篇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 个坑(重点看)

  1. 忘写 WHERE,把全表都查出来了
    早期做报表,本来只想看某个月的数据,结果漏了WHERE 入职日期 >= '2020-01-01',把历史几年全拉出来,数字直接错得离谱。结论:统计/导出前,先确认过滤条件。

  2. 字符串忘了加引号
    WHERE 部门 = 技术部会报错,正确是WHERE 部门 = '技术部'SQL 里字符串必须加单引号,数字不用。

  3. 日期格式乱写
    不同数据库日期写法不一样(Oracle 常用TO_DATE,MySQL 用'2020-01-01')。最稳的办法:先用SELECT * FROM 员工表 WHERE 入职日期 >= '2020-01-01'试,报错就查对应数据库的日期函数。


五、3 个练习(自己跑一遍)

基于上面的员工表

  1. 查工资在 7000 到 9000 之间的人(提示:BETWEEN)。
  2. 查不是人事部的人(提示:<>,或NOT 部门 = '人事部')。
  3. 查姓"王"的人(提示:LIKE '王%')。

参考答案(先自己写,再对照):

-- 1SELECT姓名,工资FROM员工表WHERE工资BETWEEN7000AND9000;-- 2SELECT姓名,部门FROM员工表WHERE部门<>'人事部';-- 3SELECT姓名FROM员工表WHERE姓名LIKE'王%';

六、小结

  • FROM找表 →WHERE过滤 →SELECT挑列
  • 字符串加单引号,数字不加
  • 统计/导出前一定先确认 WHERE 条件

下一篇我们讲排序与去重:ORDER BY / DISTINCT / LIMIT,教你把查出来的结果排个序、去个重。


互动时间:你第一次写 SQL 时,最卡壳的是哪一步?是装环境、还是写不出 WHERE 条件、还是被报错劝退?评论区聊聊,我挑典型的下篇解答。