MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

这篇具有很好参考价值的文章主要介绍了MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一:多表查询中使用SQL99实现7种JOIN操作 

二:SQL99语法新特性

1. 自然连接Natural

2. USING连接


一:多表查询中使用SQL99实现7种JOIN操作 

在多表查询中,除了遇到最多的内连接、左外连接和右外连接,还有其它的连接方式;接下来就聊聊其它的连接方式,如下图:  ​​​​​​

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

并且在正式讲解之前,需要先了解UNION的使用,因为有些结果集我们可以使用其它结果集合并的方式得到!

UNION的使用

合并查询结果:利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。

语法格式:

SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

UNION操作符:返回两个查询的结果集的并集,去除重复记录。

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

UNION ALL操作符:返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

注意:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。  

首先查询三张表:

员工表emp

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

部门表dept

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

等级表salgrade

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

1. 内连接 A∩B---》对应上图3

需求:找出每个员工的上级领导?(不包括上级领导为null的King)

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e1
INNER JOIN emp e2
ON e1.mgr = e2.empno;

执行结果:13条数据,只有e1表和e2表ON中等值关系能对上才会显示,相当于A∩B

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

2. 左外连接---》对应上图1

需求:找出每个员工的上级领导?(所有员工必须全部查询出来包括King)

select e1.ename '员工',e2.ename '领导'
from emp e1
Left outer join emp e2
on e1.mgr = e2.empno;

执行结果:14条数据,此时相当于e1表是主表,e2是副表,主表的内容会全部显示;所以KING虽然没有上级领导也会显示

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

3. 右外连接---》对应图2

需求:找出每个员工的上级领导?(所有员工必须全部查询出来包括King)

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e2
RIGHT OUTER JOIN emp e1
ON e1.mgr = e2.empno;

执行结果:14条数据,和左外连接差不多,此时还是e1是主表,e2是副表;因为是右外连接,此时把原来两张表的位置调换一下即可

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

4. 左中图 A - A∩B ---》对应图4

需求:取出上级领导为NULL的员工

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e1
LEFT OUTER JOIN emp e2
ON e1.mgr = e2.empno
WHERE e2.empno IS NULL;

执行结果:前面我们使用左外连接取出所有的员工对应的领导,所以这里在使用where加一个限制条件就能取出上级领导为NULL的员工;就等同于A - A∩B

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

5. 右中图 B-A∩B ---》对应图5

需求:取出上级领导为NULL的员工

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e2
RIGHT OUTER JOIN emp e1
ON e1.mgr = e2.empno
WHERE e2.empno IS NULL;

6. 满连接---》对应图6

对于满连接我们可以使用UNION ALL把 “图1和图5” 或者 “图2和图4”拼接在一起就能得到!

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e1
LEFT OUTER JOIN emp e2
ON e1.mgr = e2.empno;
UNION ALL
SELECT e1.ename '员工',e2.ename '领导'
FROM emp e2
RIGHT OUTER JOIN emp e1
ON e1.mgr = e2.empno
WHERE e2.empno IS NULL;

7. 右下图--》对应图7

使用UNION ALL把 “图4和图5” 拼接在一起就能得到!

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e1
LEFT OUTER JOIN emp e2
ON e1.mgr = e2.empno
WHERE e2.empno IS NULL;
UNION ALL
SELECT e1.ename '员工',e2.ename '领导'
FROM emp e2
RIGHT OUTER JOIN emp e1
ON e1.mgr = e2.empno
WHERE e2.empno IS NULL;

注:上面我使用的是表的自连接,例子不太恰当!主要理解原理会掌握使用即可! 

二:SQL99语法新特性

1. 自然连接Natural

SQL99 在 SQL92 的基础上提供了一些特殊语法,比如 NATURAL JOIN 用来表示自然连接。我们可以把 自然连接理解为 SQL92 中的等值连接。它会帮你自动查询两张连接表中所有相同的字段 ,然后进行等值连接

需求:显示每个员工信息,并显示所属的部门名称

在SQL92标准中:

SELECT e.ename,d.dname
FROM emp e,dept d
WHERE e.deptno = d.deptno;

在 SQL99 中可以写成:

# 使用join...on
SELECT e.ename,d.dname
FROM emp e
JOIN dept d
ON e.deptno = d.deptno;

# 使用自然连接---就相当于等值连接
SELECT e.ename,d.dname
FROM emp e
NATURAL JOIN dept d;

优缺点:虽然简化了连接操作的代码,但是不够灵活,因为它会把两张表或者多张表中所有相同的字段都关联起来;在实际开发中我们可能只需要某一个字段关联,而不是多个字段!

2. USING连接

①当我们进行连接的时候,SQL99还支持使用 USING 指定数据表里的 同名字段 进行等值连接。但是只能配合JOIN一起使用

②实际上USING是自然连接Natural Join的一种优化,但是必须是同名字段才可以这样使用,例如:表的自连接就无法使用,因为不是同一个字段。

# 使用join...on
SELECT e.ename,d.dname
FROM emp e
JOIN dept d
ON e.deptno = d.deptno;

# 使用USING
SELECT e.ename,d.dname
FROM emp e
JOIN dept d
USING(deptno);

总结表连接的约束条件可以有三种方式:WHERE, ON, USING

①WHERE:适用于所有关联查询。

②ON :只能和JOIN一起使用,只能写关联条件。虽然关联条件可以并到WHERE中和其他条件一起写,但分开写可读性更好。

③USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等。文章来源地址https://www.toymoban.com/news/detail-436856.html

到了这里,关于MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库干货_16—— SQL99标准中的查询

    SQL99标准中的查询 MySQL5.7 支持部分的SQL99 标准。 SQL99中的交叉连接(CROSS JOIN) 示例: 使用交叉连接查询 employees 表与 departments 表。 SQL99中的自然连接(NATURAL JOIN) 自然连接 连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,但数据类型不同,NATURAL J

    2024年02月06日
    浏览(49)
  • 【postgresql 基础入门】分组查询 group by 子句的写法,分组条件过滤having子句的写法,多列的分组以及与join联合的多表分组

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 个人主页 :我的主页 管理社区 :开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 本文主要分享在postgresql 数据库中对查询结果进行分组group by,以及对分组进行条件过滤having,同时对它

    2024年04月11日
    浏览(38)
  • MySQL基础-多表查询

    本文介绍MySQL的多表查询 一对多(多对一) 多对多 一对一 案例:部门与员工 关系:一个部门对应多个员工,一个员工对应一个部门 实现:在多的一方建立外键,指向一的一方的主键 案例:学生与课程 关系:一个学生可以选多门课程,一门课程也可以供多个学生选修 实现

    2024年02月04日
    浏览(30)
  • Mysql基础8-多表查询

    一对多或者多对一 案例:部门与员工的关系 关系:一个部门对应多个员工,一个员工对应一个部门(不考虑跨部门的特殊情况) 实现:在多的一方建立外键,指向一的一方的主键,这里员工表是多的的一方,部门表是一的一方   多对多 案例:学生与课程的关系 关系:一个

    2024年02月16日
    浏览(25)
  • 《MySQL(五):基础篇- 多表查询》

    我们之前在讲解SQL语句的时候,讲解了DQL语句,也就是数据查询语句,但是之前讲解的查询都是单 表查询,而本章节我们要学习的则是多表查询操作,主要从以下几个方面进行讲解。 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并

    2024年02月08日
    浏览(29)
  • Mysql基础篇(三)之多表查询

    一对多(多对一) 多对一 一对一 多表查询就是指从多张表中查询数据。 原来查询单表数据,执行的SQL形式为:select * from emp; 那么我们要执行多表查询,就只需要使用逗号分隔多张表即可,如:select * from emp, dept; 具体的执行结果如下: 此时,我们看到查询结果中包含了大量

    2024年02月11日
    浏览(26)
  • 业务数据LEFT JOIN 多表查询慢--优化操作

    首先你会想到,给表加索引,那么mysql会给主键自动建立索引吗? 会的,当然会。 在我们查询的业务表操作的时候,表业务数据庞大起来的时候,以及left join多的时候,甚至多表关联到几十张表的时候,查询是慢到不行。 这时候,只需要给表join查询的字段,及表结构,进行索

    2024年02月02日
    浏览(30)
  • MySQL基础 — 多表查询以及事务管理

    一对一 ​ 多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率 ​ 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE) ​ 因为是一对一,所以需要设置唯一约束 一对多 ​ 在多的一方建立外键,指向一

    2024年02月07日
    浏览(34)
  • MySQL数据库基础(三):多表查询,子查询,开窗函数

    表与表之间的关系 在SQL语句中,数据表与数据表之间,如果存在关系,一般一共有3种情况: ① 一对一关系(高级) 比如有A、B两张表,A表中的每一条数据,在B表中有一条唯一的数据与之对应。 用户表user user_id(用户编号) 账号username 密码password 001 admin admin888 002 itheima

    2024年02月12日
    浏览(34)
  • Mysql基础(下)之函数,约束,多表查询,事务

    👂 回到夏天(我多想回到那个夏天) - 傲七爷/小田音乐社 - 单曲 - 网易云音乐 截图自 劈里啪啦 -- 黑马Mysql,仅学习使用 👇原地址 47. 基础-多表查询-表子查询_哔哩哔哩_bilibili 目录 🦂函数 🌳字符串函数 🌳数值函数 🌳日期函数 🌳流程函数 🌳小结 🦂约束  🍈概述 🍈

    2024年02月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包