SELECT 基本查询
查列、别名、去重 DISTINCT。
SELECT 基本查询
这一课你将能做到
- 从任意一张表按需取列、用别名改名、用 DISTINCT 去掉重复
- 在查询时用表达式和常用函数即时加工列(四则运算、拼接、条件取值)
- 说清楚「为什么上线代码不建议
SELECT *」,并给出替代写法
为什么要学
SELECT 占日常 SQL 的八成。后端接口里,分页列表、详情页、下拉框选项,全是指定列的查询。会不会「只取需要的列、顺手把展示字段拼好」,直接决定接口的返回包大小和代码整洁度——一个 SELECT * 把 content_md 这种几百 KB 的正文列也拖出来,接口慢的锅常常就在这一行。
前置:已跑完第一课的建库脚本,以下语句都在 sql_practice 库执行。
先建立图像
把表想成一张 Excel:SELECT 负责挑列,WHERE 负责挑行(下一课),查询结果本身又是一张「虚拟表」:
course 表(7 行)
┌────┬────────────────────┬──────────┬───────┐
│ id │ title │ category │ price │
├────┼────────────────────┼──────────┼───────┤
│ 1 │ Java 基础入门 │ java │ 199 │
│ 2 │ Java 面向对象进阶 │ java │ 299 │
│ … │ … │ … │ … │
└────┴────────────────────┴──────────┴───────┘
SELECT title, price FROM course;
→ 只剩 title、price 两列,7 行不变(列是竖着切,行不动)
跟着做
步骤 1:全列查询 vs 指定列查询
SELECT * FROM course; -- 7 行 × 全部 8 列
SELECT slug, title, price FROM course; -- 7 行 × 3 列,清爽
* 返回的列顺序 = 建表时的定义顺序。查询工具里用 * 随便看看没问题,但要养成第二种的肌肉记忆。
步骤 2:列别名——给结果改名
SELECT title AS 课程名, price AS 售价 FROM course;
SELECT title AS course_name,
ROUND(price * 0.8, 2) AS `折后价(限时)`
FROM course;
AS可以省略(title 课程名也行),但写上更清楚- 别名含空格、括号或中文时,用反引号
`包起来最稳 - 表也能起别名:
SELECT c.title FROM course c;——JOIN 课会大量用到
步骤 3:表达式与函数——查询时加工数据
-- 四舍五入、算术
SELECT title, ROUND(price * 0.8, 2) AS price_80
FROM course;
-- CONCAT 拼接展示字段(接口里常见的「展示名」就这么拼)
SELECT CONCAT(title, '(', level, ')') AS display_name
FROM course;
-- IF 按条件取值
SELECT name, IF(vip = 1, '会员', '普通') AS member_label
FROM student;
注意:CONCAT 里任何一个参数是 NULL,整个结果就是 NULL。可能为 NULL 的列要用 CONCAT_WS 或 COALESCE 兜底,这是经典坑。
步骤 4:DISTINCT 去重
SELECT DISTINCT category FROM course;
-- 结果 3 行:java / database / frontend
SELECT DISTINCT category, level FROM course;
-- 结果 6 行:去重的是 (category, level) 的组合