跳到主要内容

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 表:

idnameemailagecountrysalary
1张三[email protected]25China5000
2李四[email protected]30USA7000
3王五[email protected]28China6000
4赵六[email protected]35USA8000
5孙七[email protected]25UK5500

简单查询示例

查询所有用户

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 执行顺序对编写复杂查询很重要:

  1. FROM:确定数据来源
  2. WHERE:条件过滤
  3. SELECT:选择列
  4. ORDER BY:排序
  5. 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;

小结

本章我们学习了:

  1. SELECT 基本查询
  2. DISTINCT 去重
  3. AS 别名
  4. WHERE 条件过滤
  5. ORDER BY 排序
  6. LIMIT 分页

练习

  1. 查询所有用户的姓名和邮箱
  2. 查询薪资大于6000的用户
  3. 查询中国和美国用户
  4. 按薪资从高到低排序
  5. 查询薪资最高的前3名用户