SQL Server學習筆記-T-SQL基本語句
T-SQL基本語句
基本的SELECT語句
Select語句的基本語法規則
SELECT [ALL|DISTINCT] [TOP (<expression>) [PERCENT] [WITH TIES]] FROM <source table(s)/view(s)>] [WHERE <restrictive condition>] [GROUP BY <column name or expression using a column in the SELECT list>] [HAVING <restrictive condition based on the GROUP BY results] [ORDER BY <column list>] [[FOR XML {RAW|AUTO|EXPLICIT|PATH [(<element>)]} [, XMLDATA] [, ELEMENTS][, BINARY base 64]] [OPTION (<query hint>, [, ...n])]
INFORMATION_SCHEMA
是特定的訪問路徑,用於顯示系統資料庫及其內容的相關元資料.
SELECT * FROM INFORMATION_SCHEMA.TABLES;
- MSSQL中的表名的規範為
資料庫名.構架名.表名
.
WHERE子句
- 使用範例
SELECT Name, ProductNumber, ReorderPoint
FROM Production.Product
WHERE ProductID = 356;
WHERE子句的運算子
運算子 示例用法 功能 =, >, <, >=, <=,<>,!=,!>,!< 標準的比較運算子 (1)!=和<>都表示"不相等".而 !< 和 !> 分別表示 "不小於" 和 "不大於" AND,OR,NOT 標準布林邏輯運算子. BETWEEN 在某個範圍之間.閉區間.指定的只可以為列名,變數或字面量. LIKE 可使用%和_作為萬用字元.%表示可以代替任意長度的任意字元. _表示可以代替任意單個字元.[]符號用於指定一個字元,字串或範圍.^運算子表示下一個字元是要被排除的. IN 關鍵字IN表示Column1在列表中則返回TRUE, IN關鍵字常用於子查詢 ALL, ANY, SOME <column|expression>(比較運算子) <ANY|SOME>(子查詢) 子查詢中的全部值/任意值滿足比較運算子的條件時返回true.ALL指示表示式要匹配結果集中的所有值.ANY和SOME功能相似,在表示式匹配結果集中的任意值時返回TRUE. EXISTS EXISTS(子查詢) 子查詢返回至少一行記錄時為TRUE. ORDER BY子句
ORDER BY子句用來返回資料的排列順序.
SELECT Name, ProductNumber, ReorderPoint FROM Production.Product ORDER BY ProductNumber;DESC
使用
DESC
降序排序
使用GROUP BY子句聚合資料
GROUP BY
子句用於聚合資訊.
SELECT SalesOrderID, SUM(OrderQty) FROM Sales.SalesOrderDetail WHERE SalesOrderID IN (43660, 43670, 43672) GROUP BY SalesOrderID;
在使用GROUP BY子句時, SELECT列表中所有列必須為聚合列(SUM, MIN, MAX, AVG等)或是GROUP BY子句中包括的列.
如果在SELECT列表中使用聚合列,SELECT列表必須只包含聚合列,否則必須有一個GROUP BY子句.
SELECT CustomerID, SalesPersonID, COUNT(*) FROM Sales.SalesOrderHeader WHERE CustomerID <= 11010 GROUP BY CustomerID, SalesPersonID;
聚合函式
聚合函式常用於GROUP BY子句,用於聚合分組的資料.
AVG函式用於計算平均值.
SELECT SalesOrderID, AVG(OrderQty) AS AVG FROM Sales.SalesOrderDetail WHERE SalesOrderID IN (43660, 43670, 43672) GROUP BY SalesOrderID;
MIN/MAX用於計算選擇列分組的最小值與最大值.
SELECT SalesOrderID, MIN(OrderQty) AS MinOrder, Max(OrderQty) AS MaxOrder FROM Sales.SalesOrderDetail WHERE SalesOrderID IN (43660, 43670, 43672) GROUP BY SalesOrderID;
COUNT(表示式|*)函式用於計算查詢中返回的行數.返回結果沒有預設的列名,需要指定別名.
SELECT COUNT(*) FROM HumanResources.Employee WHERE HumanResources.Employee.BusinessEntityID = 5;
除了COUNT(*)函式外,所有的聚合函式都忽略NULL值.
使用HAVING子句給分組設定條件
HAVING子句僅用於帶有GROUP BY子句的查詢語句中,用於分組後進行條件查詢.
SELECT ManagerID AS Manager, COUNT(*) AS Reports FROM HumanResources.Employee2 WHERE Employee != 5 GROUP BY ManagerID HAVING COUNT(*) > 3;
DISTINCT和ALL謂詞
- 鍵是資料庫的一個術語,用於描述一列或多列,這些列用於標識表中的一行.
- 主鍵是能唯一標識行的一列或列組.
- DISTINCT謂詞可以過濾重複的行.
- ALL謂詞可以包括所有的行.ALL是任意SELECT語句的預設值.
使用INSERT語句新增資料
INSERT語句語法結構
INSERT [TOP (<expression>) [PERCEENT]] [INTO] <tabular object> [(<column list>)] [OUTPUT <output clause>] [VALUES (<data values>) [, (<data values)] [, ..n] | <table source> | EXEC <procedure> | DEFAULT VALUES
DEFAULT關鍵字告訴SQL Server為該列使用預設值.(如果沒有預設值,則會出錯)
儲存過程
sp_help
的功能是給出任意資料庫物件,使用者自定義資料型別或SQL Sever資料型別資訊.- 檢視Sales表屬性:
EXEC sp_help Sales
- 檢視Sales表屬性:
INSERT INTO...SELECT語句
INSERT INTO...SELECT
語句可以完成一次插入一個數據塊的內容.語法結構
INSERT INTO <table name> [<column list>] <SELECT statement>
使用示例
DECLARE @MyTable Table ( SalesOrderID int, CustomerID char(5) ) INSERT INTO @MyTable SELECT SalesOrderID, CustomerID FROM AdventureWorks2017.Sales.SalesOrderHeader WHERE SalesOrderID BETWEEN 44000 AND 44010;
用UPDATE語句更改獲得的資料
語法
UPDATE [TOP (<expression>) [PERCENT]] <tabular object> SET <column> = <value> [,WRITE(<expression>, <offset>, <length>)] [, <column> = <value> [,WRITE(<expression>, <offset>, <length>)]] [ OUTPUT <output clause> ] [FROM <source table(s)>] [WHERE <restrictive condition>]
使用範例
UPDATE Stores SET City = 'There' WHERE StoreCode = 'TEST';
DELETE語句
語法
DELETE [TOP (<expression>) [PERCENT]] [FROM] <tabular object> [OUTPUT <output clause>] [FROM <table or join condition>] [WHERE <search condition> | CURRENT OF [GLOBAL] <cursor name>]
使用範例
DELETE Stores WHERE StoreCode = 'TEST';
練習題
編寫輸出AdventureWorks資料庫的Product表(Production模式中)所有行和列的資料的查詢語句.
SELECT * FROM AdventureWorks2017.Production.Product;
修改練習1的查詢語句,僅搜尋無 ProductionSubcategoryID的產品(提示: 有209個產品,需要搜尋NULL值)
SELECT * FROM AdventureWorks2017.Production.Product WHERE ProductSubcategoryID IS NULL;
在AdventureWorks資料庫的Location表(Production模式中)新增一行.
INSERT INTO AdventureWorks2017.Production.Location(Name, CostRate, Availability, ModifiedDate) values('King Oliver', 12.31, 22.31, GETDATE());
刪除剛剛新增的行
DELETE FROM AdventureWorks2017.Production.Location WHERE Name='King Oliver';