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

【MySQL数据库】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法

在DQL的基础查询中,我们已经学过了多表查询的一种:联合查询(union)。本文我们将系统的讲解多表查询。

笛卡尔积现象

首先,我们想要查询emp表和stu表两个表,按照我们之前的知识栈,我们直接使用:

select * from emp,stu;

当查询emp时:15条记录被查询

当查询stu时:5条记录被查询

但是让我们来观察结果:

哇,查询到了70条记录 。而且根据结果我们可以看出:左表emp的每条记录都会与右表stu的每条记录组成一条新的记录,也就是14*5=70条记录。这种现象非常符合离散数学中学到的笛卡尔积的结果,所以我们将这种现象称为笛卡尔积现象。

笛卡尔积(Cartesian Product):表示两个集合之间的所有可能的有序对的集合

笛卡尔积的性质包括:

  1. 笛卡尔积的结果是一个新集合。
  2. 如果 AA 和 BB 其中一个为空集,则结果也为空集。
  3. 笛卡尔积的顺序是重要的,即 A×B≠B×A。

我们如何实现15+4的结果呢?直接使用上面的select肯定是不行了。

那么,此时有一个叫联合查询的方式出现在脑海里:

联合查询

关键字:【union all】

select empno,ename,job from emp
union all
select id,nick,pwd from stu;

观察结果:19=15+4条记录 (使用union代替union all可以实现去重的功能)

但是为了将记录查询出来,我们 必须合适选择每个表的字段,将两个表查询的字段的数据类型一一对应。empno int = id int,ename varchar = nick varchar ......

如果数据类型对应不上,那么将无法查询,结果是:

直接查询的条件限制法

那么联合查询也不能符合我们对查询结果的预期,这时候需要我们转换思路。从笛卡尔积现象开始:【需求:查询员工表以及每个员工对应的部门信息】

首先直接查询:

对于查询的结果,虽然有重复, 但至少有我们需要的结果,那么只需要将这个表中的有效记录提取出来,就可以了。也就是使用where条件进行限定:

此时我们查询的结果就符合我们的预期了。但注意,这时候我们操作时必须给每个字段指定上是哪个表的字段,不然的话,该字段属于二义性字段,无法通过语法分析,也就不能执行了。

内连接

select field from tb1 
[inner] join tb2 on condition;

等值连接

eg.根据一个编号查另一个表中改编号对应的内容。常见于:根据子表外键连接父表主键

【练习:查询员工表以及每个员工对应的部门信息】

select * from emp [inner]join dept on emp.DEPTNO = dept.DEPTNO;

非等值连接

eg.根据一个表的某个字段,查另一个表中该字段属于哪段区间的信息。实际用途:等级划分

【练习:根据员工的薪水查出薪水的等级】

自连接

eg.自连接是某个表的某个字段信息存储的数据是本表的另一条记录的信息。常用于:事物关联

【练习:根据员工表的领导编号查询领导的名字】

自连接的流程:为显示的字段起别名(避免两个结果字段名冲突,非必须)=》from选择查询表=》join 连接表(本表),并起别名(避免二义性,必须)=》连接条件。[过程中的每个字段都需要明确指出是哪个表] 

外连接

由于内连接会将连接条件的字段中空值的记录给过滤掉,所以为了显示较为全面的记录,我们采用外连接的方式进行多表查询。

左外连接

左外连接就是(left [outer] join ... on...)。显示主表的所有字段,并将被连接的从表符合连接条件的记录连接到主表,如果没有,主表显示原本记录,从表的字段中为空。

【练习:查询员工表以及每个员工对应的部门信息---显示所有员工】

右外连接

右外连接就是(right [outer] join ... on...)。与左外连接类似。

【练习:查询员工表以及每个员工对应的部门信息---显示所有部门】

我们对比发现,右外连接显示的记录比左外连接的记录多一条,多出的一条是部门表中的数据,但该部门在员工表中没有员工,所以全部显示为空。

:外连接查询的结果记录数 >= 内连接查询到的结果记录数

左外连接【左图】、右外连接【右图】

子查询

子查询:嵌套在其它SQL语句内的查询语句,且必须出现在圆括号内(查询一般是指select语句):子查询的结果可以作为外层查询的过滤条件或计算字段。

标量子查询

子查询返回结果是单个值,如数字、字符串、日期等最简单的形式。这种子查询称为标量子查询。【常用的操作符:| = | <> | > | >= | < | <= |】

【练习:查询销售部的部门员工信息】

第一步:查询销售部的部门编号

select deptno from dept where dname="SALES";

第二步:查询部门编号为上述结果的员工

select * from emp where deptno = 上条语句的结果;

第三步:合并一条语句:

select * from emp where deptno = (select deptno from dept where dname="SALES");

标量子查询可以在子句中使用聚合函数、而且子句的位置还可以出现在select后作为字段出现:

【练习:查询部门名,以及每个部门的人数】

select dname, (select count(*) from emp where dept.deptno=emp.deptno) emps 
from dept;

列子查询

子查询的结果是一列(或者多列),这种子查询称为列子查询

【常用操作符:in、not in、any、some、all】

IN:在指定的集合范围之内,多选一

NOT IN:不再指定的集合范围之内

ANY:子查询返回列表中,有任意一个满足即可【相当于集合所有元素作 or 运算】

SOME:与ANY相同,SOME与ANY等价

ALL:子查询返回列表的所有值都要满足【相当于集合所有元素之间作 and 运算】

【练习:查询销售部(SALES)和调研部(RESEARCH)所有员工信息】

select * 
from emp 
where deptno in (select deptno from dept where dname in ("SALES","RESEARCH"));-- or:
select * 
from emp 
where deptno in (select deptno from dept where dname="SALES" or dname="RESEARCH");

【练习:查询比销售部的所有人的工资都高的员工信息】

比所有人都高,也就是sal > all( {...} )

通过这个练习,我们不仅练习了all运算,我们还知道了,子句可以嵌套子句。

行子查询

子查询的返回结果是一行(可以是多行),这种子查询称为行子查询

【常用操作符:| = | <> | in | not in】

【练习:查询与“SMITH”的 薪资以及直属领导 都相同的员工信息】

-- (单行结果)
select * from emp where (sal,mgr) = (select sal,mgr from emp where ename = "SMITH");-- (多行结果)
select * from emp where (sal,mgr) in (select sal,mgr from emp where ename = "SMITH");

通过该练习,我们掌握了新的知识:

(field1,field2,...,fieldn) 可以通过加圆括号的方式直接与行结果进行运算【= | <> | in | not in】 

表子查询

子查询的结果可以是多行多列,产生这种结果的子查询称为表子查询。【常用操作符:IN】

这种就是行子查询的 in 操作。

-- (多行结果)
select * from emp where (sal,mgr) in (select sal,mgr from emp where ename = "SMITH");

感谢大家!欢迎指导、询问、探讨知识!

相关文章:

【MySQL数据库】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法

在DQL的基础查询中&#xff0c;我们已经学过了多表查询的一种&#xff1a;联合查询&#xff08;union&#xff09;。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先&#xff0c;我们想要查询emp表和stu表两个表&#xff0c;按照我们之前的知识栈&#xff0c;我们直接使用…...

爬虫案例-爬取某狗音乐

文章目录 1、爬取代码2、效果图1、爬取代码 import time import requests import hashlib import jsonpath import osurl = "https://wwwapi.kugou.com/play/songinfo"#伪造请求头 header= {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64…...

Android第四次面试总结(基础算法篇)

一、反转链表 // 定义链表节点类 class ListNode {// 节点存储的值int val;// 指向下一个节点的引用ListNode next;// 构造函数&#xff0c;用于初始化节点的值ListNode(int x) { val x; } }class Solution {// 反转链表的方法public ListNode reverseList(ListNode head) {/…...

DAPO-Decoupled Clip and Dynamic sAmpling Policy Optimization

论文地址&#xff1a;https://dapo-sia.github.io/static/pdf/dapo_paper.pdf 代码地址&#xff1a;https://github.com/volcengine/verl/tree/gm-tyx/puffin/main/recipe/dapo 数据&#xff1a;https://huggingface.co/datasets/BytedTsinghua-SIA/DAPO-Math-17k 1. 背景与动机…...

每日一题——买卖股票的最佳时机

买卖股票的最佳时机 问题描述示例示例 1示例 2 提示 问题分析难点分析 算法设计思路 代码实现复杂度分析测试用例测试用例 1测试用例 2测试用例 3 总结 问题描述 给定一个数组 prices&#xff0c;其中第 i 个元素 prices[i] 表示一支给定股票在第 i 天的价格。你可以选择某一天…...

数组模拟邻接表 #图论

文章目录 为什么要用数组来模拟邻接表存储思路遍历思路 树是特殊的图&#xff0c;因此邻接表可以存储图和树两种数据结构。 为什么要用数组来模拟邻接表 在算法设计当中&#xff0c;利用数组来代替结构体模拟各种数据结构会更加简单。 存储思路 给定如下数据,我们可以构造如…...

如何实现一个分布式单例对象?什么场景需要分布式单例?

单例模式确保一个类在同一个进程中只有一个实例&#xff0c;并提供一个全局访问点。这意味着无论在哪里调用该类的实例化方法&#xff0c;返回的都是同一个对象实例。 在分布式系统中&#xff0c;无论是单台机器多个实例&#xff0c;还是多台机器多个实例&#xff0c;每个实例…...

Elasticsearch8.17 集群重启操作

一、全集群重启步骤 1. 禁用分片分配 在关闭数据节点前,需禁用副本分片的分配,避免不必要的 I/O 操作。通过以下命令将分片分配限制为仅主分片: resp = client.cluster.put_settings(persistent={"cluster.routing.allocation.enable": "primaries"}…...

VBA常见的知识都有哪些,让AI编写的VBA经常 报错,所以VBA的基础还是要学习的

掌握这些能够大大的提高VBA的编写效率&#xff0c;欢迎来到涛涛聊AI。 1. 异常处理 Cleanup:是VBScript的错误处理标签&#xff0c;用于标记程序执行失败或退出时需要执行的清理操作&#xff08;如关闭文件、释放对象&#xff09;。这段代码会在遇到错误或用户取消操作时跳转…...

dify重磅升级:从0.15.3安全升级1.1.0新手避坑指南

Docker Compose 部署 备份自定义的 docker-compose YAML 文件(可选) cd docker cp docker-compose.yaml docker-compose.yaml.-$(date +%Y-%m-%d-%H-%M).bak从 main 分支获取最新代码 git checkout main git pull origin main停止服务,命令,请在 docker 目录下执行...

NLP高频面试题(六)——decoder-only、encoder-only和encoder-decoder的区别与联系

一、基本概念与代表模型 1. Encoder-only 架构 Encoder-only 架构最具代表性的模型是 BERT。BERT 使用 masked language modeling&#xff08;MLM&#xff09;进行预训练&#xff0c;即随机遮蔽部分输入词汇&#xff0c;让模型预测被遮蔽的词汇。由于这种架构能够同时看到输入…...

DeepSeek(8):结合Kimi-PPT助手一键生成演示报告

1 生成内容 在Deepseek中生成内容&#xff1a; 帮我创建年度计划&#xff0c;描述《智能枕头》产品的如何在全国销售&#xff0c;计划切分到每个月。从而让我们的老板和团队对报告充满信息。输出的内容我需要放到ppt中进行展示。 使用Deepseek R1模型&#xff0c;如下&#x…...

【MySQL】MySQL如何存储元数据?

目录 1.数据字典的作用 2. MySQL 8.0 之前的数据字典 3. MySQL 8.0 及之后的数据字典 4.MySQL 8 中的事务数据字典的特征 5.数据字典的序列化 6. .sdi文件的作用&#xff1a; 7..sdi的存储方式 在 MySQL 中&#xff0c;元数据&#xff08;Metadata&#xff09; 是描述数…...

《基于自适应正负样本对比学习的特征提取框架》-核心公式提炼简洁版 2022年neural networks

论文源地址 以下是从文档中提取的关于“基于对比学习的特征提取框架&#xff08;CL-FEFA&#xff09;”中正负样本对比学习实现的技术细节&#xff0c;包括详细的数学公式、特征提取过程以及特征表示方式的说明。 1. 正负样本的定义与构造 在CL-FEFA框架中&#xff0c;正负样…...

8.4《同一直线上二力的合成》

教会什么:合力与分力、同一直线上二力的合成 培养什么:实验抓共同点为突破口 课标: (二)运动和相互作用 2.2 机械运动和力 2.2.4 能用示意图描述力。会测量力的大小。了解同一直线上的二力合成。 零、导入 提问: 在前面我们探究了物体处于匀速直线运动/静止状态时,即处于…...

用ASCII字符转化图片

代码 from PIL import Image# 定义 ASCII 字符集&#xff0c;从最暗到最亮 ASCII_CHARS "%#*-:. "def resize_image(image, new_width100):width, height image.sizeratio height / widthnew_height int(new_width * ratio)resized_image image.resize((new_wi…...

zookeepernacoskafka之间的联系

一、ZooKeeper与Kafka的协同工作原理 1. 核心关系&#xff1a;Kafka对ZooKeeper的依赖 在Kafka 2.8版本之前&#xff0c;ZooKeeper是Kafka集群的“大脑”&#xff0c;负责管理集群元数据、协调节点状态和故障恢复。两者的协同主要通过以下关键机制实现&#xff1a; Broker注册…...

力扣 797. 所有可能的路径 解析JS、Java、python、Go、c++

深度优先搜索解所有可能的路径问题 题目描述 力扣链接 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列…...

蓝桥与力扣刷题(蓝桥 组队)

题目&#xff1a;作为篮球队教练&#xff0c;你需要从以下名单中选出 1 号位至 5 号位各一名球员&#xff0c;组成球队的首发阵容。 每位球员担任 1号位至 5号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少&#xff1f; 本题为填空题&…...

python函数的多种参数使用形式

目录 1. 位置参数&#xff08;Positional Arguments&#xff09; 2. 关键字参数&#xff08;Keyword Arguments&#xff09; 3. 默认参数&#xff08;Default Arguments&#xff09; 4. 可变参数&#xff08;Variable Positional Arguments&#xff09; 5. 关键字可变参数&…...

天梯赛 PTAL2-009 抢红包

很简单的一道模拟题&#xff0c;使用map统计每个用户的钱数和红包数&#xff0c;最后在使用结构体存储&#xff0c;重载小于号&#xff0c;sort排序即可。 #include <bits/stdc.h> using namespace std; #define endl \n #define int long long typedef long long ll; c…...

【京东API开发指南】三步获取商品详情页实时数据:SKU、价格、销量全解析

以下是使用京东 API 获取商品详情页实时数据&#xff08;SKU、价格、销量&#xff09;的一般步骤&#xff1a; 注册与认证 注册开发者账号&#xff1a;访问京东开放平台官网&#xff0c;完成企业实名认证&#xff08;仅支持企业开发者&#xff09;。这是使用京东 API 的前提&am…...

深入探讨TK矩阵系统:创新的TikTok运营工具

TK矩阵的应用场景 TK矩阵系统适用于多个场景&#xff0c;尤其是在以下几个方面有显著优势&#xff1a; 批量账号管理与内容发布&#xff1a;对于需要管理多个TikTok账号的内容创作者或营销人员&#xff0c;TK矩阵提供了高效的账号管理工具&#xff0c;支持批量发布视频、评论、…...

AI Agent系列(六) -基于ReAct架构搭建LLM Agent(Deepseek)

AI Agent系列【六】 一、 ReAct1.1 ReAct 的处理过程&#xff1a;1.1 代码结构 二、 Python代码实现2.1 通过Zero-shot 实现python代码实例Python代码示例1&#xff1a;python代码实现示例2 一、 ReAct ReAct 是 Reseaning 和 Action 两个词的前缀合成&#xff0c;代表着先推…...

零基础上手Python数据分析 (6):Python 异常处理,告别程序崩溃的烦恼!

回顾一下,前几篇博客我们学习了 Python 的基本语法、数据结构和文件操作。 现在,我们已经掌握了 Python 编程的基础知识,可以开始编写更复杂的数据分析代码了。 但是,在实际的数据分析工作中,程序并非总能一帆风顺地运行,总会遇到各种 意外情况,例如: 文件找不到: 程序…...

AnyTouch:跨多个视觉触觉传感器学习统一的静态动态表征

25年3月来自人大、武汉科技大学和北邮的论文“AnyTouch: Learning Unified Static-dynamic Representation Across Multiple Visuo-tactile Sensors”。 视觉触觉传感器旨在模拟人类的触觉感知&#xff0c;使机器人能够精确地理解和操纵物体。随着时间的推移&#xff0c;许多精…...

关于stm32mp157

目录 设备树&#xff1a; 内核移植&#xff1a; 编写一个驱动的过程&#xff1a; 编写i2c传感器驱动的过程&#xff1a; 从arm11后&#xff0c;命名改为cortex&#xff0c; 1.cortex A&#xff1a;高端应用型领域 2.cortex R&#xff1a;实时性要求 3.cortex M&#xff1a;…...

关于单项梯度冻结小记

单项权重冻结&#xff08;Partial Weight Freezing&#xff09;详解 单项权重冻结&#xff08;Partial Weight Freezing&#xff09; 是深度学习模型训练中的一种技巧&#xff0c;指的是在训练过程中&#xff0c;只冻结&#xff08;固定&#xff09;部分网络权重&#xff0c;而…...

Ubuntu20.04安装Nvidia显卡驱动

Ubuntu20.04安装Nvidia显卡驱动 安装环境为Dell R540服务器 官网下载Nvidia显卡驱动 https://www.nvidia.cn/geforce/drivers/ 安装显卡驱动 chmod x NVIDIA-Linux-x86_64-470.63.01.run sudo ./NVIDIA-Linux-x86_64-470.63.01.run 遇到nouveau报错 lsmod查看nouveau驱动…...

YOLOv11 目标检测

本文章不再赘述anaconda的下载以及虚拟环境的配置&#xff0c;博主使用的python版本为3.8 1.获取YOLOv11的源工程文件 链接&#xff1a;GitHub - ultralytics/ultralytics: Ultralytics YOLO11 &#x1f680; 直接下载解压 2.需要自己准备的文件 文件结构如下&#xff1a;红…...