11丨SQL99是如何使用连接的,与SQL92的区别是什么?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
讲述:陈旸
时长10:49大小8.67M
SQL99 标准中的连接查询
交叉连接
自然连接
ON 连接
USING 连接
外连接
自连接
SQL99 和 SQL92 的区别
不同 DBMS 中使用连接需要注意的地方
总结
赞 22
提建议
精选留言(105)
- 一步2019-07-05所有的连接类型,是不是都先对连接的表做笛卡尔,然后在根据条件进行数据筛选的? 对于上一个问题,可能没有表达清楚,我想问的是,各种连接的内部执行步骤,比如先根据连接生成中间表数据,然后在连接类型,on,where进行数据筛选得到数据的步骤
作者回复: 完整的SELECT语句内部执行顺序是: 1、FROM子句组装数据(包括通过ON进行连接) 2、WHERE子句进行条件筛选 3、GROUP BY分组 4、使用聚集函数进行计算; 5、HAVING筛选分组; 6、计算所有的表达式; 7、SELECT 的字段; 8、ORDER BY排序 9、LIMIT筛选
共 3 条评论64 - 墨禾2019-07-05跟踪到第四个星期的专栏学习,这里对前面的知识点做个阶段性的总结。首先我自己是个用过mssql、mysql做过项目开发的人,所以我学习这几节课的专栏比较轻松,除了对过去的项目做个复盘提醒之外,还有些新的收获——从纵向广度、横向深度了解sql语言的特点。 ----------------------------------------------------------------------------------------------------- 1、纵向广度 几乎每节专栏都会对 mysql 和 oracle 的知识点做对比,让我从不同之中寻找练习,迁移默化之中加强知识迁移的能力,让我在技术不断迭代更新的时代减少一些焦虑感。 ------------------------------------------------------------------------------------------------------- 2、横向深度 -- 熟悉了更多的专业术语(如DML、DDL、DQL、TCL、SQL92、SQL99):之前在实操的时候,只管用,而不管知识属于哪个体系,这样的方法有些粗暴而低效,因为有时候出错的时候,在不理解知识整体结构和专业术语的情况下,难以定位具体的出错点,也就难以检索到对应的解决办法。 -- 理清楚mysql的知识脉络结构,学习一种思维模式:每一节专栏都有对应的思维导图,看完文字听完语音,掌握了知识要点后,可能忽略了知识之间的联系,思维导图可以很清晰地展现知识之间的联系。其实看老师的专栏的结构组织,也就是一种学习【思维模式】,让我逐渐地转变学生思维,一年后,以更为优秀的姿态走向社会。 -- 摆正心态:大步迈进,小步迭代。看到知识点都是自己学过的,有时候会觉得有些亏。 但反过来想,老师这么厉害的人,尚且与我们一起学习基础知识,我有什么理由好高骛远? 所以我要做到每节课不落地认真做笔记,最重要的还是要多实践,实践方能出真知。展开
作者回复: 多谢支持,不同企业使用的DBMS会有不同,所以在竞争激烈的环境下掌握不同的RDBMS的使用有时候会是一种优势。 我们知道数据库都有自己的“方言”,同时也都遵循一定的规范标准,所以对规范标准的掌握有时候更重要,“方言”在实际使用中查阅相应的RDBMS文档,当然日常积累也很重要 专栏里不同人所处的阶段不同,所以需要先交付基础,当然即使是基础篇也需要了解底层原理,这样对后续的SQL优化很有必要。 赞下总结笔记的习惯,我接触很多同学,一般来说经常写总结笔记的同学收获更大,在实际工作中也会游刃有余。
共 5 条评论36 - mickey2019-07-18# 编写 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展开
作者回复: 正确
共 7 条评论29 - lmingzhi2019-07-05"需要注意的是 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
15 - Geek_6355582019-07-05结果相同可以有N种写法,其实很多时候更应该关注查询的效率如何。希望可以详解
作者回复: 对的,我们需要先了解都有哪些写法,然后在正确性的基础上提升SQL优化的能力,这部分会在后面陆续讲到。 SQL优化有很多维度,最常用的考虑可以从两方面入手:如何建立有效的索引策略(包括主键),以及不要在WHERE的字段中做函数运算。 在此基础上,我们还会了解事务处理,锁的机制,不同RDBMS的特点和使用等等。
14 - rike2019-09-01我有一个疑问,在例子上写的很多sql连接查询时,只有join...on关键字,但是没有其他的,但是这种join...on和left join...on的区别是什么?
作者回复: JOIN 就是默认的 INNER JOIN,LEFT JOIN是左连接 左连接:以左表为主,关联上右表 内连接:左表和右表的交集
共 2 条评论8 - 一步2019-07-05对于连接执行的顺序,有点不太确定,希望老师讲解下各种连接及相关的关键字 执行的顺序?7
- 夜路破晓2019-07-05建议多表连接使用SQL99标准.好了本章结束,继续!
作者回复: 加油~
4 - Oliver2019-07-07老师好,问个问题,在一对多的关系中,怎么写sql语句?初学者一枚
作者回复: SQL查询语句是面向集合的思维方式,你需要思考你想提取的数据是什么?不论是一对多,一对一,还是多对多的关系,关注的都应该是你想提取的数据是什么。 不过在建数据表的时候,你需要考虑到这些关系的特性,比如一张数据表是一对多的关系,可以将1端设置为主键,这样在查询的时候效率更高。
3 - 一叶知秋2019-07-05SELECT g.height_level, count(*) FROM height_grades as g, player as p WHERE p.height BETWEEN g.height_lowest AND g.height_highest GROUP BY g.height_level; 执行结果: +--------------+----------+ | height_level | count(*) | +--------------+----------+ | A | 18 | | B | 14 | | C | 5 | +--------------+----------+ 3 rows in set (0.01 sec) 一下午真正追完了~~~~展开共 2 条评论2
- 圆子蛋2019-07-05SELECT h.height_level,COUNT(*) AS num FROM height_grades AS h JOIN player AS p ON p.player_height BETWEEN h.height_lowest AND h.height_highest GROUP BY h.height_level ORDER BY h.height_level ASC共 2 条评论2
- 柯察金2019-07-05把链接条件写在 join 里面跟写在 where 会有什么不同吗。老师能不能讲一下,工作的时候常常遇到,发现有时候筛选条件放的位置没有影响,有时候又是有两者差别又很大2
- 你的代码有灵魂吗?2021-04-08“子查询实际上是通过未知表进行查询后的条件判断,而自连接是通过已知的自身数据表进行条件判断,因此在大部分 DBMS 中都对自连接处理进行了优化。” 这句听起来有点抽象难理解,老师能举个具体一点的例子吗?1
- 唐龙2020-06-08我现在才知道,我以前一直是混用92和99的1
- 爬行的蜗牛2020-01-22mysql> SELECT h.height_level AS '身高等级', COUNT(player_id) as '球员数量' -> FROM height_grades as h LEFT JOIN player ON height -> BETWEEN h.height_lowest AND h.height_highest -> GROUP BY h.height_level; +--------------+--------------+ | 身高等级 | 球员数量 | +--------------+--------------+ | A | 18 | | B | 14 | | C | 5 | | D | 0 | +--------------+--------------+ 4 rows in set (0.00 sec)展开1
- 白了少年头2019-07-05select height_level, count(player_name) as player_num from player as p left join height_grades as h on p.height between h.height_lowest and h.height_highest group by height_level; +--------------+------------+ | height_level | player_num | +--------------+------------+ | A | 18 | | B | 14 | | C | 5 | +--------------+------------+ 3 rows in set (0.00 sec)展开1
- 郡鸿2019-07-05select h.height_level,count(*) as num from player p join height_grades h on p.height between h.height_lowest and h.height_highest group by h.height_level;1
- 张兴2022-09-19 来自上海SELECT h.height_level AS '身高级别', COUNT(p.player_id) AS '数量' FROM height_grades h LEFT JOIN player p ON height BETWEEN h.height_lowest AND h.height_highest GROUP BY h.height_level 建议先写from, 完了on筛选,用等级划分,最后select展开
- 年少挽滑稽世无双2022-09-06 来自四川# 查询不同身高级别(对应 height_grades 表)对应的球员数量(对应 player 表)。 SELECT h.height_level,COUNT(player_id) num FROM height_grades h LEFT JOIN player p ON height BETWEEN h.height_lowest AND h.height_highest GROUP BY h.height_level ORDER BY num DESC
- 唐龙2022-06-30我在MariaDB中,使用了全外连接报错了: ``` MariaDB [geektime]> SELECT * FROM player FULL JOIN team ON player.team_id = team.team_id; ERROR 1054 (42S22): Unknown column 'player.team_id' in 'on clause ``` 但是换成下面的又可以了: `SELECT * FROM player FULL JOIN team USING(team_id);` 这个时候它属于USING连接还是全连接。展开