【Mysql数据库从0到1】-入门基础篇--mysql 多表查询

news2024/11/25 2:57:02

【Mysql数据库从0到1】-入门基础篇--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/616658.html

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

相关文章

100天精通Golang(基础入门篇)——第2天:学习Go语言的前世今生:一门强大的编程语言的崛起

🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《I…

如何构建一个可实盘的跨期套利策略?

一、策略摘要 跨期套利,在同一个品种但不同月份的期货合约上建立仓位相同、方向相反的交易头寸,最后以对冲或交割方式结束交易、获得收益。因其合约价差具有较好的稳定性,被众多交易者所青睐。本篇内容我们将通过掘金量化平台构建一个可交易…

私募证券基金动态-23年5月报

成交量:5月日均11,342.95亿元 2023年5月A股两市日均成交9,284.12亿元,环比下降18.15%、同比上升10.56%。5月整体20个交易日,仅有月初5个交易日单日成交金额过万亿。 管理人:新提交备案6家,备案通过0家 2023年5月新提…

Shape-Erased Feature Learning for Visible-Infrared Person Re-Identification

Shape-Erased Feature Learning for Visible-Infrared Person Re-Identification(形状擦除特征学习在可见红外人物再识别中的应用) 期刊合集:最近五年,包含顶刊,顶会,学报>>网址 文章来源&#xff1…

Lecture 10 Distributional Semantics

目录 Problems of Lexical Database 词汇数据库的问题分布假设根据上下文猜测单词含义Word vectors 词向量词嵌入Count-based Word Vectors 基于计数的方法Document as Context: The Vector Space Model 向量空间模型TF-IDFDimensionality Reduction 降维 Words as Context 单词…

跨数据中心高可用架构设计

前言 随着常年的码代码,做设计,笔者做过基础编码,云计算平台,架构师,见过不少应用设计,系统设计,中间件,了解现有的技术体系发展模式,集中式->分布式;cap…

阿里8年,肝到P7只剩这份笔记了,已助朋友拿到15个Offer....

时光飞逝,转眼间在阿里工作了8年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到P7也费了不少心思 我的职业生涯开始和大多数测试人一样,刚开始接触…

Redis进阶:分布式锁问题

分布式锁问题 1. 分布式锁问题1.1 问题介绍1.2 解决方案1.2.1 分布式锁主流的实现方案1.2.2 使用Redis实现分布式锁1.2.3 分布式锁需要满足的四个条件 1.3 实现分布式锁 1. 分布式锁问题 1.1 问题介绍 单机单体中的锁机制在分布式集群系统中失效;单纯的Java API并…

Linux快速安装MySQL

文章目录 Linux上安装MySQL1. 安装MySQL1)上传MySQL安装包以及MySQL驱动jar包2)解压MySQL安装包3)卸载系统自带的mariadb4)安装MySQL依赖5)安装mysql-client6)安装mysql-server7)启动MySQL8&…

案例27:基于Java宠物领养系统开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

性能测试之Docker监控

相信很多程序员在进行性能测试时常常会遇到一些问题,比如如何监控Docker容器的运行状态。这时候,Docker监控工具就派上了用场。 我曾经也遇到过这样的问题,不知道如何获取Docker容器的性能数据,直到我发现了Docker监控工具。使用…

干货分享 | TSMaster小功能之实时注释在图形中的使用技巧

今天给大家介绍TSMaster功能之实时注释在图形中的使用技巧,主要通过手动注释、自动化注释、实时注释在记录与回放中的运用等三方面来进行介绍。 一、实时注释的作用 在了解实时注释的使用技巧之前,我们先了解一下实时注释是什么以及它的作用。 实时注释…

算法修炼之筑基篇——筑基二层初期(解决最长回文子串问题,马拉车(manacher)算法模板)

✨博主:命运之光 🦄专栏:算法修炼之练气篇 🍓专栏:算法修炼之筑基篇 ✨博主的其他文章:点击进入博主的主页 前言:学习了算法修炼之练气篇想必各位蒟蒻们的基础已经非常的扎实了,下来…

SpringCloud服务注册中心

SpringCloud 服务注册中心 1.Eureka基础知识 什么是服务治理? Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,…

数据库的增删改查(三)

1、查询 1.1、聚合查询 1.1.1、聚合函数 数据库提供了很多函数,其中就包括聚合函数,常见的聚合函数如下表 函数说明COUNT([IDDINCT] expr)返回查询到的数据的数量SUM([DISTINCT] expr)返回查询到的数据的总和,不是数字没有意义AVG([IDSTI…

一篇长文教你进行全方位的使用appium

随着移动应用的日益普及,移动应用的测试成为了软件开发的重要组成部分。Python,作为一种易于学习,功能强大的编程语言,特别适合进行这种测试。本文将详细介绍如何使用Python进行APP测试,并附带一个实例。 Python 和 Ap…

CVE漏洞复现-CVE-2021-2109 Weblogic Server远程代码执行

CVE-2021-2109 Weblogic Server远程代码执行 漏洞背景 2021年1月20日,Oracle官方发布了漏洞补丁,修了包括 CVE-2021-2109 Weblogic Server远程代码执行漏洞在内的多个高危严重漏洞。CVE-2021-2109 中,攻击者可构造恶意请求,造成J…

多媒体库SDL以及实时音视频库WebRTC中的多线程问题实战详解

目录 1、概述 2、开源跨平台多媒体库SDL介绍 3、开源音视频实时通信库WebRTC介绍 4、在国产化Linux桌面系统中遇到的SDL多线程问题 5、在给WebRTC新增外部音频插件库时遇到的多线程问题 6、最后 VC常用功能开发汇总(专栏文章列表,欢迎订阅&#xf…

【云原生】创建容器的方法

1)基于现有镜像的创建 先使用现有镜像创建容器 docker run 再进入容器进行内容更新 docker exec 最后提交成新的镜像 docker commit 2)基于模板创建 可以从本地容器导出模板文件 docker export 或者从网上下载现成的模板文件 http://openvz…

C++继承相关内容(二)

目录 一.拷贝构造函数 第一种情况:基类没有拷贝构造函数,派生类也没有拷贝构造函数 结果: 原因: 第二种情况:基类没有拷贝构造函数,派生类有拷贝构造函数 结果: 原因: 第三种情况…