MySQL多表查询

2023-09-20 18:52:51

浅记sql中多表查询的相关语法

笛卡尔积

单表查询:select * from table1;
多表查询:select *from table1,table2;

idnameagestatusgenderiddes
1张三2213禁止
1张三2212受限
1张三2211正常
2李四1213禁止
2李四1212受限
2李四1211正常
3王五113禁止
3王五112受限
3王五111正常

直接采用这种方法进行多表查询,结果是集合A和集合B的所有组合情况,这对应关系代数中的“笛卡尔积”。在多表查询时,需要消掉无效的笛卡尔积。

  • 这需要加上where条件:
select *
from user,status where user.status=status.id;

连接查询

内连接:相当于查询A、B交集的部分。
左外连接:查询左表所有数据,以及两张表交集部分的数据。
右外连接:查询右表所有数据,以及两张表交集部分的数据。
自连接:当前表与自身连接查询,必须使用表的别名。

内连接

隐式内连接:select 字段列表 from 表1,表2 where 条件;
显式内连接:select 字段列表 from 表1 join 表2 on 连接条件;

#显式内连接
select *
from user,
     status
where status.id = user.status;
#隐式内连接
select *
from user
         join status on status.id = user.status;

外连接

左外连接:select 字段列表 from 表1 left join 表2 on 条件;
右外连接:select 字段列表 from 表1 right join 表2 on 条件;

#左外连接
select *
from user
         left join status on status.id = user.status;
#右外连接
select *
from user
         right join status on status.id = user.status;

右外连接查询结果

idnameagestatusgenderiddes
1张三2211正常
2李四1211正常
3王五111正常
nullnullnullnullnull2受限
nullnullnullnullnull3禁止

自连接

自连接查询可以是内连接,也可以是外连接。
自连接需要起别名:select 字段列表 from 表A 别名A join 表A 别名B on 条件;
自连接往往出现在一下场景:

  • 员工A的记录中有领导id,而领导也是员工,也在员工表中。这就需要自连接,拼接员工和员工的领导。
  • 领导没有领导,如果使用内连接,那么会导致结果中没有领导。此时需要左外连接,即使没有领导,也要显示出来。
select *
from user
         join test.user u on user.status = u.id;

联合查询

使用union联合查询需要多个查询结果的字段相同。

select 字段列表 from 表A...
union [all]
select 字段列表 from 表B...;

加不加all的区别是:

  • all:直接将查询的结果合并,不去重
  • all:将查询的结果合并后去重,没有重复项
#示例,直接将查询的结果合并
select *
from user where id>1
union all
select *
from user where id<3;
#将查询的结果合并后去重
select *
from user where id>1
union
select *
from user where id<3;

子查询

子查询的外部语句可以是insertupdatedeleteselect
这些查询方式的区别在于子查询的返回值格式,限制了可用的运算符:

  • 标量子查询:子查询结果为单个值。
  • 列子查询:子查询结果为一列。
  • 行子查询:子查询结果为一行。
  • 表子查询:子查询结果为多行多列。

标量子查询

子查询返回的结果是单个值,如数字、字符串、日期等。
子查询返回的结果会自动类型转换,使用where id = '2'where id = 2结果是一样的。

根据姓名查询状态id

image.png

根据上一步获取到的状态id查询状态描述

image.png

列子查询

标量子查询返回的结果是单个值,列子查询返回的结果是多个值。
假如有如下需求:查询工资比任意员工工资高的员工列表

  • where salary > any(select salary...)//查询工资比任意员工工资高的员工列表
  • where salary > some(select salary...)//跟上一条一样的效果
  • where salary > all(select salary...)//查询工资比所有员工工资高的员工列表

image.png

行子查询

#查询与张三相同状态和性别的用户
select *
from user
where (status,gender)=(select status,gender from user where name='张三');

表子查询

子查询的结果是多行多列。
常用操作符是in

#查询与张三或李四相同状态和性别的用户
select *
from user
where (status, gender) in (select status, gender from user where name = '张三' or name = '李四');
更多推荐

【MySQL系列】使用C语言连接MySQL

「前言」文章内容大致是使用C语言连接MySQL。「归属专栏」MySQL「主页链接」个人主页「笔者」枫叶先生(fy)目录一、Connector/C使用二、MySQL的C接口介绍2.1连接MySQL2.2发送SQL请求2.3获取结果集一、Connector/C使用按照前面MySQL的安装流程,安装完MySQL,MySQL相

【操作系统笔记】进程和线程

进程的组成进程要读取ELF文件,那么:①要知道文件系统的信息,fs_struct②要知道打开的文件的信息,files_struct一个进程除了需要读取ELF文件外,还可以读取其他的文件中的数据。进程中肯定有一个mm_struct实例,每个进程都有自己的虚拟地址空间,用于进程访问内存的。进程中肯定得知道下一条需要执行指令

【Verilog教程】2.4Verilog表达式

表达式表达式由操作符和操作数构成,其目的是根据操作符的意义得到一个计算结果。表达式可以在出现数值的任何地方使用。例如:a^b;//a与b进行异或操作address[9:0]+10'b1;//地址累加flag1&&flag2;//逻辑与操作操作数操作数可以是任意的数据类型,只是某些特定的语法结构要求使用特定的操作数。操作

Leetcode算法入门与数组丨4. 数组排序

文章目录1冒泡排序2选择排序3插入排序4归并排序5希尔排序6快速排序7堆排序8计数排序9桶排序10基数排序task05task061冒泡排序冒泡排序(BubbleSort)是一种简单的排序算法。它重复地遍历待排序的元素列表,一次比较相邻的两个元素,并按照顺序交换它们,直到整个列表排序完成。基本步骤下面是冒泡排序的基本步

【深度学习】 Python 和 NumPy 系列教程(十一):NumPy详解:3、数组数学(元素、数组、矩阵级别的各种运算)

目录一、前言二、实验环境三、NumPy0、多维数组对象(ndarray)多维数组的属性1、创建数组2、数组操作3、数组数学1.元素级别a.直接运算b.加法:np.add()函数c.减法:np.subtract()函数d.乘法:np.multiply()函数e.除法:np.divide()函数f.幂运算:np.power

WIFI6特性分析

特性介绍wifi6作为全新一代wifi协议,提供了更快速度,信道利用率更高,抗干扰能力更强,更高的频宽,更好的待机表现。下边是对比wifi456三代特性的区别:OFDMA:正交多频分址,提升物理媒介的并发通信能力。MU-MINO:多用户上传下载,提升多用处场景wifi速率160MHZ:拓展频段宽度TWT:休眠唤醒机制,

php外贸代购系统网站,淘宝代购系统,淘宝代购集运系统,海外代购系统

PHP外贸代购系统网站建设需要以下步骤:链接各大热门商城上的商品并自动获取参数,程序集成了淘宝、拍拍等大型热门商城抓取规则,可以直接一键代购上面的任何商品,自动获取相应的参数。确定网站功能,如:产品展示、在线购物、搜索引擎等。选择适合的数据库,例如MySQL、PostgreSQL等,存储网站的数据信息。根据目标用户的需

【leetcode 力扣刷题】栈—波兰式///逆波兰式相关知识和题目

波兰式、逆波兰式相关知识和题目波兰式、逆波兰式介绍常规表达式转换成逆波兰式==编程让常规表达式转换成逆波兰式==逆波兰式运算过程常规表达式转换成波兰式==编程让常规表达式转换成波兰式==波兰式运算过程150.逆波兰式表达式求值224.基本计算器227.基本计算器Ⅱ282.给表达式添加运算符波兰式、逆波兰式介绍我们常看到

计算机毕业设计 基于SpringBoot餐厅点餐系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟————————————————计算机毕业设计题目《10

个人简历内容

简历个人信息专业技能熟悉Java基础,如集合、代理、反射等。了解Java多线程,了解JVM内存模型、常见GC算法、类加载机制。·#熟悉SSM+SpringBoot框架,熟悉AOP、IOC和SpringBoot自动配置原理,了解SpringMVC执行流程。熟悉MySQL数据库,熟悉InnoDB存储引擎、事务、MVCC机制

2023年云南省职业院校技能大赛中职组“网络安全”赛项样题

2023年云南省职业院校技能大赛中职组“网络安全”赛项样题一、竞赛时间总计:180分钟二、竞赛阶段竞赛阶段任务阶段竞赛任务竞赛时间分值A、B模块A-1登录安全加固180分钟200分A-2数据库加固A-3服务加固SSH\VSFTPDA-4防火墙策略B-1隐写术应用-B400分B-2内存取证B-3数据库渗透B-4Linux

热文推荐