当前位置: 首页 > article >正文

MySQL--day5--多表查询

请添加图片描述
(以下内容全部来自上述课程)
在这里插入图片描述

多表查询

请添加图片描述

1. 为什么要用多表查询

# 如果不用多表查询
#查询员工名为'Abel'的人在哪个城市工作? 
SELECT*
FROM employees
WHERE last_name = 'Abel';SELECT *
FROM departments
WHERE department_id = 80;SELECT *
FROM locatipns
WHERE location_id=2500;

2. 多表查询如何实现

2.1 出现笛卡尔积错误

# 2. 出现笛卡尔积错误(交叉连接)
# 错误的实现方式:每个员工都与每个部门匹配了一遍。
# 错误原因:缺少了多表的连接条件 
SELECT employee_id,department_name
FROM employees,departments; # 查询出2889条记录SELECT *
FROM employees; # 107条记录SELECT 2889 / 107 
FROM DUAL;SELECT *
FROM departments; # 27条记录

2.2 正确方式

#3.多表查询的正确方式:需要有连接条件
SELECT employee_id,department_name 
FROM employees,departments
#两个表的连接条件
WHERE employees.department_id = departments.department_id;

2.3 指明字段(优化)

#4.如果查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表。
SELECT employees.employee_id,departments.department_name, employees.department_id 
FROM employees,departments
WHERE employees.`department_id`= departments.department_id;
#建议:从sql优化的角度,建议多表查询时,每个字段前都指明其所在的表。

2.4 别名

#5.可以给表起别名,在SELECT和WHERE中使用表的别名。
SELECT emp.employee_id, dept.department_name, emp.department_id 
FROM employees emp,departments dept
WHERE emp.department_id = dept.department_id;#如果给表起了别名,一旦在SELECT或WHERE中使用表名的话,则必须使用表的别名,而不能再使用表的原名。 
# 如下的操作是错误的:
SELECT emp.employee_id,departments.department_name,emp.department_id 
FROM employees emp,departments dept
WHERE emp.department_id = departments.department_id;

2.5 练习

#6.如果有n个表实现多表的查询,则需要至少n-1个连接条件
#练习:查询员工的employee_id,last_name,department_name,city
SELECT e.employee_id,e.last_name,d.department_name,l.city,e.department_id,l.location_id 
FROM employees e,departments d,locations l 
WHERE e.`department_id` = d.`department_id` 
AND d.`location_id`= l.`location_id`;

3. 多表查询的分类

3.1 等值连接 vs 非等值连接

上述例子都是等值连接

#非等值连接的例子: 
SELECT *
FROM job_grades;SELECT 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`;
WHERE e.`salary`>= j.`lowest_sal` AND e.`salary` <= j.`highest_sal`;

3.2 自连接 vs 非自连接

#7.2 自连接	非自连接	
SELECT * 
FROM employees;#自连接的例子:
#练习:查询员工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`;

3.3 内连接 vs 外连接

#7.3内连接 vs外连接
# 内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行 
#        就是两表交集
SELECT employee_id,department_name 
FROM employees e,departments d
WHERE e.`department_id` = d.department_id; #只有106条记录#外连接:合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹配的行之外,
#	    还查询到了左表或右表中不匹配的行。 
#       就是量表并集	
# 外连接的分类:左外连接(交集+e左部分)、右外连接(交集+d右部分)、满外连接(并集)具体看下方图片
# 查询”所有“就是外连接。

请添加图片描述

3.4 SQL92语法

#练习:查询所有的员工的last_name,department_name信息
SELECT employee_id, department_name 
FROM employees e,departments d
WHERE e.`department_id`= d.department_id;	# 需要使用左外连接	#SQL92语法实现内连接:见上,略
#SQL92语法实现外连接:使用+ ----------MySQL不支持SQL92语法中外连接的写法!# 左连接:左腿长右腿短,垫右腿
SELECT employee_id,department_name 
FROM employees e,departments d
WHERE e.`department_id` = d.department_id(+);

3.5 SQL99语法

#SQL99语法实现内连接:
SELECT last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;#JOIN一个表ON一个条件
SELECT last_name,department_name,city 
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id` 
JOIN locations l
ON d.`location id` = l.`location id`;#SQL99语法实现外连接:
#练习:查询所有的员工的last_name,department_name信息
# 左外连接:
SELECT last_name,department_name
FROM employees e LEFT JOIN departments d 
ON e.`department_id`= d.`department_id`;#右外连接:
SELECT last_name,department_name
FROM employees e RIGHT JOIN departments d 
ON e.`department_id` = d.`department_id`;#满外连接:mysql不支持FULL OUTER JOIN 
SELECT last_name,department_name
FROM employees e FULL OUTER JOIN departments d 
ON e.`department_id` = d.`department_id`;

4. SQL99的7种JOIN操作

请添加图片描述

4.1 UNION操作符

请添加图片描述

  • UNION ALL 比 UNION 多了一倍重叠的部分
  • 满外连接需要用UNION
  • 开发中能用UNION ALL的时候不用UNION
  • 无重复部分用UNION ALL效率更高

4.2 7种实现

#中图:内连接
SELECT employee_id,department_name 
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;# 左上图:左外连接
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d 
ON e.`department_id` = d.`department_id`;#右上图:右外连接
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d 
ON e.`department_id` = d.`departmentid`;
#左中图: 左上图+右null条件(中间挖出去)
SELECT employee_id, department_name
FROM employees e LEFT JOIN departments d 
ON e.`department_id`= d.`department_id` WHERE d.`department_id` IS NULL;# 右中图: 右上图+左null条件(中间挖出去)
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d 
ON e.`department_id`= d.`department_id` WHERE e.`department_id` IS NULL;
#左下图:满外连接
# 方式1:左上图 UNION ALL 右中图
SELECT employee_id,department_name
FROM employees eI LEFT JOIN departments d 
ON e.`department id` = d.`department id` UNION ALLSELECT employee_id,department_name
FROM employees eRIGHT JOIN departments d 
ON e.`department_id` = d.`department _id` 
WHERE e.`department_id` IS NULL;# 方式2:左中图UNION ALL 右上图
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d 
ON e.`department_id` = d.`department_id` 
WHERE d.`department_id` IS NULL UNION ALLSELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d 
ON e.`department id` = d.`department id`;
# 右下图:左中图	UNION ALL 右中图	
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d 
ON e.`department_id` = d.`department_id` 
WHERE d.`department id` IS NULL UNION ALLSELECT employee_id,department_name
FROM employees eRIGHT JOIN departments d 
ON e.`department_id`= d.`department_id` 
WHERE e.`department_id` IS NULL;

5. SQL99新特性

5.1 自然连接

#10. SQL99语法的新特性1:自然连接
SELECT employee_id,last_name,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,last_name,department_name 
FROM employees e NATURAL JOIN departments d;

5.2 USING连接

#11.SQL99语法的新特性2:USING
SELECT employee_id,last_name,department_name 
FROM employees e JOIN departments d 
ON e.department_id = d.department_id;SELECT employee_id,last_name,department_name 
FROM employees e 
JOIN departments d
USING (department_id);	I

相关文章:

MySQL--day5--多表查询

&#xff08;以下内容全部来自上述课程&#xff09; 多表查询 1. 为什么要用多表查询 # 如果不用多表查询 #查询员工名为Abel的人在哪个城市工作? SELECT* FROM employees WHERE last_name Abel;SELECT * FROM departments WHERE department_id 80;SELECT * FROM locati…...

【Redis】AOF日志的三种写回机制

目录 1、背景2、appendfsync always&#xff08;同步写回&#xff09;【1】工作机制【2】特点【3】实现原理 3、appendfsync everysec&#xff08;每秒写回&#xff0c;默认配置&#xff09;【1】工作机制【2】特点【3】实现原理 4、appendfsync no&#xff08;操作系统控制&am…...

leetcode hot100刷题日记——7.最大子数组和

class Solution { public:int maxSubArray(vector<int>& nums) {//方法一&#xff1a;动态规划//dp[i]表示以i下标结尾的数组的最大子数组和//那么在i0时&#xff0c;dp[0]nums[0]//之后要考虑的就是我们要不要把下一个数加进来&#xff0c;如果下一个数加进来会使结…...

基于Spring Boot和Vue的在线考试系统架构设计与实现(源码+论文+部署讲解等)

源码项目获取联系 请文末卡片dd我获取更详细的演示视频 系统介绍 基于Spring Boot和Vue的在线考试系统。为学生和教师/管理员提供一个高效、便捷的在线学习、考试及管理平台。系统采用前后端分离的架构&#xff0c;后端基于成熟稳定的Spring Boot框架&#xff0c;负责数据处理…...

MySQL Workbench 工具导出与导入数据库:实用指南

目录 一、MySQL Workbench 简介二、导出数据库2.1 打开 MySQL Workbench2.2 数据库导出步骤三、导入数据库3.1 打开 MySQL Workbench3.2 数据库导入步骤四、注意事项五、总结MySQL Workbench 是一款强大的数据库管理和开发工具,它提供了直观的图形界面,方便用户进行数据库的设…...

Android 绘制折线图

用了一段时间的 Jetpack Compose ,感觉写 UI 的效率确实会提升不少 。 配合 AI 编程绘制了一个折线图。供大家学习参考! @Composable fun TemperatureChart() {val timeLabels = listOf("7:00", "8:00", "9:00", "10:00", "11:…...

自建srs实时视频服务器支持RTMP推流和拉流

文章目录 一、整体示意图二、服务器端1.srs简介及架构2.docker方式安装3.k8s方式安装4.端口 三、推流端1.OBS Studio2.ffmpeg推流3.streamlabs苹果手机4.twire安卓手机5.网络推流摄像头 四、拉流端1.vlc2.srs 参考awesome系列&#xff1a;https://github.com/juancarlospaco/aw…...

ubuntu22.04 卸载ESP-IDF

要在Ubuntu 22.04上完全卸载ESP-IDF&#xff0c;请按照以下步骤操作&#xff1a; 卸载ESP-IDF的步骤 删除ESP-IDF目录&#xff1a; # 假设ESP-IDF安装在~/esp/esp-idf目录 rm -rf ~/esp/esp-idf删除ESP-IDF工具链和下载的工具&#xff1a; rm -rf ~/.espressif从PATH中移除ESP…...

Spring IOCDI————(2)

DI详解 我们之前讲了控制反转IOC&#xff0c;也就是bean的存&#xff0c;那么我们还需要Bean的取&#xff0c;就是DI了&#xff0c;DI翻译过来就是依赖注入&#xff0c;啥意思呢&#xff0c;就是我们通过IOC容器&#xff0c;把所有的对象交给Spring管理&#xff0c;我们指定哪…...

80. Java 枚举类 - 使用枚举实现单例模式

文章目录 80. Java 枚举类 - 使用枚举实现单例模式**1️⃣ 为什么用枚举实现单例&#xff1f;****2️⃣ 枚举实现单例模式****3️⃣ 枚举单例如何防止反射攻击&#xff1f;****4️⃣ 枚举单例如何防止反序列化破坏&#xff1f;****5️⃣ 枚举单例 vs 传统单例****6️⃣ 枚举单例…...

融云 uni-app IMKit 上线,1 天集成,多端畅行

融云 uni-app IMKit 正式上线&#xff0c;支持一套代码同时运行在 iOS、Android、H5、小程序主流四端&#xff0c;集成仅需 1 天&#xff0c;并可确保多平台的一致性体验。 融云 uni-app IMKit 在 Vue 3 的高性能加持下开发实现&#xff0c;使用 Vue 3 Composition API&#x…...

Java中的集合详解

下面是文章详细介绍了 Java 集合框架的基本思路、主要接口与实现、各类集合之间的区别与各自的适用场景&#xff0c;以及一些常见的使用技巧和最佳实践&#xff0c;供你参考。 Java中的集合详解 在 Java 开发中&#xff0c;集合&#xff08;Collection&#xff09;作为存储和操…...

利用 Java 爬虫根据关键词获取某手商品列表

在电商领域&#xff0c;根据关键词获取商品列表是常见的需求。某手作为国内知名的电商平台&#xff0c;提供了丰富的商品资源。通过 Java 爬虫技术&#xff0c;我们可以高效地根据关键词获取某手商品列表&#xff0c;并提取商品的基本信息。本文将详细介绍如何利用 Java 爬虫根…...

Axure项目实战:智慧运输平台后台管理端-订单管理2(多级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:订单管理2 主要内容:中继器筛选、表单跟随菜单拖动、审批数据互通等 应用场景:订单管理…...

篇章五 项目创建

目录 1.创建一个SpringBoot项目 2.创建核心类 2.1 Exchange类 2.2 MessageQueue类 2.3 Binding类 2.4 Message类 1.Message的组成 2.逻辑删除 3.工厂方法 4.序列化与反序列化 5.offsetBeg和offsetEnd 1.创建一个SpringBoot项目 1.点击 2.填写表单 3.添加依赖 2.创建…...

Ntfs!ATTRIBUTE_RECORD_HEADER结构$INDEX_ROOT=0x90的一个例子

Ntfs!ATTRIBUTE_RECORD_HEADER结构$INDEX_ROOT0x90的一个例子 1: kd> dx -id 0,0,899a2278 -r1 ((Ntfs!_FILE_RECORD_SEGMENT_HEADER *)0xc431a400) ((Ntfs!_FILE_RECORD_SEGMENT_HEADER *)0xc431a400) : 0xc431a400 [Type: _FILE_RECORD_SEGMENT_HEADER …...

AGI大模型(30):LangChain链的基本使用

为开发更复杂的应用程序,需要使用Chain来链接LangChain中的各个组件和功能,包括模型之间的链接以及模型与其他组件之间的链接。 链在内部把一系列的功能进行封装,而链的外部则又可以组合串联。 链其实可以被视为LangChain中的一种基本功能单元。 API地址:https://python.…...

代码随想录算法训练营第六十六天| 图论11—卡码网97. 小明逛公园,127. 骑士的攻击

继续补&#xff0c;又是两个新算法&#xff0c;继续进行勉强理解&#xff0c;也是训练营最后一天了&#xff0c;六十多天的刷题告一段落了&#xff01; 97. 小明逛公园 97. 小明逛公园 感觉还是有点难理解原理 Floyd 算法对边的权值正负没有要求&#xff0c;都可以处理。核心…...

[创业之路-364]:企业战略管理案例分析-5-战略制定-宇树科技的使命、愿景、价值观的演变过程

目录 一、宇树科技的使命、愿景、价值观的演变过程 初创阶段&#xff08;2016 年成立前后&#xff09;&#xff1a;以技术梦想奠基&#xff0c;明确核心使命愿景 发展阶段&#xff08;2017 - 2023 年&#xff09;&#xff1a;技术突破与市场拓展&#xff0c;价值观逐步成型 …...

React--函数组件和类组件

React 中的函数组件和类组件是两种定义组件的方式&#xff0c;它们有以下主要区别&#xff1a; 1. 语法与定义方式 函数组件&#xff1a; 是 JavaScript 函数&#xff0c;接收 props 作为参数&#xff0c;返回 JSX。 const MyComponent (props) > {return <div>Hell…...

Flask 路由装饰器:从 URL 到视图函数的优雅映射

前置知识&#xff0c;关于Python装饰器的语法&#xff0c;链接&#xff1a;Python 装饰器&#xff1a;从“语法糖”到“代码神器”的深度解析 1、路由装饰器的功能&#xff1a;给 URL 贴 “功能标签” 在 Flask 开发中&#xff0c;你一定见过这样的代码&#xff1a; from fla…...

DDoS防护实战——从基础配置到高防IP部署

一、基础防护&#xff1a;服务器与网络层加固 Linux内核优化&#xff1a; 调整TCP协议栈参数&#xff0c;缓解SYN Flood攻击&#xff1a; # 启用SYN Cookie并减少超时时间 echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout…...

aws平台s3存储桶夸域问题处理

当我们收到开发反馈s3存在跨域问题 解决步骤&#xff1a; 配置 S3 存储桶的 CORS 设置&#xff1a; 登录到 AWS 管理控制台。转到 S3 服务。选择你存储文件的 存储桶。点击 权限 标签页。在 跨域资源共享&#xff08;CORS&#xff09;配置 部分&#xff0c;点击 编辑。 登陆…...

HOT100(二叉树)

二叉树 二叉树的中序遍历 class Solution { public:void traversal(TreeNode* root, vector<int> & vec){if(root nullptr) return;traversal(root->left, vec);vec.push_back(root->val);traversal(root->right, vec);}vector<int> inorderTraver…...

【vue-text-highlight】在vue2的使用教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载二、使用步骤1.引入库2.用法 效果速通 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发…...

pycharm无法正常调试问题

pycharm无法正常调试问题 1.错误代码 已连接到 pydev 调试器(内部版本号 231.8109.197)Traceback (most recent call last):File "E:\Python\pycharm\PyCharm 2023.1\plugins\python\helpers\pydev\_pydevd_bundle\pydevd_comm.py", line 304, in _on_runr r.deco…...

springboot3.4.5-springsecurity+session

创建springboot项目&#xff0c;添加以下依赖&#xff1a; LombokSpring WebSpring SecuritySpring Data JDBCMyBatis FrameworkMySQL Driver 添加fastjson2进行序列化和反序列化 <dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>f…...

网络安全利器:蜜罐技术详解

蜜罐是网络安全领域中一种主动防御和情报收集的重要工具。本文将深入探讨蜜罐技术的原理、类型、应用场景以及部署注意事项。 1. 什么是蜜罐? 蜜罐(Honeypot)是一种安全资源,其价值在于被探测、攻击或未经授权使用。简单来说,蜜罐就是一个诱饵系统,用来吸引黑客的注意力…...

Leetcode百题斩-哈希

看来面试前还是要老老实实刷leetcode为好&#xff0c;今天看到一个题库&#xff0c;leetcode百题斩&#xff0c;刚好最近面试的这两题全在里面。瞄了一眼&#xff0c;也有不少题之前居然也刷过。那么&#xff0c;冲冲冲&#xff0c;看多久能把这百题刷完。 第一天&#xff0c;先…...

MySQL替换瀚高数据库报错: TO_DAYS()不存在(APP)

文章目录 环境症状问题原因解决方案报错编码 环境 系统平台&#xff1a;中标麒麟&#xff08;海光&#xff09;7,中标麒麟&#xff08;飞腾&#xff09;7 版本&#xff1a;4.5 症状 MySQL替换为瀚高数据库进行应用系统适配报错&#xff1a;TO_DAYS&#xff08;&#xff09;不…...