SQL中的连接

关系型数据库的核心之一就是连接, 而在不同的标准中, 连接的写法上可能有区别, 最为主要的两个SQL标准就是SQL92和SQL99了, 后面的数字表示的是标准提出的时间.

SQL92中的连接

案例使用的表是球员表, 球队表和身高级别表, 下载: https://github.com/cystanford/sql_nba_data

笛卡尔积

笛卡尔积是一个数学运算, 假设两个集合X和Y, 那么X和Y的笛卡尔积就是X和Y的所有可能组合.

SQL: SELECT * FROM player, team; // 笛卡尔积

简单的来说就是两个表的数据行的乘积就是结果行.

等值连接

等值连接就是用两张表都存在的列进行连接, 可以对多张表进行等值连接.

SELECT player_id, player.team_id, player_name, height, team_name FROM player, team WHERE player.team_id = team.team_id; //等值连接

SELECT player_id, a.team_id, player_name, height, team_name FROM player AS a, team AS b WHERE a.team_id = b.team_id; // 别名代替, 看上去会更简洁
非等值连接

当我们进行多表查询的时候,如果连接多个表的条件是等号时(如果能使用等号,肯定是存在相同的列),就是等值连接,其他的运算符连接就是非等值查询。

现在要查询每个球员的身高级别, 可以采用非等值连接查询:

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; // 查询每个球员的身高级别
外连接

外连接是查询某一方不满足条件的记录. 两张表的外连接, 会有一张是主表, 一张是从表. 多张表的外连接, 第一张表是主表, 剩下的表全是从表, 在SQL92中采用(+)代表从表所在的位置, 并且在SQL92中只有左外连接和右外连接, 没有全外连接.

左外连接就是左边的表是主表, 需要显示全部行, 右侧的表是从表. 右外连接则相反.

SELECT * FROM player, team where player.team_id = team.team_id(+); // 左外连接

SELECT * FROM player, team where player.team_id(+) = team.team_id; // 右外连接

不过笔者在测试的时候发现(+)是不能使用的, 所以请参考下面的SQL99的写法

SQL:SELECT * FROM player LEFT JOIN team on player.team_id = team.team_id; // 左外连接
SQL:SELECT * FROM player RIGHT JOIN team on player.team_id = team.team_id; // 右外连接
自连接

自连接可以对多个表进行操作,也可以对同一个表进行操作。也就是说查询条件使用了当前表的字段(不过按照笔者的理解就是自己和自己连接查询)。

SELECT b.player_name, b.height FROM player as a , player as b WHERE a.player_name = '布雷克 - 格里芬' and a.height < b.height; // 自连接查询比布雷克 - 格里芬身高高的球员

SQL99的连接

还是上面的表, 看看SQL99中是如何使用连接的.

交叉连接

交叉连接也就是SQL92中的笛卡尔积, 这里采用CROSS JOIN, 如下可以得到笛卡尔积的结果:

SELECT * FROM player CROSS JOIN team;  // 使用CROSS JOIN实现笛卡尔积

自然连接

自然连接就是SQL92中的等值连接, 会自动查询连接表中所有相同的字段, 进行等值连接.

SELECT player_id, team_id, player_name, height, team_name FROM player NATURAL JOIN team ; // 使用NATURAL JOIN可以自动查询连接表的相同字段

这个有缺点有优点, 缺点在于如果设计表的时候设计不规范, 可能造成两张表字段名相同但表达意义不同, 这个时候直接使用NATURAL JOIN出来的结果可能就不是想要的结果. 当然优点在于写法简单

ON连接

ON连接用来指定想要的连接条件, 同样可以帮助我们实现自然连接的功能

SELECT player_id, player.team_id, player_name, height, team_name FROM player JOIN team ON player.team_id = team.team_id; // ON连接实现自然连接

ON连接也可以进行非等值连接, 如下

SELECT p.player_name, p.height, h.height_level
FROM player as p JOIN height_grades as h
ON height BETWEEN h.height_lowest AND h.height_highest; // 查询球员的身高等级

USING连接

USING指定数据表里同名字段进行等值连接

SELECT player_id, team_id, player_name, height, team_name FROM player JOIN team USING(team_id);

优点缺点与用NATURAL JOIN一样

外连接

SQL99中的外连接:

  1. 左外连接: LEFT JOIN或LEFT OUTER JOIN
  2. 右外连接: RIGHT JOIN或RIGHT OUTER JOIN
  3. 全外连接: FULL JOIN或FULL OUTER JOIN
SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id; // 左外连接
SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id; // 右外连接
SELECT * FROM player FULL JOIN team ON player.team_id = team.team_id; // 全外连接

需要注意的是 MySQL 不支持全外连接,否则的话全外连接会返回左表和右表中的所有行。当表之间有匹配的行,会显示内连接的结果。当某行在另一个表中没有匹配时,那么会把另一个表中选择的列显示为空值。

也就是说,全外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。

自连接

自连接在SQL99中的表述如下:

SELECT b.player_name, b.height FROM player as a JOIN player as b ON a.player_name = '布雷克 - 格里芬' and a.height < b.height; // 自连接

建议使用SQL99的写法, 看上去会更简洁与清晰明了.

SQL中的连接(极客时间)的更多相关文章

  1. SQL中的视图(极客时间)

    视图 视图也就是虚拟表, 本身不具备数据, 是SQL中的一个变红要概念. 如图 视图可以帮助我们使用表的一部分, 而不是所有的表, 另一方面可以针对不同的用户制定不同的查询视图. 创建, 更新与删除视 ...

  2. 【视频合集】极客时间 react实战进阶45讲 【更新中】

    https://up2.v.sharedaka.com/video/ochvq0AVfpa71A24bmugS5EewhFM1553702519936.mp4 01 React出现的历史背景及特性介绍 ...

  3. 极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间

    极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间 笔记体会: 方案一,事务相 ...

  4. Mysql实战45讲 05讲深入浅出索引(下)极客时间 读书笔记

    极客时间 Mysql实战45讲 04讲深入浅出索引(下)极客时间 笔记体会: 回表:回到主键索引树搜索的过程,称为回表覆盖索引:某索引已经覆盖了查询需求,称为覆盖索引,例如:select ID fro ...

  5. Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间

    极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记  笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...

  6. java爬虫系列第四讲-采集"极客时间"专栏文章、视频专辑

    1.概述 极客时间(https://time.geekbang.org/),想必大家都知道的,上面有很多值得大家学习的课程,如下图: 本文主要内容 使用webmagic采集极客时间中某个专栏课程生成h ...

  7. "做中学"之“极客时间”课程学习指导

    目录 "做中学"之"极客时间"课程学习指导 所有课程都可以选的课程 Java程序设计 移动平台开发 网络攻防实践 信息安全系统设计基础 信息安全专业导论 极客时 ...

  8. 左耳朵耗子:我为什么要在极客时间 App 开设独家专栏?

    参考链接:https://www.infoq.cn/article/2018/01/why-geektime 不少朋友都知道我在极客时间App 上开了一个收费专栏<左耳听风>,这个专栏会开 ...

  9. Mysql实战45讲 06讲全局锁和表锁:给表加个字段怎么有这么多阻碍 极客时间 读书笔记

    Mysql实战45讲 极客时间 读书笔记 Mysql实战45讲 极客时间 读书笔记 笔记体会: 根据加锁范围:MySQL里面的锁可以分为:全局锁.表级锁.行级锁 一.全局锁:对整个数据库实例加锁.My ...

随机推荐

  1. 安装quickLook插件以及解决如何不能读取offic问题

    目录 @(安装quickLook插件) quickLook插件是Mac上的快速浏览的一个功能,现在win10系统上也能安装插件,这个插件可以快速浏览txt,doc,图片,表格等文件如下图: 我认为最方 ...

  2. python中动态创建类

    class Foo(Bar): pass Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象(我说的是类对象,请紧 ...

  3. 6-SQL子查询

    (1) 什么是关联子查询,什么是非关联子查询 (嵌套查询) 子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做非关联子查询. 如 ...

  4. VSCode 如何同步设置

    微软新推出的 VSCode 是一款开源.轻量.良心的开发工具,一经问世,迅速受到全球广泛开发者的好评与青睐,威风之下有干掉 Sublime Text 的趋势.然而有不少 VSCode 使用者吐槽其不能 ...

  5. CSS 轻松搞定标签(元素)居中问题

    在CSS里,标签位置居中一直是困扰Web前端的难题.在本文中,我对这类问题进行了探究和给出了几点建议,供读者参考. 1 行内标签 1.1 水平居中 在父级标签中使用 text-align: cente ...

  6. 自动化部署-svn hook触发构建

    目的 之前是通过轮询的形式,2分钟更新一次svn,即时性不高,现在想要实现提交代码时直接触发构建 方案 使用svn的服务器hook,当有代码提交时请求jenkins api实现构建 具体实现 1.je ...

  7. 编译 lineageos 14.1 on OnePlus3

    breakfast oneplus3 命令的主要作用是 1.执行 vendorsetup.sh 2. variant 默认设置为 userdebug 3. 根据机型判断 调用  lunch  cm 或 ...

  8. 9.Java基础_for/while/do-while循环

    /* for循环(同C++) 初始化变量的作用域为循环体 出了循环体,初始化的局部变量消失 for(初始化;条件判断;条件控制){ 循环体; } while循环 while(条件判断){ 循环体; } ...

  9. c# 第37节 接口的实现与继承

    本节内容: 1:接口继承注意 2:开发封闭原则: 3:实例解释接口的作用 1:接口继承注意 接口的继承: :类继承具有单根性,接口可多重继承: :接口继承多个接口的时候,派生接口名与父接口用冒号隔开, ...

  10. 2019.6.13_SQL语句中----删除表数据drop、truncate和delete的用法

    一.SQL中的语法 1.drop table 表名称                         eg: drop table  dbo.Sys_Test   2.truncate table 表 ...