Mysql数据库入门基础篇--mysql 多表查询

news2024/11/25 12:56:32

【Mysql数据库入门基础篇--mysql 多表查询

  • 🔻一、mysql 多表查询
    • 1.1 🍃 7种sql joins 的实现
    • 1.2 🍃 错误写法---笛卡尔积错误
    • 1.3 🍃 正确的多表`select`写法
  • 🔻二、内连接`( inner) join`
  • 🔻三、 外连接(`outer join`)
    • 3.1 🌴 左外连接 ---`left (outer) join`
    • 3.2 🌴 右外连接 ---`right (outer) join`
    • 3.3 🌴 全外连接 --- `full (outer) join`
  • 🔻四、 交叉连接(笛卡尔积)---`cross join`
  • 🔻五、总结—温故知新

在这里插入图片描述

🔻一、mysql 多表查询

多表查询也称关联查询,几个表之间关联查询。

前提:表之间有关联字段。

1.1 🍃 7种sql joins 的实现

在这里插入图片描述

1.2 🍃 错误写法—笛卡尔积错误

  • 省略多个表连接查询条件
  • 连接条件无效
  • 所有表中所有行相互连接
###查询每个角色对应的菜单--每个角色都与每个菜单id匹配了一遍

mysql> select t_role.id ,role_name,menu_id from t_role ,t_permission;

在这里插入图片描述

笛卡儿积:
在这里插入图片描述

1.3 🍃 正确的多表select写法

为了避免笛卡尔积错误,需要在where 子句中加入有效的连接条件。

  • 如果查询语句中出现了多个表中相同的字段,必须指明该字段所属的表
  • 从sql优化的角度,建议多表查询时,每个字段前都指明其所属的表
  • 可以在selectwhere子句中使用表别名,增强sql可读性(from table1 表别名,table2 表别名
  • 如果使用了别名,则不能再使用表的原名
  • 如果有n个表连接查询,则至少需n-1个连接条件
###添加两个表的连接条件
####语法

select table1.colum , table2.colum  from table1,table2 where table1.colum1 = table2.colum1;

mysql> select t_role.id ,role_name,menu_id from t_role ,t_permission where t_role.id = t_permission.role_id;

🔻二、内连接( inner) join

  • 内连接也叫连接,是最早的一种连接。也称为普通连接或者自然连接
  • 显示两个以上表的公共部分,如: 查询AB两个表的交集,只返回两个表中连接字段相等的行
  • inner join 或者join(等同于inner join),注: inner 关键字可以省略
  • sql 92语法:使用+号,如oracle数据库:select * from 表A ,表B on 表A.key=表B.key(+)
  • sql 99语法:使用join ...on (mysql支持)
####语法
select * from 表A inner join 表B on 表A.key=表B.key;select * from 表A join 表B on 表A.key=表B.key;

####如:查询t_role 与t_permission 连接字段相等的行,结果为两个表的交集
mysql> select t_role.id ,role_name,menu_id from t_role inner join t_permission on t_role.id = t_permission.role_id;
mysql> 

在这里插入图片描述

🔻三、 外连接(outer join

  • 外连接(outer join)分为三种:左外连接,右外连接,全外连接。对应sql:left / right / full outer join。通常省略outer这个关键字。
  • 如果是左外连接,则连接条件中的左表为主表,右表为从表。
  • 如果是右外连接,则连接条件中的右表为主表,左表为从表。
  • 返回左右表中不满足条件的行,没有匹配行时,用null值填充。

3.1 🌴 左外连接 —left (outer) join

  • 左外连接也称左连接,返回左表中的所有记录和右表中连接字段相等的记录。

🌺 A表的全集+AB表的交集:

  • 左外连接 + A∩B
  • 返回左表中的所有记录和右表中连接字段相等的记录
####语法####

select * from 表A left Join 表B  on 表A.key=表B.key;

###如:查询所有角色对应的菜单权限,返回所有t_role行 ,和t_permission 连接字段相等的记录,没有匹配行时,右表列值用`null`值填充
mysql> select t_role.id ,role_name,menu_id from t_role left  join t_permission on t_role.id = t_permission.role_id;

在这里插入图片描述

🌺 A表的全集-AB表的交集

  • 左外连接 - A∩B
  • 表示返回数据集为A的独有
#####语法##
select * from 表A left Join 表B  on 表A.key=表B.key where 表B.key  is null;

如:查询t_role角色对应的菜单权限,返回所有t_role独有的行
mysql> select t_role.id ,role_name,menu_id from t_role left  join t_permission on t_role.id = t_permission.role_id where t_permission.role_id is null;
+----+-----------+---------+
| id | role_name | menu_id |
+----+-----------+---------+
| 18 | 老师      | NULL    |
+----+-----------+---------+
1 row in set (0.00 sec)

mysql>

在这里插入图片描述

3.2 🌴 右外连接 —right (outer) join

  • 右外连接也称右连接,返回右表中的所有记录和左表中连接字段相等的记录。

🌺 B表的全集+ AB表的交集:

  • 右外连接 + A∩B
  • 返回右表中的所有记录和左表中连接字段相等的记录
####语法####

select * from 表A right Join 表B  on 表A.key=表B.key;


####如:查询所有菜单权限对应的角色,返回所有t_permission行,和t_role 连接字段相等的记录,没有匹配行时,左表列值用`null`值填充
mysql> select t_role.id ,role_name,menu_id from t_role right  join t_permission on t_role.id = t_permission.role_id;

在这里插入图片描述

🌺 B表的全集-AB表的交集

  • 右外连接 - A∩B
  • 表示返回数据集为B的独有
#####语法##
select * from 表A left Join 表B  on 表A.key=表B.key where 表A.key  is null;

如:查询t_role角色对应的菜单权限,返回所有t_permission独有的行
mysql> select t_role.id ,role_name,menu_id from t_role left  join t_permission on t_role.id = t_permission.role_id where t_role.id is null;

mysql>

在这里插入图片描述

3.3 🌴 全外连接 — full (outer) join

  • mysql本身不支持full (outer) join(全外连接),但可以通过union来实现。
  • 语法一:左外连接 + A∩B union all 右外连接 - A∩B
  • 语法二:右外连接 + A∩B union all 左外连接 - A∩B
### 语法一 ### 
mysql> select t_role.id ,role_name,menu_id from t_role left  join t_permission on t_role.id = t_permission.role_id
    -> union all
    -> select t_role.id ,role_name,menu_id from t_role left  join t_permission on t_role.id = t_permission.role_id where t_role.id is null;

### 语法二 ### 
mysql> selectt_role.id ,role_name,menu_id from t_role right  join t_permission on t_role.id = t_permission.role_id
    -> union all
    -> select t_role.id ,role_name,menu_id from t_role left  join t_permission on t_role.id = t_permission.role_id where t_permission.role_id is null;

union all返回查询结果并集,重复部分不去重,执行union all 所需要的资源比union少,如果结果数据不存在重复记录或不需要去重,则尽量使用union all,以便提高查询效率。
在这里插入图片描述

union返回查询结果并集,去除重复部分
在这里插入图片描述

🌺 A+B-(AB交集):

-语法:左外连接 - A∩B union all 右外连接 - A∩B

###语法####
左外连接 - A∩B  union all   右外连接 - A∩B

```sql
mysql> select t_role.id ,role_name,menu_id from t_role left  join t_permission on t_role.id = t_permission.role_id where t_permission.role_id is null
    -> union all
    -> select t_role.id ,role_name,menu_id from t_role left  join t_permission on t_role.id = t_permission.role_id where t_role.id is null;
+----+-----------+---------+
| id | role_name | menu_id |
+----+-----------+---------+
| 18 | 老师      | NULL    |
+----+-----------+---------+
1 row in set (0.00 sec)

mysql> 

在这里插入图片描述

🔻四、 交叉连接(笛卡尔积)—cross join

  • 返回被连接的两个以上表所有数据行的笛卡尔积。
  • 返回结果集合中的数据行数等于第一个表中复合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
####语法###

select * from 表A cross join 表B on 表A.key=表B.key;

mysql> select t_role.id ,role_name,menu_id from t_role cross join t_permission on t_role.id = t_permission.role_id;

🔻五、总结—温故知新

7种sql joins 的实现
❓ 内连接`( inner)  join`语法
❓ 外连接(`outer join`)各种语法
❓ 交叉连接(笛卡尔积)---`cross join`语法

👈【上一篇】
💖The End💖 点点关注,收藏不迷路💖
【下一篇】👉

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

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

相关文章

【LeetCode】23. 合并 K 个升序链表

23. 合并 K 个升序链表(困难) 方法一:顺序合并 思路 ListNode* mergeTwoLists(ListNode *a, ListNode *b) {if ((!a) || (!b)) return a ? a : b;ListNode head, *tail &head, *aPtr a, *bPtr b;while (aPtr && bPtr) {if (…

【第十期】Apache DolphinScheduler 每周 FAQ 集锦

点击蓝字 关注我们 摘要 为了让 Apache DolphinScheduler 的广大用户和爱好者对于此项目的疑问得到及时快速的解答,社区特发起此次【每周 FAQ】栏目,希望可以解决大家的实际问题。 关于本栏目的要点: 本栏目每周将通过腾讯文档(每…

卡尔曼滤波与组合导航原理(十二)扩展卡尔曼滤波:EKF、二阶EKF、迭代EKF

文章目录 一、多元向量的泰勒级数展开二、扩展Kalman滤波三、二阶滤波四、迭代EKF滤波 一、多元向量的泰勒级数展开 { y 1 f 1 ( X ) f 1 ( x 1 , x 2 , ⋯ x n ) y 2 f 2 ( X ) f 2 ( x 1 , x 2 , ⋯ x n ) ⋮ y m f m ( X ) f m ( x 1 , x 2 , ⋯ x n ) \left\{\begin{…

大家都说Java有三种创建线程的方式,并发编程中的惊天骗局

在Java中,创建线程是一项非常重要的任务。线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高。Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是继承Thread类、实现…

论文浅尝 | Dually Distilling KGE for Faster and Cheaper Reasoning

笔记整理:张津瑞,天津大学硕士,研究方向为知识图谱 链接:https://dl.acm.org/doi/10.1145/3488560.3498437 动机 知识图谱已被证明可用于各种 AI 任务,如语义搜索,信息提取和问答等。然而众所周知&#xff…

【C++】C++11常用新特性

✍作者:阿润菜菜 📖专栏:C 目录 一、统一的列表初始化二、 简化声明2.1 auto2.2 decltype2.3 nullptr 三、右值引用和移动语义 -- 重要3.1 区分左值引用和右值引用3.2 对比左值引用看看右值引用使用价值3.3 万能引用和完美转发(st…

基于word文档,使用Python输出关键词和词频,并将关键词的词性也标注出来

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 移船相近邀相见,添酒回灯重开宴。 大家好,我是Python进阶者。 一、前言 前几天在有个粉丝问了个问题,大概意思是这样…

一道北大强基题背后的故事(三)——什么样的题是好题?

早点关注我,精彩不错过! 上回我们针对这道北大强基题[((1 sqrt(5)) / 2) ^ 12]在答案的基础上给出了出题的可能思路,想一探究竟,相关内容请戳: 一道北大强基题背后的故事(二)——出题者怎么想的…

【Kubernetes入门】Service四层代理入门实战详解

文章目录 一、Service四层代理概念、原理1、Service四层代理概念2、Service工作原理3、Service原理解读4、Service四种类型 二、Service四层代理三种类型案例1、创建ClusterIP类型Service2、创建NodePort类型Service3、创建ExternalName类型Service 三、拓展1、Service域名解析…

Latex中图片排版(多个子图、横排、竖排、添加小标题)

1、两个子图横排 \begin{figure}[!t] \centering %\includegraphics[width3in]{fig5} \subfloat[subfig figure title]{\includegraphics[scale0.5]{superd2}} \subfloat[subfig figure title]{\includegraphics[scale0.5]{superd2}} \caption{title} \label{fig_6} \end{figu…

阿里发布的百亿级高并发系统(全彩版小册),涵盖了所有的高并发操作

高并发 提到“高并发”相信你们应该都不会感到陌生!此时你脑中应该会浮现好多有关高并发的:业务急剧增长、电商购物、电商秒杀、12306抢票、淘宝天猫各种活动等;都是需要用到高并发的,那么如何去设计一个高并发系统抵挡这些冲击呢…

Django的app里面的视图函数

我之前说过需要重点去了解view和model,下面是我的总结。 视图函数是存在view.py里面的,视图函数的主要功能是接收请求、返回响应。在建立应用程序后,先在URL配置文件中加一条配置项指明URL与视图函数的对应关系。然后按照实际需求在视图函数…

三次握手四次挥手过程剖析

【一】预备知识: 1.三次握手并不一定非得成功,最担心得其实就是最后一个akc(应答)丢失,但是还是有配套得解决方案,比如超时重传机制。 2.连接是需要被保存下来得,是需要被os管理起来得&#xf…

被一个gpio口搞死的一天

今天是新项目调试的第一天。 我起的很早,起早的原因很简单,我家楠哥要我送他上学,他说爸爸没有起到一个当爸爸的责任,他也想让爸爸送他上学,然后我就送了。 7点30起来,8点出发,然后回来看了一下…

IDEA把css/js压缩成一行min文件,idea实现右键压缩css和js文件

前言 发布时有些css和js文件较长多行,导致加载的时候略慢,所以想把指定的css或js压缩 实现 整合 yuicompressor-2.4.8.jar 下载地址1:https://github.com/yui/yuicompressor/releases 下载地址2:https://github.com/yui/yuicom…

小学生开“卷”AIGC,绝不能输在起跑线上

图片来源:由无界AI生成 OpenAI的研究报告称,未来,大量工作岗位将受到AI冲击,首当其冲的岗位是作家、数学家、网页设计师、记者、律师…… 自从ChatGPT问世以来,人类会被AI替代的讨论甚嚣尘上,焦虑情绪无处不…

chatgpt赋能python:Python中的倒序遍历:如何使用Python倒序遍历?

Python中的倒序遍历:如何使用Python倒序遍历? Python是一种高级编程语言,它非常适合数据科学、机器学习和人工智能等领域。Python的强大之处在于它有很多内置功能,其中包括倒序遍历。 在本篇文章中,我们将介绍如何使…

EmbodiedGPT|具身智能或将成为实现AGI的最后一公里

卷友们好,我是穆尧。 最近由Chatgpt所引爆的新一代人工智能的革命正在如火如荼的进行,几乎重塑了所有的互联网产品,如办公软件、浏览器插件、搜索引擎、推荐系统等。这样巨大的改变,让大家对通用人工智能又燃起了新的希望&#xf…

CTPN文本检测详解 面试版本

二.关键idea 1.采用垂直anchor回归机制,检测小尺度的文本候选框 2.文本检测的难点在于文本的长度是不固定,可以是很长的文本,也可以是很短的文本.如果采用通用目标检测的方法,将会面临一个问题:**如何生成好…

Autosar诊断实战系列01-手把手教你增加一路31Routine服务

本文框架 1.系列概述2. UDS Routine服务添加3. DcmDspRoutine配置3.1 DcmDspRoutineInfos配置3.2 DcmDspRoutines配置1.系列概述 在本系列笔者将结合工作中对诊断实战部分的应用经验进一步介绍常用UDS服务的进一步探讨及开发中注意事项, Dem/Dcm/CanTp/Fim模块配置开发及注意…