SQL語法

SQL程式語言的語法是由ISO/IEC 9075標準中的ISO/IEC SC 32委員會所定義和維護的。儘管存在標準，不過SQL程式碼仍然無法在不進行修改的前提下在不同的資料庫系統中直接移植。語言元素.SQL語言分成了幾種要素，包括：運算子.有人也提議實現其他運運算元，例如。條件表示式.SQL在SQL-92標準中引入了codice_1語句。通常情況下所稱的“搜尋CASE語句”例子如下：CASE WHEN n &gt; 0THEN '正'WHEN n  100.00ORDER BY title;子查詢.查詢可以巢狀，以便一個查詢的結果可以透過關係運算符或聚合函式在另一個查詢中使用。巢狀查詢也稱為"子查詢"。雖然連線和其他表操作在許多情況下提供了計算上優越的替代方案，但是子查詢的使用引入了在執行中會很有用或很必要的等級。在下例中，聚合函式codice_31接收子查詢的結果作為輸入：SELECT isbn,title,priceFROM BookWHERE price &lt; (SELECT AVG(price) FROM Book)ORDER BY title;子查詢可以使用外部查詢的值，在這種情況下，它被稱為。自1999年以來，SQL標準允許稱為的命名子查詢。CTE還可以透過自身引用來遞迴；允許樹或圖遍歷，以及更一般的不動點計算。派生表."派生表"是在FROM子句中引用SQL子查詢的用法。基本上，派生表是可以從中選擇或連線到的子查詢。派生表功能允許使用者將子查詢引用為表。派生表也稱為"內聯檢視"或"子選擇"。在下例中，SQL語句涉及從初始“Book”表到派生表“sales”的連線。此派生表使用ISBN捕獲關聯的圖書銷售資訊以加入“Book”表。因此，派生表提供的結果集包含附加列：SELECT b.isbn, b.title, b.price, sales.items_sold, sales.company_nmFROM Book bJOIN (SELECT SUM(Items_Sold) Items_Sold, Company_Nm, ISBNFROM Book_SalesGROUP BY Company_Nm, ISBN) salesON sales.isbn = b.isbn空值與三值邏輯.SQL中引入了空值的概念，用來處理關係模型中缺少資訊的情況。codice_6一詞表示空白值，是SQL中的保留詞。如果Null進行比較，例如在WHERE子句中使用“=”判斷相等，那麼會返回未知值，而SELECT語句只會返回WHERE子句條件為真或未知的結果。“真”、“假”以及與空值直接比較時所得到的“未知”共同組成了SQL的three-valued logic。SQL所用的真值表與Kleene和Lukasiewicz三值邏輯的共同部分對應 (它們對內涵的定義不同，然而SQL沒有定義這樣的操作)。然而，由於在直接比較之外的處理，在SQL中對Null的語義解釋存在爭議。如上表所示，SQL中的兩個NULL之間的直接等式比較，這種語義上的不一致被合理化了，他認為在集合操作中刪除重複的操作發生在 "比檢索操作求值中的相等驗證更低的細節層次上"。 然而，計算機科學教授Ron van der Meyden認為“SQL標準的不一致意味著不可能將任何直觀的邏輯語義歸結為SQL中的null處理。”另外，由於直接與空值比較會返回未知，因此SQL又提供了兩個用於測試空值的語句：codice_37和codice_38，前者用於判斷是否為空，後者相反。 SQL不明確支援全稱量化，必須將其定義為否定存在量化。 還有“)”。還引入了codice_40型別變數，根據標準也可以是未知值。實踐中一些資料庫系統會把 implement the BOOLEAN Unknown as a BOOLEAN NULL.資料操作.資料操縱語言是SQL用於新增、更新和刪除資料的子集：INSERT INTO example(field1, field2, field3)VALUES('test', 'N', NULL);UPDATE exampleSET field1 = 'updated value'WHERE field2 = 'N';DELETE FROM exampleWHERE field2 = 'N';MERGE INTO table_name USING table_reference ON (condition)WHEN MATCHED THENUPDATE SET column1 = value1 [, column2 = value2 ...]WHEN NOT MATCHED THENINSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...])事務控制.如果資料庫系統支援事務，那麼可用以下語句：CREATE TABLE tbl_1(id int);INSERT INTO tbl_1(id) VALUES(1);INSERT INTO tbl_1(id) VALUES(2);COMMIT;UPDATE tbl_1 SET id=200 WHERE id=1;SAVEPOINT id_1upd;UPDATE tbl_1 SET id=1000 WHERE id=2;ROLLBACK to id_1upd;SELECT id from tbl_1;codice_52和codice_53會中止當前事務並釋放鎖。在沒有codice_47或類似語句的情況下，SQL的語義與實現有關的。下面例子展示了把一個賬戶的金額轉移到另一個賬戶上面的過程。只要表示減少和增加的兩個UPDATE語句中有一個失敗，整個事務就會回退，更改也不會儲存到資料庫中。START TRANSACTION;UPDATE Account SET amount=amount-200 WHERE account_number=1234;UPDATE Account SET amount=amount+200 WHERE account_number=2345;IF ERRORS=0 COMMIT;IF ERRORS0 ROLLBACK;資料定義.資料定義語言管理表和索引結構。DDL的最基本是codice_60、codice_61、codice_62、codice_63和codice_64語句：CREATE TABLE example(column1 INTEGER,column2 VARCHAR(50),column3 DATE NOT NULL,PRIMARY KEY (column1, column2)ALTER TABLE example ADD column4 NUMBER(3) NOT NULL;TRUNCATE TABLE example;DROP TABLE example;資料型別.一張表中的每個欄位都要定義該欄位的型別。ANSI SQL包括下列資料型別：Bit型別.Bit是一種儲存0或1的整數型別，一個Bit值需要一個位元組。數值.定點數型別包含兩個要素：長度、精度。長度表示數字的最大個數，包括小數點左面和右面的數字。精度是非負整數，精度為零意味著數值只能是整數。以123.45為例，它的長度為5，精度為2。SQL提供了除去小數部分、只保留整數部分的函式，叫做codice_88日期與時間.SQL提供了多個在日期時間型別和字串型別之間互相轉換的函式，例如codice_103、codice_104、codice_105等。可以透過codice_106函式來獲取資料庫伺服器的時間。資料控制.資料控制語言 (Data Control Language, DCL) 授權的使用者訪問和操作的資料。它的兩個主要的語句是：例如:GRANT SELECT, UPDATEON exampleTO some_user, another_user;REVOKE SELECT, UPDATEON exampleFROM some_user, another_user;