Mysql第二章 多表查询的操作

这篇具有很好参考价值的文章主要介绍了Mysql第二章 多表查询的操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


因为直接连接多表时,笛卡尔积的问题引出了多表联查的问题,多表查询基本分为三类,外连接和内连接,等值和非等值,自连接和非自连接

一 外连接与内连接的概念

这些连接关系,归根结底是集合的交并补运算
求出两个表的公共部分,叫做内连接,相当于是交集
求出两个表的公共部分加上左边的,叫做左外连接
如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为从表
如果是右外连接,则连接条件右边的表称为主表,左边的表称为从表

sql99语法实现 默认是内连接

SELECT last_name,department_name
FROM employees e INNER JOIN departments d
on e.department_id=d.department_id

结果显示为102条数据:
Mysql第二章 多表查询的操作

sql99语法实现左外连接,把没有部门的员工也查出来

SELECT last_name,department_name
FROM employees e LEFT  OUTER JOIN departments d
on e.department_id=d.department_id;

结果为103条数据
相当于是左边是员工表的全部信息,右边是部门表的部分信息
员工表和部门表的交集,e交d,和部门表为NULL但员工表有人的信息
Mysql第二章 多表查询的操作

Mysql第二章 多表查询的操作

sql99语法实现右外连接,把没有人的部门查出来

SELECT last_name,department_name
FROM employees e RIGHT  OUTER JOIN departments d
on e.department_id=d.department_id;

结果如图可见,有119条信息
Mysql第二章 多表查询的操作
也就是关键是右边的部门表,所以叫做,右外连接,首要查出的是所有的部门

Mysql第二章 多表查询的操作

sql99语法实现满外连接,mysql不支持这样写

SELECT  last_name,department_name
FROM employees e
FULL OUTER departments d
ON e.department_id=d.department_id 

mysql中如果要实现满外连接的效果,推荐使用union关键字

Union关键字,返回一个并集,类似于A并B,会执行去重检索的操作
union all 返回并集加上交集 ,优点是效率比较高

  • 查询部门编号>90或邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE '%a%' 
UNION SELECT * FROM employees WHERE department_id>90;
  • 查询所有部门号和所有员工姓名,需要去重
#查找所有的员工名字,以及所有的部门
SELECT last_name,department_name
FROM employees e LEFT  OUTER JOIN departments d
on e.department_id=d.department_id
UNION 
SELECT last_name,department_name
FROM employees e RIGHT  OUTER JOIN departments d
on e.department_id=d.department_id;

结果显示出来118条信息
Mysql第二章 多表查询的操作
这里出现了一个问题,那就是,右外连接的数据,居然比去重后的并集数目还要多,以后再解决吧

  • 查询所有部门号和所有员工姓名,不需要去重
    结果222条信息
SELECT last_name,department_name
FROM employees e LEFT  OUTER JOIN departments d
on e.department_id=d.department_id
UNION ALL
SELECT last_name,department_name
FROM employees e RIGHT  OUTER JOIN departments d
on e.department_id=d.department_id;

二 自连接和非自连接的概念

  • 自连接,就是多表查询中自己引用自己
    查询员工id,员工姓名,管理者的ID和姓名
# 查询员工id,员工姓名,管理者的ID和姓名
SELECT emp.employee_id,emp.last_name,mgr.employee_id 经理工号,mgr.last_name 经理名字
FROM employees emp,employees mgr
WHERE emp.manager_id=mgr.employee_id;
  • 非自连接,普通的多表查询
SELECT last_name,department_name
FROM employees e INNER JOIN departments d
on e.department_id=d.department_id
 

三 等值连接和非等值连接的概念

1.1 等值连接

等值连接也称为显示内连接,在进行多表联合查询时通过“=”等号来连接多张表之间相字段对应的值,其产生的结果会出现重复列。意思是,如果对多张表进行等值连接操作,那么前提要求是这多张表之间必须有相同的字段名。,比方说一个表的主键是另一个表的外键

SELECT last_name,department_name
FROM employees e INNER JOIN departments d
on e.department_id=d.department_id

1.1 非等值连接

非等值连接最大的特点就是:连接条件中的关系是非等量关系
Mysql第二章 多表查询的操作
查询一个员工的名字,工资和所处的等级

SELECT last_name,salary,grade_level
FROM employees e,job_grades j
WHERE e.salary BETWEEN j.lowest_sal and j.highest_sal;

四 七种JOIN的实现

Mysql第二章 多表查询的操作

1 内连接 A∩B

# 内连接 A∩B
SELECT e.employee_id,e.last_name,d.department_name
FROM employees e
JOIN departments d
ON  e.department_id=d.department_id;

2 左外连接

SELECT e.employee_id,e.last_name,d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id=d.department_id;

3 右外连接

# 右外连接,右边的项目作为主表,左边的是从表
SELECT e.employee_id,e.last_name,d.department_name
FROM employees e
RIGHT JOIN departments d 
ON e.department_id =d.department_id;

4 A - A∩B

# A - A∩B 有名字,没有部门
SELECT e.employee_id ,e.last_name,d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id=d.department_id
WHERE d.department_id
IS NULL;

5 B - A∩B

SELECT employee_id,last_name,department_name
FROM employees e
RIGHT JOIN departments d
ON e.department_id=d.department_id
WHERE e.department_id
IS NULL;

6 满外连接

左外连接并上B - A∩B

SELECT employee_id,last_name,department_name
FROM employees e
RIGHT JOIN departments d
ON e.department_id=d.department_id
WHERE e.department_id
IS NULL
union all
SELECT e.employee_id,e.last_name,d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id=d.department_id;

7 满外连接- 内连接

SELECT employee_id,last_name,department_name
FROM employees e
RIGHT JOIN departments d
ON e.department_id=d.department_id
WHERE e.department_id
IS NULL
union all
SELECT e.employee_id ,e.last_name,d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id=d.department_id
WHERE d.department_id
IS NULL;

五 natural join与USING

自动查询两张连接表中 所有相同的字段 ,然后进行 等值 连接

SELECT employee_id,last_name,department_name 
FROM employees e NATURAL JOIN departments d;

USING相对于natural join 优化了一点

SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d 
USING (department_id);

多表查询需要限制,太多了相当于多重for循环,消耗资源文章来源地址https://www.toymoban.com/news/detail-440292.html

到了这里,关于Mysql第二章 多表查询的操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Linux操作系统——第二章 进程控制

        目录 进程创建 fork函数初识 fork函数返回值 写时拷贝 fork常规用法 fork调用失败的原因 进程终止 进程退出场景 进程常见退出方法 _exit函数 exit函数 return退出 进程等待 进程等待必要性 进程等待的方法 wait方法 waitpid方法 获取子进程status 进程程序替换 替换原理 替换函数

    2024年02月08日
    浏览(46)
  • 【第二章 selenium基本操作之元素】

    第一章 【初识selenium自动化测试框架(详细记录)】 1). F12 进入开发调试工具(DevTools) 2). 选择图中红圈的箭头(select element),则鼠标放到相应元素上可看获取到信息,例如属性与内容等 或者右键点击某个元素,选择 检查 规范性的网站一般id是唯一的(在html中是 标记

    2024年02月08日
    浏览(47)
  • 第二十二章:HBase的CRUD操作

    HBase是一个分布式、可扩展、高性能的列式存储系统,基于Google的Bigtable设计。它是Hadoop生态系统的一部分,可以与HDFS、MapReduce、ZooKeeper等组件集成。HBase具有高可靠性、高性能和高可扩展性,适用于大规模数据存储和实时数据访问场景。 在HBase中,数据以行为单位存储,每行

    2024年02月20日
    浏览(40)
  • 【数据库】第二章 MySql的安装和部署

    PS :仅仅是一个产品,Oracle旗下的小型数据库。广泛应用在中小型项目中,特征体积小速度快整体成本低。尤其是开源,所以很多中小型项目为了降低成本纷纷选用MySql作为数控存储介质。 1、底层语言使用C、C++编写的。并且使用多种编译器进行测试,以确保源码的可移植性

    2024年01月25日
    浏览(49)
  • 操作系统(第5版罗宁 文艳军编著)第二章课后习题答案

            几种常见的中断包括: 输入/输出(I/O)中断:当计算机需要等待外部设备(如硬盘驱动器、键盘、鼠标)完成它们的任务时,它会发出I/O中断。 时钟中断:时钟中断是一个计时器发出的中断,它定期发生,以确保操作系统和其他软件程序能够在一定的时间内运行

    2024年02月08日
    浏览(45)
  • 第二章:25+ Python 数据操作教程(第十三节NUMPY 教程与练习)

    NumPy(“Numerical Python”或“Numeric Python”的缩写)是 Python 中对数组和矩阵进行快速数学计算的最基本的软件包之一。在处理多维数据时它也非常有用。集成C、C++和FORTRAN工具是一件幸事。它还提供了许多傅里叶变换 (FT) 和线性代数函数。   人们可能会想到为什么我们应该更喜

    2024年02月12日
    浏览(33)
  • Python开发 Git 第二章: 提交更改 撤销更改 分支管理 远程仓库操作

    在第一章中,我们成功地初始化了Git仓库,并进行了一些基本的配置。现在,让我们深入学习Git的基本操作,包括提交更改、撤销更改、分支管理以及远程仓库的操作。 2.1.1 添加文件到暂存区 在Git中,提交更改通常需要将文件先添加到暂存区。假设我们有一个新的文件 exa

    2024年02月04日
    浏览(49)
  • 开源数据库MYSQL DBA运维实战 第二章 SQL

    1.1定义库 创建业务数据库         语法:CREATE  DATABASE   数据库名;         数据库命名要求:                 区分大小写                 唯一性                 不能使用如create  select                 不能单独使用数字和特殊符号如-                

    2024年02月20日
    浏览(82)
  • 第二章:25+ Python 数据操作教程(第二十二节如何从 R 调用或运行 python)持续更新

    本文介绍了如何从 R 调用或运行 python。这两种工具都有自己的优点和缺点。使用这两个工具中最好的包和功能并将其组合起来总是一个好主意。在数据科学领域,这些工具在使用方面拥有良好的市场份额。R 主要以数据分析、统计建模和可视化而闻名。而Python在深度学习和自

    2024年02月07日
    浏览(53)
  • 计算机操作系统重点概念整理-第二章 进程管理【期末复习|考研复习】

    计算机操作系统复习系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 给大家整理了一下计算机操作系统中的重点概念,以供大家期末复习和考研复习的时候使用。 参考资料是王道的计算

    2024年02月08日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包