2009年3月9日 星期一

SQLite3 SQL語法 - SELECT

statement:


任何隨意的運算式都可做為結果。如果結果運算式是 *,則那一個運算式就會由所有資料表的所有欄取代。如果運算式是資料表的名稱後面接著 .*,則結果就是那一個資料表的所有欄。

select-core:


DISTINCT 關鍵字會導致傳回結果列的子集,這些結果列每個各不相同。NULL 值不會被視為與其它值不同。預設行為是會傳回所有結果列,這也可用關鍵字 ALL 明確指定。

查詢執行時,會針對 FROM 關鍵字後指定的一或多個資料表進行查詢。如果用逗號分隔多個資料表名稱,查詢會使用各個資料表的交叉聯結。JOIN 語法也可用來指定資料表的聯結方式。唯一支援的一種外部聯結類型是 LEFT OUTER JOIN。join-args 中的 ON 子句運算式必須解析成 Boolean 值。FROM 子句中可以使用括在括弧中的子查詢做為資料表。整個 FROM 子句可以完全省略,如此一來,結果將是由 result 運算式清單的值所構成的單一列。

WHERE 子句會用來限制查詢擷取的列數。WHERE 子句運算式必須解析成 Boolean 值。WHERE 子句篩選是在任何群組動作之前執行,所以 WHERE 子句運算式不得包含彙總函數。

GROUP BY 子句會導致一或多個結果列在輸出中合併成單一列。當結果包含彙總函數時,GROUP BY 子句特別好用。GROUP BY 子句中的運算式不一定要是出現在 SELECT 運算式清單中的運算式。

HAVING 子句類似 WHERE,可用來限制陳述式傳回的列。但 HAVING 子句是在 GROUP BY 子句指定的任何群組動作之後套用。因此,HAVING 運算式可以參考包含彙總函數的值。HAVING 子句運算式不一定要出現在 SELECT 清單中。HAVING 運算式和 WHERE 運算式一樣,都必須解析成 Boolean 值。

ORDER BY 子句會導致輸出列經過排序。ORDER BY 子句的 sort-expr-list 引數是做為排序索引鍵的運算式清單。在簡單 SELECT 中,這些運算式不一定要是結果的一部分,但在複合 SELECT (使用 compound-op 運算子的 SELECT) 中,每個排序運算式都必須確實符合其中一個結果欄。每個排序運算式後面可以選擇性的接著一個 sort-order 子句,內含 COLLATE 關鍵字和用於排列文字的定序函數名稱及 (或) 關鍵字 ASC 或 DESC 以指定排序順序 (遞增或遞減)。sort-order 可以省略,這時會使用預設值 (遞增順序)。

LIMIT 子句會設定結果中傳回的列數上限。負數的 LIMIT 表示沒有上限。LIMIT 後面可以選擇性的接著 OFFSET,以指定須略過結果集開頭的多少列。在複合 SELECT 查詢中,LIMIT 子句只能出現在最後的 SELECT 陳述式之後,而且限制適用於整個查詢。請注意,如果 LIMIT 子句中使用 OFFSET 關鍵字,則限制是第一個整數,位移是第二個整數。如果用逗號取代 OFFSET 關鍵字,則位移是第一個數字,而限制是第二個數字。這種看起來很矛盾的語法是為了儘可能與舊式 SQL 資料庫系統相容而故意設計的。

compound-operator:

複合 SELECT 是由兩個或多個簡單 SELECT 陳述式組成,陳述式之間可使用 UNION、UNION ALL、INTERSECT 或 EXCEPT 其中一個運算子連接。在複合 SELECT 中,所有組成的 SELECT 陳述式都必須指定相同數目的結果欄。只有在最後一個 SELECT 陳述式之後 (和唯一的 LIMIT 子句之前,如果指定的話) 才能有一個 ORDER BY 子句。UNION 和 UNION ALL 運算子會合併前後 SELECT 陳述式的結果,成為單一資料表。差別在於,UNION 的所有結果列各不相同,而 UNION ALL 的所有結果則可以有重製項目。INTERSECT 運算子會取得前後 SELECT 陳述式結果的交集。EXCEPT 會取得前一個 SELECT 的結果,從中移除後一個 SELECT 的結果。如果將三個或更多 SELECT 陳述式複合連接在一起,它們會從第一個到最後一個群組在一起。

* 所有圖片轉載自:http://www.sqlite.org

沒有留言:

張貼留言