INSERT SELECT UPDATE 刪除資料操作語言的基礎知識

D ata M anipulation L anguage(簡稱 DML)包括 INSERTUPDATEDELETE 等操作:

-- Create a table HelloWorld

CREATE TABLE HelloWorld (
    Id INT IDENTITY,
    Description VARCHAR(1000)
)

-- DML Operation INSERT, inserting a row into the table
INSERT INTO HelloWorld (Description) VALUES ('Hello World')

-- DML Operation SELECT, displaying the table 
SELECT * FROM HelloWorld  

-- Select a specific column from table
SELECT Description FROM HelloWorld

-- Display number of records in the table
SELECT Count(*) FROM HelloWorld

-- DML Operation UPDATE, updating a specific row in the table
UPDATE HelloWorld SET Description = 'Hello, World!' WHERE Id = 1

-- Selecting rows from the table (see how the Description has changed after the update?)
SELECT * FROM HelloWorld

-- DML Operation - DELETE, deleting a row from the table
DELETE FROM HelloWorld WHERE Id = 1

-- Selecting the table. See table content after DELETE operation 
SELECT * FROM HelloWorld

在這個指令碼中,我們建立了一個表來演示一些基本查詢。

以下示例顯示瞭如何查詢表:

USE Northwind;
GO
SELECT TOP 10 * FROM Customers 
ORDER BY CompanyName

將選擇 Customer 表的前 10 條記錄,由資料庫 Northwind(這是 Microsoft 的樣本資料庫之一,可從 此處 下載 ) 列 CompanyName 排序 :

https://i.stack.imgur.com/6xeX4.jpg

請注意Use Northwind; 會更改所有後續查詢的預設資料庫。你仍然可以使用[Database]形式的完全限定語法來引用資料庫。[Schema]。[Table]:

SELECT TOP 10 * FROM Northwind.dbo.Customers 
ORDER BY CompanyName

SELECT TOP 10 * FROM Pubs.dbo.Authors
ORDER BY City

如果你要查詢來自不同資料庫的資料,這將非常有用。請注意,指定介於兩者之間dbo 稱為模式,需要在使用完全限定語法時指定。你可以將其視為資料庫中的資料夾。dbo 是預設架構。可以省略預設模式。需要指定所有其他使用者定義的模式。

如果資料庫表包含名為保留字的列,例如 Date,則需要將列名括在括號中,如下所示:

-- descending order
SELECT TOP 10 [Date] FROM dbo.MyLogTable
ORDER BY [Date] DESC

如果列名在其名稱中包含空格(不建議這樣做),則同樣適用。另一種語法是使用雙引號而不是方括號,例如:

-- descending order
SELECT top 10 "Date" from dbo.MyLogTable
order by "Date" desc 

相當但不常用。注意雙引號和單引號之間的區別:單引號用於字串,即

-- descending order
SELECT top 10 "Date" from dbo.MyLogTable
where UserId='johndoe'
order by "Date" desc 

是一種有效的語法。請注意,T-SQL 為 NChar 和 NVarchar 資料型別提供了 N 字首,例如

SELECT TOP 10 * FROM Northwind.dbo.Customers 
WHERE CompanyName LIKE N'AL%'
ORDER BY CompanyName

返回所有公司名稱以 AL 開頭的公司(%是一張外卡,使用它就像在 DOS 命令列中使用星號一樣,例如 DIR AL*)。對於 LIKE,有幾個可用的萬用字元,請檢視 此處 以瞭解更多詳細資訊。

加盟

如果要查詢一個表中不存在但在多個表中不存在的欄位,則聯接很有用。例如:你想要查詢 Northwind 資料庫中 Region 表中的所有列。但是你注意到你還需要 RegionDescription,它存放在一個不同的表中,Region。但是,有一個公共金鑰 RgionID,你可以使用它在單個查詢中組合此資訊,如下所示(Top 5 只返回前 5 行,省略它以獲取所有行):

SELECT TOP 5 Territories.*, 
    Regions.RegionDescription 
FROM Territories 
INNER JOIN Region 
    ON Territories.RegionID=Region.RegionID
ORDER BY TerritoryDescription

將顯示 Territories 的所有列以及 RegionRegionDescription 列。結果由 TerritoryDescription 訂購。

表別名

當你的查詢需要引用兩個或更多表時,你可能會發現使用表別名很有用。表別名是對可用於代替完整表名的表的簡寫引用,並且可以減少鍵入和編輯。使用別名的語法是:

<TableName> [as] <alias>

as 是一個可選的關鍵字。例如,以前的查詢可以重寫為:

SELECT TOP 5 t.*, 
    r.RegionDescription 
FROM Territories t
INNER JOIN Region r 
    ON t.RegionID = r.RegionID
ORDER BY TerritoryDescription

對於查詢中的所有表,別名必須是唯一的,即使你使用同一個表兩次。例如,如果你的 Employee 表包含 SupervisorId 欄位,則可以使用此查詢返回員工及其主管的姓名:

SELECT e.*, 
    s.Name as SupervisorName -- Rename the field for output
FROM Employee e
INNER JOIN Employee s
    ON e.SupervisorId = s.EmployeeId
WHERE e.EmployeeId = 111

聯合

正如我們之前看到的,Join 會新增來自不同表源的列。但是,如果要組合來自不同來源的行,該怎麼辦?在這種情況下,你可以使用 UNION。假設你正計劃參加一個聚會,並且不僅希望邀請員工,還希望邀請客戶。然後你可以執行這個查詢來做到這一點:

SELECT FirstName+' '+LastName as ContactName, Address, City FROM Employees
UNION
SELECT ContactName, Address, City FROM Customers

它將在一個表中返回員工和客戶的姓名,地址和城市。請注意,重複的行(如果應該有的話)會自動消除(如果你不想這樣,請使用 UNION ALL 代替)。列號,列名,順序和資料型別必須與作為聯合一部分的所有 select 語句匹配 - 這就是第一個 SELECT 將 FirstNameLastName 從 Employee 組合到 ContactName 的原因。

表變數

如果你需要處理臨時資料(特別是在儲存過程中),使用表變數可能很有用:真實表和表變數之間的區別在於它只存在於記憶體中以進行臨時處理。

例:

DECLARE @Region TABLE
(
  RegionID int, 
  RegionDescription NChar(50)
)

在記憶體中建立一個表。在這種情況下,@ 字首是必需的,因為它是一個變數。你可以執行上面提到的所有 DML 操作來插入,刪除和選擇行,例如

INSERT INTO @Region values(3,'Northern')
INSERT INTO @Region values(4,'Southern')

但通常情況下,你會根據真實的表格來填充它

INSERT INTO @Region
SELECT * FROM dbo.Region WHERE RegionID>2;

它將讀取真實表 dbo.Region 中的過濾值並將其插入到記憶體表 @Region 中 - 它可以用於進一步處理。例如,你可以在類似的連線中使用它

SELECT * FROM Territories t
JOIN @Region r on t.RegionID=r.RegionID

在這種情況下,將返回所有 NorthernSouthern 地區。更多詳細資訊可以在這裡找到。如果你有興趣閱讀有關該主題的更多資訊,請在此處討論臨時表。

注意: 如果表變數中的資料行數小於 100,Microsoft 僅建議使用表變數。如果要處理大量資料,請使用臨時表或臨時表。