SQL 入门:一次讲清 SELECT、WHERE 与 JOIN

举报
yd_296515785 发表于 2026/10/29 10:07:25 2026/10/29
【摘要】 刚接触数据库时,很多人会被一堆关键字吓住。其实日常查询大多围绕三个动作展开:挑出想要的列,筛出想要的行,再把分散在不同表里的数据拼到一起。把 SELECT、WHERE 与 JOIN 这三件事讲清楚,SQL 就入门了一大半。先看 SELECT,它回答的是“要哪些列”。例如 SELECT 姓名, 部门 FROM 员工表,就是只拿姓名和部门这两列,而不是把整张表都拖出来。写 SELECT * 虽然...

刚接触数据库时,很多人会被一堆关键字吓住。其实日常查询大多围绕三个动作展开:挑出想要的列,筛出想要的行,再把分散在不同表里的数据拼到一起。把 SELECT、WHERE 与 JOIN 这三件事讲清楚,SQL 就入门了一大半。

先看 SELECT,它回答的是“要哪些列”。例如 SELECT 姓名, 部门 FROM 员工表,就是只拿姓名和部门这两列,而不是把整张表都拖出来。写 SELECT * 虽然省事,却可能带回用不上的大字段和敏感字段,还会让结果难以预测。养成只写需要列的习惯,既清晰又高效。给列起别名也能让结果更好读,例如把计算结果命名为平均薪资,阅读者一眼就能明白。

WHERE 回答的是“要哪些行”。它在取数之前先做筛选,例如只保留入职年份大于 2023 年的员工,或者只看某个城市的订单。常见的比较有等于、大于、小于、区间和模糊匹配。需要注意的是,WHERE 里对空值的判断不能用等于号,而要用 IS NULL,因为空值表示未知,而不是一个具体的值。多个条件组合时,AND 表示同时满足,OR 表示满足其一,括号可以明确优先级,避免写出与本意不同的筛选逻辑。

当数据不在同一张表时,就要用到 JOIN。假设员工表里只有部门编号,部门名称在另一张部门表里,这时可以用部门编号把两张表连起来。INNER JOIN 只保留两边都能对上号的记录,适合回答“已经分配了部门的员工有哪些”。LEFT JOIN 则以左表为主,即使右表没有对应记录,左表的行也会保留,缺失处显示为空,适合回答“所有员工分别属于哪个部门,没有部门的也要列出来”。

写 JOIN 时最容易出错的地方有两个。第一是忘记写连接条件,结果会变成两张表的笛卡尔积,行数暴涨,数据完全失真。第二是把筛选条件放错位置:在 LEFT JOIN 里,把右表的筛选写进 WHERE,往往会把本应保留的空行过滤掉,效果悄悄变成 INNER JOIN。把连接关系写在 ON 里,把对最终结果的筛选写在 WHERE 里,逻辑会更稳定。

再把执行顺序串起来:数据库会先确定参与的表和连接方式,再用 WHERE 筛选行,接着按 SELECT 挑选列,最后才做排序和限制条数。理解这个顺序,就能明白为什么 WHERE 里不能直接使用 SELECT 中定义的别名做筛选,也能更冷静地排查“为什么结果少了一行”这类问题。

给新手一个可行的练习路径:先用一张小表练 SELECT 和 WHERE,确认筛选结果符合预期;再准备两张有关联的小表,分别用 INNER JOIN 和 LEFT JOIN 对比行数变化;最后故意写一次缺少连接条件的语句,观察行数异常,从而记住连接条件的重要性。把每一步的结果都先想清楚再写 SQL,入门会快得多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。