課程 1:建立及查詢資料庫物件

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Analytics Platform System (PDW)

注意

使用 Transact-SQL 開始查詢學習路徑提供更深入的內容,以及實際範例。

這一課會示範如何建立資料庫、在資料庫中建立資料表,然後在資料表中存取和變更資料。 因為這一課是使用 Transact-SQL 的簡介,所以並不會使用或描述這些陳述式所能使用的許多選項。

您可以透過下列方式撰寫 Transact-SQL 陳述式並提交給資料庫:

  • 使用 SQL Server Management Studio。 此教學課程會假設您正在使用 Management Studio,但您也可以使用 Management Studio Express,該版本可從 Microsoft 下載中心免費下載。

  • 使用 sqlcmd 公用程式。

  • 從您建立的應用程式連接。

不論您提交程式碼陳述式的方式為何,這個程式碼在資料庫引擎上都會以相同的方式和相同的權限來執行。

若要在 Management Studio 中執行 Transact-SQL 陳述式,請開啟 Management Studio 並連線到 SQL Server 資料庫引擎的執行個體。

必要條件

若要完成本教學課程,您需要 SQL Server Management Studio 和 SQL Server 執行個體存取權。

如果您沒有 SQL Server 執行個體,請建立一個。 請從下列連結選取平台來建立 SQL Server 執行個體。 若您選擇 SQL 驗證,請使用您的 SQL Server 登入認證。

建立資料庫

和許多 Transact-SQL 陳述式一樣,CREATE DATABASE 陳述式也有一個必要參數,那就是資料庫的名稱。 CREATE DATABASE 也有許多選擇性參數,例如要用來放置資料庫檔案的磁碟位置。 當執行 CREATE DATABASE 但未指定選擇性參數時,SQL Server 針對這些參數的大部分會使用預設值。

  1. 在查詢編輯器視窗中,鍵入下列程式碼 (但不要執行):

    CREATE DATABASE TestData
    GO
    
  2. 使用指標選取 CREATE DATABASE這兩個字,然後按 F1鍵。 CREATE DATABASE 文章應該會開啟。 您可使用此技術來找到 CREATE DATABASE,以及在這個教學課程中所使用的其他陳述式完整語法。

  3. 在 [查詢編輯器] 中按 F5 ,執行陳述式並建立名為 TestData的資料庫。

當您建立資料庫時,SQL Server 會建立 model 資料庫的複本,並將此複本重新命名為資料庫名稱。 除非您在選擇性參數中指定了非常大的資料庫初始大小,否則這項作業應該只需要幾秒鐘的時間。

注意

如果在單一批次中提交了一個以上的陳述式,可用關鍵字 GO 來分隔陳述式; 如果批次中只包含一個陳述式,則 GO 可有可無。

建立表格

適用於:SQL ServerAzure SQL DatabaseAzure Synapse AnalyticsAnalytics Platform System (PDW)

若要建立資料表,您必須提供資料表的名稱,以及資料表中各資料行的名稱和資料類型, 最好也能指出各資料行中是否允許有 Null 值。 若要建立資料表,您必須擁有 CREATE TABLE 權限,以及將包含資料表之結構描述的 ALTER SCHEMA 權限。 db_ddladmin 固定資料庫角色具有這些權限。

大多數資料表都具有由資料表中一或多個資料行組成的主索引鍵。 主索引鍵一定是唯一的。 資料庫引擎會強制執行限制,讓資料表中的所有主索引鍵值都不能重複。

如需資料類型清單及各自描述的連結,請參閱資料類型 (Transact-SQL)

注意

資料庫引擎可以安裝為區分大小寫或不區分大小寫。 如果將資料庫引擎安裝為區分大小寫,則物件名稱的大小寫一定要完全相同。 例如,名稱為 OrderData 的資料表與名稱為 ORDERDATA 的資料表會代表不同的資料表。 如果將資料庫引擎安裝為不區分大小寫,則會將這兩個資料表名稱視為代表同一個資料表,而且該名稱只能使用一次。

將查詢編輯器連接切換到 TestData 資料庫

在 [查詢編輯器] 視窗中,輸入並執行下列程式碼,將連接變更為 TestData 資料庫。

USE TestData
GO

建立資料表

在 [查詢編輯器] 視窗中鍵入並執行下列程式碼,以建立名為 Products 的資料表。 此資料表中的資料行名稱分別為 ProductIDProductNamePriceProductDescriptionProductID 資料行是此資料表的主索引鍵。 intvarchar(25)moneyvarchar(max) 全部都是資料類型。 在插入或變更資料列時,只有 PriceProductionDescription 資料行可以不含任何資料。 這個陳述式包含一個選擇性的元素 (dbo.),稱為「結構描述」。 結構描述就是擁有資料表的資料庫物件。 如果您是系統管理員,則 dbo 是預設的結構描述。 dbo 代表資料庫擁有者。

CREATE TABLE dbo.Products
    (ProductID int PRIMARY KEY NOT NULL,
    ProductName varchar(25) NOT NULL,
    Price money NULL,
    ProductDescription varchar(max) NULL)
GO

在資料表中插入及更新資料

既然您現在建立好 Products 資料表,就可以準備使用 INSERT 陳述式,將資料插入資料表。 在插入資料後,您將使用 UPDATE 陳述式來變更資料列的內容。 使用 UPDATE 陳述式的 WHERE 子句,限制只更新單一資料列。 四個陳述式將輸入下列資料。

ProductID ProductName 價格 ProductDescription
1 Clamp 12.48 Workbench clamp
50 Screwdriver 3.17 Flat head
75 Tire Bar Tool for changing tires.
3000 3 mm Bracket 0.52

基本語法包括:INSERT、資料表、資料行清單、VALUES 以及要插入的值清單。 程式行前面的兩個連字號,代表該程式行是註解,而且編譯器會忽略這行文字。 在本案例中,註解說明所允許的語法變化。

將資料插入資料表中

  1. 執行下列陳述式,將資料列插入上一項工作中建立的 Products 資料表。

    -- Standard syntax
    INSERT dbo.Products (ProductID, ProductName, Price, ProductDescription)
        VALUES (1, 'Clamp', 12.48, 'Workbench clamp')
    GO
    

    如果插入成功,請繼續進行下一個步驟。

    如果插入失敗,可能是因為 Product 資料表已經具有資料列,其中包含該產品識別碼。 若要繼續,請刪除資料表中的所有資料列,並重複上述步驟。 TRUNCATE TABLE 會刪除資料表中的所有資料列。

    執行下列命令來刪除資料表中的所有資料列:

    TRUNCATE TABLE TestData.dbo.Products;
    GO
    

    截斷資料表後,請重複此步驟中的 INSERT 命令。

  2. 下列陳述式示範如何可以在透過切換欄位清單 (括號內) 和值清單內 ProductIDProductName 的位置所提供的參數中變更順序。

    -- Changing the order of the columns
    INSERT dbo.Products (ProductName, ProductID, Price, ProductDescription)
        VALUES ('Screwdriver', 50, 3.17, 'Flat head')
    GO
    
  3. 下列陳述式示範只要依照正確的順序列出值,就可以省略資料行的名稱。 這是常見的語法,但不建議您使用,因為其他使用者可能會很難了解您的程式碼。 NULL 已針對 Price 資料行指定,這是因為此產品的價格不明。

    -- Skipping the column list, but keeping the values in order
    INSERT dbo.Products
        VALUES (75, 'Tire Bar', NULL, 'Tool for changing tires.')
    GO
    
  4. 只要是在預設的結構描述中存取及變更資料表,就可以省略結構描述名稱。 因為 ProductDescription 資料行可以接受 Null 值及無值,所以在陳述式中便可以完全省略 ProductDescription 資料行名稱和值。

    -- Dropping the optional dbo and dropping the ProductDescription column
    INSERT Products (ProductID, ProductName, Price)
        VALUES (3000, '3 mm Bracket', 0.52)
    GO
    

更新產品資料表

輸入並執行下列 UPDATE 陳述式,將第二個產品的 ProductNameScrewdriver變更為 Flat Head Screwdriver

UPDATE dbo.Products
    SET ProductName = 'Flat Head Screwdriver'
    WHERE ProductID = 50
GO

從資料表讀取資料

使用 SELECT 陳述式來讀取資料表的資料。 Transact-SQL 陳述式中最重要的其中一個陳述式就是 SELECT 陳述式,而其中有很多的語法變化。 在本教學課程,您會處理五個基本版本。

讀取資料表的資料

  1. 輸入並執行下列陳述式,以讀取 Products 資料表的資料。

    -- The basic syntax for reading data from a single table
    SELECT ProductID, ProductName, Price, ProductDescription
        FROM dbo.Products
    GO
    
  2. 您可使用星號 (*) 來選取資料表中的所有資料行。 星號適用於特定查詢。 請在固定程式碼中提供資料行清單,讓陳述式傳回預期的資料行,即使以後將新資料行新增至資料表也一樣。

    -- Returns all columns in the table
    -- Does not use the optional schema, dbo
    SELECT * FROM Products
    GO
    
  3. 您可以省略不想要傳回的資料行。 資料行會以列出的順序傳回。

    -- Returns only two of the columns from the table
    SELECT ProductName, Price
        FROM dbo.Products
    GO
    
  4. 使用 WHERE 子句,限制要傳回給使用者的資料列。

    -- Returns only two of the records in the table
    SELECT ProductID, ProductName, Price, ProductDescription
        FROM dbo.Products
        WHERE ProductID < 60
    GO
    
  5. 您可以處理資料行中所傳回的值。 下列範例會在 Price 資料行上進行數學運算。 除非使用 AS 關鍵字提供名稱,否則以這種方式變更的資料行不會有名稱。

    -- Returns ProductName and the Price including a 7% tax
    -- Provides the name CustomerPays for the calculated column
    SELECT ProductName, Price * 1.07 AS CustomerPays
        FROM dbo.Products
    GO
    

SELECT 陳述式中的實用函數

如需可在 SELECT 陳述式中用來處理資料的一些函數資訊,請參閱下列文章:

建立檢視和預存程序

檢視是儲存的 SELECT 陳述式,而預存程序是一或多個以批次執行的 Transact-SQL 陳述式。

檢視的查詢方式和資料表一樣,而且不接受參數。 預存程序就比檢視還要複雜。 預存程序能有輸出和輸入參數,而且還能包含控制程式碼流程的陳述式,如 IF 和 WHILE 陳述式。 對於所有在資料庫中的重複動作,使用預存程序是一個不錯的程式設計方法。

就這個例子而言,您會使用 CREATE VIEW 建立檢視表,其中只選取 Products 資料表中的兩個資料行。 接著,使用 CREATE PROCEDURE 建立預存程序,而該程序會接受 price 參數,並且只傳回成本小於指定參數值的產品。

建立檢視

執行下列陳述式來建立會執行 SELECT 陳述式並將產品名稱及價格傳回給使用者的檢視。

CREATE VIEW vw_Names
   AS
   SELECT ProductName, Price FROM Products;
GO

測試檢視

檢視的處理方式和資料表一樣。 使用 SELECT 陳述式存取檢視。

SELECT * FROM vw_Names;
GO

建立預存程序

下列陳述式會建立預存程序名稱 pr_Names,接受資料類型為 @VarPrice 的輸入參數 (名稱是 money)。 預存程序會列印與輸出參數串連的 Products less than 陳述式,而這個輸出參數會從 money 資料類型變更為 varchar(10) 字元資料類型。 然後,預存程序會執行檢視上的 SELECT 陳述式,將輸出參數當做 WHERE 子句的一部分進行傳遞。 這樣會傳回成本小於輸出參數值的所有產品。

CREATE PROCEDURE pr_Names @VarPrice money
   AS
   BEGIN
      -- The print statement returns text to the user
      PRINT 'Products less than ' + CAST(@VarPrice AS varchar(10));
      -- A second statement starts here
      SELECT ProductName, Price FROM vw_Names
            WHERE Price < @VarPrice;
   END
GO

測試預存程序

若要測試預存程序,請輸入並執行下列陳述式。 這個程序應該傳回兩個成本小於 Products 的產品名稱,這兩個產品是在第 1 課輸入 10.00資料表而來的。

EXECUTE pr_Names 10.00;
GO

後續步驟

下一篇文章會教您如何設定資料庫物件的權限。 在課程 1 中建立的物件也會用於課程 2。

請前往下一篇文章以深入了解: