SELECT 查询
SELECT 是 SQL 中最常用的语句,用于从数据库表中查询数据。
基本语法
SELECT 列名1, 列名2, ...
FROM 表名;
查询所有列
使用星号 * 可以查询所有列:
SELECT * FROM users;
查询指定列
SELECT name, email, age FROM users;
别名(AS)
使用 AS 关键字可以为列指定别名:
-- 单个别名
SELECT name AS 姓名, email AS 邮箱 FROM users;
-- 省略 AS
SELECT name 姓名, email 邮箱 FROM users;
-- 计算字段别名
SELECT price * quantity AS total FROM orders;
去重(DISTINCT)
使用 DISTINCT 去除重复结果:
-- 查询所有城市(去重)
SELECT DISTINCT city FROM users;
-- 多列去重
SELECT DISTINCT city, country FROM users;
-- 统计去重后的数量
SELECT COUNT(DISTINCT city) FROM users;
计算字段
可以在 SELECT 中进行计算:
-- 算术运算
SELECT price, quantity, price * quantity AS total FROM orders;
-- 字符串连接(MySQL)
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
-- 字符串连接(SQLite)
SELECT first_name || ' ' || last_name AS full_name FROM users;
演示数据库
假设有如下 users 表:
| id | name | age | country | salary | |
|---|---|---|---|---|---|
| 1 | 张三 | [email protected] | 25 | China | 5000 |
| 2 | 李四 | [email protected] | 30 | USA | 7000 |
| 3 | 王五 | [email protected] | 28 | China | 6000 |
| 4 | 赵六 | [email protected] | 35 | USA | 8000 |
| 5 | 孙七 | [email protected] | 25 | UK | 5500 |
简单查询示例
查询所有用户
SELECT * FROM users;
结果:
+------+------+----------------------+------+---------+--------+
| id | name | email | age | country | salary |
+------+------+----------------------+------+---------+--------+
| 1 | 张三 | [email protected] | 25 | China | 5000 |
| 2 | 李四 | [email protected] | 30 | USA | 7000 |
| 3 | 王五 | [email protected] | 28 | China | 6000 |
| 4 | 赵六 | [email protected] | 35 | USA | 8000 |
| 5 | 孙七 | [email protected] | 25 | UK | 5500 |
+------+------+----------------------+------+---------+--------+
查询指定列
SELECT name, salary FROM users;
结果:
+------+--------+
| name | salary |
+------+--------+
| 张三 | 5000 |
| 李四 | 7000 |
| 王五 | 6000 |
| 赵六 | 8000 |
| 孙七 | 5500 |
+------+--------+
带别名
SELECT name AS 姓名, salary AS 薪资 FROM users;
结果:
+------+--------+
| 姓名 | 薪资 |
+------+--------+
| 张三 | 5000 |
| 李四 | 7000 |
| 王五 | 6000 |
| 赵六 | 8000 |
| 孙七 | 5500 |
+------+--------+
WHERE 条件过滤
简单条件
-- 查询年龄大于25的用户
SELECT * FROM users WHERE age > 25;
-- 查询中国用户
SELECT * FROM users WHERE country = 'China';
-- 查询薪资等于7000的用户
SELECT * FROM users WHERE salary = 7000;
组合条件
-- AND:同时满足
SELECT * FROM users WHERE country = 'China' AND age > 26;
-- OR:满足任一条件
SELECT * FROM users WHERE country = 'USA' OR country = 'UK';
-- NOT:取反
SELECT * FROM users WHERE NOT country = 'China';
BETWEEN 范围
-- 薪资在6000到8000之间
SELECT * FROM users WHERE salary BETWEEN 6000 AND 8000;
-- 等价于
SELECT * FROM users WHERE salary >= 6000 AND salary <= 8000;
IN 列表
-- 查询美国和中国用户
SELECT * FROM users WHERE country IN ('USA', 'China');
-- 等价于
SELECT * FROM users WHERE country = 'USA' OR country = 'China';
LIKE 模糊匹配
-- 名字以张开头的用户
SELECT * FROM users WHERE name LIKE '张%';
-- 名字以某个字符开头
SELECT * FROM users WHERE name LIKE '_三';
-- 包含某个字符
SELECT * FROM users WHERE email LIKE '%@email.com';
注意:
%:匹配任意多个字符_:匹配单个字符
IS NULL 空值
-- 查询邮箱为空的 users
SELECT * FROM users WHERE email IS NULL;
-- 查询邮箱不为空的 users
SELECT * FROM users WHERE email IS NOT NULL;
ORDER BY 排序
单列排序
-- 按薪资升序(默认)
SELECT * FROM users ORDER BY salary;
-- 按薪资降序
SELECT * FROM users ORDER BY salary DESC;
多列排序
-- 先按国家排序,再按薪资降序
SELECT * FROM users ORDER BY country ASC, salary DESC;
排序优先级
-- 先按年龄排序,年龄相同按薪资排序
SELECT * FROM users ORDER BY age, salary DESC;
LIMIT 限制结果
基本用法
-- 只取前3条
SELECT * FROM users LIMIT 3;
-- 取前3条,薪资最高
SELECT * FROM users ORDER BY salary DESC LIMIT 3;
分页查询
-- 第1页,每页3条
SELECT * FROM users LIMIT 0, 3;
-- 或
SELECT * FROM users LIMIT 3 OFFSET 0;
-- 第2页,每页3条
SELECT * FROM users LIMIT 3 OFFSET 3;
-- 第3页,每页3条
SELECT * FROM users LIMIT 3 OFFSET 6;
分页公式:LIMIT 每页数量 OFFSET (页码-1) * 每页数量
综合查询
-- 查询中国用户,按薪资降序,只取前2名
SELECT name, age, salary
FROM users
WHERE country = 'China'
ORDER BY salary DESC
LIMIT 2;
结果:
+------+------+--------+
| name | age | salary |
+------+------+--------+
| 王五 | 28 | 6000 |
| 张三 | 25 | 5000 |
+------+------+--------+
SELECT 执行顺序
理解 SQL 执行顺序对编写复杂查询很重要:
- FROM:确定数据来源
- WHERE:条件过滤
- SELECT:选择列
- ORDER BY:排序
- LIMIT:限制数量
常见错误
1. 字符串值缺少引号
-- 错误
SELECT * FROM users WHERE country = China;
-- 正确
SELECT * FROM users WHERE country = 'China';
2. 使用模糊匹配忘记 %
-- 错误:只匹配精确的"张"
SELECT * FROM users WHERE name LIKE '张';
-- 正确:匹配所有以"张"开头的
SELECT * FROM users WHERE name LIKE '张%';
3. 忘记 WHERE 导致更新所有行
-- 危险!没有 WHERE 条件,会更新所有行
UPDATE users SET salary = 6000;
-- 正确
UPDATE users SET salary = 6000 WHERE id = 1;
小结
本章我们学习了:
- SELECT 基本查询
- DISTINCT 去重
- AS 别名
- WHERE 条件过滤
- ORDER BY 排序
- LIMIT 分页
练习
- 查询所有用户的姓名和邮箱
- 查询薪资大于6000的用户
- 查询中国和美国用户
- 按薪资从高到低排序
- 查询薪资最高的前3名用户