现在是时候把这些东西都串起来,学会用SELECT、WHERE和ORDER BY组合写出简单但很有用的查询啦。这个技能你以后会经常用到,比如查用户列表、做个小报告啥的。
在开始之前,先回顾下最基础的SQL查询结构长啥样:
SELECT 列1, 列2, 列3
FROM 表
WHERE 条件
ORDER BY 列 ASC
LIMIT 行数
OFFSET 行数;
如果SQL是本小说的话,SELECT就是章节标题,FROM是内容,WHERE是剧情解释。ORDER BY就像给故事加点顺序,看起来更有意思!
这些关键字的顺序是固定的。 有些可以省略(不写),但顺序绝对不能乱。
例子1:查出成绩优秀的学生名字
假设我们有个students表,结构和数据如下:
| id | name | age | grade |
|---|---|---|---|
| 1 | Otto | 21 | A |
| 2 | Maria | 22 | B |
| 3 | Alex | 20 | A |
| 4 | Nat | 23 | C |
| 5 | Dan | 25 | B |
你要查出所有成绩是A的学生(也就是grade = 'A'),并按名字排序。这样写:
SELECT name
FROM students
WHERE grade = 'A'
ORDER BY name ASC;
结果:
| name |
|---|
| Alex |
| Otto |
解释:
SELECT name—— 只查名字。没必要把不需要的数据都查出来,浪费资源。WHERE grade = 'A'—— 只要成绩是A的。ORDER BY name ASC—— 按名字字母顺序排。
例子2:按价格查商品
现在假设有个products表,里面是商品信息:
| id | product_name | category | price |
|---|---|---|---|
| 1 | 智能手机 | Electronics | 30000 |
| 2 | 电视 | Electronics | 45000 |
| 3 | 冰箱 | Appliances | 50000 |
| 4 | 吸尘器 | Appliances | 15000 |
| 5 | 灯泡 | Lighting | 500 |
我们的任务是查出"Electronics"分类下的商品,并按价格从高到低排。SQL如下:
SELECT product_name, price
FROM products
WHERE category = 'Electronics'
ORDER BY price DESC;
结果:
| product_name | price |
|---|---|
| 电视 | 45000 |
| 智能手机 | 30000 |
解释:
SELECT product_name, price—— 查商品名和价格。WHERE category = 'Electronics'—— 只要"Electronics"分类的。ORDER BY price DESC—— 按价格从高到低排(最贵的在前面)。
例子3:复杂条件过滤
还是用students表。假如我们要找所有年龄大于21岁,成绩是B或C的学生,并按年龄排序。这里要组合多个条件:
SELECT name, age, grade
FROM students
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
ORDER BY age ASC;
结果:
| name | age | grade |
|---|---|---|
| Maria | 22 | B |
| Nat | 23 | C |
| Dan | 25 | B |
解释:
WHERE age > 21—— 只要年龄大于21的学生。AND (grade = 'B' OR grade = 'C')—— 成绩是B或C。括号用来分组条件。ORDER BY age ASC—— 按年龄从小到大排。
例子4:排序和过滤一起用
回到products表。我们想找出价格低于50000的商品,先按分类排,再在每个分类里按价格从低到高排。
SELECT product_name, category, price
FROM products
WHERE price < 50000
ORDER BY category ASC, price ASC;
结果:
| product_name | category | price |
|---|---|---|
| 吸尘器 | Appliances | 15000 |
| 智能手机 | Electronics | 30000 |
| 电视 | Electronics | 45000 |
| 灯泡 | Lighting | 500 |
解释:
WHERE price < 50000—— 先过滤出价格低于50000的商品。ORDER BY category ASC, price ASC—— 先按分类字母顺序排,每个分类里再按价格从低到高排。
例子5:常见错误——漏写括号
现在看看可能会出错的地方。如果像下面这样忘了加括号,逻辑运算就会出问题:
错误的SQL:
SELECT name, age, grade
FROM students
WHERE age > 21 AND grade = 'B' OR grade = 'C'
ORDER BY age ASC;
这里OR grade = 'C'会被单独执行,跟AND age > 21没关系,结果会查出所有成绩是C的学生,不管他们多大。
所以一定要用括号让条件更清楚:
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
GO TO FULL VERSION