[MySQL--基础]多表查询

news2024/9/25 19:21:16

前言

在这里插入图片描述

⭐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 = '宋远桥');

效果图

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

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

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

相关文章

DNS服务器配置与分析

目录 实验目的&#xff1a; 实验原理&#xff1a; 实验步骤&#xff1a; 步骤1&#xff1a;创建拓扑 步骤2&#xff1a;为PC、Client和Server配置IPv4地址、子网掩码和域名服务器 步骤3&#xff1a;启动设备和服务器 步骤4&#xff1a;测试PC-1、Client-1和Server-1之间…

仅 CSS 阅读进度条

为了构建一个阅读进度条&#xff0c;即显示用户向下滚动时阅读文章的进度&#xff0c;很难不考虑 JavaScript。但是&#xff0c;事实证明&#xff0c;您也可以使用纯 CSS 构建阅读进度条。 从本质上讲&#xff0c;一个名为 animation-timeline 的新实验性 CSS 属性可以让你指定…

剑指 Offer(第2版)面试题 16:数值的整数次方

剑指 Offer&#xff08;第2版&#xff09;面试题 16&#xff1a;数值的整数次方 剑指 Offer&#xff08;第2版&#xff09;面试题 16&#xff1a;数值的整数次方解法1&#xff1a;快速幂 - 递归写法解法2&#xff1a;快速幂 - 非递归写法 剑指 Offer&#xff08;第2版&#xff…

强化学习——简单解释

一、说明 最近 OpenAI 上关于 Q-star 的热议激起了我温习强化学习知识的兴趣。这是为强化学习 (RL) 新手提供的复习内容。 二、强化学习的定义 强化学习是人类和其他动物用来学习的学习类型。即&#xff0c;通过阅读房间来学习。&#xff08;从反馈中学习&#xff09;。让我解…

在线直线度测量仪在圆形轧钢中的重要性

在线直线度测量仪在圆形轧钢中的重要性 在现代轧钢生产中&#xff0c;在线直线度测量仪是一种非常重要的工具&#xff0c;它可以帮助工人和产线进行高精度的直线度和直径测量&#xff0c;从而保证产品质量的稳定性和精度。以下是详细介绍直线度测量仪的重要性和应用。 一、测…

高斯平滑处理

本文主要介绍了高斯滤波器的原理及其实现过程 高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1;而高斯滤波器的模板…

06、pytest将多个测试放在一个类中

官方用例 # content of test_class.py # 实例1 class TestClass:def test_one(self):x "this"assert "h" in xdef test_two(self):x "hello"assert hasattr(x,"check")# content of test_class_demo.py # 每个测试都有唯一的类实例…

逻辑回归 使用Numpy实现逻辑回归

使用Numpy实现逻辑回归 sigmoid 函数 g ( z ) 1 ( 1 e − z ) g(z)\frac{1}{(1e^{−z} )} g(z)(1e−z)1​ # sigmoid 函数 def sigmod(z):return 1/(1np.exp(-z))线性计算与梯度下降 J ( θ ) − 1 m [ ∑ i 1 m y ( i ) l o g ⁡ ( h θ ( x ( i ) ) ) ( 1 − y ( i ) …

算符优先语法分析程序设计与实现

制作一个简单的C语言词法分析程序_用c语言编写词法分析程序-CSDN博客文章浏览阅读378次。C语言的程序中&#xff0c;有很单词多符号和保留字。一些单词符号还有对应的左线性文法。所以我们需要先做出一个单词字符表&#xff0c;给出对应的识别码&#xff0c;然后跟据对应的表格…

quickapp_快应用_生命周期

生命周期 APP的生命周期页面组件的生命周期页面栈页面的生命周期onBackPressonMenuPress踩坑 onRefreshonConfigurationChanged页面滚动 自定义组件的生命周期父子组件初始化生命周期执行顺序 APP的生命周期 App的生命周期在app.ux 中定义的回调函数。 onCreate() {prompt.sh…

谈谈 .NET8 平台中对 LiteDB 的 CRUD 操作

哪个啥&#xff01;纯 C# 编写的 LiteDB 你还不会操作&#xff1f; LiteDB 简介LiteDB 安装同步版 LiteDB异步版 LiteDB.Async LiteDB StudioLiteDB CRUD 操作举例LiteDB vs SQLite 对比1、谈谈 sqlite 和 litedb 的 ACID 事务支持&#xff1f;2、谈谈 sqlite 和 litedb 的稳定…

股票代码合法验证:python字符串str应用

从键盘输入六位股票代码字符串&#xff0c;判定合法并输出板块分类&#xff0c;否则输出“NO”。 (笔记模板由python脚本于2023年12月04日 19:19:07创建&#xff0c;本篇笔记适合熟悉python字符串和字典的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https:…

C语言小游戏:三子棋

目录 &#x1f30d;前言 &#x1f685;目录设计 &#x1f48e;游戏逻辑设置 ⚔三子棋棋盘设计 ⚔三子棋运行逻辑 &#x1f440;怎么设置人下棋 &#x1f440;怎么设置电脑下棋 ✈如何判断输赢 ✍结语 &#x1f30d;前言 Hello,csdn的各位小伙伴你们好啊!这次小赵给大…

密码学学习笔记(二十三):哈希函数的安全性质:抗碰撞性,抗第一原象性和抗第二原象性

在密码学中&#xff0c;哈希函数是一种将任意长度的数据映射到固定长度输出的函数&#xff0c;这个输出通常称为哈希值。理想的哈希函数需要具备几个重要的安全性质&#xff0c;以确保数据的完整性和验证数据的来源。这些性质包括抗碰撞性、抗第一原象性和抗第二原象性。 抗碰…

C#网络编程TCP程序设计(Socket类、TcpClient类和 TcpListener类)

目录 一、Socket类 1.Socket类的常用属性及说明 2.Socket类的常用方法及说明 二、TcpClient类 三、TcpListener类 四、示例 1.源码 2.生成效果 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在C#中&#xff0c;TCP程序设…

Fiddler的配置、原理和使用

一、Fiddler的工作原理 本地应用与服务器之间所有的请求&#xff08;request&#xff09;和响应&#xff08;response&#xff09;&#xff0c;由fiddler进行转发&#xff0c;此时fiddler以代理服务器的方式存在。 由于所有的网络数据都要经过fiddler&#xff0c;因此&#xf…

6、原型模式(Prototype Pattern,不常用)

原型模式指通过调用原型实例的Clone方法或其他手段来创建对象。 原型模式属于创建型设计模式&#xff0c;它以当前对象为原型&#xff08;蓝本&#xff09;来创建另一个新的对象&#xff0c;而无须知道创建的细节。原型模式在Java中通常使用Clone技术实现&#xff0c;在JavaSc…

01_W5500简介

目录 W5500简介&#xff1a; 芯片特点: 全硬件TCPIP协议栈: 引脚分布&#xff1a; W5500简介&#xff1a; W5500是一款高性价比的以太网芯片&#xff0c;其全球独一无二的全硬件TCPIP协议栈专利技术&#xff0c;解决了嵌入式以太网的接入问题&#xff0c;简单易用&#xff…

HostHunter虚拟主机发现

HostHunter虚拟主机发现 1.HostHunter2.安装3.参数解释4.实例1.HostHunter HostHunter 一种工具,用于有效发现和提取提供大量目标 IPv4 或 IPv6 地址的主机名。HostHunter 利用简单的 OSINT 和主动协调技术将 IP 目标与虚拟主机名进行映射。这对于发现组织的真正攻击面特别有…

直观清晰的带你了解KMP算法(超详细)

KMP算法用来找某个字符串是否存在某个连续的真子串的 下面举一个例子让抽象的KMP算法更加直观&#xff0c;有助于理解 首先我们要了解KMP算法首先要找到一个next数组来表示主串中每一个字符的回退的下标&#xff08;这个下标是对于真子串而言的&#xff0c;主串不需要回退&…