MySQL-- 多表查询的分类,SQL92与SQL99,7种JOIN的实现,SQL99语法的新特性

目录

一,多表查询的分类

角度1:等值连接  vs  非等值连接

角度2:自连接  vs  非自连接

角度3:内连接  vs  外连接

二,SQL92语法实现内连接:见上,略SQL92语法实现外连接:使用 +  ----------MySQL不支持SQL92语法中外连接的写法!

三,SQL99语法如何实现多表的查询。

1,SQL99语法实现内连接:

2,SQL99语法实现外连接:

3,UNION  和 UNION ALL的使用

四,7种JOIN的实现:

1.中图:内连接

2.左上图:左外连接

3.右上图:右外连接

4.左中图:

5.右中图:

6.左下图:满外连接

方式1:左上图 UNION ALL 右中图

方式2:左中图 UNION ALL 右上图

7.右下图:左中图  UNION ALL 右中图

五,SQL99语法的新特性

1:自然连接

2:USING


一,多表查询的分类

角度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`;

员工无法与等级相等,使用between and连接

角度2:自连接  vs  非自连接


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:内连接  vs  外连接

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

SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id` = d.department_id;  #只有106条记录

外连接:合并具有同一列的两个以上的表的行, 结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表 或 右表中不匹配的行。

 外连接的分类:左外连接、右外连接、满外连接

左外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足条件的行,这种连接称为左外连接。


右外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回右表中不满足条件的行,这种连接称为右外连接。

#练习:查询所有的员工的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(+);

SQL99语法中使用 JOIN ...ON 的方式实现多表的查询。这种方式也能解决外连接的问题。MySQL是支持此种方式的。

三,SQL99语法如何实现多表的查询。

1,SQL99语法实现内连接:

SELECT last_name,department_name
FROM employees e INNER JOIN departments d
ON e.`department_id` = d.`department_id`;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`;

2,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 OUTER 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`;

3,UNION  和 UNION ALL的使用

UNION:会执行去重操作
UNION ALL:不会执行去重操作
结论:如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。

四,7种JOIN的实现:

1.中图:内连接

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

2.左上图:左外连接

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

3.右上图:右外连接

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

4.左中图:

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;

5.右中图:

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;


6.左下图:满外连接


方式1:左上图 UNION ALL 右中图

SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
UNION ALL
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;


方式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 ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;

7.右下图:左中图  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 ALL
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;

五,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`;# NATURAL JOIN : 它会帮你自动查询两张连接表中`所有相同的字段`,然后进行`等值连接`。
SELECT employee_id,last_name,department_name
FROM employees e NATURAL JOIN departments d;


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);#拓展:
SELECT last_name,job_title,department_name 
FROM employees INNER JOIN departments INNER JOIN jobs 
ON employees.department_id = departments.department_id 
AND employees.job_id = jobs.job_id;

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

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

相关文章

时间轮算法:原理、演进与应用实践指南

目录 1. 时间轮算法基础 1.1 什么是时间轮算法&#xff1f; 1.2 核心组成部分 2. 基本时间轮的实现机制 2.1 时间轮的构成要素 2.2 工作原理详解 3. 基本时间轮的局限性 3.1 时间范围限制问题 3.2 简单解决方案及其缺陷 4. 时间轮算法的演进 4.1 Round机制&#xff…

Unity 常见报错 定位和查找方法

1.控制台 直接看报错信息 2.打log 例子&#xff1a; for(int i 0;i < 8;i) {Debug.Log(i);//这是打的log,看看到底i是几的时候出问题gameObject.name strs[i];} 3.断点调试 &#xff08;1&#xff09;在你想打断点的行&#xff0c;左边空白处点击可以打断点&#xff…

第十八章:Python实战专题:北京市水资源数据可视化与图书馆书籍管理应用开发

今天我要和大家分享两个非常有趣的Python实战项目&#xff1a;一个是北京市2001-2017年水资源数据的可视化分析&#xff0c;另一个是图书馆书籍管理应用程序的开发。这两个项目都使用了Python的主流库&#xff0c;比如Pandas、Matplotlib和Tkinter&#xff0c;非常适合初学者学…

音视频基础(音视频的录制和播放原理)

文章目录 一、录制原理**1. 音视频数据解析****2. 音频处理流程****3. 视频处理流程****4. 同步控制****5. 关键技术点****总结** 二、播放原理**1. 音视频数据解析****2. 音频处理流程****3. 视频处理流程****4. 同步控制****5. 关键技术点****总结** 一、录制原理 这张图展示…

Nginx多域名HTTPS配置全攻略:从证书生成到客户端安装

一、业务背景 在现代Web开发中&#xff0c;HTTPS已成为保障数据传输安全的标准协议。特别是对于地图类API服务&#xff08;如高德地图&#xff09;&#xff0c;往往需要同时支持多个子域名&#xff08;如webapi.amap.com、restapi.amap.com等&#xff09;的HTTPS访问。传统方式…

Redis原理:rename命令

RENAME key newkey 将一个key重命名为新key&#xff0c;如果key不存在&#xff0c;则会返回异常。如果newKey已经存在&#xff0c;则会被覆盖&#xff0c;其实newKey会被显示的删除&#xff0c;所以如果newKey是一个大key&#xff0c;则会引起延迟。 源码 void renameCommand…

k8s污点与容忍

k8s污点与容忍 k8s污点管理常用命令effect标记值查看污点添加污点删除污点 node污点与容忍污点容忍yaml示例容忍放大基于污点的驱逐驱逐时排除指定服务 设置master调度设置master尽量不调度允许master节点调度pod恢复Master Only状态将node标记为不可调度状态(节点警戒)设置nod…

(BFS)题解:P9425 [蓝桥杯 2023 国 B] AB 路线

题解&#xff1a;P9425 [蓝桥杯 2023 国 B] AB 路线 题目传送门 P9425 [蓝桥杯 2023 国 B] AB 路线 一、题目描述 给定一个NM的迷宫&#xff0c;每个格子标记为A或B。从左上角(1,1)出发&#xff0c;需要移动到右下角(N,M)。移动规则是&#xff1a;必须交替走K个A格子和K个B…

python-leetcode 62.搜索插入位置

题目&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置 方法一&#xff1a;二分查找 假设题意是在排序数组中寻找是否存在一个目标值&#xff0c;则可以…

【计网速通】计算机网络核心知识点和高频考点——数据链路层(一)

数据链路层核心知识点&#xff08;一&#xff09; 一、数据链路层概述 1.1 基本概念 数据链路层位于OSI模型的第二层&#xff0c;介于物理层和网络层之间&#xff0c;主要负责在相邻节点之间传输和识别数据帧。 1.2 主要功能 帧同步&#xff1a;识别帧的开始和结束差错控制…

模型部署与调用

目录 部署 ollama下载 模型版本选择 ​编辑 对照表 控制台执行 调用 部署 大模型部署我使用的是Ollama&#xff0c;点击跳转 接下来我将在本地使用ollama就行模型部署的演示 ollama下载 模型版本选择 对照表 大家可以根据自己的显卡配置选择对应的模型版本 控制台执…

Rstudio如何使用Conda环境配置的R

前言 Rstudio作为一款流行的R语言集成开发环境&#xff08;IDE&#xff09;&#xff0c;为用户提供了便捷的编程体验。然而&#xff0c;不同项目可能需要不同版本的R&#xff0c;这就需要我们灵活切换R版本。除了在之前文章中提到的使用 Docker 部署不同版本的 R 的方法之外&am…

C++---RAII模式

一、RAII模式概述 1. 定义 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;即资源获取即初始化&#xff0c;是C中用于管理资源生命周期的一种重要编程模式。其核心在于将资源的获取和释放操作与对象的生命周期紧密绑定。当对象被创建时&#xff0c;资源…

【功能开发】DSP F2837x 检测中断所有函数运行一次的时间

要查看 DSP F28377 的 CPU 在 50 微秒一次的中断内所有程序运行完总共占用了中断多长时间&#xff0c;可以采用硬件定时器测量和软件计时两种常见方法。 方法一&#xff1a;使用硬件定时器测量 原理 利用 DSP 内部的高精度硬件定时器&#xff0c;在中断开始时记录定时器的值…

MAC环境给docker换源

2025-03-28 MAC环境给docker换源 在官网下载docker ,dmg 文件 参考&#xff1a; https://blog.csdn.net/qq_73162098/article/details/145014490 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},&q…

Vulnhub-zico2靶机打靶记录

本篇文章旨在为网络安全渗透测试靶机教学。通过阅读本文&#xff0c;读者将能够对渗透Vulnhub系列zico2靶机有一定的了解 一、信息收集阶段 靶机下载地址&#xff1a;https://download.vulnhub.com/zico/zico2.ova 因为靶机为本地部署虚拟机网段&#xff0c;查看dhcp地址池设…

【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)

&#x1f680; 力扣热题 347&#xff1a;前 K 个高频元素&#xff08;详细解析&#xff09; &#x1f4cc; 题目描述 力扣 347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k&#xff0c;请你返回其中出现频率 前 k 高的元素。你可以按 任意顺序 返回答案。 &#x1f…

Java 大视界 -- Java 大数据机器学习模型在金融衍生品定价中的创新方法与实践(166)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

深度学习入门:从神经网络基础到简单实现

深度学习作为人工智能领域最令人兴奋的技术之一,已经在图像识别、自然语言处理、语音识别等多个领域取得了突破性进展。本文将深入浅出地介绍深度学习的基本概念,并通过Python代码实现一个简单的神经网络模型,帮助读者建立直观理解并迈出实践第一步。 神经网络的基本原理 …

第2.6节 iOS生成全量和增量报告

2.6.1 简介 在采集了覆盖率数据后&#xff0c;就需要生成对应需求的全量和增量覆盖率报告&#xff0c;以便对测试进行查漏补缺。IOS系统有两种开发语言&#xff0c;所以生成报告的方式也不相同&#xff0c;下面就分别介绍一下Object C和Swift语言如何生成覆盖率报告。 2.6.2 O…