篇02_SELECT_FROM_WHERE_基础查询
零基础学SQL 02:SELECT / FROM / WHERE —— 写出你的第一条查询
系列前文:篇01 什么是数据库?什么是 SQL?一文搞懂
系列目录:SQL 从入门到精通 · 总目录(置顶)
先说点真话
我 2016 年刚入行做数据分析那会儿,师傅丢给我第一张几百万行的业务表,说"把某部门工资大于 8000 的人拉出来"。
我当时盯着屏幕,连"从哪张表取、取哪些列、按什么条件"都没捋清,写出来的 SQL 要么报错,要么把全公司的人全查出来了,被师傅笑了一周。
后来我才明白,90% 的 SQL 入门都卡在同一件事上:搞不清 SELECT、FROM、WHERE 这三兄弟谁干啥。今天这篇就把它们一次讲透。
一、这条查询到底在干啥?
一条最基础的 SQL,长这样:
SELECT列名FROM表名WHERE条件;把它翻译成人话:
- FROM:去哪张表拿数据(先定位"仓库")
- SELECT:从这张表里挑哪些列(要"苹果"还是"香蕉")
- WHERE:只拿满足条件的行(挑"红苹果")
记住顺序:先 FROM 找表,再 WHERE 过滤,最后 SELECT 挑列。虽然书写顺序是 SELECT→FROM→WHERE,但数据库真正执行的顺序是 FROM→WHERE→SELECT,这点后面调错很有用。
二、最小可运行例子
我们统一用系列练习表里的员工表来练手(本系列所有文章都基于这 4 张表,建一次表就能跟着全系列练):
-- 📋 本系列统一练习表(复制即可建表,随时练手)CREATETABLE员工表(员工idINTPRIMARYKEY,姓名VARCHAR(20),部门VARCHAR(20),工资DECIMAL(10,2),邮箱VARCHAR(50),手机VARCHAR(20),入职日期DATE);CREATETABLE订单表(订单idINTPRIMARYKEY,员工idINT,订单金额DECIMAL(10,2),下单时间DATETIME,付款时间DATETIME,状态VARCHAR(20));CREATETABLE用户表(用户idINTPRIMARYKEY,姓名VARCHAR(20),手机VARCHAR(20),邮箱VARCHAR(50),地址VARCHAR(100));CREATETABLE任务表(任务idINTPRIMARYKEY,员工idINT,备注VARCHAR(100),状态VARCHAR(20));-- 先往员工表插几条示例数据INSERTINTO员工表VALUES(1,'张三','技术部',9000,'zhangsan@x.com','13800000001','2019-03-12'),(2,'李四','技术部',7500,'lisi@x.com','13800000002','2020-07-01'),(3,'王五','销售部',8200,'wangwu@x.com','13800000003','2018-11-23'),(4,'赵六','人事部',6000,'zhaoliu@x.com','13800000004','2021-05-09');例子 1:查所有人的姓名和工资
SELECT姓名,工资FROM员工表;结果:
| 姓名 | 工资 |
|---|---|
| 张三 | 9000 |
| 李四 | 7500 |
| 王五 | 8200 |
| 赵六 | 6000 |
例子 2:只查技术部的人
SELECT*FROM员工表WHERE部门='技术部';*表示"所有列"。结果只剩张三、李四两行。
三、WHERE 里能写哪些条件?
WHERE 后面可以接各种判断,最常用的:
| 写法 | 含义 | 示例 |
|---|---|---|
= | 等于 | WHERE 部门 = '技术部' |
><>=<= | 大小比较 | WHERE 工资 > 8000 |
<>或!= | 不等于 | WHERE 部门 <> '人事部' |
AND/OR | 并且 / 或者 | WHERE 部门='技术部' AND 工资>8000 |
IN (...) | 在列表里 | WHERE 部门 IN ('技术部','销售部') |
BETWEEN a AND b | 区间 | WHERE 工资 BETWEEN 6000 AND 8000 |
LIKE | 模糊匹配 | WHERE 姓名 LIKE '张%'(姓张的) |
组合一下:技术部且工资大于 8000
SELECT姓名,工资FROM员工表WHERE部门='技术部'AND工资>8000;结果只有张三。
四、当年我踩过的 3 个坑(重点看)
忘写 WHERE,把全表都查出来了
早期做报表,本来只想看某个月的数据,结果漏了WHERE 入职日期 >= '2020-01-01',把历史几年全拉出来,数字直接错得离谱。结论:统计/导出前,先确认过滤条件。字符串忘了加引号
WHERE 部门 = 技术部会报错,正确是WHERE 部门 = '技术部'。SQL 里字符串必须加单引号,数字不用。日期格式乱写
不同数据库日期写法不一样(Oracle 常用TO_DATE,MySQL 用'2020-01-01')。最稳的办法:先用SELECT * FROM 员工表 WHERE 入职日期 >= '2020-01-01'试,报错就查对应数据库的日期函数。
五、3 个练习(自己跑一遍)
基于上面的员工表:
- 查工资在 7000 到 9000 之间的人(提示:
BETWEEN)。 - 查不是人事部的人(提示:
<>,或NOT 部门 = '人事部')。 - 查姓"王"的人(提示:
LIKE '王%')。
参考答案(先自己写,再对照):
-- 1SELECT姓名,工资FROM员工表WHERE工资BETWEEN7000AND9000;-- 2SELECT姓名,部门FROM员工表WHERE部门<>'人事部';-- 3SELECT姓名FROM员工表WHERE姓名LIKE'王%';六、小结
FROM找表 →WHERE过滤 →SELECT挑列- 字符串加单引号,数字不加
- 统计/导出前一定先确认 WHERE 条件
下一篇我们讲排序与去重:ORDER BY / DISTINCT / LIMIT,教你把查出来的结果排个序、去个重。
互动时间:你第一次写 SQL 时,最卡壳的是哪一步?是装环境、还是写不出 WHERE 条件、还是被报错劝退?评论区聊聊,我挑典型的下篇解答。
