SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?

陈旸 2019-07-03
今天我主要讲解连接表的操作。在讲解之前,我想先给你介绍下连接(JOIN)在 SQL 中的重要性。
我们知道 SQL 的英文全称叫做 Structured Query Language,它有一个很强大的功能,就是能在各个数据表之间进行连接查询(Query)。这是因为 SQL 是建立在关系型数据库基础上的一种语言。关系型数据库的典型数据结构就是数据表,这些数据表的组成都是结构化的(Structured)。你可以把关系模型理解成一个二维表格模型,这个二维表格是由行(row)和列(column)组成的。每一个行(row)就是一条数据,每一列(column)就是数据在某一维度的属性。
正是因为在数据库中,表的组成是基于关系模型的,所以一个表就是一个关系。一个数据库中可以包括多个表,也就是存在多种数据之间的关系。而我们之所以能使用 SQL 语言对各个数据表进行复杂查询,核心就在于连接,它可以用一条 SELECT 语句在多张表之间进行查询。你也可以理解为,关系型数据库的核心之一就是连接。
既然连接在 SQL 中这么重要,那么针对今天的内容,需要你从以下几个方面进行掌握:
SQL 实际上存在不同的标准,不同标准下的连接定义也有不同。你首先需要了解常用的 SQL 标准有哪些;
了解了 SQL 的标准之后,我们从 SQL92 标准入门,来看下连接表的种类有哪些;
针对一个实际的数据库表,如果你想要做数据统计,需要学会使用跨表的连接进行操作。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(51)

  • mickey 置顶
    /*
    team 表做一道动手题,表格中一共有 3 支球队,现在这 3 支球队需要进行比赛,请用一条 SQL 语句显示出所有可能的比赛组合。
    */
    #分主客队
    SELECT CONCAT(kedui.team_name, ' VS ', zhudui.team_name) as '客队 VS 主队' FROM team as zhudui LEFT JOIN team as kedui on zhudui.team_id<>kedui.team_id;

    客队 VS 主队
    ------------------------------------
    底特律活塞 VS 印第安纳步行者
    底特律活塞 VS 亚特兰大老鹰
    印第安纳步行者 VS 底特律活塞
    印第安纳步行者 VS 亚特兰大老鹰
    亚特兰大老鹰 VS 底特律活塞
    亚特兰大老鹰 VS 印第安纳步行者

    #不分主客队
    SELECT a.team_name as '队伍1' ,'VS' , b.team_name as '队伍2' FROM team as a ,team as b where a.team_id<b.team_id;

    队伍1 VS 队伍2
    ------------------------------------
    底特律活塞 VS 印第安纳步行者
    底特律活塞 VS 亚特兰大老鹰
    印第安纳步行者 VS 亚特兰大老鹰

    作者回复: 可以看下这个留言,解释的很详细

    2019-07-03
    1
    34
  • 一步
    有两个问题:
    1: 在进行连接查询的时候,查询的顺序是什么呢? 是先进行笛卡尔积在进行条件条件筛选吗?
    2: 在进行连接查询的时候 on 中的条件和 where 中的条件有什么区别呢? 这两个的筛选顺序一样吗?

    作者回复: 1、查询顺序是:FROM > WHERE > GROUP BY > HAVING > SELECT 的字段 > DISTINCT > ORDER BY > LIMIT
    可以看下05篇后面的内容。
    你说的正确,是先进行 CROSS JOIN 求笛卡尔积,然后进行条件筛选。
    2、执行的顺序会先进行ON连接,然后进行WHERE筛选。ON连接是一般连接表的方式,当我们得到数据之后,再会对数据行进行条件筛选

    2019-07-05
    6
  • 长安落雪
    SELECT t1.team_name,t2.team_name FROM team as t1 LEFT JOIN team as t2 ON t1.team_id != t2.team_id

    SELECT t1.team_name , t2.team_name FROM team as t1 ,team as t2 where t1.team_id<t2.team_id;

    作者回复: 正确,大家可以参考下这个。如果是分主客场的话,是第一个SQL。如果是不重复的两个球队的比赛的话,是第二个SQL。

    2019-07-04
    4
  • 小白
    老师请教个问题,数据库主键id bigint 自增 为什么有时候会出现id跳跃增长,整个表没有删除操作,尤其线上,跳跃幅度很大
    2019-07-21
    2
    3
  • 圆子蛋
    三队对阵的可能组合:
    SELECT * FROM team AS a,team AS b WHERE a.team_id < b.team_id
    主客场对阵的可能(只列出名字的话是不是可以这样?)
    SELECT a.team_name as 主场,b.team_name as 客场 FROM team AS a,team AS b WHERE a.team_id != b.team_id

    作者回复: 这两个SQL都正确

    2019-07-03
    3
  • ack
    练习:
    1.①内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接。自然连接是一种特殊的等值连接,他要求两个关系表中进行比较的必须是相同的属性列,无须添加连接条件,并且在结果中消除重复的属性列。要求是两个这两个关系中参与比较的属性列必须是同名、同属性。
    ②外连接有三种方式:左连接,右连接和全连接。
    ③自连接,连接的两个表都是同一个表
    2.SELECT * FROM team a,team b WHERE a.team_id < b.team_id;
    2019-07-03
    3
  • Paradise
    "查看比布雷克·格里芬高的球员都有谁"看个这个题目第一反应是想到子查询。。。

    SELECT player_name, height FROM player WHERE height > (SELECT height FROM player WHERE player_name = '布雷克-格里芬');
    2019-10-24
    2
  • Samson
    SQL:SELECT p.player_name, p.height, h.height_level
    FROM player AS p, height_grades AS h
    WHERE p.height BETWEEN h.height_lowest AND h.height_highest
     

    老师,我还是不能够理解这条语句中WHERE之后的部分,可以麻烦详加解释一番吗?

    另外,对于外连接的两个例子,可以把已经结果也贴一下吗?感觉这样子下效果会更好
    2019-07-05
    2
    2
  • 太精
    select * from team as a, team as b where a.team_id != b.team_id;
    +---------+-----------------------+---------+-----------------------+
    | team_id | team_name | team_id | team_name |
    +---------+-----------------------+---------+-----------------------+
    | 1002 | 印第安纳步行者 | 1001 | 底特律活塞 |
    | 1003 | 亚特兰大老鹰 | 1001 | 底特律活塞 |
    | 1001 | 底特律活塞 | 1002 | 印第安纳步行者 |
    | 1003 | 亚特兰大老鹰 | 1002 | 印第安纳步行者 |
    | 1001 | 底特律活塞 | 1003 | 亚特兰大老鹰 |
    | 1002 | 印第安纳步行者 | 1003 | 亚特兰大老鹰 |
    +---------+-----------------------+---------+-----------------------+

    作者回复: 主队,客队的话 是这样的

    2019-07-04
    2
  • whaleFall_
    连接,有主从表之分。
    内连接:主表和从表的交集,类似“”等值连接“”
    左外连接:主表连接从表(+),显示主表的全部记录,从表只显示符合条件的记录。
    右外连接,和左外连接相反。
    全外连接:主表和从表的并集。
    自连接:自己连接自己,查询的时候用到了自己的字段。

    # 显示三只球队所有可能的比赛组合

    # 1)分主客队伍
    SELECT
        CONCAT(a.team_name,'VS',b.team_name) AS '主队 VS 客队'
    FROM team AS a
    JOIN team AS b
    ON a.team_id != b.team_id

    # 2)不分主客队伍
    SELECT
        a.team_name AS '队伍1',
        b.team_name AS '队伍2'
    FROM team AS a
    JOIN team AS b
    ON a.team_id < b.team_id
    2019-10-23
    1
  • 日拱一卒
    目前主流的DNMS应该都是按照SQL99的规定来设计连接操作的,在实际工作中,极少看到SAL语句中带+的情况。我的建议是在介绍了基本概念后,可以直接使用SAL99,这样更有利于实战。

    作者回复: 对 后面有讲解到SQL99

    2019-10-02
    1
  • 野马
    那一个RDBMS支持多个SQL标准吗?

    作者回复: 这是一个好问题,有的时候是同时支持的,比如:
    SELECT * FROM a, b 和 SELECT * FROM a JOIN b
    但有的时候又不支持,比如在MySQL中不支持SQL92标准下的 +号方式的外连接,但是支持SQL99的外连接方式。
    具体还需要参考RDBMS相关的文档,即使是同一个标准,每个RDBMS都有自己的“方言”,使用的语法也有差异。

    2019-07-04
    1
  • 墨禾
    /*等值连接:两张表存在相同的列属性*/
    SELECT player_id, player.team_id, player_name, height, team_name FROM player, team WHERE player.team_id = team.team_id;

    /*非等值连接*/
    SELECT p.player_name, p.height...

    极客时间版权所有: https://time.geekbang.org/column/article/104637


    /*外连接:包括左连接、右连接、全连接*/
    -- 左外连接:左边的表为主表
     select count(*) from team t left outer join player p on t.team_id = p.team_id;
     /*
    1001 底特律活塞 10001 1001 韦恩-艾灵顿 1.93
    1001 底特律活塞 10002 1001 雷吉-杰克逊 1.91
    1002 印第安纳步行者 10037 1002 Ike Anigbogu 2.08
    1003 亚特兰大老鹰
    */
    -- 右外连接:右边的表为主表
    select count(*) from team t RIGHT outer join player p on t.team_id = p.team_id;
    /*
    1001 底特律活塞 10001 1001 韦恩-艾灵顿 1.93
    1001 底特律活塞 10002 1001 雷吉-杰克逊 1.91
    1002 印第安纳步行者 10037 1002 Ike Anigbogu 2.08
    1003 亚特兰大老鹰
    */

    -- 全连接:两张表做笛卡尔积
    select count(*) from team t outer join player p on t.team_id = p.team_id;
    /*
    1001 底特律活塞 10001 1001 韦恩-艾灵顿 1.93
    1001 底特律活塞 10002 1001 雷吉-杰克逊 1.91
    1002 印第安纳步行者 10037 1002 Ike Anigbogu 2.08
    1003 亚特兰大老鹰
    */


    select count(*) from team t inner join player p on t.team_id = p.team_id;


    -- 自连接:可对单表或多表进行操作
    SELECT b.player_name, b.height FROM player as a , player as b WHERE a.player_name = '布雷克 - 格里芬' and a.height < b.height

    /*请用一条 SQL 语句显示出所有可能的比赛组合*/
    SELECT * FROM team t1 , team t2 WHERE t1.team_id<> t2.team_id
    -- 或
    SELECT * FROM team t1 , team t2 WHERE t1.team_id !=t2.team_id
    2019-07-03
    1
  • 王加武
    外连接不仅可以返回符合条件的行,还可以返回一些不符合条件的行
    内连接只能返回符合条件的行,不能返回不符合条件的行
    自连接自己连接自己,查询的时候用到了自己的字段,也可以多表进行连接

    学习这一节我觉得重点在于理解连接是如何进行的,区分清楚各个连接查询的主表和从表
    想要很深刻的理解,还是需要多做题目

    练习题
    SQL语句
    SELECT a.`team_name` AS 主队,b.team_name AS 客队
    FROM team AS a,team AS b
    WHERE a.`team_id` < b.`team_id`;

    2019-12-06
  • 爬行的蜗牛
    SELECT * FROM team as a, team as b WHERE a.team_name != b.team_name;

    作者回复: 小蜗牛你好,如果分主队,客队的话,SQL正确

    2019-11-23
  • 凌晨四点半
    为什么代码不能显示多行?每次我都需要把代码复制到记事本上看,直接在网页上还需要拖着才能看全局。
    2019-11-21
  • 扶幽
    作业:
    SELECT a.team_name, b.team_name
    FROM team AS a, team AS b
    WHERE a.team_name<>b.team_name;
    2019-10-27
  • chenysh38
    mysql> select a.team_name as team1, b.team_name as team2
        -> from team as a, team as b
        -> where (
        -> select distinct a.team_id - b.team_id
        -> ) > 0;
    +----------------+----------------+
    | team1 | team2 |
    +----------------+----------------+
    | 印第安纳步行者 | 底特律活塞 |
    | 亚特兰大老鹰 | 底特律活塞 |
    | 亚特兰大老鹰 | 印第安纳步行者 |
    +----------------+----------------+
    3 rows in set (0.02 sec)
    2019-09-12
  • 峻铭
    select * from team as a inner join team as b where a.team_id!=b.team_id and a.team_id > b.team_id;
    2019-09-04
  • 靠人品去赢
    高能怎么样,格林芬可以空接啊。
    2019-08-15
收起评论
51
返回
顶部