語言元素
SQL語言細分為幾個語言元素,包括:
1、子句,是語句和查詢的組成部分。
2、表達式,可以生成標量值,也可以生成由列和行數據組成的表。
3、謂詞,指定可以評估為SQL三值邏輯(3VL)(真/假/未知)或布爾真值的條件,用於限制語句和查詢的效果,或用於更改程式流。
4、查詢,根據特定條件檢索數據。這是SQL的一個重要元素。
語句可能對架構和數據產生持久影響,或者可能控制事務,程式流,連線,會話或診斷。
SQL語句還包括分號(“;”)語句終止符。雖然並非每個平台都需要,但它被定義為SQL語法的標準部分。在SQL語句和查詢中通常會忽略無關緊要的空格,從而可以更輕鬆地格式化SQL代碼以提高可讀性。
操作
| |
| |
| |
| |
| |
| |
| |
| Cost BETWEEN 100.00 AND 500.00 |
| |
| DeptCode IN (101, 103, 209) |
| |
IS [NOT] TRUE or IS [NOT] FALSE | |
| Debt IS NOT DISTINCT FROM - Receivables |
| SELECT employee AS "department1" |
有時建議或實施其他運營商,例如天際線運營商(僅用於查找那些不比其他運營商“更糟糕”的記錄)。
SQL具有case / when / then / else / end表達式,它是在SQL-92中引入的。 在其最常見的形式中,在SQL標準中稱為“搜尋案例”:
CASE WHEN n > 0 THEN 'positive' WHEN n < 0 THEN 'negative' ELSE 'zero'END
SQL測試條件按順序出現在源中。 如果源未指定ELSE表達式,則SQL默認為ELSE NULL。 SQL標準鏡像switch語句中的縮寫語法 - 稱為“簡單大小寫”:
CASE n WHEN 1 THEN 'One' WHEN 2 THEN 'Two' ELSE 'I cannot count that high'END
此語法使用隱式相等比較,通常需要注意與NULL進行比較。特殊CASE表達式有兩種簡短形式:COALESCE和NULLIF。
COALESCE表達式返回通過從左到右工作找到的第一個非NULL運算元的值,如果所有運算元都等於NULL,則返回NULL。
相當於:
CASE WHEN x1 IS NOT NULL THEN x1 ELSE x2END
NULLIF表達式有兩個運算元,如果運算元具有相同的值,則返回NULL,否則它具有第一個運算元的值。
相當於:
CASE WHEN x1 = x2 THEN NULL ELSE x1 END
查詢
SQL中最常見的操作(查詢)使用聲明性SELECT語句。 SELECT從一個或多個表或表達式中檢索數據。標準SELECT語句對資料庫沒有持久影響。 SELECT的一些非標準實現可以具有持久性效果,例如某些資料庫中提供的SELECT INTO語法。
查詢允許用戶描述所需的數據,讓資料庫管理系統(DBMS)執行計畫,最佳化和執行生成所選結果所必需的物理操作。
查詢包括要包含在最終結果中的列的列表,通常緊跟在SELECT關鍵字之後。星號(“*”)可用於指定查詢應返回查詢表的所有列。 SELECT是SQL中最複雜的語句,可選的關鍵字和子句包括:
FROM子句,指示從中檢索數據的表。 FROM子句可以包含可選的JOIN子子句,以指定連線表的規則。
WHERE子句包含比較謂詞,它限制查詢返回的行。 WHERE子句從結果集中刪除比較謂詞未計算為True的所有行。
GROUP BY子句將具有公共值的行投影到較小的行集中。 GROUP BY通常與SQL聚合函式結合使用,或者從結果集中消除重複的行。 WHERE子句在GROUP BY子句之前套用。
HAVING子句包含用於過濾GROUP BY子句產生的行的謂詞。因為它作用於GROUP BY子句的結果,所以可以在HAVING子句謂詞中使用聚合函式。
ORDER BY子句標識用於對結果數據進行排序的列,以及對它們進行排序的方向(升序或降序)。如果沒有ORDER BY子句,則SQL查詢返回的行的順序是未定義的。
DISTINCT關鍵字消除了重複數據。
LIMIT子句指定要返回的記錄數。請注意,所有SQL資料庫都不支持此子句。
查詢的子句具有特定的執行順序,由右側的數字表示。它如下:
SELECT <columns> ......................................... 5
FROM <table> .............................................. 1
WHERE <行上的謂詞> ........................... 2
GROUP BY <columns> .......................................... 3
HAVING<關於群體的謂詞> ....................... 4
ORDER BY <columns> ......................................... 6
以下SELECT查詢示例返回昂貴的書籍列表。該查詢從Book表中檢索price列包含大於100.00的值的所有行。結果按標題按升序排序。選擇列表中的星號(*)表示Book表的所有列都應包含在結果集中。
子查詢
可以嵌套查詢,以便可以通過關係運算符或聚合函式在另一個查詢中使用一個查詢的結果。 嵌套查詢也稱為子查詢。 雖然連線和其他表操作在許多情況下提供計算上優越的(即更快的)替代方案,但子查詢的使用在執行中引入了可能有用或必要的層次結構。 在以下示例中,聚合函式AVG接收子查詢的結果作為輸入:
SELECT isbn, title, price FROM Book WHERE price < (SELECT AVG(price) FROM Book) ORDER BY title;
子查詢可以使用外部查詢中的值,在這種情況下,它稱為相關子查詢。
自1999年以來,SQL標準允許子查詢的WITH子句,即命名子查詢,通常稱為公共表表達式(也稱為子查詢因子分解)。 CTE也可以通過引用自己來遞歸;結果機制允許樹或圖遍歷(當表示為關係時),更一般地說是固定點計算。
派生表
派生表是在FROM子句中引用SQL子查詢的用法。實質上,派生表是可以從中選擇或連線的子查詢。派生表功能允許用戶將子查詢作為表引用。內聯視圖也稱為內聯視圖或子選擇。
在以下示例中,SQL語句涉及從初始“Book”表到派生表“sales”的連線。此派生表使用ISBN連線到“Book”表來捕獲相關的圖書銷售信息。因此,派生表提供的結果集包含其他列(銷售的商品數量和銷售圖書的公司):
SELECT b.isbn, b.title, b.price, sales.items_sold, sales.company_nmFROM Book b JOIN (SELECT SUM(Items_Sold) Items_Sold, Company_Nm, ISBN FROM Book_Sales GROUP BY Company_Nm, ISBN) sales ON sales.isbn = b.isbnNull or three-valued logic (3VL)
數據操作
數據操作語言(DML)是用於添加,更新和刪除數據的SQL的子集:
INSERT將行(正式元組)添加到現有表中,例如:
INSERT INTO example (column1, column2, column3) VALUES ('test', 'N', NULL);
UPDATE修改一組現有的表行,例如:
UPDATE example SET column1 = 'updated value' WHERE column2 = 'N';
DELETE從表中刪除現有行,例如:
DELETE FROM example WHERE column2 = 'N';
MERGE用於組合多個表的數據。它結合了INSERT和UPDATE元素。它在SQL:2003標準中定義;在此之前,一些資料庫通過不同的語法提供了類似的功能,有時稱為“upsert”。
MERGE INTO table_name USING table_reference ON (condition)WHEN MATCHED THEN UPDATESET column1 = value1 [, column2 = value2 ...]WHEN NOT MATCHED THEN INSERT (column1 [, column2 ...])VALUES (value1 [, value2 ...])