T-SQL 快速指南

2018-12-15 16:50 更新

T-SQL - 概述

T-SQL 快速指南

在1986年,SQL由ANSI(美國國家標(biāo)準(zhǔn)協(xié)會)批準(zhǔn),并在1987年,它被ISO(國際標(biāo)準(zhǔn)化組織)批準(zhǔn)。

SQL是一種結(jié)構(gòu)查詢語言,它是所有RDBMS產(chǎn)品的通用數(shù)據(jù)庫語言。 不同的RDBMS產(chǎn)品供應(yīng)商通過為自己的RDBMS產(chǎn)品擴(kuò)展SQL來開發(fā)自己的數(shù)據(jù)庫語言。

T-SQL代表Transact Structure Query Language,它是Microsoft產(chǎn)品,是SQL語言的擴(kuò)展。

MS SQL Server - SQL\T-SQL

ORACLE - SQL\PL-SQL

T-SQL - 數(shù)據(jù)類型

SQL Server數(shù)據(jù)類型是指定任何對象的數(shù)據(jù)類型的屬性。 每個(gè)列,變量和表達(dá)式在SQL Server中具有相關(guān)的數(shù)據(jù)類型。 創(chuàng)建表時(shí)可以使用這些數(shù)據(jù)類型。 您可以根據(jù)需要為表列選擇特定的數(shù)據(jù)類型。

SQL Server提供七個(gè)類別,包括要使用的和其他類別的數(shù)據(jù)類型。

精確數(shù)值類型

類型
bigint-9,223,372,036,854,775,8089,223,372,036,854,775,807
int2,147,483,6482,147,483,647
smallint-32,76832,767
tinyint0255
bit01
decimal-10 ^ 38加110 ^ 38 -1
numeric-10 ^ 38加110 ^ 38 -1
money-922,337,203,685,477.5808+922,337,203,685,477.5807
smallmoney-214,748.3648+214,748.3647

數(shù)字和小數(shù)是固定精度和標(biāo)度數(shù)據(jù)類型,在功能上等效。

近似數(shù)值類型

類型
Float-1.79E + 3081.79E + 308
Real-3.40E + 383.40E + 38

日期和時(shí)間類型

類型

datetime (3.33毫秒精度)

1753年1月1日9999年12月31日

smalldatetime(1分鐘精度)

1900年1月1日2079年6月6日

date(1天的精度。在SQL Server 2008中引入)

0001年1月1日9999年12月31日

datetimeoffset(100納秒的精度。在SQL Server 2008中引入)

0001年1月1日
9999年12月31日

datetime2(100納秒的精度。在SQL Server 2008中引入)

0001年1月1日9999年12月31日

time(100納秒的精度。在SQL Server 2008中引入)

00:00:00.000000023:59:59.9999999

字符型

Sr.No類型及說明
1

char

固定長度的非Unicode字符數(shù)據(jù),最大長度為8,000個(gè)字符。

2

varchar

最大長度為8,000個(gè)字符的可變長度非Unicode數(shù)據(jù)。

3

Varchar (max)

可變長度的非Unicode數(shù)據(jù),最大長度為231個(gè)字符(在SQL Server 2005中引入)。

4

text

可變長度非Unicode數(shù)據(jù),最大長度為2,147,483,647個(gè)字符。

Unicode

Sr.No類型及說明
1

nchar

固定長度的Unicode數(shù)據(jù),最大長度為4,000個(gè)字符。

2

nvarchar

最大長度為4,000個(gè)字符的可變長度Unicode數(shù)據(jù)。

3

Nvarchar (max)

最大長度為230個(gè)字符的可變長度Unicode數(shù)據(jù)(在SQL Server 2005中引入)。

4

ntext

最大長度為1,073,741,823個(gè)字符的可變長度Unicode數(shù)據(jù)。

二進(jìn)制字符串

Sr.No類型及說明
1

binary

固定長度二進(jìn)制數(shù)據(jù),最大長度為8,000字節(jié)。

2

varbinary

最大長度為8,000字節(jié)的可變長度二進(jìn)制數(shù)據(jù)。

3

varbinary(max)

最大長度為231字節(jié)的可變長度二進(jìn)制數(shù)據(jù)(在SQL Server 2005中引入)。

4

image

最大長度為2,147,483,647字節(jié)的可變長度二進(jìn)制數(shù)據(jù)。

其他數(shù)據(jù)類型

  • SQL_VARIANT -存儲各種SQL Server支持的數(shù)據(jù)類型的值,text,ntext和timestamp除外。

  • TIMESTAMP -時(shí)間戳是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)。

  • UNIQUEIDENTIFIER  -存儲全局唯一標(biāo)識符(GUID)。

  • XML -存儲XML數(shù)據(jù)。 您可以將XML實(shí)例存儲在列或變量中(在SQL Server 2005中引入)。

  • CURSOR -對游標(biāo)的引用。

  • TABLE -存儲結(jié)果集以供稍后處理。

  • HIERARCHYID -用于表示層次結(jié)構(gòu)中位置的可變長度的系統(tǒng)數(shù)據(jù)類型(在SQL Server 2008中引入)。

T-SQL - 創(chuàng)建表

創(chuàng)建一個(gè)基本表,包括表名,字段名稱,以及每個(gè)字段的數(shù)據(jù)類型

在SQL Server CREATE TABLE語句用于創(chuàng)建新表。

語法

以下是使用CREATE TABLE創(chuàng)建表的基本語法:

CREATE TABLE table_name( 
   column1 datatype, 
   column2 datatype, 
   column3 datatype, 
   ..... 
   columnN datatype, 
   PRIMARY KEY( one or more columns ));

CREATE TABLE只是操作數(shù)據(jù)庫系統(tǒng)創(chuàng)建新表的一個(gè)關(guān)鍵詞。事實(shí)上你要?jiǎng)?chuàng)建一張新的數(shù)據(jù)表,你還需要帶上一個(gè)唯一的表名稱或者標(biāo)識符,然后在后面的括號里定義表中的每一個(gè)字段和字段的類型??赐暌韵碌膶?shí)例就會更明白了。

現(xiàn)有表的副本可以使用CREATE TABLE語句的組合,SELECT語句來創(chuàng)建。您可以檢查在創(chuàng)建表使用另一個(gè)表的完整信息。

使用CREATE TABLE 和 SELECT 的組合語句可以為現(xiàn)有表創(chuàng)建一個(gè)副本,也可以使用CREATE TABLE 語句來檢查另一張表的完整性。

在這個(gè)例子中,我們將創(chuàng)建一張名稱為CUSTOMERS表,ID為主鍵,NOT NULL表示這些字段在添加記錄時(shí),值不能為空。

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服務(wù)器顯示的消息來驗(yàn)證表是否已經(jīng)創(chuàng)建成功,也可以使用以下命令查看

exec sp_columns CUSTOMERS

上述命令輸出以下結(jié)果:

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 

現(xiàn)在可以看到,CUSTOMERS表已經(jīng)存在數(shù)據(jù)庫中,你可以用它來存儲與客戶相關(guān)的資料。

T-SQL - 刪除表

在SQL Server中 DROP TABLE語句用來刪除表的定義和所有數(shù)據(jù),包括索引,觸發(fā)器,約束和權(quán)限規(guī)范。

 -請謹(jǐn)慎使用此命令,因?yàn)橐坏┮粋€(gè)表被刪除,那么該表中的所有可用數(shù)據(jù)也將被永久刪除。

語法

以下是DROP TABLE語句的基本語法 

DROP TABLE table_name;

讓我們先驗(yàn)證剛才創(chuàng)建的客戶表,然后我們會從數(shù)據(jù)庫中將它刪除。

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 

可以看出,數(shù)據(jù)庫中存在名稱為CUSTOMERS的數(shù)據(jù)表,下面我們對它進(jìn)行刪除。以下是刪除數(shù)據(jù)表CUSTOMERS
的命令。

DROP TABLE CUSTOMERS; 
Command(s) completed successfully.

執(zhí)行了上述命令以后,你就查詢不到CUSTOMERS表的數(shù)據(jù)了,該數(shù)據(jù)表被成功刪除。

Exec sp_columns CUSTOMERS; 
No rowsdata will be displayed 

T-SQL - INSERT語句

SQL Server INSERT INTO語句用于向數(shù)據(jù)庫中的表添加新的數(shù)據(jù)行。

語法

下面是INSERT INTO語句的兩個(gè)基本語法。

INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]   
VALUES (value1, value2, value3,...valueN); 

其中column1,column2,...列是要插入數(shù)據(jù)的表中的列的名稱。

如果要為表的所有列添加值,則不需要在SQL查詢中指定列名。 但請確保值的順序與表中的列的順序相同。 

以下是SQL INSERT INTO第二種語法:

INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

下面的語句將創(chuàng)建六個(gè)記錄在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 );

語法

您可以使用第二種方法如下在顧客表中的記錄 -

INSERT INTO CUSTOMERS VALUES (7, 'Muffy', 24, 'Indore', 10000.00 );

上述的所有語句執(zhí)行以后,CUSTOMERS表將產(chǎn)生以下記錄:

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 

使用另一個(gè)表填充一個(gè)表

您可以通過SELECT語句將數(shù)據(jù)填充到表中,而另一個(gè)表提供另一個(gè)表具有一組字段,這是填充第一個(gè)表所必需的。 以下是基本語法:

INSERT INTO first_table_name  
   SELECT column1, column2, ...columnN  
      FROM second_table_name 
      [WHERE condition];

T-SQL - SELECT語句

SQL Server SELECT語句用于從以結(jié)果表的形式返回從數(shù)據(jù)庫中提取的數(shù)據(jù)。 這些結(jié)果表稱為結(jié)果集。

語法

以下是SELECT語句的基本語法

SELECT column1, column2, columnN FROM table_name;

其中,column1,column2 ...是您要獲取其值的表的字段。 如果要獲取所有可用字段,則可以使用以下語法。

SELECT * FROM table_name;

請參考具有以下記錄的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 

以下命令是一個(gè)示例,它將獲取CUSTOMERS表中可用的客戶的ID,Name和Salary字段。

SELECT ID, NAME, SALARY FROM CUSTOMERS; 

上述命令將產(chǎn)生以下結(jié)果集:

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;

上述命令將產(chǎn)生以下結(jié)果集:

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語句

SQL Server UPDATE Query用于修改表中的現(xiàn)有記錄。

您可以使用WHERE子句與UPDATE查詢更新所選行,否則所有行都會受到影響。

語法

以下是UPDATE查詢與WHERE子句的基本語法。

UPDATE table_name 
SET column1 = value1, column2 = value2...., columnN = valueN 
WHERE [condition];

您可以使用AND或OR運(yùn)算符組合N個(gè)條件。

請參考具有以下記錄的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 

以下命令是一個(gè)示例,將更新ID為6的客戶的ADDRESS:

UPDATE CUSTOMERS 
SET ADDRESS = 'Pune' 
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 
6   Komal      22        Pune                4500.00 
7   Muffy      24        Indore              10000.00 

如果要修改CUSTOMERS表中的所有ADDRESS和SALARY列值,則不需要使用WHERE子句。查詢示例如下:

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語句

SQL Server DELETE Query用于從表中刪除現(xiàn)有記錄。

您最好使用WHERE子句與DELETE查詢來刪除所選行,否則所有記錄都將被刪除。

語法

下面是使用WHERE子句的DELETE查詢的基本語法:

DELETE FROM table_name 
WHERE [condition]; 

您可以使用AND或OR運(yùn)算符組合N個(gè)條件。

請參考具有以下記錄的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 

以下命令是一個(gè)示例,將刪除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 FROM CUSTOMERS;

執(zhí)行后,CUSTOMERS表將不會有任何記錄。

T-SQL - WHERE子句

MS SQL Server 的 WHERE 子句用于從單個(gè)表獲取數(shù)據(jù)或者使用多個(gè)表連接時(shí)指定條件。

如果滿足給定條件,則僅從表中返回特定值。 如果你只想獲取特定條件的記錄,則你必須使用WHERE子句來過濾記錄。

WHERE子句不僅可以用于SELECT語句,而且還可用于UPDATE,DELETE語句等,我們將在后續(xù)章節(jié)中進(jìn)行討論。

語法

以下是具有WHERE子句的SELECT語句的基本語法

SELECT column1, column2, columnN  
FROM table_name 
WHERE [condition]

您可以使用比較或邏輯運(yùn)算符(如>,<,=,LIKE,NOT等)指定條件。以下示例將介紹此概念。

請參考具有以下記錄的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表中獲取薪水大于2000的用戶ID,姓名和薪水值:

SELECT ID, NAME, SALARY  
FROM CUSTOMERS 
WHERE SALARY > 2000;

上述命令將產(chǎn)生以下結(jié)果集:

ID  NAME       SALARY 
4   Chaitali   6500.00 
5   Hardik     8500.00 
6   Komal      4500.00 
7   Muffy      10000.00

下面的命令將從CUSTOMERS表中獲取姓名為'Hardik'的用戶的ID,姓名和薪水值。需要注意的是,所有的字符類型都應(yīng)該包含在單引號('')內(nèi),而數(shù)值則不需要任何引號。

示例如下所示:

SELECT ID, NAME, SALARY  
FROM CUSTOMERS 
WHERE NAME = 'Hardik';

上述命令將產(chǎn)生以下結(jié)果集:

ID  NAME     SALARY 
5   Hardik   8500.00 

T-SQL - LIKE子句

MS SQL Server LIKE子句用于使用通配符運(yùn)算符將值與類似值進(jìn)行比較。 有兩個(gè)通配符與LIKE運(yùn)算符結(jié)合使用:

  • 百分號(%)
  • 下劃線(_)

百分號表示零個(gè),一個(gè)或多個(gè)字符。 下劃線表示單個(gè)數(shù)字或字符。 符號可以組合使用。

語法

以下是 '%' 和 '_' 的基本語法。

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運(yùn)算符組合N個(gè)條件。 XXXX可以是任何數(shù)字或字符串值。

以下是一些示例,顯示具有帶有'%'和'_'運(yùn)算符的不同LIKE子句的WHERE部分。

Sr.No聲明和說明
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個(gè)字符的所有值

WHERE SALARY LIKE'%2'

查找以2結(jié)尾的所有值

6

WHERE SALARY LIKE'%_2 3'

查找在第二個(gè)位置有2,并以3結(jié)束的所有值

7

WHERE SALARY LIKE'2___3“

查找以2開頭并以3結(jié)尾的五位數(shù)字中的任何值

請參考具有以下記錄的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%'; 

上述命令將產(chǎn)生以下結(jié)果集:

ID   NAME     AGE     ADDRESS       SALARY 
1    Ramesh   32      Ahmedabad     2000.00 
3    kaushik  23      Kota          2000.00

T-SQL - ORDER BY子句

MS SQL Server ORDER BY子句用于根據(jù)一個(gè)或多個(gè)列以升序或降序?qū)?shù)據(jù)進(jìn)行排序。 默認(rèn)情況下,一些數(shù)據(jù)庫排序查詢結(jié)果按升序排列。

語法

以下是ORDER BY子句的基本語法。

SELECT column-list  
FROM table_name  
[WHERE condition]  
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

您可以在ORDER BY子句中使用多個(gè)列。 確保您使用的任何列進(jìn)行排序,該列應(yīng)該在列表中。

請參考具有以下記錄的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 

以下命令是一個(gè)示例,它將按NAME和SALARY的升序?qū)Y(jié)果進(jìn)行排序。

SELECT * FROM CUSTOMERS 
   ORDER BY NAME, SALARY 

上述命令將產(chǎn)生以下結(jié)果集:

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 

以下命令是一個(gè)示例,它將按NAME的降序?qū)Y(jié)果進(jìn)行排序。

SELECT * FROM CUSTOMERS 
   ORDER BY NAME DES

上述命令將產(chǎn)生以下結(jié)果集:

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子句

SQL Server GROUP BY子句與SELECT語句協(xié)作使用,以將相同的數(shù)據(jù)分組。

GROUP BY子句位于SELECT語句中的WHERE子句之后,位于ORDER BY子句之前。

語法

以下是GROUP BY子句的基本語法,GROUP BY子句必須遵循WHERE子句中的條件,并且必須在使用ORDER BY子句之前。

SELECT column1, column2 
FROM table_name 
WHERE [ conditions ] 
GROUP BY column1, column2 
ORDER BY column1, column2 

請參考具有以下記錄的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 

如果你想知道每個(gè)客戶的工資總額,那么可以使用以下的GROUP BY查詢方式:

SELECT NAME, SUM(SALARY) as [sum of salary] FROM CUSTOMERS 
   GROUP BY NAME;

上述命令將產(chǎn)生以下結(jié)果集:

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

現(xiàn)在讓我們考慮存在重復(fù)名稱的情況,請參考具有以下記錄的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 

如果我們想知道每個(gè)客戶的工資總額,那么可以使用以下的GROUP BY查詢方式:

SELECT NAME, SUM(SALARY) as [sum of salary] FROM CUSTOMERS 
   GROUP BY NAME 

上述命令將產(chǎn)生以下結(jié)果集:

NAME        sum of salary 
Hardik      8500.00 
kaushik     8500.00 
Komal       4500.00 
Muffy       10000.00 
Ramesh      3500.00 

T-SQL - DISTINCT子句

MS SQL Server DISTINCT關(guān)鍵字與SELECT語句一起使用,以消除所有重復(fù)記錄并僅提取唯一記錄。

可能存在表中有多個(gè)重復(fù)記錄的情況。 在獲取此類記錄時(shí),更有意義的是僅提取唯一記錄,而不是提取重復(fù)記錄。

語法

以下是DISTINCT關(guān)鍵字的基本語法,用于刪除重復(fù)記錄。

SELECT DISTINCT column1, column2,.....columnN  
FROM table_name 
WHERE [condition] 

請參考具有以下記錄的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 

讓我們先來看下未使用DISTINCT關(guān)鍵字情況下SELECT查詢返回的結(jié)果集:

SELECT SALARY FROM CUSTOMERS 
   ORDER BY SALARY 

其中,工資為2000的記錄出現(xiàn)了兩次,這是因?yàn)镃USTOMERS表中存在兩條SALARY為2000的記錄。

SALARY 
1500.00 
2000.00 
2000.00 
4500.00 
6500.00 
8500.00 
10000.00

現(xiàn)在讓我們使用DISTINCT關(guān)鍵字對CUSTOMERS表進(jìn)行SELECT查詢并查看結(jié)果:

SELECT DISTINCT SALARY FROM CUSTOMERS 
   ORDER BY SALARY 

上述命令將產(chǎn)生以下結(jié)果集,我們可以發(fā)現(xiàn),并未出現(xiàn)重復(fù)記錄

SALARY 
1500.00 
2000.00 
4500.00 
6500.00 
8500.00 
10000.00 

T-SQL - 連接表

MS SQL Server Joins子句用于合并數(shù)據(jù)庫中兩個(gè)或多個(gè)表的記錄。 JOIN是通過使用每個(gè)表共有的值來組合兩個(gè)表的字段的手段。

請參考具有以下記錄的兩張表,(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語句中加入這兩個(gè)表,如下所示

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 

上述命令將產(chǎn)生以下結(jié)果集:

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子句中執(zhí)行的。 可以使用幾個(gè)運(yùn)算符來連接表,例如=,<,>,<>,<=,> =,!=,BETWEEN,LIKE和NOT; 它們都可以用于連接表。 然而,最常見的運(yùn)算符是等號。

MS SQL Server連接類型:

   在MS SQL Server中有不同類型的連接 --

  • INNER JOIN -當(dāng)兩個(gè)表中都有匹配項(xiàng)時(shí)返回行。

  • LEFT JOIN -返回左側(cè)表中的所有行,即使右表中沒有匹配項(xiàng)。

  • RIGHT JOIN -返回右表中的所有行,即使左表中沒有匹配項(xiàng)。

  • FULL JOIN -在其中一個(gè)表中存在匹配項(xiàng)時(shí)返回行。

  • SELF JOIN -這用于將表連接到自身,就像該表是兩個(gè)表,臨時(shí)重命名MS SQL Server語句中的至少一個(gè)表。

  • CARTESIAN JOIN -返回兩個(gè)或多個(gè)聯(lián)接表中的記錄集的笛卡爾乘積。

T-SQL - 子查詢

子查詢或內(nèi)部查詢或嵌套查詢是另一個(gè)SQL Server查詢內(nèi)的查詢,并嵌入在WHERE子句中。 子查詢用于返回將在主查詢中使用的數(shù)據(jù)作為進(jìn)一步限制要檢索的數(shù)據(jù)的條件。

子查詢可以與SELECT,INSERT,UPDATE和DELETE語句以及諸如=,<,>,> =,<=,IN,BETWEEN等運(yùn)算符一起使用。

子查詢必須遵循幾個(gè)規(guī)則

  • 子查詢語句必須寫在括號內(nèi)。

  • 子查詢必須包括SELECT子句和FROM子句。

  • 子查詢可以使用WHERE,GROUP BY和HAVING子句。

  • 子查詢不能使用COMPUTE或FOR BROWSE子句。

  • 只有在使用了TOP子句時(shí),才能使用ORDER BY子句。

  • 您可以嵌套最多32個(gè)級別的子查詢。

帶SELECT語句的子查詢

語法

子查詢最常用于SELECT語句,以下是基本語法:

SELECT column_name [, column_name ] 
FROM   table1 [, table2 ] 
WHERE  column_name OPERATOR 
   (SELECT column_name [, column_name ] 
   FROM table1 [, table2 ] 
   [WHERE]) 

請參考具有以下記錄的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語句應(yīng)用以下子查詢:

SELECT *  
   FROM CUSTOMERS
   WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)

上述命令將產(chǎn)生以下結(jié)果集:

ID  NAME       AGE       ADDRESS          SALARY 
4   Chaitali   25        Mumbai           6500.00 
5   Hardik     27        Bhopal           8500.00 
7   Muffy      24        Indore           10000.00 

帶有INSERT語句的子查詢

子查詢也可以與INSERT語句一起使用。INSERT語句使用從子查詢返回的數(shù)據(jù)插入到另一個(gè)表中??梢允褂米址?,日期或數(shù)字函數(shù)中的任何一個(gè)修改子查詢中選定的數(shù)據(jù)。

語法

下面是基本的語法。

INSERT INTO table_name [ (column1 [, column2 ]) ] 
   SELECT [ *|column1 [, column2 ] 
   FROM table1 [, table2 ] 
   [ WHERE VALUE OPERATOR ]

創(chuàng)建一張命名為CUSTOMERS_BKP的表,表結(jié)構(gòu)與CUSTOMERS表相同,并將CUSTOMERS表的數(shù)據(jù)復(fù)制到CUSTOMERS_BKP表中。

以下是將完整的CUSTOMERS表數(shù)據(jù)復(fù)制到CUSTOMERS_BKP的語法:

INSERT INTO CUSTOMERS_BKP 
   SELECT * FROM CUSTOMERS  
   WHERE ID IN (SELECT ID FROM CUSTOMERS)

帶有UPDATE語句的子查詢

子查詢可以與UPDATE語句結(jié)合使用。 當(dāng)使用帶有UPDATE語句的子查詢時(shí),可以更新表中的單個(gè)或多個(gè)列。

語法

以下是基本語法。

UPDATE table 
SET column_name = new_value 
[ WHERE OPERATOR [ VALUE ] 
   (SELECT COLUMN_NAME 
   FROM TABLE_NAME) 
   [ WHERE) ] 

以下命令對CUSTOMERS表中AGE大于或等于27的所有客戶的SALARY乘以0.25。

UPDATE CUSTOMERS 
   SET SALARY = SALARY * 0.25 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )

上述命令將產(chǎn)生以下結(jié)果集:

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 

使用DELETE語句的子查詢

子查詢可以與DELETE語句一起使用,就像上面提到的任何其他語句一樣。

語法

以下是基本語法。

DELETE FROM TABLE_NAME 
[ WHERE OPERATOR [ VALUE ] 
   (SELECT COLUMN_NAME 
   FROM TABLE_NAME) 
   [ WHERE) ] 

以下命令將刪除CUSTOMERS表中所有的年齡大于或等于27的客戶的記錄。

DELETE FROM CUSTOMERS 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )

上述命令將產(chǎn)生以下結(jié)果集:

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 - 存儲過程

MS SQL Server存儲過程用于通過將相同的數(shù)據(jù)存儲在數(shù)據(jù)庫中來節(jié)省寫入代碼的時(shí)間,并通過傳遞參數(shù)獲得所需的輸出。

語法

以下是存儲過程創(chuàng)建的基本語法:

Create procedure <procedure_Name> 
As 
Begin 
<SQL Statement> 
End 
Go

請參考具有以下記錄的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數(shù)據(jù)庫中的CUSTOMERS表中獲取所有記錄的示例。

CREATE PROCEDURE SelectCustomerstabledata 
AS 
SELECT * FROM Testdb.Customers 
GO

上述命令將產(chǎn)生以下結(jié)果集:

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 - 事務(wù)

事務(wù)是針對數(shù)據(jù)庫執(zhí)行的工作單元。 事務(wù)是以邏輯順序完成的單元或工作序列,無論是以用戶的手動(dòng)方式還是以某種數(shù)據(jù)庫程序自動(dòng)進(jìn)行。

事務(wù)是將一個(gè)或多個(gè)執(zhí)行命令發(fā)送到數(shù)據(jù)庫。例如,你正在創(chuàng)建記錄,修改記錄或者從表中刪除記錄,這些行為都是對表進(jìn)行事務(wù)操作。事務(wù)對于確保數(shù)據(jù)完整性和處理數(shù)據(jù)庫錯(cuò)誤是非常重要的。

實(shí)際上,你常常會將許多SQL操作分成一組事務(wù)一起執(zhí)行。

事務(wù)屬性

事務(wù)具有以下四個(gè)標(biāo)準(zhǔn)屬性,通常由首字母縮寫ACID簡稱 -

  • 原子性 -確保工作單元內(nèi)的所有操作成功完成; 否則,事務(wù)在故障點(diǎn)處中止,并且先前的操作被回滾到它們的原先狀態(tài)。

  • 一致性 -確保數(shù)據(jù)庫在成功提交的事務(wù)后正確更改狀態(tài)。

  • 隔離性 -事務(wù)之間是獨(dú)立運(yùn)行互不相關(guān)的。

  • 持久性 -事務(wù)一旦被執(zhí)行,即使系統(tǒng)故障,其結(jié)果依然有效。

事務(wù)控制

一下命令用于控制事務(wù)

  • COMMIT-提交事務(wù)。

  • ROLLBACK -回滾事務(wù)。

  • SAVEPOINT -創(chuàng)建事務(wù)的回滾節(jié)點(diǎn)。

  • SET TRANSACTION -設(shè)置事務(wù)名稱。

事務(wù)控制命令僅與DML命令I(lǐng)NSERT,UPDATE和DELETE一起使用。 在創(chuàng)建表或刪除它們時(shí),不能使用它們,因?yàn)檫@些操作會在數(shù)據(jù)庫中自動(dòng)提交。

為了在MS SQL Server中使用事務(wù)控制命令,我們必須以“begin tran”或begin transaction命令開始事務(wù),否則這些命令將不起作用。

commit命令

COMMIT命令是用于將事務(wù)調(diào)用的更改保存到數(shù)據(jù)庫的事務(wù)命令。 此命令將自上次COMMIT或ROLLBACK命令以來將所有事務(wù)保存到數(shù)據(jù)庫。

語法

以下是COMMIT命令的語法。

COMMIT; 

請參考具有以下記錄的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表中刪除所有年齡等于25的用戶記錄。

Begin Tran 
DELETE FROM CUSTOMERS 
   WHERE AGE = 25 
COMMIT 

上述命令將產(chǎn)生以下結(jié)果集:

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命令

ROLLBACK命令是用于撤銷尚未保存到數(shù)據(jù)庫的事務(wù)的事務(wù)性命令。 此命令只能用于在發(fā)出最后一個(gè)COMMIT或ROLLBACK命令后撤消事務(wù)。

語法

以下是ROLLBACK命令的語法。

ROLLBACK

請參考具有以下記錄的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表中刪除年齡等于25的用戶記錄,然后使用ROLLBACK命令,回滾數(shù)據(jù)。

Begin Tran 
DELETE FROM CUSTOMERS 
   WHERE AGE = 25; 
ROLLBACK

使用ROLLBACK命令,刪除操作不會影響表中的數(shù)據(jù),執(zhí)行后CUSTOMERS表結(jié)果集如下:

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命令

SAVEPOINT命令可以使事務(wù)回滾到某個(gè)點(diǎn)節(jié)點(diǎn),而不回滾整個(gè)事務(wù)。

語法

以下是SAVEPOINT命令的語法。

SAVE TRANSACTION SAVEPOINT_NAME

此命令僅用于在事務(wù)語句之間創(chuàng)建SAVEPOINT。 ROLLBACK命令用于撤消一組事務(wù)。

以下是回滾到一個(gè)事務(wù)節(jié)點(diǎn)的語法。

ROLLBACK TO SAVEPOINT_NAME

在下面的示例中,我們將從CUSTOMERS表中刪除三個(gè)不同的記錄。 我們將在每次刪除之前創(chuàng)建一個(gè)SAVEPOINT,以便我們可以隨時(shí)將ROLLBACK任何SAVEPOINT返回到其原始狀態(tài)的相應(yīng)數(shù)據(jù)。

請參考具有以下記錄的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.

三個(gè)刪除已經(jīng)發(fā)生,但是,我們改變了主意,決定ROLLBACK到SAVEPOINT,我們確定為SP2。 因?yàn)镾P2是在第一次刪除后創(chuàng)建的,所以最后兩個(gè)刪除被撤消

ROLLBACK Transaction SP2 
Rollback complete. 

請注意,我們回滾到SP2后,相當(dāng)于只發(fā)生了第一次刪除。

SELECT * FROM CUSTOMERS 

查詢后的結(jié)果為6條記錄:

ID  NAME       AGE       ADDRESS          SALARY 
2   Khilan     25        Ahmedabad        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 

SET TRANSACTION命令

SET TRANSACTION命令可用于啟動(dòng)數(shù)據(jù)庫事務(wù)。 此命令用于指定隨后事務(wù)的特性。

語法

以下是SET TRANSACTION語法。

SET TRANSACTION ISOLATION LEVEL <Isolationlevel_name>

T-SQL - 索引

索引是數(shù)據(jù)庫搜索引擎用來加速數(shù)據(jù)檢索的特殊查找表。 簡單地說,一個(gè)索引是一個(gè)指向表中數(shù)據(jù)的指針。 數(shù)據(jù)庫中的索引與書本目錄的索引方式非常相似。

例如,如果您要引用一本書中討論某個(gè)主題的所有頁面,則可以參考索引,該索引按字母順序列出所有主題,然后指定了這些主題的頁碼。

索引加快了SELECT查詢和WHERE子句,但它降低了UPDATE和INSERT語句的數(shù)據(jù)輸入速度。創(chuàng)建或刪除索引不會對數(shù)據(jù)有影響。

創(chuàng)建索引涉及CREATE INDEX語句,它允許你對索引進(jìn)行命名,指定表和要索引的列,并指示索引是按升序還是按降序排列。

索引也可以是唯一的,類似于UNIQUE約束,索引防止在具有索引的列的組合中出現(xiàn)重復(fù)條目。

CREATE INDEX命令

以下是CREATE INDEX的基本語法。

語法

CREATE INDEX index_name ON table_name

單列索引

單列索引是基于僅一個(gè)表的單列創(chuàng)建的索引。以下是基本語法。

語法

CREATE INDEX index_name 
ON table_name (column_name)

CREATE INDEX singlecolumnindex 
ON customers (ID)

唯一索引

唯一索引不僅用于查找性能的提升,還可用于約束數(shù)據(jù)的完整性。唯一索引不允許將任何重復(fù)值插入到表中。以下是基本語法。

語法

CREATE UNIQUE INDEX index_name 
on table_name (column_name)

CREATE UNIQUE INDEX uniqueindex 
on customers (NAME)

復(fù)合索引

復(fù)合索引是對表的兩個(gè)或多個(gè)列設(shè)置索引。以下是基本語法。

語法

CREATE INDEX index_name on table_name (column1, column2) 

CREATE INDEX compositeindex 
on customers (NAME, ID)

無論是創(chuàng)建單列索引還是復(fù)合索引,請考慮您可能在查詢的WHERE子句中頻繁使用的列作為過濾條件。

如果只使用一列,則應(yīng)該選擇單列索引。 如果在WHERE子句中經(jīng)常使用兩個(gè)或多個(gè)列作為過濾器,則復(fù)合索引將是最佳選擇。

隱式索引

隱式索引是在創(chuàng)建對象時(shí)由數(shù)據(jù)庫服務(wù)器自動(dòng)創(chuàng)建的索引。 一般情況下數(shù)據(jù)庫會將自動(dòng)為主鍵約束和唯一約束創(chuàng)建索引。

DROP INDEX命令

可以使用MS SQL SERVER DROP命令刪除索引。 丟棄索引時(shí)應(yīng)小心,因?yàn)樾阅芸赡軙p慢,也可能得到改善。

語法

下面是基本的語法。

DROP INDEX tablename.index_name

什么時(shí)候避免索引?

雖然索引旨在提高數(shù)據(jù)庫的性能,但有時(shí)應(yīng)避免使用它們。以下幾種情況應(yīng)重新考慮是否使用索引

  • 不應(yīng)在小表上使用索引。

  • 經(jīng)常進(jìn)行大批量更新或插入操作的表不應(yīng)設(shè)置索引。

  • 不應(yīng)在可能含大量NULL值的列上使用索引。

  • 頻繁操作的列不應(yīng)設(shè)置索引。

T-SQL - 函數(shù)

MS SQL Server有許多內(nèi)置功能上的字符串或數(shù)字?jǐn)?shù)據(jù)進(jìn)行處理。下面是所有有用的SQL內(nèi)置函數(shù)列表 -

  • SQL Server的計(jì)數(shù)功能 -在SQL Server COUNT聚合函數(shù)用于計(jì)算在數(shù)據(jù)庫表中的行數(shù)。

  • SQL Server的max函數(shù) -在SQL Server MAX聚合功能可以選擇某列的最高(最大)值。

  • SQL Server的MIN功能 -在SQL Server MIN聚合函數(shù)允許選擇了某列的最低(最?。┲怠?

  • SQL Server的AVG功能 -在SQL Server AVG聚合函數(shù)選擇對某些表列的平均值。

  • SQL Server的SUM函數(shù) -在SQL Server SUM聚合函數(shù)允許選擇總讓數(shù)字列。

  • SQL Server的SQRT功能 -這用于產(chǎn)生一個(gè)給定數(shù)目的平方根。

  • SQL Server的RAND函數(shù) -這是用于產(chǎn)生使用SQL命令的隨機(jī)數(shù)。

  • SQL Server的concat函數(shù) -這是用來連接多個(gè)參數(shù)的參數(shù)。

  • SQL Server的數(shù)值函數(shù) -在SQL處理數(shù)字所需的SQL功能的完整列表。

  • SQL Server的字符串函數(shù) -來操作字符串在SQL需要SQL函數(shù)的完整列表。

T-SQL - 字符串函數(shù)

SQLServer字符串函數(shù)掃描應(yīng)用于字符串值,或返回字符串值或數(shù)字?jǐn)?shù)據(jù)。

下面是帶有示例的String函數(shù)列表。

ASCII()

ASCII代碼值將作為字符表達(dá)式的輸出。

以下查詢將給出給定字符的ASCII代碼值。

Select ASCII ('word') 

CHAR()

字符將作為給定ASCII代碼或整數(shù)的輸出。

以下查詢將給出給定整數(shù)的字符。

Select CHAR(97)

NCHAR()

Unicode字符將作為給定整數(shù)的輸出。

以下查詢將給出給定整數(shù)的Unicode字符。

Select NCHAR(300)

CHARINDEX()

給定搜索表達(dá)式的起始位置將作為給定字符串表達(dá)式中的輸出。

以下查詢將給出給定字符串表達(dá)式“KING”的“G”字符的起始位置。

Select CHARINDEX('G', 'KING')

LEFT()

給定字符串的左邊部分,直到指定的字符數(shù)作為給定字符串的輸出。

下面的查詢將給出“WORLD”字符串作為字符串給定字符串'WORLD'的4個(gè)字符。

Select LEFT('WORLD', 4)

RIGHT()

給定字符串的右邊部分,直到指定的字符數(shù)作為給定字符串的輸出。

下面的查詢將給出'DIA'字符串3個(gè)給定字符串'INDIA'的字符數(shù)。

Select RIGHT('INDIA', 3)

SUBSTRING()

基于開始位置值和長度值的字符串的一部分將作為給定字符串的輸出。

以下查詢將給出分別對于給定字符串“WORLD”提供(1,3),(3,3)和(2,3)作為開始和長度值的“WOR”,“DIA”,“ING” ,'INDIA'和'KING'。

Select SUBSTRING ('WORLD', 1,3) 
Select SUBSTRING ('INDIA', 3,3) 
Select SUBSTRING ('KING', 2,3)

LEN()

字符數(shù)將作為給定字符串表達(dá)式的輸出。

以下查詢將為5提供“HELLO”字符串表達(dá)式。

Select LEN('HELLO') 

LOWER()

小寫字符串將作為給定字符串?dāng)?shù)據(jù)的輸出。

以下查詢將為'SQL Server'字符數(shù)據(jù)提供'sql server'。

Select LOWER('SQLServer') 

UPPER()

大寫字符串將作為給定字符串?dāng)?shù)據(jù)的輸出。

以下查詢將為“Sql Server”字符數(shù)據(jù)提供“SQL SERVER”。

Select UPPER('SqlServer')

LTRIM()

字符串表達(dá)式將在刪除前導(dǎo)空白后作為給定字符串?dāng)?shù)據(jù)的輸出。

以下查詢將為“WORLD”字符數(shù)據(jù)提供“WORLD”。

Select LTRIM('   WORLD')

RTRIM()

字符串表達(dá)式將在刪除尾部空格后作為給定字符串?dāng)?shù)據(jù)的輸出。

下面的查詢將給出'INDIA'字符數(shù)據(jù)的'INDIA'。

Select RTRIM('INDIA   ') 

REPLACE()

在用指定字符替換指定字符的所有出現(xiàn)后,字符串表達(dá)式將作為給定字符串?dāng)?shù)據(jù)的輸出。

以下查詢將為'INDIA'字符串?dāng)?shù)據(jù)提供'KNDKA'字符串。

Select REPLACE('INDIA', 'I', 'K')

REPLICATE()

重復(fù)字符串表達(dá)式將作為指定次數(shù)的給定字符串?dāng)?shù)據(jù)的輸出。

以下查詢將為“WORLD”字符串?dāng)?shù)據(jù)提供“WORLDWORLD”字符串。

Select REPLICATE('WORLD', 2)

REVERSE()

反向字符串表達(dá)式將作為給定字符串?dāng)?shù)據(jù)的輸出。

下面的查詢將給出'WORLD'字符串?dāng)?shù)據(jù)的'DLROW'字符串。

Select REVERSE('WORLD')

SOUNDEX()

返回四字符(SOUNDEX)代碼,以評估兩個(gè)給定字符串的相似性。

下面的查詢將為'Smith','Smyth'字符串給出'S530'。

Select SOUNDEX('Smith'), SOUNDEX('Smyth')

DIFFERENCE()

整數(shù)值將作為給定的兩個(gè)表達(dá)式的輸出。

以下查詢將給出4個(gè)“Smith”,“Smyth”表達(dá)式。

Select Difference('Smith','Smyth') 

 -如果輸出值為0,表示給定2個(gè)表達(dá)式之間的相似度較弱或沒有相似性。

SPACE()

字符串來作為的空格指定數(shù)量的輸出。

下面的查詢將給出'I LOVE INDIA'。

Select 'I'+space(1)+'LOVE'+space(1)+'INDIA'

STUFF()

字符串表達(dá)式將作為給定字符串?dāng)?shù)據(jù)的輸出,在從起始字符替換為指定字符的指定長度之后。

下面的查詢將給出'ABCDEFGH'字符串?dāng)?shù)據(jù)的'AIJKFGH'字符串作為給定的起始字符和長度分別為2和4,'IJK'作為指定的目標(biāo)字符串。

Select STUFF('ABCDEFGH', 2,4,'IJK') 

STR()

字符數(shù)據(jù)將作為給定數(shù)字?jǐn)?shù)據(jù)的輸出。

以下查詢將給定187.37的187.37,基于指定的長度為6和十進(jìn)制為2。

Select STR(187.369,6,2) 

UNICODE()

整數(shù)值將作為給定表達(dá)式的第一個(gè)字符的輸出。

以下查詢將為82提供“RAMA”表達(dá)式。

Select UNICODE('RAMA') 

QUOTENAME()

給定字符串將作為輸出與指定的分隔符。

以下查詢將為給定的“RAMA”字符串指定“RAMA”,因?yàn)槲覀冎付p引號作為分隔符。

Select QUOTENAME('RAMA','"') 

PATINDEX()

需要從指定的“I”位置的給定表達(dá)式開始第一個(gè)出現(xiàn)的位置。

下面的查詢將給出'INDIA'的1。

Select PATINDEX('I%','INDIA') 

FORMAT()

給定表達(dá)式將作為具有指定格式的輸出。

下面的查詢將給出'星期一,2015年11月16日'的getdate函數(shù)按照指定的格式,'D'表示星期名稱。

SELECT FORMAT ( getdate(), 'D') 

CONCAT()

單個(gè)字符串將作為輸出,連接給定的參數(shù)值后。

以下查詢將給出給定參數(shù)的'A,B,C'。

Select CONCAT('A',',','B',',','C') 

T-SQL - 日期函數(shù)

以下是MS SQL Server中的日期函數(shù)列表。

GETDATE()

它將返回當(dāng)前日期和時(shí)間。

語法

上述函數(shù)的語法:

GETDATE()

以下查詢將返回當(dāng)前日期以及MS SQL Server中的時(shí)間。

Select getdate() as currentdatetime

DATEPART()

它將返回日期或時(shí)間的一部分。

語法

上述函數(shù)的語法:

DATEPART(datepart, datecolumnname)

示例1 -以下查詢將返回MS SQL Server中當(dāng)前日期的一部分。

Select datepart(day, getdate()) as currentdate

示例2 -以下查詢將返回當(dāng)前月份在MS SQL Server中的部分。

Select datepart(month, getdate()) as currentmonth

DATEADD()

它將通過加或減日期和時(shí)間間隔顯示日期和時(shí)間。

語法

上述函數(shù)的語法:

DATEADD(datepart, number, datecolumnname)

以下查詢將返回MS SQL Server中當(dāng)前日期和時(shí)間之后10天的日期和時(shí)間。

Select dateadd(day, 10, getdate()) as after10daysdatetimefromcurrentdatetime 

DATEDIFF()

它將顯示兩個(gè)日期之間的日期和時(shí)間。

語法

上述函數(shù)的語法:

DATEDIFF(datepart, startdate, enddate)

以下查詢將返回MS SQL Server中2015-11-16和2015-11-11之間的時(shí)間差異。

Select datediff(hour, 2015-11-16, 2015-11-11) as 
differencehoursbetween20151116and20151111 

CONVERT()

它將以不同的格式顯示日期和時(shí)間。

語法

上述函數(shù)的語法:

CONVERT(datatype, expression, style)

以下查詢將以不同格式在MS SQL Server中返回日期和時(shí)間。

SELECT CONVERT(VARCHAR(19),GETDATE()) 
SELECT CONVERT(VARCHAR(10),GETDATE(),10) 
SELECT CONVERT(VARCHAR(10),GETDATE(),110)

T-SQL - 數(shù)值函數(shù)

MS SQL Server數(shù)字函數(shù)可以應(yīng)用于數(shù)值數(shù)據(jù),并返回?cái)?shù)值數(shù)據(jù)。

下面是帶有示例的數(shù)值函數(shù)列表。

ABS()

輸出給定值的絕對值。

以下查詢將輸出-22的絕對值:22。

Select ABS(-22)

ACOS()

輸出給定值的反余弦值。

以下查詢將輸出0的反余弦值:1.5707963267948966。

Select ACOS(0)

ASIN()

輸出給定值的正弦值。

以下查詢將輸出0的正弦值:0。

Select ASIN(0)

ATAN()

輸出給定值的反正切值。

以下查詢將輸出0的反正切值:0。

Select ATAN(0)

ATN2()

輸出給定值的方位角,也可以理解為計(jì)算復(fù)數(shù) x+yi 的幅角。

以下查詢將輸出(0,-1)的方位角:0。

Select ATN2(0, -1)

請參考具有以下記錄的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 

BETWEEN()

輸出給定的兩個(gè)表達(dá)式之間的值。

以下實(shí)例將輸出薪水區(qū)間在2000到8500之間的所有薪水值:

SELECT salary from customers where salary between 2000 and 8500

上述命令將產(chǎn)生以下結(jié)果集:

salary 
2000.00 
2000.00 
6500.00 
8500.00 
4500.00

MIN()

輸出給定參數(shù)的最小值。

以下查詢將給出customers表中'salary'最低值'1500.00'。

Select MIN(salary)from CUSTOMERS

MAX()

輸出給定參數(shù)的最大值。

以下查詢將給出customers表中'salary'最大值'10000.00'。

Select MAX(salary)from CUSTOMERS

SQRT()

輸出給定值的平方根。

以下查詢將輸出4的平方根:2。

Select SQRT(4)

PI()

該函數(shù)會輸出PI(Π)的值。

下面的查詢將輸出3.14159265358979

Select PI()

CEILING()

給定值向上舍入(正向無窮大的方向)后輸出。

下面的查詢將輸出124。

Select CEILING(123.25)

FLOOR()

給定值向下舍入(正向無窮小的方向)后輸出。

下面的查詢將輸出123。

Select FLOOR(123.25) 

LOG()

輸出給定值的對數(shù)。

下面的查詢將輸出0。

Select LOG(1) 

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號