<MySQL> 查询数据进阶操作 -- 联合查询

目录

一、什么是笛卡尔积?

二、什么是联合查询?

三、内连接

3.1 简介

3.2 语法

3.3 更多的表

3.4 操作演示

四、外连接

4.1 简介

4.2 语法

4.3 操作演示

五、自连接

5.1 简介

5.2 自连接非必要不使用

六、子查询(嵌套查询)

6.1 简介

6.2 in 和 exists 关键字

6.3 子查询可能让简单的语句变复杂

七、合并查询

7.1 简介

7.2 合并查询可能让简单的语句变复杂

八、MySQL 中各个关键字的执行顺序


一、什么是笛卡尔积?

        笛卡尔积(Cartesian product)是一种数学概念,用于描述两个或多个集合之间的组合。它表示为两个或多个集合的乘积,其中每个元素都来自不同的集合。

        在编程中,笛卡尔积通常用于描述两个或多个数据集合之间的组合。

编程中使用笛卡尔积,需要注意以下两点:

实际开发中,使用笛卡尔积需要慎重,需要预估笛卡尔积后的结果集的规模,避免规模过大。
通常表与表之间存在关联关系,才可以进行笛卡尔积。没有关联关系的数据得出的笛卡尔积,通常也没有意义。

二、什么是联合查询?

        在MySQL中,联合查询是一种查询多个表的多个列的查询,通过取笛卡尔积,这些表和列被组合成一个结果集。联合查询通常用于查询多个表之间的关联数据。

联合查询的常见方式包括:内连接、外连接、自连接、子查询(嵌套查询)、合并查询


三、内连接

3.1 简介

        内连接是查询两个表或多个表之间的关联数据,返回两个表之间的交集数据。内连接是默认的连接类型,如果不指定连接类型,那么查询默认为内连接

3.2 语法

基本语法:select * from 表1 join 表2 on 关联条件;
基本语法:select * from 表1,表2 where 关联条件;
释义:

根据关联条件,全列查询指定表的笛卡尔积。

以上两种写法效果一致。

可以指定别名。

以上语法只进行了基本的查询,后续往往需要根据需要根据需求对表的内容进行精简

查询和精简步骤:

1、进行笛卡尔积

2、指定表之间的关联条件

3、指定结果集的筛选条件
4、指定需要打印的列(对需要打印的列进行精简或聚合运算)

join on

语法:

select 需要打印的列名... from 表1 join 表2 on 关联条件 and 结果集的其他筛选条件;

where语法:

select 需要打印的列名... from 表1,表2 where 关联条件 and 结果集的其他筛选条件;

3.3 更多的表

在超过两个表做笛卡尔积时,两种语法分别是怎样添加对应语句的?

假设此时有三个表做笛卡尔积:

join on 语法:

select 需要打印的列名...

from 表1 join 表2 on 关联条件 join 表3 on 关联条件

and 结果集的其他筛选条件;

where 语法:

select 需要打印的列名...

from 表1,表2,表3 where 关联条件,关联条件 

and 结果集的其他筛选条件;

        第一种写法清晰地表达了表之间是什么关联条件;而第二种写法则更为简洁,但表之间的关联条件却写成一团;两种写法各有各的优点。

3.4 操作演示


四、外连接

4.1 简介

        外连接也是查询两个表之间的关联数据,但有所不同的是,内连接查询的是两个表的交集,而外连接则会以一侧的表为主,显示所有列

4.2 语法

        外连接需要使用 left join 或 right join 子句指定连接方向。使用 left join 表示完全显示左侧表,称为左外连接;使用 right join 表示完全显示右侧表,称为右外连接。

语法:

select 需要打印的列名...

from 表1 left join 表2 on 关联条件 

and 结果集的其他筛选条件;

释义:根据关联条件和结果集的其他筛选条件,以指定的左侧表为主,查询指定表中指定的列数据。

4.3 操作演示


五、自连接

5.1 简介

        自连接是指一个表和自己进行笛卡尔积,这种查询方式应用场景不多,在需要将行关系转化成列关系时可以使用

语法:

select * from 表名 as 别名1,表名 as 别名2;
释义:

指定一个表和自己进行笛卡尔积,并打印结果集。

由于在同一个语句中表名相同,因此自连接需要使用别名。

没有使用别名将报错:

5.2 自连接非必要不使用

假设有以下场景:

        从上图可知,除了行列关系不同,使用其他方法可以和自连接获得一样的数据,但是自连接还需要对数据进行笛卡尔积,查询开销大因此,自连接的查询方式并不常用。如果出现一定要使用自连接进行查询才能获得正确数据的情况,此时则应考虑表的设计是否存在缺陷。


六、子查询(嵌套查询)

6.1 简介

        子查询是嵌套在主查询内部的SQL查询,它返回一个结果集,然后被用作主查询的条件。子查询需要使用where子句,并将其放在主查询的括号内。

语法:

主查询语句 where 包含(子查询语句)的条件表达式;
释义:

使用子查询语句返回的结果集作为主查询语句的条件。

6.2 in 和 exists 关键字

子查询语句可以配合 in 和 exists 关键字使用。

关键字释义
in / exists包含在(子查询语句返回的结果集中)
not in / not exists不包含在(子查询语句返回的结果集中)

6.3 子查询可能让简单的语句变复杂


七、合并查询

7.1 简介

        合并查询用于查询多个表的多个列的查询,这些表和列将被组合成一个结果集。在前后查询的结果集中,列的类型和数量需要一致,列名则不需要一致。

        合并查询需要使用 union 或 union all 关键字。

关键字说明
union取得两个结果集的并集,去重
union all取得两个结果集的并集,不去重
语法:查询语句1 union 查询语句2;
释义:将两个查询的结果集合并,去重,打印。

7.2 合并查询可能让简单的语句变复杂


八、MySQL 中各个关键字的执行顺序

fromonjoinwheregroup bywithhavingselectdistinctorder bylimit
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

        关键字从左到右,优先级依次从高到低。优先级高的关键字先执行。


阅读指针 -> 《数据库中的索引是什么?》

链接生成中...........

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕设 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要…

自己动手实现一个深度学习算法——六、与学习相关的技巧

文章目录 1.参数的更新1)SGD2)Momentum3)AdaGrad4)Adam5)最优化方法的比较6)基于MNIST数据集的更新方法的比较 2.权重的初始值1)权重初始值不能为02)隐藏层的激活值的分布3&#xff…

使用docker部署ELK日志框架-Elasticsearch

一、ELK知识了解 1-ELK组件 工作原理: (1)在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。 (2)Logstash 收集日志&#…

gRPC协议详解

gRPC介绍 gRPC是一个高性能、开源和通用的RPC(远程过程调用)框架,由Google发起并开发,于2015年对外发布。它基于HTTP/2协议和Protocol Buffers设计,支持多种编程语言(如C、Java、Python、Go、Ruby、C#、No…

es安装方式

es安装方式 1.下载镜像的方式 分词器 kibana和es和容器互通的方式 docker network create es-net开始拉去镜像的方式 docker pull kibana:7.12.1运行镜像的方式 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-…

论文笔记——BiFormer

Title: BiFormer: Vision Transformer with Bi-Level Routing AttentionPaper: https://arxiv.org/pdf/2303.08810.pdfCode: https://github.com/rayleizhu/BiFormer 一、前言 众所周知,Transformer相比于CNNs的一大核心优势便是借助自注意力机制的优势捕捉长距离…

【算法】堆排序

算法-堆排序 前置知识 堆(即将更新) 思路 我们现在有一个序列,怎么对它排序? 这是一个非常经典的问题,这里我们使用一个借助数据结构的算法——堆排序解决。 这里有一个序列,要对它升序排序 4 7 3 6 5 …

kubectl get nodes报错:The connection to the server localhost:8080

报错描述kubectl get nodes命令无法执行 在K8S-master初始化后,worker-node节点加入K8S集群后 kubeadm join 192.168.31.150:6443 --token 2n0t62.gvuu8x3zui9o8xnc \--discovery-token-ca-cert-hash sha256:d294c082cc7e0d5f620fb10e527a8a7cb4cb6ccd8dc45ffaf2c…

突发!奥特曼宣布暂停ChatGPT Plus新用户注册!

大新闻!就在刚刚! OpenAI的CEO Sam Altman宣布暂停ChatGPT Plus 新用户注册! Sam Altman对此解释道: 由于OpenAI开发日后ChatGPT使用量的激增超出了我们的承受能力,我们希望确保每个人都有良好的体验。 您仍然可以在a…

51单片机应用从零开始(三)

51单片机应用从零开始(一)-CSDN博客 51单片机应用从零开始(二)-CSDN博客 详解 KEIL C51 软件的使用建立工程-CSDN博客 详解 KEIL C51 软件的使用设置工程编绎与连接程序-CSDN博客 目录 1. 用单片机控制第一个灯亮 2. 认识单片…

Mendix 创客访谈录|低代码赋能IoT应用开发

本期创客 郑锴 舜宇光学科技(集团)有限公司信息技术部 毕业于浙江大学,三年软件设计开发经验。目前任职于舜宇光学科技(集团)有限公司信息技术部,担任软件开发工程师,主要负责工业互联网相关软件…

报错资源不足,k8s使用containerd运行容器修改挂载点根目录换成/home

运行k8s一段时间发现存储不足报错 发现这里用的是根路径的挂载,修改一下

深入Android S(12.0) 探索 Android Framework 之 SystemServer 进程启动详解

深入学习 Android Framework 第三:深入Android S(12.0) 探索 Android Framework 之 SystemServer 进程启动详解 文章目录 深入学习 Android Framework前言一、Android 系统的启动流程1. 流程图2. 启动流程概述 二、源码详解1. 时序图2. 源代码1、ZygoteInit # main…

opencv(1):创建和显示窗口, 读取保存图片

下载源码,方便查看 API 信息。 快速在源码文件夹中搜索相关 api. grep“namedWindow(*-Rn// 限定 .h 文件 grep“namedWindow(*-Rn|grep "\.h" vscode 语法检测有问题 一直有波浪线 打开 vscode, setting 界面,搜索 python 在 setting.json…

【Shell脚本12】Shell 输入/输出重定向

Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默…

Linux系统编程——进程中vfork函数

函数原型 pid_t vfork(void);//pid_t是无符号整型 所需头文件 #include <sys/types.h> #include <unistd.h> 功能 vfork() 函数和 fork() 函数一样都是在已有的进程中创建一个新的进程&#xff0c;但它们创建的子进程是有区别的。 返回值 成功子进程中返回 …

RK3588平台开发系列讲解(摄像头篇)USB摄像头驱动分析

🚀返回专栏总目录 文章目录 一. USB摄像头基本知识1.1 内部逻辑结构1.2 描述符实例解析二. UVC驱动框架2.1、设备枚举过程2.2、数据传输过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 USB摄像头驱动位于 drivers\media\usb\uvc\uvc_driver.c ,我们本篇重点看下…

rpmbuild 包名 version 操作系统信息部分来源 /etc/rpm/macros.dist

/etc/rpm/macros.dist openeuler bclinux src.rpm openssl-1.1.1f-13.oe1.src.rpm 打包名称结果 openeuler openssl-1.1.1f-13.aarch64.rpm bclinux openssl-1.1.1f-13.oe1.bclinux.aarch64.rpm 验证 修改openeuler配置文件macros.dist 重新在openeuler上执行rpmbuild…

opencv:从0到实现人脸识别

目录 opencv 人脸检查原理&#xff1a; 整体目录&#xff1a; 1.读取并展示图片 2.人脸检测 3.视频人脸检测 4.拍照保存 5 数据训练 6 人脸识别 opencv 人脸检查原理&#xff1a; OpenCV 中的人脸检测是基于哈尔特征分类器&#xff08;Haar Feature-based Cascade Cla…

EtherCAT从站EEPROM组成信息详解(1):字0-7ESC寄存器配置区

0 工具准备 1.EtherCAT从站EEPROM数据&#xff08;本文使用DE3E-556步进电机驱动器&#xff09;1 字0-字7ESC寄存器配置区组成信息详解 1.1 ESC寄存器配置区组成规范 对于EtherCAT从站来说&#xff0c;EEPROM的字0-字7组成的ESC寄存器配置区决定了从站上电后ESC能否正常工作…