1. 程式人生 > >SQL Server學習筆記-T-SQL基本語句

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

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';