SQL 高級 01

SQL 高級 02
SQL 高級 03

SQLite Limit 子句

SQLite 的 LIMIT 子句用于限制由 SELECT 語句返回的數(shù)據(jù)數(shù)量。
帶有 LIMIT 子句的 SELECT 語句的基本語法如下:
SELECT column1, column2, columnN FROM table_name LIMIT [no of rows]
下面是 LIMIT 子句與 OFFSET 子句一起使用時的語法:
SELECT column1, column2, columnN FROM table_name LIMIT 4 OFFSET 2
SQLite 引擎將返回從第 3 行開始截取 4 行的數(shù)據(jù)

LIKE 操作符

SQLite 的 LIKE 運算符是用來匹配通配符指定模式的文本值。如果搜索表達式與模式表達式匹配,LIKE 運算符將返回真 (true) ,也就是 1。這里有兩個通配符與 LIKE 運算符一起使用:

  • 百分號 (%)
  • 下劃線 (_)

百分號(%)代表零個、一個或多個數(shù)字或字符。下劃線(_)代表一個單一的數(shù)字或字符。這些符號可以被組合使用。

SELECT column_list 
FROM table_name
WHERE column LIKE 'XXXX%'

or 

SELECT column_list 
FROM table_name
WHERE column LIKE '%XXXX%'

or

SELECT column_list 
FROM table_name
WHERE column LIKE 'XXXX_'

or

SELECT column_list 
FROM table_name
WHERE column LIKE '_XXXX'

or

SELECT column_list 
FROM table_name
WHERE column LIKE '_XXXX_'

您可以使用 AND 或 OR 運算符來結合 N 個數(shù)量的條件。在這里,XXXX 可以是任何數(shù)字或字符串值。

實例

下面一些實例演示了 帶有 '%' 和 '_' 運算符的 LIKE 子句不同的地方:

語句 描述
WHERE SALARY LIKE '200%' 查找以 200 開頭的任意值
WHERE SALARY LIKE '%200%' 查找任意位置包含 200 的任意值
WHERE SALARY LIKE '_00%' 查找第二位和第三位為 00 的任意值
WHERE SALARY LIKE '2_%_%' 查找以 2 開頭,且長度至少為 3 個字符的任意值
WHERE SALARY LIKE '%2' 查找以 2 結尾的任意值
WHERE SALARY LIKE '_2%3' 查找第二位為 2,且以 3 結尾的任意值
WHERE SALARY LIKE '2___3' 查找長度為 5 位數(shù),且以 2 開頭以 3 結尾的任意值

IN 操作符
IN 操作符允許我們在 WHERE 子句中規(guī)定多個值。

SQL IN 語法

SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
現(xiàn)在,我們希望從上表中選取姓氏為 Adams 和 Carter 的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')

BETWEEN 操作符
操作符 BETWEEN ... AND 會選取介于兩個值之間的數(shù)據(jù)范圍。這些值可以是數(shù)值、文本或者日期。

SQL BETWEEN 語法

SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2

如需以字母順序顯示介于 "Adams"(包括)和 "Carter"(不包括)之間的人,請使用下面的 SQL:
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'

如需使用上面的例子顯示范圍之外的人,請使用 NOT 操作符:
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'



通過使用 SQL,可以為列名稱和表名稱指定別名(Alias)。

SQL Alias

表的 SQL Alias 語法
SELECT column_name(s) FROM table_name AS alias_name
列的 SQL Alias 語法
SELECT column_name AS alias_name FROM table_name

Alias 實例: 使用表名稱別名

假設我們有兩個表分別是:"Persons" 和 "Product_Orders"。我們分別為它們指定別名 "p" 和 "po"。
現(xiàn)在,我們希望列出 "John Adams" 的所有定單。
我們可以使用下面的 SELECT 語句:
SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'

不使用別名的 SELECT 語句:
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName FROM Persons, Product_Orders WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
從上面兩條 SELECT 語句您可以看到,別名使查詢程序更易閱讀和書寫。

Alias 實例: 使用一個列名別名

表 Persons:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

SQL:
SELECT LastName AS Family, FirstName AS Name FROM Persons
結果:

Family Name
Adams John
Bush George
Carter Thomas


SQLite Joins

SQLite 的 Joins 子句用于結合兩個或多個數(shù)據(jù)庫中表的記錄。JOIN 是一種通過共同值來結合兩個表中字段的手段。

SQL 定義了三種主要類型的連接:

  • 交叉連接 - CROSS JOIN
  • 內(nèi)連接 - INNER JOIN
  • 外連接 - OUTER JOIN

在我們繼續(xù)之前,讓我們假設有兩個表 COMPANYDEPARTMENT。
現(xiàn)在讓我們假設 COMPANY 表的記錄列表如下:

ID NAME AGE ADDRESS SALARY
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0

另一個表是 DEPARTMENT,定義如下:

ID DEPT EMP_ID
1 IT Billing 1
2 Engineerin 2
3 Finance 7
交叉連接 - CROSS JOIN

交叉連接(CROSS JOIN)把第一個表的每一行與第二個表的每一行進行匹配。如果兩個輸入表分別有 x 和 y 列,則結果表有 x+y 列。由于交叉連接(CROSS JOIN)有可能產(chǎn)生非常大的表,使用時必須謹慎,只在適當?shù)臅r候使用它們。
下面是交叉連接(CROSS JOIN)的語法:
SELECT ... FROM table1 CROSS JOIN table2 ...
基于上面的表,我們可以寫一個交叉連接(CROSS JOIN),如下所示:
SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT
上面的查詢會產(chǎn)生以下結果:

CROSS JOIN 交叉連接
內(nèi)連接 - INNER JOIN

內(nèi)連接(INNER JOIN)根據(jù)連接謂詞結合兩個表(table1 和 table2)的列值來創(chuàng)建一個新的結果表。查詢會把 table1 中的每一行與 table2 中的每一行進行比較,找到所有滿足連接謂詞的行的匹配對。當滿足連接謂詞時,A 和 B 行的每個匹配對的列值會合并成一個結果行。
內(nèi)連接(INNER JOIN)是最常見的連接類型,是默認的連接類型。INNER 關鍵字是可選的。
下面是內(nèi)連接(INNER JOIN)的語法:
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
為了避免冗余,并保持較短的措辭,可以使用 USING 表達式聲明內(nèi)連接(INNER JOIN)條件。這個表達式指定一個或多個列的列表:
SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
自然連接(NATURAL JOIN)類似于 JOIN...USING,只是它會自動測試存在兩個表中的每一列的值之間相等值:
SELECT ... FROM table1 NATURAL JOIN table2...
基于上面的表,我們可以寫一個內(nèi)連接(INNER JOIN),如下所示:
SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_I;
上面的查詢會產(chǎn)生以下結果:

EMP_ID NAME DEPT
1 Paul IT Billing
2 Allen Engineerin
7 James Finance
外連接 - OUTER JOIN

外連接(OUTER JOIN)是內(nèi)連接(INNER JOIN)的擴展。雖然 SQL 標準定義了三種類型的外連接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外連接(LEFT OUTER JOIN)。

外連接(OUTER JOIN)聲明條件的方法與內(nèi)連接(INNER JOIN)是相同的,使用 ON、USING 或 NATURAL 關鍵字來表達。最初的結果表以相同的方式進行計算。一旦主連接計算完成,外連接(OUTER JOIN)將從一個或兩個表中任何未連接的行合并進來,外連接的列使用 NULL 值,將它們附加到結果表中。
下面是左外連接(LEFT OUTER JOIN)的語法:
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
為了避免冗余,并保持較短的措辭,可以使用 USING 表達式聲明外連接(OUTER JOIN)條件。這個表達式指定一個或多個列的列表:
SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...
基于上面的表,我們可以寫一個外連接(OUTER JOIN),如下所示:
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID
上面的查詢會產(chǎn)生以下結果:

EMP_ID NAME DEPT
1 Paul IT Billing
2 Allen Engineerin
Teddy
Mark
David
Kim
7 James Finance
SQL UNION 和 UNION ALL 操作符

SQL UNION 操作符
UNION 操作符用于合并兩個或多個 SELECT 語句的結果集。
請注意,UNION 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列。列也必須擁有相似的數(shù)據(jù)類型。同時,每條 SELECT 語句中的列的順序必須相同。
SQL UNION 語法
SELECT column_name(s) FROM table_name1UNIONSELECT column_name(s) FROM table_name2
注釋:默認地,UNION 操作符選取不同的值。如果允許重復的值,請使用 UNION ALL。
SQL UNION ALL 語法
SELECT column_name(s) FROM table_name1UNION ALLSELECT column_name(s) FROM table_name2
另外,UNION 結果集中的列名總是等于 UNION 中第一個 SELECT 語句中的列名。

下面的例子中使用的原始表:
Employees_China:

E_ID E_Name
01 Zhang, Hua
02 Wang, Wei
03 Carter, Thomas
04 Yang, Ming

Employees_USA:

E_ID E_Name
01 Adams, John
02 Bush, George
03 Carter, Thomas
04 Gates, Bill

使用 UNION 命令
實例
列出所有在中國和美國的不同的雇員名:
SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA
結果

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill

注釋:這個命令無法列出在中國和美國的所有雇員。在上面的例子中,我們有兩個名字相同的雇員,他們當中只有一個人被列出來了。UNION 命令只會選取不同的值。

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill

UNION ALL
UNION ALL 命令和 UNION 命令幾乎是等效的,不過 UNION ALL 命令會列出 所有的值。
SQL Statement 1UNION ALLSQL Statement 2
使用 UNION ALL 命令
實例:
列出在中國和美國的所有的雇員:
SELECT E_Name FROM Employees_ChinaUNION ALL SELECT E_Name FROM Employees_USA
結果

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容