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ù)之前,讓我們假設有兩個表 COMPANY 和 DEPARTMENT。
現(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)生以下結果:

內(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 |