MySQL 基础:SELECT 语句的核心语法与规范

SELECT 语句是 MySQL 中最基础也最常用的查询命令,掌握其语法规则和使用规范,是高效处理数据的第一步。本文将聚焦 SELECT 语句的基本结构、关键规范及实用功能,帮助初学者建立扎实的 SQL 基础。

一、SELECT 语句的基本语法结构

1. 核心语法框架

SELECT 语句的最基础结构用于从表中提取指定字段的数据,语法如下:

1
2
3
4
5
-- 选择指定字段
SELECT 字段1, 字段2, ... FROM 表名;

-- 选择所有字段(不推荐在生产环境使用)
SELECT * FROM 表名;

2. 关键说明

  • SELECT 后接需要查询的字段名,多个字段用英文逗号分隔;

  • FROM 后必须指定数据来源的表名,否则会触发语法错误;

  • 语句必须以英文分号 ; 结束,这是 MySQL 语句的通用规则。

二、SELECT * 的使用禁忌与替代方案

SELECT * 能快速返回表中所有字段,但在实际开发中存在明显弊端,需谨慎使用:

1. 不推荐使用的原因

  • 效率低下:会返回无关字段,增加数据库 IO 压力和网络传输成本,尤其对包含大量字段的大表影响显著;

  • 稳定性差:当表结构变更(如新增 / 删除字段)时,查询结果会意外包含或丢失数据,可能导致依赖查询结果的应用程序出错;

  • 可读性低:无法直观判断查询的具体字段,不利于代码维护。

2. 推荐做法

明确指定所需字段,例如:

1
2
3
4
5
6
-- 推荐:只查询必要字段
SELECT id, username, register_time FROM user;

-- 不推荐:返回所有字段
SELECT id, username, register_time, password, email, phone, ... -- 字段过多时可换行
FROM user;

三、SQL 大小写规范与书写建议

MySQL 对大小写的敏感性随操作系统不同而变化,遵循统一规范可避免低级错误:

1. 大小写规则

  • Windows 环境:大小写不敏感(SELECT 与 select 等效);

  • Linux 环境:大小写敏感(数据库名、表名、表别名严格区分大小写)。

2. 通用书写规范

  • 关键字(如 SELECT、FROM、WHERE)全部大写;

  • 表名、字段名、别名等全部小写;

  • 多字段或复杂语句分行书写并缩进,提升可读性:

1
2
3
4
5
6
7
8
9
-- 规范示例
SELECT
id,
product_name,
price
FROM
product
WHERE
stock > 0;

四、列别名:提升结果可读性的实用技巧

列别名用于给查询结果中的字段临时命名,让输出更直观,不影响原表结构。

1. 语法格式

1
2
3
4
5
-- 格式1:使用 AS 关键字(推荐,可读性强)
SELECT 字段名 AS 别名 FROM 表名;

-- 格式2:省略 AS(需在字段名与别名间加空格)
SELECT 字段名 别名 FROM 表名;

2. 注意事项

  • 若别名包含空格、特殊字符(如括号、中文),需用双引号 “ 或反引号 ` 包裹:
1
2
3
4
SELECT 
user_id AS "用户 ID", -- 别名含空格
order_no `订单编号(2023)` -- 别名含特殊字符
FROM order;
  • 别名仅在当前查询结果中生效,不会修改表中实际字段名。

五、去重查询:DISTINCT 关键字的正确用法

DISTINCT 用于提取唯一值,消除结果中的重复记录,适用于统计不重复数据的场景。

1. 基本语法

1
SELECT DISTINCT 字段名 FROM 表名;

2. 关键特性

  • DISTINCT 作用于其后的所有字段,而非单个字段。例如 SELECT DISTINCT a, b 会对 a 和 b 的组合去重;

  • 若字段包含 NULL,DISTINCT 会将所有 NULL 视为相同值,仅保留一条。

3. 示例

1
2
3
4
5
-- 对单个字段去重:查询所有不重复的部门 ID
SELECT DISTINCT department_id FROM employee;

-- 对多个字段去重:查询不重复的"部门-职位"组合
SELECT DISTINCT department_id, job_title FROM employee;

六、空值(NULL)的特殊处理规则

NULL 表示 “未知值”,与空字符串 “” 完全不同(空字符串长度为 0,NULL 长度未知且占用存储空间),处理方式需特别注意:

1. 核心规则

  • 不能用 = 或 != 判断 NULL,必须使用 IS NULL(判断为空)或 IS NOT NULL(判断非空);

  • NULL 与任何值运算的结果都为 NULL(如 NULL + 1、NULL || ‘abc’ 均返回 NULL)。

2. 示例

1
2
3
4
5
-- 查询未填写邮箱的用户
SELECT username FROM user WHERE email IS NULL;

-- 查询已填写手机号的用户
SELECT username FROM user WHERE phone IS NOT NULL;

七、着重号:解决关键字冲突的必备技巧

若表名、字段名与 SQL 关键字(如 order、select)重名,需用反引号 ` 包裹,避免语法错误。

1
2
3
4
5
-- 表名是关键字 order,用着重号包裹
SELECT * FROM `order`;

-- 字段名是关键字 desc,用着重号包裹
SELECT `desc` FROM product;

八、常数查询:为结果添加固定标识

SELECT 语句支持直接查询常数,在结果中增加固定值列,常用于标记数据来源或整合多数据源。

1. 应用场景

  • 区分不同表的查询结果(如多表数据合并时);

  • 为结果添加业务标识(如数据归属、统计版本)。

2. 示例

1
2
3
4
5
6
-- 为员工表查询结果添加公司标识
SELECT
'技术部' AS department, -- 固定常数列
emp_name,
hire_date
FROM employee;

查询结果:

department emp_name hire_date
技术部 张三 2023-01-15
技术部 李四 2023-03-20

九、显示表结构:DESCRIBE / DESC 命令

使用 DESCRIBE 或 DESC 可查看表的字段详情,是分析表结构的常用工具。

1. 语法

1
2
3
4
5
-- 完整写法
DESCRIBE 表名;

-- 简写
DESC 表名;

2. 输出字段含义

执行 DESC user; 后,输出结果包含以下信息:

  • Field:字段名称;

  • Type:字段数据类型(如 INT、VARCHAR(50));

  • Null:是否允许存储 NULL 值(YES 表示允许);

  • Key:索引类型(PRI 为主键,UNI 为唯一索引);

  • Default:字段默认值;

  • Extra:附加信息(如 AUTO_INCREMENT 表示自增)。

十、条件过滤:WHERE 子句的基础用法

WHERE 子句用于筛选符合条件的记录,必须紧跟 FROM 子句,是数据过滤的核心工具。

1. 语法结构

1
SELECT 字段名 FROM 表名 WHERE 条件表达式;

2. 示例

1
2
3
4
5
6
7
8
9
-- 查询价格大于 100 且库存大于 0 的商品
SELECT name, price
FROM product
WHERE price > 100 AND stock > 0;

-- 查询注册时间在 2023 年的用户
SELECT username
FROM user
WHERE register_time BETWEEN '2023-01-01' AND '2023-12-31';

总结:核心要点速览

  • 避免SELECT *,明确指定需要的字段,提升效率和稳定性;

  • 善用列别名让结果更易读,特殊别名用双引号包裹;

  • DISTINCT对其后所有字段去重,注意NULL的处理;

  • NULL需用IS NULL判断,与空字符串不同;

  • 关键字冲突用着重号(`)解决;

  • 常数查询可标记数据来源,DESC用于查看表结构;

  • WHERE子句紧随FROM,用于筛选符合条件的记录。

掌握这些技巧,能让你的 SQL 查询更高效、更易维护,为复杂查询打下坚实基础。