多表联查--01---LEFT JOIN 实现多表联查

news/2024/10/24 7:30:40/

表的关系

  • 一对一,一张表 有时候会为了性能而拆开(商品信息和商品备注信息–详情-很大)
  • 一对多,必须两张表
  • 多对一,反过来就是一对多,必须两张表
  • 多对多,必须三张表,中间表,来维护它们之间的关系
    在这里插入图片描述

笛卡尔积查询:

  • 所谓笛卡尔积查询就是指,查询两张表,其中一张表有m条记录,另一张表有n条记录,查询的结果是m*n条。

笛卡尔积。

现在,我们有两个集合A和B。 A = {0,1} B = {2,3,4}

集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};

B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};

以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。

查询复杂度

例如: A表 n条记录,B表m条记录

  1. 表连接查询 select * from A left B on , 复杂度 n+m
  2. 相关子查询 select * from A IN (select * from B) , 复杂度 n*m

所以 mysql查询优化器可能对涉及子查询的查询语句进行重写, 转变为多表查询的操作,已降低查询的复杂度
在这里插入图片描述
在这里插入图片描述

案例:

tab1

在这里插入图片描述

tab2

在这里插入图片描述

SELECT * FROM tab1 ,tab2 ;

  • 笛卡尔积=3*3=9

在这里插入图片描述

where 和 left join区别

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

区别:

1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录

2. where条件是在临时表生成好后,再对临时表进行过滤的条件。

这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

案例:

tab1

在这里插入图片描述

tab2

在这里插入图片描述

WHERE:

SELECT * FROM tab1 ,tab2 WHERE tab1.size = tab2.size ;

在这里插入图片描述

LEFT JOIN ON:

SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.size = tab2.size;

在这里插入图片描述

SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.size != tab2.size

在这里插入图片描述

解析:

1.数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表

相当于 SELECT * FROM tab1 ,tab2 ; ==> 中间的临时表

在这里插入图片描述

2.LEFT JOIN on条件是在生成临时表时使用的条件,

SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.size != tab2.size;

其中tab1.size != tab2.size 是条件 在这里插入图片描述

3.不管LEFT JOIN on中的条件是否为真,都会返回左边表中的记录

SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.size = tab2.size;

在这里插入图片描述

4. 我们再看where 多表联查:

SELECT * FROM tab1 , tab2 WHERE tab1.size = tab2.size;

在这里插入图片描述

where条件是在临时表生成好后,再对临时表进行过滤帅选

同理:

SELECT * FROM tab1 , tab2 WHERE tab1.size != tab2.size;

在这里插入图片描述

LEFT JOIN , RIGHT JOIN ,INNER JOIN对比

概念:

  • left join(左联接) :把左边的全部查出来,右边有的则匹配,没有则为null
  • right join(右联接) :返回包括右表中的所有记录,和左表中联结字段相等的记录
  • inner join(等值连接): 只返回两个表中联结字段相等的行

案例:

tab1

在这里插入图片描述

tab2

在这里插入图片描述

SELECT * FROM tab1 ,tab2;

在这里插入图片描述

条件为tab1 .size = tab2.size;

SELECT * FROM tab1 , tab2 WHERE tab1.size = tab2.size;
在这里插入图片描述

SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.size = tab2.size;
在这里插入图片描述

SELECT * FROM tab1 RIGHT JOIN tab2 ON tab1.size = tab2.size;
在这里插入图片描述

SELECT * FROM tab1 INNER JOIN tab2 ON tab1.size = tab2.size;
在这里插入图片描述

条件为tab1 .size != tab2.size

SELECT * FROM tab1 , tab2 WHERE tab1.size != tab2.size;
在这里插入图片描述

SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.size != tab2.size;
在这里插入图片描述

SELECT * FROM tab1 RIGHT JOIN tab2 ON tab1.size != tab2.size
在这里插入图片描述

SELECT * FROM tab1INNER JOIN tab2 ON tab1.size != tab2.size
在这里插入图片描述

另: 只查询左表字段的的记录

SELECT tab1.id, tab1.salary, tab1.size

FROM tab1 LEFT JOIN tab2 ON tab1.size != tab2.size;

在这里插入图片描述

看上去像有重复记录,实际是没查全

在这里插入图片描述

中间临时表在这里插入图片描述

加上 DISTINCT

SELECT DISTINCT tab1.id, tab1.salary, tab1.size
FROM tab1 LEFT JOIN tab2 ON tab1.size != tab2.size

在这里插入图片描述

解析:

因为on的条件tab1.size != tab2.size ,左表一条匹配到右边记录多条,所以单看左表会显示重复记录

如果要唯一 可以使用where 在on之后进行筛选,或者on后的条件 是一 一匹配.

题目:

需求:找出表tab1中 size和tab2中size不相等的记录

tab1

在这里插入图片描述

tab2

在这里插入图片描述

不能直接用left join on 去找

SELECT tab1.id,tab1.salary,tab1.size

FROM tab1 LEFT JOIN tab2 ON tab1.size != tab2.size;

在这里插入图片描述
在这里插入图片描述

因为: tab1.size != tab2.size ,左表一条匹配到右边记录多条,所以单看左表会显示重复记录

正确写法 1:

先找到相等的记录 ,在筛选

SELECT tab1.id,tab1.salary,tab1.size FROM tab1 WHERE tab1.id NOT IN (

SELECT tab1.id FROM tab1 INNER JOIN tab2 ON tab1.size = tab2.size );

在这里插入图片描述

或者

SELECT tab1.id,tab1.salary,tab1.size FROM tab1 WHERE tab1.id NOT IN (

SELECT tab1.id FROM tab1 , tab2 WHERE tab1.size = tab2.size );

注意:

上诉sql不能用left JOIN on 或者 right JOIN on

left 会默认返回所有 tab1.id

SELECT tab1.id FROM tab1 LEFT JOIN tab2 ON tab1.size = tab2.size
在这里插入图片描述

right 返回结果集 会有null 记录

- SELECT tab1.id FROM tab1 RIGHT JOIN tab2 ON tab1.size = tab2.size

在这里插入图片描述

INNER JOIN

SELECT * FROM tab1 INNER JOIN tab2 ON tab1.size = tab2.size

在这里插入图片描述
在这里插入图片描述

总结:

  1. 对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面

  2. 对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。

正确写法 2:

not in 效率不高 可以考虑 not exists

SELECT id ,size,salary FROM tab1 AS a WHERE NOT EXISTS(

SELECT tab1.id FROM tab1 INNER JOIN tab2 =ON tab1.size =tab2.size

WHERE tab1.id= a.id )

在这里插入图片描述

正确写法 3:

SELECT tab1.id,tab1.salary,tab1.size FROM tab1 WHERE size NOT IN (

SELECT size FROM tab2 )

在这里插入图片描述


http://www.ppmy.cn/news/824112.html

相关文章

WORD 插入SVG矢量图导致文件太大

问题:投稿word论文中插入几k SVG矢量图导致文件变大几兆 解决: 1. 查看每个插图的大小 1.1小的直接在在线AVG转换器调小一下 1.2 大的将图片转为pdf,再在线压缩pdf 选择最低,40dpi图像 2. 替换所有图片 因为期刊要求矢量图&am…

Junit 参数化测试基础 (公司的代码用到)

Junit 参数化测试基础 学习背景参数化测试步骤完整代码 学习背景 背景:公司的地图组件,是在各大图商:高德SDK、百度SDK、Google SDK 以及自己开发的 HLL SDK 组装起来的一个大的 SDK组件,在测试的 生产代码中可以看到,…

ps文件怎么导出html文件,PS存储到网页格式的最佳方式

当需要把图片存储为网页所用格式时,为了确保图片无卡顿地清晰显现,考虑它的品质和大小总是很必要的。这个教程就会教给你关于"存储为web所用格式"你需要知道的知识。 存储为web所用格式 互联网几乎是当今最大的艺术、图形和相片分享平台之一,因此掌握一些保存为网…

ps保存时显示和服务器不兼容,PS保存文件时出现最大兼容性是什么意思?Photoshop最大兼容性问题讲解...

我们使用photosohp,在将文件保存为.psd格式的时候,photoshop经常会弹出一个最大兼容性的对话框,对话框在询问:是否关闭最大兼容性,关闭最大兼容性,有可能会导致其他应用程序或其他版本的photoshop无法打开你…

lr不能直接转ps编辑_20 秒实现PS和LR互相切换使用,让照片管理与精修有更多的可能...

尽管在Lightroom中能完成照片的大部分日常编辑工作,但当遇到需要给照片添加文字,换背景等需要精修照片的时候,lightroom就显得很鸡肋需要借助Photoshop来实现。 20 秒教程——lightroom中的照片转到Photoshop 照片转入Photoshop中进行处理,在【图库】模板,选择要编辑的照片…

PS文件的存储

一、PS文件储存方法 存储---ctrls存储为---ctrlshifts存储为Web所用格式---ctrlshiftalts(注:保存为网页格式目的是输出展示在网页上的图片,创建网页使用的图像,保存的主要的目的之一是在维持图片质量的同时尽可能地缩小文件体积&#xff1b…

解决PS中:无法将图片存储为Web存储格式,及如何将图片大小修改成10KB的问题

1、所用的 PS (PhotoShop) 版本: Adobe Photoshop CC 20182、出现的问题: 在将图片转化成 10KB 大小时,出现将存储为Web存储格式时,页面显示无法操作;3、解决问题: A、找到菜单按钮,打开运行&a…

ps动作保存不覆盖原文件_Photoshop从入门到精通:图像的基本操作,新建打开保存关闭文件...

图像的基本操作 在Photoshop中,最常见的5种文件操作分别是新建文件、打开文件、保存文件、关闭文件和置入文件。大家只有掌握好了这些最基本的操作,才更更好的掌握和学习Photoshop,从而来进行图像的处理。 1、新建文件 新建文件用于在Photoshop中创建一个新的图像文件。新建…