T Sql 简明教程
T-SQL - Overview
在 20 世纪 70 年代,IBM 开发了一种名为“SEQUEL”的结构化英语查询语言,后来 SEQUEL 被重新命名为“SQL”,即结构化查询语言。
1986 年,SQL 获得 ANSI(美国国家标准协会)的批准,1987 年,它获得 ISO(国际标准组织)的批准。
SQL 是一种结构化查询语言,是所有 RDBMS 产品的通用数据库语言。不同的 RDBMS 产品供应商为自己的 RDBMS 产品扩展了 SQL,开发了自己的数据库语言。
T-SQL 代表事务结构查询语言,它是 Microsoft 产品,是 SQL 语言的扩展。
T-SQL - Data Types
SQL Server 数据类型是一种属性,它指定了任何对象的 data 类型。每列,变量和表达式在 SQL Server 中有相关的 data 类型。在创建表时可使用这些数据类型。你可针对你的需求为表格栏选择特定的数据类型。
SQL Server 提供了七个类别包括其他类别的 data 类型以供使用。
Exact Numeric Types
Type |
From |
To |
bigint |
-9,223,372,036,854,775,808 |
9,223,372,036,854,775,807 |
int |
-2,147,483,648 |
2,147,483,647 |
smallint |
-32,768 |
32,767 |
tinyint |
0 |
255 |
bit |
0 |
1 |
decimal |
-10^38 +1 |
10^38 –1 |
numeric |
-10^38 +1 |
10^38 –1 |
money |
-922,337,203,685,477.5808 |
+922,337,203,685,477.5807 |
smallmoney |
-214,748.3648 |
+214,748.3647 |
数字和十进制是固定精度和刻度 data 类型,以及在功能上是相等的。
Date and Time Types
Type |
From |
To |
datetime(3.33 milliseconds accuracy) |
Jan 1, 1753 |
Dec 31, 9999 |
smalldatetime(1 minute accuracy) |
Jan 1, 1900 |
Jun 6, 2079 |
date (1 天精度。在 SQL Server 2008 中引入) |
Jan 1, 0001 |
Dec 31, 9999 |
datetimeoffset (100 纳秒精度。在 SQL Server 2008 中引入) |
Jan 1, 0001 |
Dec 31, 9999 |
datetime2 (100 纳秒精度。在 SQL Server 2008 中引入) |
Jan 1, 0001 |
Dec 31, 9999 |
time (100 纳秒精度。在 SQL Server 2008 中引入) |
00:00:00.0000000 |
23:59:59.9999999 |
Character Strings
Sr.No |
Type & Description |
1 |
char 固定长度非 Unicode 字符数据,最大长度为 8000 字符。 |
2 |
varchar 可变长度非 Unicode 数据,最大长度为 8000 字符。 |
3 |
Varchar (max) 可变长度非 Unicode 数据,最大长度为 231 个字符(在 SQL Server 2005 中引入)。 |
4 |
text 可变长度非 Unicode 数据,最大长度为 2,147,483,647 个字符 |
Unicode Character Strings
Sr.No |
Type & Description |
1 |
nchar 固定长度 Unicode 数据,最大长度为 4000 字符。 |
2 |
nvarchar 可变长度 Unicode 数据,最大长度为 4000 字符。 |
3 |
Nvarchar (max) 可变长度 Unicode 数据,最大长度为 230 个字符(在 SQL Server 2005 中引入)。 |
4 |
ntext 可变长度 Unicode 数据,最大长度为 1,073,741,823 个字符。 |
Binary Strings
Sr.No |
Type & Description |
1 |
binary 固定长度二进制数据,最大长度为 8000 字节。 |
2 |
varbinary 可变长度二进制数据(最大长度 8000 字节)。 |
3 |
varbinary(max) 长度最大为 231 个字节的可变长度二进制数据(在 SQL Server 2005 中引入)。 |
4 |
image 长度最大为 2,147,483,647 个字节的可变长度二进制数据。 |
Other Data Types
-
sql_variant − 存储各种 SQL Server 支持的数据类型的数值,文本、ntext 和时间戳除外。
-
timestamp − 存储一个数据库范围的唯一号,每当更新一行,它就会更新。
-
uniqueidentifier −存储一个全局唯一标识符(GUID)。
-
xml −存储XML数据。您可以在一个列或一个变量中存储XML实例(SQL Server 2005中引入)。
-
cursor −一个游标的引用。
-
table −存储一个结果集以备稍后处理。
-
hierarchyid −一个可变长度系统数据类型,用于表示一个层次中的位置(SQL Server 2008中引入)。
T-SQL - Create Tables
创建基本表涉及命名表并定义其列和每个列的数据类型。
SQL Server CREATE TABLE 语句用于创建新表。
Syntax
以下是 CREATE TABLE 语句的基本语法:
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns ));
CREATE TABLE 是告诉数据库系统你想要做什么的关键字。在本例中,你要创建一个新表。表中唯一名称或标识符应位于 CREATE TABLE 语句后面。然后括号中应该是定义表中每一列的内容及其是什么数据类型的列表。通过以下示例可以更清楚地了解语法。
可以使用 CREATE TABLE 语句与 SELECT 语句的组合来创建现有表的副本。你可以在使用其他表创建表中查看所有详细信息。
Example
在本示例中,让我们创建一个以 ID 为主键且 NOT NULL 的 CUSTOMERS 表,约束表明在该表中创建记录时,这些字段不能为 NULL:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID));
你可以通过查看 SQL Server 显示的消息来验证你的表是否已成功创建,此外还可以使用以下命令:
exec sp_columns CUSTOMERS
以上命令会产生以下输出。
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME
PRECISION LENGTH SCALE RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE
SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE SS_DATA_TYPE
TestDB dbo CUSTOMERS ID 4 int 10 4 0 10 0
NULL NULL 4 NULL NULL 1 NO 56
TestDB dbo CUSTOMERS NAME 12 varchar 20 20 NULL NULL 0
NULL NULL 12 NULL 20 2 NO 39
TestDB dbo CUSTOMERS AGE 4 int 10 4 0 10 0
NULL NULL 4 NULL NULL 3 NO 56
TestDB dbo CUSTOMERS ADDRESS 1 char 25 25 NULL NULL 1
NULL NULL 1 NULL 25 4 YES 39
TestDB dbo CUSTOMERS SALARY 3 decimal 18 20 2 10 1
NULL NULL 3 NULL NULL 5 YES 106
你现在可以看见 CUSTOMERS 表已在你的数据库中可用,你可以使用它来存储与客户相关的所需信息。
T-SQL - Drop Tables
SQL Server DROP TABLE 语句用于删除表定义以及表的所有数据、索引、触发器、约束和权限规范。
Note − 使用此命令时必须小心,因为一旦表被删除,表中提供的所有信息也将永远丢失。
Example
让我们先验证 CUSTOMERS 表,然后从数据库中删除它 −
Exec sp_columns CUSTOMERS;
以上命令显示了以下表。
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME
PRECISION LENGTH SCALE RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE
SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE SS_DATA_TYPE
TestDB dbo CUSTOMERS ID 4 int 10 4 0 10 0
NULL NULL 4 NULL NULL 1 NO 56
TestDB dbo CUSTOMERS NAME 12 varchar 20 20 NULL NULL 0
NULL NULL 12 NULL 20 2 NO 39
TestDB dbo CUSTOMERS AGE 4 int 10 4 0 10 0
NULL NULL 4 NULL NULL 3 NO 56
TestDB dbo CUSTOMERS ADDRESS 1 char 25 25 NULL NULL 1
NULL NULL 1 NULL 25 4 YES 39
TestDB dbo CUSTOMERS SALARY 3 decimal 18 20 2 10 1
NULL NULL 3 NULL NULL 5 YES 106
CUSTOMERS 表在数据库中可用,因此让我们删除它。以下是相同的命令。
DROP TABLE CUSTOMERS;
Command(s) completed successfully.
使用以上命令,你将不会得到任何行。
Exec sp_columns CUSTOMERS;
No rows\data will be displayed
T-SQL - INSERT Statement
SQL Server INSERT INTO 语句用于在数据库中的表中添加新数据行。
Syntax
以下是 INSERT INTO 语句的两个基本语法:
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
其中,column1、column2、……columnN 是要在其中插入数据的表中的列名。
如果你为表的所有列添加值,则不需要在 SQL 查询中指定列名。但确保值的顺序与表中的列相同。以下是 SQL INSERT INTO 语法 −
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
Example
以下语句将在 CUSTOMERS 表中创建六条记录 −
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
Syntax
你可以使用第二个语法在 CUSTOMERS 表中创建记录,如下所示 −
INSERT INTO CUSTOMERS VALUES (7, 'Muffy', 24, 'Indore', 10000.00 );
上面的所有语句都将在 CUSTOMERS 表中生成以下记录−
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
T-SQL - SELECT Statement
SQL Server SELECT 语句用于从数据库表中获取数据,这些数据以结果表格的形式返回。这些结果表格被称为 result-sets 。
Syntax
以下是 SELECT 语句的基本语法 −
SELECT column1, column2, columnN FROM table_name;
其中,列 1、列 2… 是您要获取其值的表的字段。如果您想获取字段中提供的所有字段,则可以使用以下语法 −
SELECT * FROM table_name;
Example
考虑包含以下记录的 CUSTOMERS 表:
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下命令是一个示例,它将获取 CUSTOMERS 表中提供的客户的 ID、姓名和工资字段 −
SELECT ID, NAME, SALARY FROM CUSTOMERS;
以上命令将生成以下输出。
ID NAME SALARY
1 Ramesh 2000.00
2 Khilan 1500.00
3 kaushik 2000.00
4 Chaitali 6500.00
5 Hardik 8500.00
6 Komal 4500.00
7 Muffy 10000.00
如果你想提取 CUSTOMERS 表的所有字段,那么使用以下查询 −
SELECT * FROM CUSTOMERS;
上述代码将产生以下输出。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
T-SQL - UPDATE Statement
SQL Server UPDATE 查询用于修改表中现有的记录。
可以将 WHERE 子句与 UPDATE 查询结合使用以更新所选行,否则会影响所有行。
Syntax
以下是带 WHERE 子句的 UPDATE 查询的基本语法:
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
可以使用 AND 或 OR 运算符组合 N 个条件。
Example
考虑包含以下记录的 CUSTOMERS 表:
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下命令是一个示例,用于更新 ID 为 6 的客户地址:
UPDATE CUSTOMERS
SET ADDRESS = 'Pune'
WHERE ID = 6;
客户表现在将具有以下记录:
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Pune 4500.00
7 Muffy 24 Indore 10000.00
如果要修改 CUSTOMERS 表中的所有 ADDRESS 和 SALARY 列值,则不需要使用 WHERE 子句。UPDATE 查询如下:
UPDATE CUSTOMERS
SET ADDRESS = 'Pune', SALARY = 1000.00;
CUSTOMERS 表现在将具有以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Pune 1000.00
2 Khilan 25 Pune 1000.00
3 kaushik 23 Pune 1000.00
4 Chaitali 25 Pune 1000.00
5 Hardik 27 Pune 1000.00
6 Komal 22 Pune 1000.00
7 Muffy 24 Pune 1000.00
T-SQL - DELETE Statement
SQL Server DELETE 查询用于从表中删除现有记录。
您必须将 WHERE 子句与 DELETE 查询一起使用以删除选定的行,否则将删除所有记录。
Syntax
以下是有 WHERE 子句的 DELETE 查询的基本语法 −
DELETE FROM table_name
WHERE [condition];
可以使用 AND 或 OR 运算符组合 N 个条件。
Example
考虑包含以下记录的 CUSTOMERS 表:
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下命令是一个示例,它将 DELETE 一个 ID 为 6 的客户 −
DELETE FROM CUSTOMERS
WHERE ID = 6;
CUSTOMERS 表现在将具有以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
7 Muffy 24 Indore 10000.00
如果你想从 CUSTOMERS 表中删除所有记录,你不需要使用 WHERE 子句。DELETE 查询将如下所示 −
DELETE FROM CUSTOMERS;
CUSTOMERS 表现在没有任何记录。
T-SQL - WHERE Clause
MS SQL Server WHERE 子句用于在从单个表获取数据或与多个表连接时指定条件。
如果满足给定条件,则它仅从表中返回一个特定值。您将必须使用 WHERE 子句来筛选记录并仅获取必需的记录。
WHERE 子句不仅用于 SELECT 语句中,而且还用于 UPDATE、DELETE 语句中,我们将在后续章节中研究这些语句。
Syntax
以下是带有 WHERE 子句的 SELECT 语句的基本语法−
SELECT column1, column2, columnN
FROM table_name
WHERE [condition]
您可以使用 >、<、=、LIKE、NOT 等比较或逻辑运算符指定条件。以下示例将阐明此概念。
Example
考虑包含以下记录的 CUSTOMERS 表:
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下命令是一个示例,它将从 CUSTOMERS 表中获取 ID、Name 和 Salary 字段,其中工资大于 2000。
SELECT ID, NAME, SALARY
FROM CUSTOMERS
WHERE SALARY > 2000;
以上命令将生成以下输出。
ID NAME SALARY
4 Chaitali 6500.00
5 Hardik 8500.00
6 Komal 4500.00
7 Muffy 10000.00
以下命令是一个示例,它将为名为“Hardik”的客户从 CUSTOMERS 表中获取 ID、Name 和 Salary 字段。需要注意的是,所有字符串都应放在单引号('')内,而数字值应不带任何引号,如上例所示−
SELECT ID, NAME, SALARY
FROM CUSTOMERS
WHERE NAME = 'Hardik';
以上命令将生成以下输出。
ID NAME SALARY
5 Hardik 8500.00
T-SQL - LIKE Clause
MS SQL Server LIKE 子句用于使用通配符运算符将值与类似值进行比较。与 LIKE 运算符结合使用的通配符有两种 -
-
The percent sign (%)
-
The underscore (_)
百分号表示零个、一个或多个字符。下划线表示单个数字或字符。这些符号可以组合使用。
Syntax
以下是 % 和 _ 的基本语法。
SELECT *\column-list FROM table_name
WHERE column LIKE 'XXXX%'
or
SELECT *\column-list FROM table_name
WHERE column LIKE '%XXXX%'
or
SELECT *\column-list FROM table_name
WHERE column LIKE 'XXXX_'
or
SELECT *\column-list FROM table_name
WHERE column LIKE '_XXXX'
or
SELECT *\column-list FROM table_name
WHERE column LIKE '_XXXX_'
您可以使用 AND 或 OR 运算符组合 N 个条件。XXXX 可以是任何数字或字符串值。
Example
以下是一些示例,显示 WHERE 部分具有带 '%' 和 '_' 运算符的不同 LIKE 子句。
Sr.No |
Statement & Description |
1 |
WHERE SALARY LIKE '200%' 查找以 200 开头的任何值 |
2 |
WHERE SALARY LIKE '%200%' 查找在任何位置具有 200 的任何值 |
3 |
WHERE SALARY LIKE '_00%' 查找在第二个和第三个位置具有 00 的任何值 |
4 |
WHERE SALARY LIKE '2_%_%' 查找以 2 开头且长度至少为 3 个字符的任何值 |
5 |
WHERE SALARY LIKE '%2' 查找以 2 结尾的任何值 |
6 |
WHERE SALARY LIKE '_2%3' 查找第二位为 2,且以 3 结尾的任何值 |
7 |
WHERE SALARY LIKE '2___3' 查找五位数字中以 2 开头且以 3 结尾的任何值 |
可以将 CUSTOMERS 表视为包含以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下命令是一个示例,它会显示 CUSTOMERS 表中 SALARY 以 200 开头的所有记录。
SELECT * FROM CUSTOMERS
WHERE SALARY LIKE '200%';
以上命令将生成以下输出。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
3 kaushik 23 Kota 2000.00
T-SQL - ORDER BY Clause
MS SQL Server ORDER BY 子句用于按一个或多个列基于升序或降序对数据进行排序。默认情况下,一些数据库按升序对查询结果进行排序。
Syntax
以下是 ORDER BY 子句的基本语法。
SELECT column-list
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
你可以在 ORDER BY 子句中使用多个列。确保要用于排序的列在列列表中。
Example
考虑包含以下记录的 CUSTOMERS 表:
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下命令是一个示例,按 NAME 和 SALARY 升序对结果进行排序。
SELECT * FROM CUSTOMERS
ORDER BY NAME, SALARY
以上命令将生成以下输出。
ID NAME AGE ADDRESS SALARY
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
3 kaushik 23 Kota 2000.00
2 Khilan 25 Delhi 1500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
1 Ramesh 32 Ahmedabad 2000.00
以下命令是一个示例,按 NAME 降序对结果进行排序。
SELECT * FROM CUSTOMERS
ORDER BY NAME DESC
以上命令将生成以下结果 −
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
7 Muffy 24 Indore 10000.00
6 Komal 22 MP 4500.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
5 Hardik 27 Bhopal 8500.00
4 Chaitali 25 Mumbai 6500.00
T-SQL - GROUP BY Clause
SQL Server GROUP BY 子句与 SELECT 语句配合使用,将相同数据整理到组中。
GROUP BY 子句在 SELECT 语句中紧跟在 WHERE 子句之后,并且出现在 ORDER BY 子句之前。
Syntax
以下是 GROUP BY 子句的基本语法。GROUP BY 子句必须跟在 WHERE 子句的条件之后,如果使用,则必须在 ORDER BY 子句之前。
SELECT column1, column2
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2
ORDER BY column1, column2
Example
考虑 CUSTOMERS 表具有以下记录 −
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
如果您想了解每个客户的工资总额,那么以下将是 GROUP BY 查询。
SELECT NAME, SUM(SALARY) as [sum of salary] FROM CUSTOMERS
GROUP BY NAME;
以上命令将生成以下输出。
NAME sum of salary
Chaitali 6500.00
Hardik 8500.00
kaushik 2000.00
Khilan 1500.00
Komal 4500.00
Muffy 10000.00
Ramesh 2000.00
现在让我们考虑以下 CUSTOMERS 表,其中有以下记录,带有重复姓名。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
如果您想了解每个客户的工资总额,那么以下将是 GROUP BY 查询。
SELECT NAME, SUM(SALARY) as [sum of salary] FROM CUSTOMERS
GROUP BY NAME
以上命令将生成以下输出。
NAME sum of salary
Hardik 8500.00
kaushik 8500.00
Komal 4500.00
Muffy 10000.00
Ramesh 3500.00
T-SQL - DISTINCT Clause
MS SQL Server DISTINCT 关键字与 SELECT 语句一起使用,以消除所有重复的记录并仅获取唯一的记录。
在表中,你可能会遇到重复记录的情况。在获取这些记录时,只获取唯一记录比获取重复记录更有意义。
Syntax
以下是 DISTINCT 关键字消除重复记录的基本语法。
SELECT DISTINCT column1, column2,.....columnN
FROM table_name
WHERE [condition]
Example
可以将 CUSTOMERS 表视为包含以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
让我们看看 다음 SELECT 查询如何返回重复的薪资记录。
SELECT SALARY FROM CUSTOMERS
ORDER BY SALARY
上述命令将产生以下输出,其中薪资 2000 出现两次,这是原始表中的重复记录。
SALARY
1500.00
2000.00
2000.00
4500.00
6500.00
8500.00
10000.00
现在,让我们对上述 SELECT 查询使用 DISTINCT 关键字并查看结果。
SELECT DISTINCT SALARY FROM CUSTOMERS
ORDER BY SALARY
上述命令会产生以下输出,其中我们没有任何重复项。
SALARY
1500.00
2000.00
4500.00
6500.00
8500.00
10000.00
T-SQL - Joining Tables
MS SQL Server Joins 子句用于合并数据库中两个或更多表中的记录。JOIN 是通过使用每张表都通用的值来合并两张表中的字段的方法。
考虑以下两个表,(a)CUSTOMERS 表如下−
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
(b)另一张表 ORDERS 如下−
OID DATE CUSTOMER_ID AMOUNT
100 2009-10-08 00:00:00.000 3 1500.00
101 2009-11-20 00:00:00.000 2 1560.00
102 2009-10-08 00:00:00.000 3 3000.00
103 2008-05-20 00:00:00.000 4 2060.00
让我们在我们的 SELECT 语句中连接这两个表,如下所示 −
SELECT ID, NAME, AGE, AMOUNT
FROM CUSTOMERS, ORDERS
WHERE CUSTOMERS.ID = ORDERS.CUSTOMER_ID
OR
SELECT A.ID, A.NAME, A.AGE, B.AMOUNT
FROM CUSTOMERS A inner join ORDERS B on A.ID = B.Customer_ID
以上命令将生成以下输出。
ID NAME AGE AMOUNT
2 Khilan 25 1560.00
3 kaushik 23 1500.00
3 kaushik 23 3000.00
4 Chaitali 25 2060.00
需要注意的是,联接是在 WHERE 子句中执行的。可以使用多个运算符来联接表,例如 =、<、>、<>、⇐、>=、!=、BETWEEN、LIKE 和 NOT;它们都可以用于联接表。但是,最常见的运算符是等号。
MS SQL Server 联接类型−
MS SQL Server 中有多种类型的联接可用 −
-
INNER JOIN − 当两个表中都有匹配项时返回行。
-
LEFT JOIN −从左表返回所有行,即使在右表中没有匹配项。
-
RIGHT JOIN −从右表返回所有行,即使在左表中没有匹配项。
-
FULL JOIN − 当其中一张表中存在匹配项时返回行。
-
SELF JOIN − 这用于将表连接到自身,就好像该表是两张表一样,在 MS SQL Server 语句中临时重命名至少一张表。
-
CARTESIAN JOIN – 返回两个或多个连接表中记录集的笛卡尔积。
T-SQL - Sub-Queries
sub-query 、 Inner query 或 Nested query 是另一个 SQL Server 查询内的一个查询,并且嵌入在 WHERE 子句中。子查询用于返回将用作主查询中一个条件的数据,以便进一步限制要检索的数据。
子查询可与 SELECT、INSERT、UPDATE 和 DELETE 语句以及 =、<、>、>=、⇐、IN、BETWEEN 等运算符搭配使用。
子查询必须遵循一些规则:
-
必须在括号中将子查询括起来。
-
子查询必须包括一个 SELECT 子句和一个 FROM 子句。
-
子查询可以包含可选的 WHERE、GROUP BY 和 HAVING 子句。
-
子查询不能包含 COMPUTE 或 FOR BROWSE 子句。
-
只有在包含 TOP 子句时,才可包含 ORDER BY 子句。
-
可以最多将子查询嵌套 32 层。
Subqueries with SELECT Statement
Syntax
子查询最常与 SELECT 语句一起使用。以下是基本语法。
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
Example
可以将 CUSTOMERS 表视为包含以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
让我们对 SELECT 语句应用以下子查询。
SELECT *
FROM CUSTOMERS
WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)
以上命令将生成以下输出。
ID NAME AGE ADDRESS SALARY
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
7 Muffy 24 Indore 10000.00
Subqueries with INSERT Statement
子查询还可以与 INSERT 语句一起使用。INSERT 语句使用从子查询返回的数据插入另一个表。子查询中所选的数据可以使用任何字符、日期或数字函数进行修改。
Subqueries with UPDATE Statement
子查询可以与 UPDATE 语句联合使用。在使用 UPDATE 语句与子查询时,可以更新表中的单个或多个列。
Syntax
以下是基本语法。
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Example
我们假设我们有可用的是 CUSTOMERS_BKP 表,它是 CUSTOMERS 表的备份。
以下命令示例将对 CUSTOMERS 表中所有年龄大于或等于 27 的客户更新 SALARY,更新幅度为 0.25 倍。
UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )
这将影响两行,并且最终 CUSTOMERS 表将拥有以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 500.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 2125.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
Subqueries with DELETE Statement
与上面提到的其他任何语句一样,子查询可与 DELETE 语句一起使用。
Syntax
以下是基本语法。
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Example
我们假设我们有可用的是 CUSTOMERS_BKP 表,它是 CUSTOMERS 表的备份。
以下命令示例将删除 CUSTOMERS 表中所有年龄大于或等于 27 的客户的记录。
DELETE FROM CUSTOMERS
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )
这将影响两行,并且最终 CUSTOMERS 表将拥有以下记录。
ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
T-SQL - Stored Procedures
MS SQL Server Stored procedure 可用于通过在数据库中存储相同内容节省编写代码时间,并通过传递参数获得所需输出。
Example
可以将 CUSTOMERS 表视为包含以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下命令是一个示例,它将从 Testdb 数据库中的 CUSTOMERS 表中获取所有记录。
CREATE PROCEDURE SelectCustomerstabledata
AS
SELECT * FROM Testdb.Customers
GO
以上命令将生成以下输出。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
T-SQL - Transactions
transaction 是针对数据库执行的一项工作单元。事务是由用户手动或由某种数据库程序自动以逻辑顺序执行的工作单元或工作序列。
事务是向数据库传播一项或多项更改的过程。例如,如果您正在创建记录或更新记录或从表中删除记录,那么您正在对表执行事务。控制事务以确保数据完整性并处理数据库错误非常重要。
实际上,您会将许多 SQL 查询合并到一个组中,并将它们全部作为一个事务的一部分一起执行。
Properties of Transactions
事务具有以下四个标准属性,通常用首字母缩写词 ACID 提到 -
-
Atomicity − 确保工作单元内的所有操作都已成功完成;否则,事务将中止于故障点,之前的操作将回滚至其原有状态。
-
Consistency − 确保数据库在成功提交事务后正确地更改状态。
-
Isolation − 使得事务能够彼此独立且透明地操作。
-
Durability − 确保在系统故障的情况下,已提交事务的结果或效果会持续存在。
COMMIT Command
COMMIT 命令用于将由事务调用的更改保存到数据库的事务命令。此命令将自上次 COMMIT 或 ROLLBACK 命令以来所有事务保存到数据库。
Example
可以将 CUSTOMERS 表视为包含以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下命令示例将从表中删除年龄 = 25 的记录,然后在数据库中提交更改。
Begin Tran
DELETE FROM CUSTOMERS
WHERE AGE = 25
COMMIT
最后将从表中删除两行,并且 SELECT 语句将生成以下输出。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
3 kaushik 23 Kota 2000.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
ROLLBACK Command
ROLLBACK 命令是用于撤消尚未保存到数据库的事务的事务命令。该命令只能用于自上次发出 COMMIT 或 ROLLBACK 命令以来撤消事务。
Example
可以将 CUSTOMERS 表视为包含以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下命令示例将从表中删除年龄 = 25 的记录,然后在数据库中回滚更改。
Begin Tran
DELETE FROM CUSTOMERS
WHERE AGE = 25;
ROLLBACK
最后,删除操作将不影响表,并且 SELECT 语句将生成以下结果。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
SAVEPOINT Command
SAVEPOINT 是事务中的一个点,在该点上您可以将事务回滚到某个点,而无需回滚整个事务。
Syntax
以下是 SAVEPOINT 命令的语法。
SAVE TRANSACTION SAVEPOINT_NAME
此命令仅用于在事务语句中创建 SAVEPOINT。ROLLBACK 命令用于撤消一组事务。
以下是回滚到 SAVEPOINT 的语法。
ROLLBACK TO SAVEPOINT_NAME
在以下示例中,我们将从 CUSTOMERS 表中删除三条不同的记录。在每次删除之前,我们都必须创建一个 SAVEPOINT,以便我们可以在任何时间回滚到任何 SAVEPOINT,以将适当的数据返回到其原始状态。
Example
考虑包含以下记录的 CUSTOMERS 表:
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下是操作系列:
Begin Tran
SAVE Transaction SP1
Savepoint created.
DELETE FROM CUSTOMERS WHERE ID = 1
1 row deleted.
SAVE Transaction SP2
Savepoint created.
DELETE FROM CUSTOMERS WHERE ID = 2
1 row deleted.
SAVE Transaction SP3
Savepoint created.
DELETE FROM CUSTOMERS WHERE ID = 3
1 row deleted.
这三个删除操作已经发生,但是,我们改变了主意并决定回滚到我们标识为 SP2 的 SAVEPOINT。因为 SP2 是在第一次删除后创建的,所以最后两个删除操作被撤消了 -
ROLLBACK Transaction SP2
Rollback complete.
请注意,由于我们回滚到了 SP2,因此只执行了第一次删除。
SELECT * FROM CUSTOMERS
选择了 6 行。
ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
T-SQL - Indexes
Indexes 是数据库搜索引擎用于加快数据检索的特殊查找表。简而言之, index 是指向表中数据的指针。数据库中的索引与书末尾的索引非常相似。
例如,如果你想要引用一本书中讨论某一特定主题的所有页面,你首先会参考索引,它按字母顺序列出所有主题,然后被引用到一个或多个特定的页码。
索引有助于加快 SELECT 查询和 WHERE 子句的速度,但会减慢数据输入速度,以及 UPDATE 和 INSERT 语句。可以在不影响数据的情况下创建或删除索引。
创建索引涉及使用 CREATE INDEX 语句,该语句允许你命名索引、指定表和要索引的列(一个或多个)以及指示索引是按升序还是降序。
索引也可以是唯一的,类似于 UNIQUE 约束,其中索引禁止在列或有索引列组合中重复条目。
T-SQL - Functions
MS SQL Server 有许多内置函数用于对字符串或数字数据执行处理。以下是所有有用的 SQL 内置函数的列表:
-
* SQL Server COUNT Function* - SQL Server COUNT 聚合函数用于计算数据库表格中的行数。
-
* SQL Server MAX Function* - SQL Server MAX 聚合函数允许选择某一列中的最高(最大)值。
-
* SQL Server MIN Function* - SQL Server MIN 聚合函数允许选择某一列中的最低(最小)值。
-
* SQL Server AVG Function* - SQL Server AVG 聚合函数选择某一表列中的平均值。
-
* SQL Server SUM Function* - SQL Server SUM 聚合函数允许选择数字列的总和。
-
* SQL Server SQRT Function* - 用于生成给定数字的平方根。
-
* SQL Server RAND Function* - 用于使用 SQL 命令生成随机数。
-
* SQL Server CONCAT Function* - 用于将多个参数连接到单个参数。
-
* SQL Server Numeric Functions* − SQL 中操纵数字所需 SQL 函数的完整列表。
-
* SQL Server String Functions* − SQL 中操纵字符串所需 SQL 函数的完整列表。
T-SQL - String Functions
MS SQL Server 字符串函数可应用于字符串值,或将返回字符串值或数字数据。
以下是字符串函数及其示例列表。