MySQL

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; 重试

小结

  1. select 列 from 表:先定列,再定表。
  2. * 方便练习;正式查询尽量写清列名。
  3. as 只改本次显示名;limit 控制行数;distinct 去掉重复。
  4. 下一篇用 WHERE 筛出行:等值、比较、and/or、like、in、null。

系列导航:总目录 · 上一篇:数据的增删改 · 下一篇:WHERE 与 LIKE

相关阅读

全部文章 →
← 返回列表更多「MySQL」