SQLite SELECT 基本组合用法大全
//表
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 |
1. Where 条件筛选
SELECT * FROM COMPANY WHERE AGE = 25 ;
2. AND/OR NOT/BETWEEN交并集
-- AGE 大于等于 25 且工资大于等于 65000.00 的所有记录: SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
-- AGE 大于等于 25 或工资大于等于 65000.00 的所有记录: SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;
-- AGE 不为 NULL 的所有记录 SELECT * FROM COMPANY WHERE AGE IS NOT NULL;
-- AGE 的值为 25 或 27 的所有记录: SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 );
-- AGE 的值既不是 25 也不是 27 的所有记录: SELECT * FROM COMPANY WHERE AGE NOT IN ( 25, 27 );
-- AGE 的值在 25 与 27 之间的所有记录: SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27;
-- 使用 SQL 子查询,子查询查找 SALARY > 65000 的带有 AGE 字段的所有记录,后边的 WHERE 子句与 EXISTS 运算符一起使用,列出了外查询中的 AGE 存在于子查询返回的结果中的所有记录 SELECT AGE FROM COMPANY WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
-- 使用 SQL 子查询,子查询查找 SALARY > 65000 的带有 AGE 字段的所有记录,后边的 WHERE 子句与 > 运算符一起使用,列出了外查询中的 AGE 大于子查询返回的结果中的年龄的所有记录: SELECT * FROM COMPANY WHERE AGE > (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
3. Update 更新
-- 更新 ID 为 6 的客户地址: UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6;
-- 修改 COMPANY 表中 ADDRESS 和 SALARY 列的所有值,则不需要使用 WHERE 子句 UPDATE COMPANY SET ADDRESS = 'Texas', SALARY = 20000.00;
4. Delete 删除
-- 删除 ID 为 7 的客户: DELETE FROM COMPANY WHERE ID = 7;
-- 从 COMPANY 表中删除所有记录,则不需要使用 WHERE 子句 DELETE FROM COMPANY;
5. Like 模糊匹配
这里有两个通配符与 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 表中 AGE 以 2 开头的所有记录: SELECT * FROM COMPANY WHERE AGE LIKE '2%';
--COMPANY 表中 ADDRESS 文本里包含一个连字符(s)的所有记录 SELECT * FROM COMPANY WHERE ADDRESS LIKE '%s%';
6. Glob 匹配指定模式
SQLite 的 GLOB 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,GLOB 运算符将返回真(true),也就是 1。与 LIKE 运算符不同的是,GLOB 是大小写敏感的,对于下面的通配符,它遵循 UNIX 的语法。
– 星号 (*)
– 问号 (?)
星号(*)代表零个、一个或多个数字或字符。问号(?)代表一个单一的数字或字符。这些符号可以被组合使用。
语句 | 描述 |
---|---|
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 表中 AGE 以 2 开头的所有记录: SELECT * FROM COMPANY WHERE AGE GLOB '2*';
-- COMPANY 表中 ADDRESS 文本里包含一个连字符(-)的所有记录: SELECT * FROM COMPANY WHERE ADDRESS GLOB '*-*';
7. Limit 条数限制
-- 用法1 默认从第0个开始 SELECT column1, column2, columnN FROM table_nameLIMIT rows; -- 用法2 从第几个开始 SELECT column1, column2, columnN FROM table_name LIMIT rows OFFSET num
-- 从表中提取的行数: SELECT * FROM COMPANY LIMIT 6; -- 从一个特定的偏移开始提取记录。下面是一个实例,从第三位开始提取 6 个记录: SELECT * FROM COMPANY LIMIT 6 OFFSET 2;
8. Order By 排序
-- 将结果按 SALARY 升序排序:ASC(升序) SELECT * FROM COMPANY ORDER BY SALARY ASC;
-- 将结果按 NAME 和 SALARY 升序排序:NAME的优先级高于SALARY SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;
-- 将结果按 NAME 降序排序: SELECT * FROM COMPANY ORDER BY NAME DESC;
9. Group By 分组
在 SELECT 语句中,GROUP BY 子句放在 WHERE 子句之后,放在 ORDER BY 子句之前。
-- 了解每个客户的工资总额,则可使用 GROUP BY 查询 SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;
让我们使用下面的 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 列进行分组: 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 |
10. Having 分组设置条件限制
HAVING 子句允许指定条件来过滤将出现在最终结果中的分组结果。
WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。
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 的所有记录: SELECT * FROM COMPANY GROUP BY name HAVING count(name) > 2;
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
10 | James | 45 | Texas | 5000 |
11. Distinct 消除重复
-- 没有任何重复的条目: SELECT DISTINCT name FROM COMPANY;
NAME |
---|
Paul |
Allen |
Teddy |
Mark |
David |
Kim |
James |