MySQL SELECT语句的基本结构

🎉摘要:本文详细讲解MySQL SELECT语句的完整语法结构、执行顺序,并通过具体实例演示如何从数据库表中查询数据,包括查询所有列、指定列、常量、表达式及内置函数,帮助初学者快速掌握SQL数据查询核心技能。

前面介绍了 MySQL 创建数据表,以及对数据表的操作。下面开始介绍如何从数据库表查询数据,查询数据使用 select 语句完成。

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 语句了,后续章节会介绍其他子句。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号