[MySQL--基础]多表查询

前言

在这里插入图片描述

⭐Hello!这里是欧_aita的博客。
⭐今日语录:生活中最大的挑战就是发现自己是谁。然后,坚定不移地成为那个人。
⭐个人主页:欧_aita
ψ(._. )>⭐个人专栏:
数据结构与算法
MySQL数据库

在这里插入图片描述

在这里插入图片描述

多表查询

  • 前言
  • 多表关系
    • 概述🚀
    • 一对多🚀
    • 多对多🚀
    • 一对一🚀
  • 多表查询概述
    • 连接查询🐍
      • 内连接🕷
        • 隐式内连接
          • 代码实战
          • 效果图
        • 显式内连接
          • 实战代码
          • 效果图
      • 外连接🕷
        • 左外连接
          • 实战代码
          • 效果图
        • 右外连接
          • 实战代码
          • 效果图
      • 自连接🕷
        • 实战代码
        • 效果图
    • 联合查询--union,union all🐍
      • 实战代码
      • 效果图
      • 注意点🕷
      • 子查询🕷
        • 标量子查询
          • 实战代码
          • 效果图
        • 列子查询
          • 实战代码
          • 效果图
        • 行子查询
          • 实战代码
          • 效果图
        • 表子查询
          • 实战代码
          • 效果图

多表关系

概述🚀

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模板之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在各种联系,基本上分为三种:
1. 一对多
2. 多对多
3. 一对一

一对多🚀

一个部门对应多个员工,在多的一方建立外键,指向一的一方的主键。

多对多🚀

学生与课程之间的关系。建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。

create table student(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '姓名',
    no varchar(10) comment '学号'
)comment '学生表';
insert into student values (null,'黛绮丝','2000100101'),(null,'谢逊','2000100102'),(null,'殷天正','2000100103'),(null,'韦一笑','2000100104');

create table course(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '课程名称'
)comment '课程表';
insert into course values (null,'Java'),(null,'PHP'),(null,'MySQL'),(null,'Hadoop');

create table student_course(
    id int auto_increment comment '主键' primary key,
    studentid int not null comment '学生ID',
    courseid int not null comment '课程ID',
    constraint fk_courseid foreign key (courseid)references course(id),
    constraint fk_studentid foreign key (studentid)references student(id)
)comment '学生课程中间表';
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);

展示多对多关系图片

1.学生
在这里插入图片描述
2.课程
在这里插入图片描述

3.将同学与课程连接起来==(多对多的关系体现)==
在这里插入图片描述

一对一🚀

用户与用户详情的关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。
在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的

create table tb_user(
    id int auto_increment primary key  comment '主键ID',
    name varchar(10) comment '姓名',
    age int comment '年龄',
    gender char(1) comment '1: 男 , 2: 女',
    phone char(11) comment '手机号'
)comment '用户基本信息表';

create table tb_user_edu(
    id int auto_increment primary key comment '主键ID',
    degree varchar(20) comment '学历',
    major varchar(50) comment '专业',
    primaryschool varchar(50) comment '小学',
    middleschool varchar(50) comment '中学',
    university varchar(50) comment '大学',
    userid int unique comment '用户ID',
    constraint fk_userid foreign key (userid) references tb_user(id)
)comment '用户教育信息表';

insert into tb_user(id,name,age,gender,phone)values
            (null,'黄子',45,'1','18800001111'),
            (null,'冰冰',35,'2','18800002222'),
            (null,'码云',55,'1','18800008888'),
            (null,'李宏',50,'1','18800009999');

insert into tb_user_edu(id,degree,major,primaryschool,middleschool,university,userid)values
            (null,'本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈学院',1),
            (null,'硕士','表演','朝阳区第一小学','杭州市第一中学','杭州师范大学',2),
            (null,'本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学',3),
            (null,'本科','应用数学','阳泉区第一小学 ','阳泉区第一中学','清华大学',4);

多表查询概述

设定两个集合A,B。
在这里插入图片描述

连接查询🐍

内连接🕷

相当于查询A、B交集部分数据

如下图即是绿色的交集部分。

隐式内连接
SELECT 字段列表 FROM1,2 WHERE 条件...;
代码实战

– 内连接演示
– 1.查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
– 表结构:emp , dept
– 连接条件: emp.dept_id = dept.id

select emp.name , dept.name from emp , dept where emp.dept_id = dept.id order by emp.id ;

这里如果嫌字段列表名太长,可以选择起别名

-- 起别名,起别名之后只能使用别名去查询,因为DQL语句中先执行from语句--------------------
select e.name , d.name from emp e , dept d where e.dept_id = d.id ;
效果图

在这里插入图片描述

显式内连接
SELECT 字段列表 FROM1 [INNER] JOIN2 ON 连接条件...;
实战代码

– 2.查询每一个员工的姓名,及关联的部门的名称(显式内连接实现)
– 表结构:emp , dept
– 连接条件: emp.dept_id = dept.id

select e.name , d.name  from emp e inner join dept d on e.dept_id = d.id order by e.id;

同时inner可以选择忽略

select e.name , d.name  from emp e join dept d on e.dept_id = d.id order by e.id;
效果图

在这里插入图片描述

外连接🕷

在这里插入图片描述

左外连接

查询左表所有数据,以及两张表交集部分数据。

即是集合A左半边和集合A与集合B的交集。

SELECT 字段列表 FROM1 LEFT [OUTER] JOIN2 ON 条件...;
实战代码

– 外连接演示--------------
– 1.查询emp表的所有数据,和对应的部门信息(左外连接)
– 表结构:emp,dept
– 连接方式:emp.dept_id = dept.id

select e.* , d.name from emp e left outer join dept d on e.dept_id = d.id ;

同样的 outer 可以选择忽略。

select e.* , d.name from emp e left join dept d on e.dept_id = d.id ;
效果图

在这里插入图片描述

右外连接

查询右表所有数据,以及两张表交集部分数据。

即是集合B右半边和集合A与集合B的交集。

SELECT 字段列表 FROM1 RIGHT [OUTER] JOIN2 ON 条件...;
实战代码

– 2.查询dept表的所有数据,和对应的员工信息表(右外连接)

select d.* , e.* from emp e right outer join dept d on e.dept_id = d.id ;
效果图

在这里插入图片描述

自连接🕷

当前表与自身的连接查询,自连接必须使用表别名。

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...; 
实战代码

– 自连接
– 1.查询员工 及其 所属领导的名字
– 表结构 :emp

select a.name '员工' , b.name '领导' from emp a left join emp b on a.managerid = b.managerid ;

效果图

在这里插入图片描述

在这里插入图片描述

联合查询–union,union all🐍

对于联合查询,就是把多次查询的结果合并起来,形成一个新的查询结果集

SELECT 字段列表 FROM 表A ...
UNION[ALL]
SELECT 字段列表 FROM 表B ...;

实战代码

– union all , union
– 1.将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来。

select * from emp where salary < 5000
union
select * from emp where age > 50 ;

效果图

在这里插入图片描述

注意点🕷

union all 是直接将查询的两个表合并,而union 是将和并后的表进行去重。

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

子查询🕷

1.概念 : SQL 语句中嵌套SELECT语句,称为嵌套语句,又称子查询

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

子查询外部的语句可以是INSERT / UPDATE / SELECT 的任何一个。

2.根据子查询结果不同,分为:

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

3.根据子查询位置,分为:WHERE 之后、FROM之后、SELECT之后。

标量子查询
  • 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询成为标量子查询
  • 常见的操作符:= <> > >= < <=
实战代码

– 标量子查询
– 1.查询“销售部”的所有员工信息
– 查询出销售部的部门ID

select * from emp where dept_id = (select id from dept where name = '销售部') ;
效果图

在这里插入图片描述

列子查询
  • 子查询返回的结果是一列(可以是多行),这种子查询称为列子查询
  • 常用的操作符:IN 、NOT IN、ANY、SOME、ALL
    在这里插入图片描述
实战代码

– 列子查询
– 1.查询“销售部”和“市场部”的所有员工信息
– a.查询“销售部”和“市场部”的部门ID
– b.根据部门ID,查询员工信息

select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');

效果图

在这里插入图片描述

行子查询
  • 子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
  • 常用操作符:= 、<> 、IN 、NOT IN
实战代码

– 行子查询
– 1.查询与 “张无忌” 的薪资及直属领导的员工信息

select * from emp where (salary,managerid)=( select salary ,managerid from emp where name = '张无忌');

效果图

在这里插入图片描述

表子查询
  • 子查询返回的结果是多行多列, 这种子查询称为表子查询。
  • 常用的操作符:IN 、
实战代码

– 表子查询
– 1. 查询与“宋远桥” , “鹿杖客” 的职位和薪资相同的员工信息

select * from emp where ( job , salary ) in (select job,salary from emp where name = '鹿杖客' or name = '宋远桥');

效果图

在这里插入图片描述
这篇文章就到此结束了,如果对你有所帮助就点个赞吧。
在这里插入图片描述

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

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

相关文章

怎么翻译英文医学文献资料

文献翻译是一项要求严谨、精确且地道的工作&#xff0c;对于医学文献翻译更是如此。那么&#xff0c;怎么翻译英文医学文献资料&#xff0c;医学英文文献翻译公司哪个好&#xff1f; 专业人士指出&#xff0c;在翻译医学文献时&#xff0c;理解原文的语境是至关重要的。这不仅需…

Vue JAVA开发常用模板

1.VsCode添加模板 左下角设置》用户代码片段 新建全局代码片段》将模板粘贴仅文件&#xff08;prefix用于指定触发关键字&#xff09; 添加成功过后输入配置的关键字即可使用 1.1 vue2模板 {// Example:"Print to console": {"prefix": "vue2",…

创建conan包-Understanding Packaging

创建conan包-Understanding Packaging 1 Understanding Packaging1.1 Creating and Testing Packages Manually1.2 Package Creation Process 本文是基于对conan官方文档Understanding Packaging翻译而来&#xff0c; 更详细的信息可以去查阅conan官方文档。 1 Understanding …

Leetcode刷题详解——等差数列划分

1. 题目链接&#xff1a;413. 等差数列划分 2. 题目描述&#xff1a; 如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。 例如&#xff0c;[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 …

24、到底什么是感受野?

在之前的文章中介绍卷积算法时,一直在强调一个地方,那就是卷积算法是——卷积核在输入图像上滑动扫描的过程。 在每一次扫描时,可以把卷积核的在长宽方向的大小看做一个窗口,透过窗口可以看到的输入图像的范围,就称为感受野。 也就是神经网络(卷积)在每一次扫描过程中…

RHEL8.9 静默安装Oracle19C

RHEL8.9 静默安装Oracle19C 甘肃圆角网络科技开发有限公司 说明(GUI)&#xff1a;  1.实际业务场景中&#xff0c;Linux环境一般情况下是没有GUI的。没有GUI并不意味着没有安装图形界面。可能在部署Linux操作系统环境的时候安装了桌面环境&#xff0c;只是启动的时候设置了启动…

龙迅LT2611UX 四端口LVDS转HDMI(2.0)

1.描述&#xff1a; LT2611UX 四端口LVDS TO HDMI2.0。 LT2611UX是一款高性能得LVDS到HDMI2.0转换器得STB&#xff0c;DVD应用程序&#xff0c;LVDS输入可以配置单端口&#xff0c;双端口或者四端口&#xff0c;带有一个高速时钟通道&#xff0c;最多可运行三到四个高速数据…

FacetWP Relevanssi Integration相关性集成插件

点击阅读FacetWP Relevanssi Integration相关性集成插件原文 FacetWP Relevanssi Integration相关性集成插件是FacetWP与用于高级搜索的 Relevanssi 插件的集成显着增强了您网站的搜索功能。这个强大的工具使您的用户能够轻松找到他们寻求的特定内容&#xff0c;无论他们的查询…

【分布式算法】Raft算法详解

目录 一、什么是分布式一致性 二、Raft算法概述 三、Raft 算法的实现原理 3.1、Leader 选举 3.1.1、背景 3.1.2、有哪些成员身份 ​编辑 3.1.3、节点的状态转换 3.1.4、选举领导者的过程 3.1.5、节点间如何通讯&#xff1f; 3.1.6、什么是任期&#xff1f; 3.1.7、选…

SQL数据库知识点总结归纳

前后顺序可以任意颠倒,不影响库中的数据关系 关系数据库的逻辑性强而物理性弱,因此关系数据库中的各条记录前后顺序可以任意颠倒,不影响库中的数据关系 一名员工可以使用多台计算机(1:m),而一台计算机只能被一名员工使用(1:1),所以员工和计算机两个实体之间是一对多…

如何写出一个性能优化的单例模式

总结/朱季谦 单例模型是面试当中最常见的一种设计模式&#xff0c;它是一种对象创建模式&#xff0c;用于产生一个对象的具体实例&#xff0c;可以确保系统中一个类只产生一个实例。 简而言之&#xff0c;单例模式可以带来两个好处&#xff1a; 1、对于频繁使用到的对象&…

Linux--网络编程-ftp(TCP)网络通信-文件交互

项目要求&#xff1a;实现以下内容 远程控制&#xff1a; 1、查看服务器当前路径文件 ls 3、进入、退出服务器文件夹 cd 4、上传文件到服务器 put xxx 本地控制&#xff1a; 1、查看本地&#xff08;客户端&#xff09;文件 lls 2、进入客户端文件夹 lcd 3、获取服务器的文件…

MySQL笔记-第01章_数据库概述

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第01章_数据库概述1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库…

n皇后问题的最优解及优化

n皇后问题的最优解 时间复杂度 package algorithm;public class NQueen {public static int num(int n){if(n < 1){return 0;}int[] record new int[n];//n皇后的n*n的棋盘&#xff0c;record[i]表示第i行的皇后放在了第几列return process(0,record,n);}/***返回n皇…

深入学习锁--Synchronized各种使用方法

一、什么是synchronized 在Java当中synchronized通常是用来标记一个方法或者代码块。在Java当中被synchronized标记的代码或者方法在同一个时刻只能够有一个线程执行被synchronized修饰的方法或者代码块。因此被synchronized修饰的方法或者代码块不会出现数据竞争的情况&#x…

Vue练习 v-model 指令在状态和表单输入之间创建双向绑定

效果&#xff1a; <template><h2>Text Input</h2><input v-model"text"> {{ text }}<h2>Checkbox</h2><input type"checkbox" id"checkbox" v-model"checked"><label for"checkbox…

使用VBA创建Excel条件格式

实例需求&#xff1a;数据总行数不确定&#xff0c;现需要将Category区域&#xff08;即C列到J列&#xff09;中第3行开始的区域设置条件格式&#xff0c;规则如下&#xff1a; 只对部分指定单元格应用色阶条件格式&#xff08;3色&#xff09;指定单元格应满足条件&#xff1…

抓取Chrome所有版本密码

谷歌浏览器存储密码的方式 在使用谷歌浏览器时,如果我们输入某个网站的账号密码,他会自动问我们是否要保存密码,以便下次登录的时候自动填写账号和密码 在设置中可以找到登录账户和密码 也可以直接看密码,不过需要凭证 这其实是windows的DPAPI机制 DPAPI Data Protection Ap…

微信小程序 纯css画仪表盘

刚看到设计稿的时候第一时间想到的就是用canvas来做这个仪表盘&#xff0c;虽然本人的画布用的不是很好但还可以写一写&#x1f600;。话不多说直接上代码。最后有纯css方法 <!--wxml--> <canvas canvas-id"circle" class"circle" >// js dat…

python pyaudio显示音频波形图

python pyaudio显示音频波形图 代码如下&#xff1a; import numpy as np import matplotlib.pylab as plb import wave# 读取 wav wf wave.open("./output.wav", "rb")# 获取音频相关参数&#xff1a;声道数、量化位数、采样频率、采样帧数 nchannels,…