SELECT 查询入门
MySQL 用 SELECT 查数据:指定列与 *、别名 AS、LIMIT 截取结果、DISTINCT 去重,以及和 WHERE 的分工预告。
本页目录
数据库最重要的能力是查。今天从最简单的 select ... from 表 开始:看全部列、只要某些列、起别名、限制行数。学完你应能「想看什么就写出什么」。
系列:MySQL 入门到查询 · 第 7 / 17 篇(第 7 天 · 4 月 27 日)
上一篇:数据的增删改
下一篇:WHERE 与 LIKE
总目录:系列索引
环境说明
- 库:
train;表:建议用goods(含id、name、price) - 若昨天清空过,先插入几行:
use train;
drop table if exists goods;
create table goods(
id int,
name varchar(30),
price double
);
insert into goods(id, name, price) values
(1, 'iPhone', 5499),
(2, 'MacBook Pro', 8999),
(3, 'AirPods', 899),
(4, 'iPad', 3299),
(5, 'Watch', 2499),
(6, '华为手机', 4999);
1. SELECT 在做什么
| 关键字 | 管什么 | 口诀 |
|---|---|---|
| SELECT | 选列(显示哪些字段) | * = 全部列 |
| FROM | 从哪张表查 | 表名要存在 |
| WHERE(预告) | 选行(只要哪些记录) | 明天细讲 |
SELECT 哪些列
FROM 哪张表
WHERE 哪些行 (可选,下一篇)
SELECT 不改数据:反复执行查询是安全的(不会「查一次就少一行」)。
2. 查看整张表
select * from goods;
| 符号 | 含义 |
|---|---|
* | 所有列 |
from goods | 从 goods 表 |
结果类似:
+----+-------------+-------+
| id | name | price |
+----+-------------+-------+
| 1 | iPhone | 5499 |
| 2 | MacBook Pro | 8999 |
...
生产提醒:大表不要习惯性
select *,列多、数据多时很耗资源;练习库无所谓,正式代码尽量写明列名。
3. 只查需要的列
select name, price from goods;
select id from goods;
| 写法 | 结果 |
|---|---|
select name from goods | 只有一列 name |
select id, name from goods | 两列,顺序按你写的来 |
select * from goods | 表定义里的全部列 |
列与列之间用英文逗号,最后一个列名后不要多写逗号。
4. 列别名(AS)
给结果里的列换一个「显示名」,不改表结构。
select name as 商品名称, price as 价格 from goods;
更多写法(结果类似,推荐写 as 更清楚):
select name as "商品名称" from goods;
select name "商品名称" from goods;
select name 商品名称 from goods;
| 写法 | 说明 |
|---|---|
列名 as 别名 | 推荐,含义清楚 |
列名 as "别名" | 别名有空格或中文时常用引号 |
列名 别名(省略 as) | 也合法,可读性稍差 |
为什么需要别名
- 报表列名要显示成中文
- 运算或函数后给结果起名(后面聚合、计算会常用)
- 只影响本次查询的显示,
desc goods看到的仍是原列名
desc goods;
select name as n, price as p from goods;
desc goods;
5. 限制返回行数:LIMIT
select * from goods limit 3;
只显示前 3 行(在不指定排序时,顺序由引擎决定,练习里通常稳定但不保证业务语义)。
select id, name, price from goods limit 2;
LIMIT 偏移(分页雏形)
-- 语法:limit 行数
-- 或:limit 偏移量, 行数 (偏移从 0 开始)
select * from goods limit 3, 2;
| 写法 | 含义 |
|---|---|
limit 3 | 最多 3 行 |
limit 3, 2 | 跳过前 3 行,再取 2 行 |
limit 2 offset 3 | 等价写法(更易读) |
select id, name from goods limit 2 offset 3;
用途:网页「第 2 页每页 2 条」这类分页;排序后的 TOP-N 在第 12 天会与
order by一起练。
6. DISTINCT:去掉重复值
select price from goods;
select distinct price from goods;
| 写法 | 结果 |
|---|---|
select price ... | 每一行都列出,可能有重复价格 |
select distinct price ... | 相同价格只保留一个 |
多列时,distinct 看的是组合是否重复:
select distinct id, name from goods;
7. SELECT 也可以「不查表」
第 3 天用过的系统信息,本质也是 select:
select version();
select user();
select database();
| 语句 | 作用 |
|---|---|
version() | MySQL 版本 |
user() | 当前登录用户 |
database() | 当前所在库;未 use 可能为 NULL |
8. 和 WHERE 的分工(下一篇预告)
-- 查所有列、所有行
select * from goods;
-- 只要 id=3 的行(明天细讲条件)
select * from goods where id=3;
-- 只要 name 和 price,且 id=3
select name, price from goods where id=3;
| 部分 | 决定 |
|---|---|
select 列 | 显示哪些字段 |
where 条件 | 保留哪些记录 |
9. 完整跟练脚本
use train;
select database();
select * from goods;
select name from goods;
select id, price from goods;
select name as 商品名称, price as 价格 from goods;
select * from goods limit 3;
select * from goods limit 3, 2;
select * from goods limit 2 offset 3;
select price from goods;
select distinct price from goods;
select version();
select user();
期望
select *能看到本篇「环境说明」里重新准备的商品数据(第 6 天脚本末尾可能已truncate,以本篇 seed 为准)- 指定列只有你写的字段
- 别名显示为中文表头(客户端显示可能因工具而异)
limit行数变少;distinct后重复价格合并
10. 常见错误
易错:列名拼写错误 →
Unknown column 'xxx' in 'field list'
易错:表名错误或未use库 → 相关报错,先show tables;/select database();
易错:逗号用了中文逗号
易错:limit写成负数或非数字
易错:以为select会改表数据(不会)
易错:distinct放错位置,如select a, distinct b(语法错误,应写select distinct a, b)
11. 速查表
| 目标 | 语句 |
|---|---|
| 全表(练习用) | select * from 表; |
| 指定列 | select 列1, 列2 from 表; |
| 列别名 | select 列 as 别名 from 表; |
| 前 N 行 | select ... limit N; |
| 跳过再取 | limit 偏移, 行数 或 limit 行数 offset 偏移 |
| 去重 | select distinct 列 from 表; |
| 当前库 | select database(); |
| 版本/用户 | select version(); / select user(); |
12. 今天的练习清单
-
select * from goods; - 只显示
name列 -
select id, name, price from goods; - 用
as把列显示成中文 -
limit 3与limit 2, 2各执行一次,对比结果 -
distinct price与普通select price对比 - 在不
use的情况下执行select * from goods;,观察报错,再use train;重试
小结
select 列 from 表:先定列,再定表。*方便练习;正式查询尽量写清列名。as只改本次显示名;limit控制行数;distinct去掉重复。- 下一篇用 WHERE 筛出行:等值、比较、
and/or、like、in、null。
系列导航:总目录 · 上一篇:数据的增删改 · 下一篇:WHERE 与 LIKE