前面介绍了 MySQL 创建数据表,以及对数据表的操作。下面开始介绍如何从数据库表查询数据,查询数据使用 select 语句完成。
下面是完整标准的 SELECT 语法:
SELECT
[DISTINCT] -- 去重
select_expr1, select_expr2, ... -- 字段/表达式/函数/*
FROM
table_name [AS alias] -- 表,可起别名
[INNER|LEFT|RIGHT JOIN 关联表 ON 连接条件] -- 多表连接
[WHERE 条件] -- 行过滤,分组**之前**过滤
[GROUP BY col1,col2] -- 分组
[HAVING 分组过滤条件] -- 分组**之后**过滤,可使用聚合函数
[ORDER BY col [ASC|DESC], ...] -- 排序 ASC升序(默认),DESC降序
[LIMIT [offset,] row_count]; -- 限制结果行数注意:
书写顺序为 SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT,不要将顺序写错了。
不需要记住语法,后续使用时查询即可,使用多了就记住了。
MySQL 执行 SELECT 的真实顺序如下(掌握它对写出高效的 SQL 有帮助):
FROM / JOIN:确定数据源、关联表
WHERE:过滤原始数据行
GROUP BY:分组
聚合函数计算(sum/count/max 等)
HAVING:对分组后的结果过滤
SELECT:选取字段、计算表达式、DISTINCT 去重
ORDER BY:排序
LIMIT:截取行数
重点区分 WHERE 和 HAVING
WHERE:分组前,不能用聚合函数;过滤原始表数据
HAVING:分组后,可以用聚合函数;过滤分组结果
在使用 select 查询前,先准备一些数据,方便后续查询:
-- 创建用户表
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
user_age INT,
email VARCHAR(100) NOT NULL,
phone VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 准备示例数据
INSERT INTO users (username, user_age, email, phone) VALUES('zhang_san', 23, 'zhangsan@example.com', '13800138001'),
('li_si', 28, 'lisi@example.com', '13800138002'),
('wang_wu', 35, 'wangwu@example.com', '13800138003'),
('zhao_liu', 19, 'zhaoliu@example.com', NULL),
('qian_qi', 42, 'qianqi@example.com', '13800138005'),
('sun_ba', 26, 'sunba@example.com', '13800138006'),
('zhou_jiu', 31, 'zhoujiu@example.com', NULL),
('wu_shi', 50, 'wushi@example.com', '13800138008'),
('zheng_shiyi', 22, 'zheng11@example.com', '13800138009'),
('chen_shier', 38, 'chen12@example.com', '13800138010');下面通过大量例子来感受 select 语句的用法:
(1)查询表格所有列所有行的数据
mysql> select * from users;
+---------+-------------+----------+----------------------+-------------+---------------------+
| user_id | username | user_age | email | phone | created_at |
+---------+-------------+----------+----------------------+-------------+---------------------+
| 1 | zhang_san | 23 | zhangsan@example.com | 13800138001 | 2026-07-29 13:55:25 |
| 2 | li_si | 28 | lisi@example.com | 13800138002 | 2026-07-29 13:55:25 |
| 3 | wang_wu | 35 | wangwu@example.com | 13800138003 | 2026-07-29 13:55:25 |
| 4 | zhao_liu | 19 | zhaoliu@example.com | NULL | 2026-07-29 13:55:25 |
| 5 | qian_qi | 42 | qianqi@example.com | 13800138005 | 2026-07-29 13:55:25 |
| 6 | sun_ba | 26 | sunba@example.com | 13800138006 | 2026-07-29 13:55:25 |
| 7 | zhou_jiu | 31 | zhoujiu@example.com | NULL | 2026-07-29 13:55:25 |
| 8 | wu_shi | 50 | wushi@example.com | 13800138008 | 2026-07-29 13:55:25 |
| 9 | zheng_shiyi | 22 | zheng11@example.com | 13800138009 | 2026-07-29 13:55:25 |
| 10 | chen_shier | 38 | chen12@example.com | 13800138010 | 2026-07-29 13:55:25 |
+---------+-------------+----------+----------------------+-------------+---------------------+
10 rows in set (0.00 sec)注意,如果数据表数据很多,不要这样查询,很容易影响数据性能。
(2)查询指定列,只查询你需要的列,避免浪费
mysql> SELECT username, email FROM users;
+-------------+----------------------+
| username | email |
+-------------+----------------------+
| zhang_san | zhangsan@example.com |
| li_si | lisi@example.com |
| wang_wu | wangwu@example.com |
| zhao_liu | zhaoliu@example.com |
| qian_qi | qianqi@example.com |
| sun_ba | sunba@example.com |
| zhou_jiu | zhoujiu@example.com |
| wu_shi | wushi@example.com |
| zheng_shiyi | zheng11@example.com |
| chen_shier | chen12@example.com |
+-------------+----------------------+
10 rows in set (0.00 sec)注意,只查询自己需要列的数据这是一个很好的习惯,假如数据表的字段非常多,还存在TEXT、LONGTEXT、BLOB大数据字段更是如此。
(3)查询常量,直接在 SELECT 语句后面给出要返回的字符串、数字等
mysql> SELECT 'Hello MySQL';
+-------------+
| Hello MySQL |
+-------------+
| Hello MySQL |
+-------------+
1 row in set (0.00 sec)(4)查询表达式,在 select 语句中还可以执行一些简单的表示,如数学表达式
mysql> SELECT 1 + 1;
+-------+
| 1 + 1 |
+-------+
| 2 |
+-------+
1 row in set (0.00 sec)(5)查询当前数据库、时间等
mysql> SELECT DATABASE(), NOW(), VERSION();
+------------+---------------------+-----------+
| DATABASE() | NOW() | VERSION() |
+------------+---------------------+-----------+
| shop | 2026-07-29 14:19:58 | 8.0.46 |
+------------+---------------------+-----------+
1 row in set (0.01 sec)database()、now() 和 version() 均是数据库内置的函数,database() 用于返回当前正在使用的数据库,now() 返回当前数据库时间,version() 返回当前数据库的版本信息。
学到这里,你已经会使用 select 语句了,后续章节会介绍其他子句。