【MySQL】第五部分 多表查询

news2024/9/30 7:19:51

【MySQL】第五部分 多表查询


文章目录

  • 【MySQL】第五部分 多表查询
  • 5. 多表查询
    • 5.1 等值连接
    • 5.2 非等值连接
    • 5.3 自连接
    • 5.4 内连接
    • 5.5 外连接
    • 5.6 满外连接
    • 5.7 SQL99语法实现多表查询
      • 5.7.1 JOIN...ON语法
      • 5.7.2 使用SQL99语法实现内连接
      • 5.7.3 使用SQL99语法实现左外连接和右外连接
      • 5.7.4 UNION的使用
      • 5.7.5 七种SQL JOINS的实现
  • 总结


5. 多表查询

多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。

多表查询的条件必须要满足:一起查询的表之间必须要有联系,它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。

5.1 等值连接

表的结构

在这里插入图片描述

注意点:

  1. 当查询的字段出现在多个表中需要指定出该字段所在的表,例如:department_id
  2. 根据sql优化的角度,建议在多表查询的时候,指出每个字段所在的表,如下所示
  3. 当表名过长的时候可以使用别名
  4. 如果使用了表的别名,那么在SELECT和WHERE语句中都必须使用表的别名,否则报错
SELECT e.first_name,e.department_id,d.department_name
FROM employees e,departments d
WHERE e.department_id = d.department_id;
SELECT e.first_name,e.department_id,d.department_name,l.location_id
FROM employees e,departments d,locations l
WHERE e.department_id = d.department_id AND d.location_id = l.location_id;

5.2 非等值连接

通过非等值连接查看员工薪资等级

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

在这里插入图片描述


5.3 自连接

相当于自己连接自己,本质上是同一张表只是用取别名的方式虚拟成两张表用来代表不同的意义,然后两个表再进行内连接,外连接等查询。

例如查询员工所对应的上司的名字和员工ID

SELECT e1.employee_id "员工ID" ,e1.last_name "员工", e2.employee_id "上司ID", e2.last_name "上司"
FROM employees e1,employees e2
WHERE e1.manager_id = e2.employee_id;

在这里插入图片描述



5.4 内连接

内连接: 合并具有相同列的两个以上的表的行,结果包含一个表和另一个表相匹配的行

在这里插入图片描述

SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.department_id = d.department_id;

5.5 外连接

简单来说: 除了查询满足条件的记录以外,外连接还可以查询某一方不满足条件的记录

外连接: 合并具有相同列的两个以上的表的行,结果不仅仅包含一个表和另一个表相匹配的行,而且还查询到左表或右表不匹配的行, 外连接还分为:左外连接和右外连接

如果是左外连接,则连接条件中左边的表也称为主表,右边的表称为从表

在这里插入图片描述

如果是右外连接,则连接条件中右边的表也称为主表,左边的表称为从表

在这里插入图片描述


5.6 满外连接

满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据,说白了就是全部

在这里插入图片描述



5.7 SQL99语法实现多表查询

5.7.1 JOIN…ON语法

语法说明:

  • 可以使用 ON 子句指定额外的连接条件
  • 这个连接条件是与其它条件分开的。
  • ON 子句使语句具有更高的易读性
  • 关键字 JOIN、INNER JOIN、CROSS JOIN 的含义是一样的,都表示内连接
SELECT table1.column, table2.column,table3.column
FROM table1 JOIN table2 
ON table1 和 table2 的连接条件
JOIN table3 
ON table2 和 table3 的连接条件


JOIN 后接表
ON 后接条件

5.7.2 使用SQL99语法实现内连接

两表进行连接

SELECT employee_id,department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id
AND e.manager_id = d.manager_id;

三表进行连接

SELECT employee_id, city, department_name
FROM employees e JOIN departments d
ON d.department_id = e.department_id 
JOIN locations l
ON d.location_id = l.location_id;

5.7.3 使用SQL99语法实现左外连接和右外连接

左外连接
在这里插入图片描述

#实现查询结果是A
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件;


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

右外连接
在这里插入图片描述

#实现查询结果是B
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件;

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

5.7.4 UNION的使用

利用UNION关键字,可以使用多条SELECT语句,并将它们的结果组合成单个结果集

注意: 合并时,两个表对应的列数和数据类型必须相同并且相互对应, 各个SELECT语句之间使用UNION或UNION ALL关键字分隔。

# 语法格式
SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

UNION操作符和UNION ALL操作符的区别:

  1. UNION 操作符返回两个查询的结果集的并集去除重复记录UNION ALL操作符返回两个查询的结果集的并集, 对于两个结果集的重复部分,不去重

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


5.7.5 七种SQL JOINS的实现

在这里插入图片描述

图一、图二、图三上述都已经实现了这里就不写了,主要是实现其他四个图。

图四的实现,思想:通过图一扣去交集部分即可得出图四,那么因为它们交集部分都是有值的存在,所以可以去加条件:取B为NULL作为条件,那么交集不为空即可去掉交集部分,同理图五也是这个思想。

# 图四: A - A∩B

SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
# 图五: 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 employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
UNION ALL  #没有去重操作,效率高
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


# 图二加图四
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
UNION ALL  #没有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL

图七的实现,图四加图五即可

SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL  #没有去重操作,效率高
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

总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

postman入门

目录 新建界面 菜单区 百度翻译api实战 post 参数化 新建界面 1)可以新建请求,(rqueset)模拟客户端的请求, 2)可以创建测试集合(collection),对接口请求进行统一管理…

删除排序链表中的重复元素

删除排序链表中的重复元素 题目描述 原始题目参考:删除有序链表的重复元素 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1…

java spring IOC Bean管理操作(xml P名称空间注入)

首先 我们来写一个基本的 通过xml的set属性注入 首先创建一个项目 然后引入 spring 最基本的几个依赖包 src下 下有一个 gettingStarted 包 下面有一个 user类 代码如下 package gettingStarted;public class user {public String name;public int age;public void setName(S…

leetcode 1817. 查找用户活跃分钟数【python3,哈希表的实现思路详解】

题目 给你用户在 LeetCode 的操作日志,和一个整数k。日志用一个二维整数数组logs表示,其中每个logs[i] [IDi, timei]表示ID为IDi的用户在timei分钟时执行了某个操作。 多个用户可以同时执行操作,单个用户可以在同一分钟内执行多个操作。指定…

Deno不只是个Javascript运行时

Deno 是一个安全的 JavaScript 和 TypeScript 运行时,作者是 Ryan Dahl(也是 Node.js 的原作者)。Deno 的诞生之初是为了解决 2009 年首次设计 Node.js 时的一些疏忽。我认为这种改造动机很有道理,因为我相信每个程序员都希望有机…

cmake跨平台构建工具

TOP目录 前言 CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。CMake可以说已经成为大部分C开源项目标配 因此,作为一名C C发开人员,看到cmake不应该一脸茫然… 作为初学者,通俗的认为cmake…

C语言入门(七)——结构体

复合类型与结构体 数据抽象 数据类型标志 嵌套结构体 复合类型与结构体 在编程语言中,最基本的,不可再分的数据类型称为基本类型,例如整型,浮点型;根据语法规则由基本类型组合而成的类型称为复合类型,例如字符串是…

系统性能优化、性能指标、性能测试

系统性能是互联网应用最核心的非功能性架构目标,系统因为高并发访问引起的首要问题就是性能问题:高并发访问的情况下,系统因为资源不足,处理每个请求的时间就会变慢,看起来就是性能变差。 因此,性能优化是…

1596_AURIX_TC275_LMU简介

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这个章节其实没有多少页文档,而大部分的文档其实是寄存器的字段描述。因此,这次一次性把这个文档的内容大概看完。 LMU提供了32K的本地通用RAM。ED存储的访问也是通…

Mybatis 框架开发的准备

从百度中“mybatis download”可以下载最新的 Mybatis 开发包。进入选择语言的界面,进入中文版本的开发文档。下载相关的 jar 包或 maven 开发的坐标。下载的 zip 文件如下(我们的资料文件夹):我们所使用的 Mybatis 版本是 3.2.7 …

我在CSDN的2022:突破零粉丝,4个月涨粉4000+,2023年目标5万+

文章目录前言我为什么又回来写博客?初写文章碰壁1024活动第一次上热榜关于上热榜博客之星2023年目标最后前言 今年最自豪的事,我用业余时间,在CSDN上坚持创作了4个月,产出了20多篇博客,其中7篇文章上了全站热榜&#…

Python基础必经之路——函数

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 目录前言定义函数向函数传递信息实参和形参传递实参返回值将函数存储在模块中导入整个模块尾语 💝定义函数 下面是一个打印问候语的简单函数 def greet_user():print("hello") greet_user()本例示例…

excel函数技巧:如何快速汇总销售合计项

一年的销售数据整理完了,除了要看到每个人的销售合计之外,老板今年还要看到图中这两项合计:销量最高的三个月合计是指汇总每人一年中,销量最高的三个月的数据。超过平均值的销售合计是指汇总超过总平均值的月份销量。两项合计需要…

【进阶】Spring Boot日志文件

努力经营当下,直至未来明朗! 文章目录一、日志有什么用二、日志怎么用三、 自定义日志打印四、 日志级别五、日志持久化六、更简单的日志输出——lombok小结普通小孩也要热爱生活! 一、日志有什么用 日志是解决问题最直观、最有效的方法。⽇…

ROS2机器人编程简述humble-第二章-Launchers .3.3

ROS2机器人编程简述humble-第二章-Publishing and Subscribing .3.2ros2 run一次只能开启一个node,如果一次开启一组相关node,需要使用ros2 launch。支持Python, XML, 和 YAML。推荐Python。zhangrelayLAPTOP-5REQ7K1L:~$ ros2 run -h usage: ros2 run […

Mysql之约束

简介 not null前面也说过,这些约束是针对列的数据的,对应整个列的数据都起约束作用 基本但是创建表在字段后使用的语句 1.primary key-主键 主键特征1.对应列不能有重复的数据2.不能为NULL 唯一且非空 -- 主键 -- id,name,email CREATE TABLE t17(id…

AX7A200教程(1): DDR3仿真平台搭建(一)

本章节主要调用官方的MIG控制器,并使用官方的MIG控制器进行仿真,开发环境vivado2020.1鉴于很多童鞋无法仿真自己新建的DDR工程,即使使用modelsim仿真也仿真失败,本例程着重于在vivado中,对自己新建的带DDR3的工程进行仿…

力扣45.跳跃游戏Ⅱ(贪心思路详解)

文章目录力扣45.跳跃游戏Ⅱ题目描述算法思路代码实现力扣45.跳跃游戏Ⅱ 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意…

114、【树与二叉树】leetcode ——77. 组合:回溯法+剪枝优化(C++版本)

题目描述 原题链接:77. 组合 解题思路 组合问题是回溯法里的经典问题,分别采用两个全局变量path记录当前组合情况,res作为结果集。每次因为结果集需要去重,因此还需要再设置一个局部变量startIndex作为每次遍历的起始值&#xf…

Linux kernel Memory Pin机制的实现以及测试

提起Memory Pin机制,就不得不提到swap的概念,这两个概念息息相关,为了避免在CPU忙碌的时候,也就是在缺页异常发生的时候,临时搜索可供换出的内存页面并加以换出,Linux内核定期地检查系统的空闲页面数量是否…