SQLite Like 子句
SQLite 的 LIKE 運算符是用來匹配通配符指定模式的文本值。如果搜索表達式與模式表達式匹配,LIKE 運算符將返回真(true),也就是 1。這裏有兩個通配符與 LIKE 運算符一起使用:
-
百分號 (%)
-
下劃線 (_)
百分號(%)代表零個、一個或多個數字或字符。下劃線(_)代表一個單一的數字或字符。這些符號可以被組合使用。
語法
% 和 _ 的基本語法如下:
SELECT FROM table_name WHERE column LIKE 'XXXX%' or SELECT FROM table_name WHERE column LIKE '%XXXX%' or SELECT FROM table_name WHERE column LIKE 'XXXX_' or SELECT FROM table_name WHERE column LIKE '_XXXX' or SELECT FROM table_name WHERE column LIKE '_XXXX_'
您可以使用 AND 或 OR 運算符來結合 N 個數量的條件。在這裏,XXXX 可以是任何數字或字符串值。
實例
下面一些實例演示了 帶有 '%' 和 '_' 運算符的 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 位數,且以 2 開頭以 3 結尾的任意值 |
讓我們舉一個實際的例子,假設 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
下面是一個實例,它顯示 COMPANY 表中 AGE 以 2 開頭的所有記錄:
sqlite> SELECT * FROM COMPANY WHERE AGE LIKE '2%';
這將產生以下結果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 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
下面是一個實例,它顯示 COMPANY 表中 ADDRESS 文本里包含一個連字符(-)的所有記錄:
sqlite> SELECT * FROM COMPANY WHERE ADDRESS LIKE '%-%';
這將產生以下結果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 4 Mark 25 Rich-Mond 65000.0 6 Kim 22 South-Hall 45000.0
SQLite Glob 子句
SQLite 的 GLOB 運算符是用來匹配通配符指定模式的文本值。如果搜索表達式與模式表達式匹配,GLOB 運算符將返回真(true),也就是 1。與 LIKE 運算符不同的是,GLOB 是大小寫敏感的,對於下面的通配符,它遵循 UNIX 的語法。
-
星號 (*)
-
問號 (?)
星號(*)代表零個、一個或多個數字或字符。問號(?)代表一個單一的數字或字符。這些符號可以被組合使用。
語法
* 和 ? 的基本語法如下:
SELECT FROM table_name WHERE column GLOB 'XXXX*' or SELECT FROM table_name WHERE column GLOB '*XXXX*' or SELECT FROM table_name WHERE column GLOB 'XXXX?' or SELECT FROM table_name WHERE column GLOB '?XXXX' or SELECT FROM table_name WHERE column GLOB '?XXXX?' or SELECT FROM table_name WHERE column GLOB '????'
您可以使用 AND 或 OR 運算符來結合 N 個數量的條件。在這裏,XXXX 可以是任何數字或字符串值。
實例
下面一些實例演示了 帶有 '*' 和 '?' 運算符的 GLOB 子句不同的地方:
語句 | 描述 |
---|---|
WHERE SALARY GLOB '200*' | 查找以 200 開頭的任意值 |
WHERE SALARY GLOB '*200*' | 查找任意位置包含 200 的任意值 |
WHERE SALARY GLOB '?00*' | 查找第二位和第三位爲 00 的任意值 |
WHERE SALARY GLOB '2??' | 查找以 2 開頭,且長度至少爲 3 個字符的任意值 |
WHERE SALARY GLOB '*2' | 查找以 2 結尾的任意值 |
WHERE SALARY GLOB '?2*3' | 查找第二位爲 2,且以 3 結尾的任意值 |
WHERE SALARY GLOB '2???3' | 查找長度爲 5 位數,且以 2 開頭以 3 結尾的任意值 |
讓我們舉一個實際的例子,假設 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
下面是一個實例,它顯示 COMPANY 表中 AGE 以 2 開頭的所有記錄:
sqlite> SELECT * FROM COMPANY WHERE AGE GLOB '2*';
這將產生以下結果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 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
下面是一個實例,它顯示 COMPANY 表中 ADDRESS 文本里包含一個連字符(-)的所有記錄:
sqlite> SELECT * FROM COMPANY WHERE ADDRESS GLOB '*-*';
這將產生以下結果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 4 Mark 25 Rich-Mond 65000.0 6 Kim 22 South-Hall 45000.0
SQLite Limit 子句
SQLite 的 LIMIT 子句用於限制由 SELECT 語句返回的數據數量。
語法
帶有 LIMIT 子句的 SELECT 語句的基本語法如下:
SELECT column1, column2, columnN FROM table_name LIMIT [no of rows]
下面是 LIMIT 子句與 OFFSET 子句一起使用時的語法:
SELECT column1, column2, columnN FROM table_name LIMIT [no of rows] OFFSET [row num]
SQLite 引擎將返回從下一行開始直到給定的 OFFSET 爲止的所有行,如下面的最後一個實例所示。
實例
假設 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
下面是一個實例,它限制了您想要從表中提取的行數:
sqlite> SELECT * FROM COMPANY LIMIT 6;
這將產生以下結果:
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
但是,在某些情況下,可能需要從一個特定的偏移開始提取記錄。下面是一個實例,從第三位開始提取 3 個記錄:
sqlite> SELECT * FROM COMPANY LIMIT 3 OFFSET 2;
這將產生以下結果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0
SQLite Order By
SQLite 的 ORDER BY 子句是用來基於一個或多個列按升序或降序順序排列數據。
語法
ORDER BY 子句的基本語法如下:
SELECT column-list FROM table_name [WHERE condition] [ORDER BY column1, column2, .. columnN] [ASC | DESC];
您可以在 ORDER BY 子句中使用多個列。確保您使用的排序列在列清單中。
實例
假設 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
下面是一個實例,它會將結果按 SALARY 降序排序:
sqlite> SELECT * FROM COMPANY ORDER BY SALARY ASC;
這將產生以下結果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 7 James 24 Houston 10000.0 2 Allen 25 Texas 15000.0 1 Paul 32 California 20000.0 3 Teddy 23 Norway 20000.0 6 Kim 22 South-Hall 45000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0
下面是一個實例,它會將結果按 NAME 和 SALARY 降序排序:
sqlite> SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;
這將產生以下結果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 2 Allen 25 Texas 15000.0 5 David 27 Texas 85000.0 7 James 24 Houston 10000.0 6 Kim 22 South-Hall 45000.0 4 Mark 25 Rich-Mond 65000.0 1 Paul 32 California 20000.0 3 Teddy 23 Norway 20000.0
下面是一個實例,它會將結果按 NAME 降序排序:
sqlite> SELECT * FROM COMPANY ORDER BY NAME DESC;
這將產生以下結果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 3 Teddy 23 Norway 20000.0 1 Paul 32 California 20000.0 4 Mark 25 Rich-Mond 65000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0 5 David 27 Texas 85000.0 2 Allen 25 Texas 15000.0
SQLite Group By
SQLite 的 GROUP BY 子句用於與 SELECT 語句一起使用,來對相同的數據進行分組。
在 SELECT 語句中,GROUP BY 子句放在 WHERE 子句之後,放在 ORDER BY 子句之前。
語法
下面給出了 GROUP BY 子句的基本語法。GROUP BY 子句必須放在 WHERE 子句中的條件之後,必須放在 ORDER BY 子句之前。
SELECT column-list FROM table_name WHERE [ conditions ] GROUP BY column1, column2....columnN ORDER BY column1, column2....columnN
您可以在 GROUP BY 子句中使用多個列。確保您使用的分組列在列清單中。
實例
假設 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
如果您想了解每個客戶的工資總額,則可使用 GROUP BY 查詢,如下所示:
sqlite> SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;
這將產生以下結果:
NAME SUM(SALARY) ---------- ----------- Allen 15000.0 David 85000.0 James 10000.0 Kim 45000.0 Mark 65000.0 Paul 20000.0 Teddy 20000.0
現在,讓我們使用下面的 INSERT 語句在 COMPANY 表中另外創建三個記錄:
INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00 ); INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00 ); INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00 );
現在,我們的表具有重複名稱的記錄,如下所示:
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 8 Paul 24 Houston 20000.0 9 James 44 Norway 5000.0 10 James 45 Texas 5000.0
讓我們用同樣的 GROUP BY 語句來對所有記錄按 NAME 列進行分組,如下所示:
sqlite> SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME;
這將產生以下結果:
NAME SUM(SALARY) ---------- ----------- Allen 15000 David 85000 James 20000 Kim 45000 Mark 65000 Paul 40000 Teddy 20000
讓我們把 ORDER BY 子句與 GROUP BY 子句一起使用,如下所示:
sqlite> SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME DESC;
這將產生以下結果:
NAME SUM(SALARY) ---------- ----------- Teddy 20000 Paul 40000 Mark 65000 Kim 45000 James 20000 David 85000 Allen 15000
SQLite Having 子句
HAVING 子句允許指定條件來過濾將出現在最終結果中的分組結果。
WHERE 子句在所選列上設置條件,而 HAVING 子句則在由 GROUP BY 子句創建的分組上設置條件。
語法
下面是 HAVING 子句在 SELECT 查詢中的位置:
SELECT FROM WHERE GROUP BY HAVING ORDER BY
在一個查詢中,HAVING 子句必須放在 GROUP BY 子句之後,必須放在 ORDER BY 子句之前。下面是包含 HAVING 子句的 SELECT 語句的語法:
SELECT column1, column2 FROM table1, table2 WHERE [ conditions ] GROUP BY column1, column2 HAVING [ conditions ] ORDER BY column1, column2
實例
假設 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 8 Paul 24 Houston 20000.0 9 James 44 Norway 5000.0 10 James 45 Texas 5000.0
下面是一個實例,它將顯示名稱計數小於 2 的所有記錄:
sqlite > SELECT * FROM COMPANY GROUP BY name HAVING count(name) < 2;
這將產生以下結果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 2 Allen 25 Texas 15000 5 David 27 Texas 85000 6 Kim 22 South-Hall 45000 4 Mark 25 Rich-Mond 65000 3 Teddy 23 Norway 20000
下面是一個實例,它將顯示名稱計數大於 2 的所有記錄:
sqlite > SELECT * FROM COMPANY GROUP BY name HAVING count(name) > 2;
這將產生以下結果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 10 James 45 Texas 5000
SQLite Distinct 關鍵字
SQLite 的 DISTINCT 關鍵字與 SELECT 語句一起使用,來消除所有重複的記錄,並只獲取唯一一次記錄。
有可能出現一種情況,在一個表中有多個重複的記錄。當提取這樣的記錄時,DISTINCT 關鍵字就顯得特別有意義,它只獲取唯一一次記錄,而不是獲取重複記錄。
語法
用於消除重複記錄的 DISTINCT 關鍵字的基本語法如下:
SELECT DISTINCT column1, column2,.....columnN FROM table_name WHERE [condition]
實例
假設 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 8 Paul 24 Houston 20000.0 9 James 44 Norway 5000.0 10 James 45 Texas 5000.0
首先,讓我們來看看下面的 SELECT 查詢,它將返回重複的工資記錄:
sqlite> SELECT name FROM COMPANY;
這將產生以下結果:
NAME ---------- Paul Allen Teddy Mark David Kim James Paul James James
現在,讓我們在上述的 SELECT 查詢中使用 DISTINCT 關鍵字:
sqlite> SELECT DISTINCT name FROM COMPANY;
這將產生以下結果,沒有任何重複的條目:
NAME ---------- Paul Allen Teddy Mark David Kim James