SQL 必知必会
陈旸
清华大学计算机博士
73337 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
第一章:SQL语法基础篇 (19讲)
SQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

11丨SQL99是如何使用连接的,与SQL92的区别是什么?

使用自连接而不是子查询
在连接时不要忘记WHERE语句
控制连接表的数量
全外连接
右外连接
左外连接
USING连接
ON连接
自然连接
交叉连接
右外连接
左外连接
自连接
非等值连接
等值连接
性能问题
SQLite的外连接
Oracle的表别名
不支持全外连接
特殊语法
可读性
WHERE vs JOIN
外连接
连接操作
外连接
连接操作
不同DBMS中使用连接需要注意的地方
SQL99与SQL92的区别
SQL99标准
SQL92标准
SQL连接操作

该思维导图由 AI 生成,仅供参考

上节课我们讲解了 SQL92 标准,在它之后又提出了 SQL99 标准。现在各大 DBMS 中对 SQL99 标准的支持度更好。你一定听说过 LEFT JOIN、RIGHT JOIN 这样的操作符,这实际上就是 SQL99 的标准,在 SQL92 中它们是用(+)代替的。SQL92 和 SQL99 标准原理类似,只是 SQL99 标准的可读性更强。
今天我就来讲解一下 SQL99 标准中的连接查询,在今天的课程中你需要重点掌握以下几方面的内容:
SQL99 标准下的连接查询是如何操作的?
SQL99 与 SQL92 的区别是什么?
在不同的 DBMS 中,使用连接需要注意什么?

SQL99 标准中的连接查询

上一篇文章中,我用 NBA 球员的数据表进行了举例,包括了三张数据表 player、team 和 height_grades。
其中 player 表为球员表,一共有 37 个球员,如下所示:
team 表为球队表,一共有 3 支球队,如下所示:
height_grades 表为身高等级表,如下所示:
接下来我们看下在 SQL99 标准中,是如何进行连接查询的?

交叉连接

交叉连接实际上就是 SQL92 中的笛卡尔乘积,只是这里我们采用的是 CROSS JOIN。
我们可以通过下面这行代码得到 player 和 team 这两张表的笛卡尔积的结果:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

SQL99标准与SQL92标准在连接查询方面有着明显的区别。SQL99标准提供了更灵活、可读性更强的连接操作方式,包括交叉连接、自然连接、ON连接、USING连接、外连接和自连接。相比之下,SQL92标准在连接查询时需要将所有需要连接的表放到FROM之后,并在WHERE中写明连接条件,而SQL99标准采用JOIN的方式,每次连接一张表,可以多次使用JOIN进行连接,使得SQL语句更加简洁、可读性更强。总的来说,SQL99标准在连接查询方面提供了更加灵活、清晰的操作方式,使得多表连接更加直观易懂。 此外,不同的DBMS在使用连接时会存在差异,需要注意一些常见的问题,如不是所有的DBMS都支持全外连接,Oracle中不存在表别名AS,SQLite的外连接只有左连接等。在连接时需要注意控制连接表的数量,不要连接不必要的表,并且不要忘记WHERE语句以筛选符合条件的数据行。另外,建议使用自连接而不是子查询,因为在许多DBMS的处理过程中,对于自连接的处理速度要比子查询快得多。 总的来说,连接是SQL中的核心操作,通过两篇文章的学习,读者可以从多个维度对连接进行了了解。在实际工作中,尤其是做业务报表的时候,需要理解和熟练掌握SQL标准中连接的使用,以及不同DBMS中对连接的语法规范。文章提供了对SQL标准的学习,建议在需要进行外连接的时候采用SQL99标准,这样更适合阅读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(106)

  • 最新
  • 精选
  • 所有的连接类型,是不是都先对连接的表做笛卡尔,然后在根据条件进行数据筛选的? 对于上一个问题,可能没有表达清楚,我想问的是,各种连接的内部执行步骤,比如先根据连接生成中间表数据,然后在连接类型,on,where进行数据筛选得到数据的步骤

    作者回复: 完整的SELECT语句内部执行顺序是: 1、FROM子句组装数据(包括通过ON进行连接) 2、WHERE子句进行条件筛选 3、GROUP BY分组 4、使用聚集函数进行计算; 5、HAVING筛选分组; 6、计算所有的表达式; 7、SELECT 的字段; 8、ORDER BY排序 9、LIMIT筛选

    2019-07-05
    3
    67
  • 墨禾
    跟踪到第四个星期的专栏学习,这里对前面的知识点做个阶段性的总结。首先我自己是个用过mssql、mysql做过项目开发的人,所以我学习这几节课的专栏比较轻松,除了对过去的项目做个复盘提醒之外,还有些新的收获——从纵向广度、横向深度了解sql语言的特点。 ----------------------------------------------------------------------------------------------------- 1、纵向广度 几乎每节专栏都会对 mysql 和 oracle 的知识点做对比,让我从不同之中寻找练习,迁移默化之中加强知识迁移的能力,让我在技术不断迭代更新的时代减少一些焦虑感。 ------------------------------------------------------------------------------------------------------- 2、横向深度 -- 熟悉了更多的专业术语(如DML、DDL、DQL、TCL、SQL92、SQL99):之前在实操的时候,只管用,而不管知识属于哪个体系,这样的方法有些粗暴而低效,因为有时候出错的时候,在不理解知识整体结构和专业术语的情况下,难以定位具体的出错点,也就难以检索到对应的解决办法。 -- 理清楚mysql的知识脉络结构,学习一种思维模式:每一节专栏都有对应的思维导图,看完文字听完语音,掌握了知识要点后,可能忽略了知识之间的联系,思维导图可以很清晰地展现知识之间的联系。其实看老师的专栏的结构组织,也就是一种学习【思维模式】,让我逐渐地转变学生思维,一年后,以更为优秀的姿态走向社会。 -- 摆正心态:大步迈进,小步迭代。看到知识点都是自己学过的,有时候会觉得有些亏。 但反过来想,老师这么厉害的人,尚且与我们一起学习基础知识,我有什么理由好高骛远? 所以我要做到每节课不落地认真做笔记,最重要的还是要多实践,实践方能出真知。

    作者回复: 多谢支持,不同企业使用的DBMS会有不同,所以在竞争激烈的环境下掌握不同的RDBMS的使用有时候会是一种优势。 我们知道数据库都有自己的“方言”,同时也都遵循一定的规范标准,所以对规范标准的掌握有时候更重要,“方言”在实际使用中查阅相应的RDBMS文档,当然日常积累也很重要 专栏里不同人所处的阶段不同,所以需要先交付基础,当然即使是基础篇也需要了解底层原理,这样对后续的SQL优化很有必要。 赞下总结笔记的习惯,我接触很多同学,一般来说经常写总结笔记的同学收获更大,在实际工作中也会游刃有余。

    2019-07-05
    5
    36
  • mickey
    # 编写 SQL 查询语句,查询不同身高级别(对应 height_grades 表)对应的球员数量(对应 player 表) SELECT h.height_level AS '身高级别', COUNT(player_id) AS '球员数量' FROM height_grades as h LEFT JOIN player as p ON height BETWEEN h.height_lowest AND h.height_highest GROUP BY height_level; 身高级别 球员数量 --------------------------- A 18 B 14 C 5 D 0

    作者回复: 正确

    2019-07-18
    7
    30
  • lmingzhi
    "需要注意的是 MySQL 不支持全外连接,否则的话全外连接会返回左表和右表中的所有行。当表之间有匹配的行,会显示内连接的结果。当某行在另一个表中没有匹配时,那么会把另一个表中选择的列显示为空值。" 请问一下,这里的否则,指的是支持全外连接的数据库吗?

    作者回复: 对的 就是讲解下如果支持全外连接的数据库是怎样的结果。Oracle支持全外连接 FULL JOIN,而MySQL不支持,不过想要写全外连接的话,可以用 左外连接 UNION 右外连接,比如: SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id UNION SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id

    2019-07-05
    15
  • Geek_635558
    结果相同可以有N种写法,其实很多时候更应该关注查询的效率如何。希望可以详解

    作者回复: 对的,我们需要先了解都有哪些写法,然后在正确性的基础上提升SQL优化的能力,这部分会在后面陆续讲到。 SQL优化有很多维度,最常用的考虑可以从两方面入手:如何建立有效的索引策略(包括主键),以及不要在WHERE的字段中做函数运算。 在此基础上,我们还会了解事务处理,锁的机制,不同RDBMS的特点和使用等等。

    2019-07-05
    15
  • rike
    我有一个疑问,在例子上写的很多sql连接查询时,只有join...on关键字,但是没有其他的,但是这种join...on和left join...on的区别是什么?

    作者回复: JOIN 就是默认的 INNER JOIN,LEFT JOIN是左连接 左连接:以左表为主,关联上右表 内连接:左表和右表的交集

    2019-09-01
    2
    9
  • 夜路破晓
    建议多表连接使用SQL99标准.好了本章结束,继续!

    作者回复: 加油~

    2019-07-05
    4
  • Oliver
    老师好,问个问题,在一对多的关系中,怎么写sql语句?初学者一枚

    作者回复: SQL查询语句是面向集合的思维方式,你需要思考你想提取的数据是什么?不论是一对多,一对一,还是多对多的关系,关注的都应该是你想提取的数据是什么。 不过在建数据表的时候,你需要考虑到这些关系的特性,比如一张数据表是一对多的关系,可以将1端设置为主键,这样在查询的时候效率更高。

    2019-07-07
    3
  • Krison
    我SQL很差,之前订了课程一直没时间学。今天捡起来。这个sql想了很久,总算是想出来了。加油! SELECT CONCAT( '身高级别', ' - ', b.height_level ), CONCAT( '球员数量', ' - ', count( b.height_level ) ) FROM `player` AS a LEFT JOIN height_grades AS b ON a.height BETWEEN b.height_lowest AND b.height_highest GROUP BY b.height_level; ------结果如下------------ 身高级别 - A 球员数量 - 18 身高级别 - B 球员数量 - 14 身高级别 - C 球员数量 - 5

    作者回复: 加油Krison,SQL写的不错

    2019-11-27
  • 爬行的蜗牛
    SELECT COUNT(*), h.height_level FROM player as p JOIN height_grades as h ON p.height BETWEEN h.height_lowest AND h.height_highest GROUP BY h.height_level;

    作者回复: 正确

    2019-11-25
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部