【MySQL】不就是MySQL——多表查询

news2024/12/23 22:36:02

前言

  嗨!小伙伴们大家好呀,忙碌的一周就要开始!在此之前我们学习的MySQL数据库的各种操作都是在一张表之中,今天我们学习要对多张表进行相关操作,相比较于单一的表来说,多张表操作相对复杂一些,我相信只要认真学习多表查询也不再话下!

 目录

目录

前言

 目录

一、多表关系

1.概述

1.1 一对一

1.2 一对多(多对一) 

​1.3 多对多

 二、多表查询概述

三、多表查询分类 

3.1 连接查询

3.2 内连接语法

3.3 内连接练习

3.4 外连接语法

3.5 外连接练习

3.6 自连接语法

3.7 联合查询 union,union all

四、总结 


一、多表关系

1.概述

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

一对一(多对一)

一对多

多对多

1.1 一对一

案例: 用户与 用户详情的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率

实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

 1.1.1 创建用户基本信息

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

1.1.2 创建用户教育信息表

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

1.2 一对多(多对一) 

案例:部门与员工的关系
 关系:一个部门对应多个员工,一个员工对应一个部门
 实现: 在多的一方建立外键,指向一的一方的主键

1.3 多对多

案例: 学生与 课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

 

 建立三张表的代码如下

1.3.1 创建学生表且插入数据

create table student(id int auto_increment primary key comment'主键id',
name varchar(10) comment'姓名',
novar char(10) comment'学号') comment'学生表';

insert into student values(null,'宋江','001'),(null,'鲁智深','002'),(null,'李逵','001');

1.3.2 创建课程表且插入数据

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

1.3.3 创建课程中间表且插入数据

create table student_course
(
    id        int auto_increment comment '主键'
        primary key,
    studentid int not null comment '学生id',
    courseid  int not null comment '课程id',
    constraint f_kcourseid
        foreign key (courseid) references course (id),
    constraint f_kstudentid
        foreign key (studentid) references student (id)
)
    comment '学生课程中间表';

 

 二、多表查询概述

概述: 指从多张表中查询数据,多表查询就是要消除笛卡尔积。
笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合和 B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)

 

创建两张表:部门表、员工表

create table dept
(
    id   int auto_increment comment 'id'
        primary key,
    name varchar(50) not null comment '部门名称'
)
    comment '部门表';

create table emp
(
    id         int auto_increment comment 'id'
        primary key,
    name       varchar(50) not null comment '姓名',
    age        int         null comment '年龄',
    job        varchar(20) null comment '职位',
    salary     int         null comment '薪水',
    entrydate  date        null comment '入职时间',
    mangagerid int         null comment '直属的领导id',
    dept_id    int         null comment '部门id',
    constraint dept_id
        foreign key (dept_id) references dept (id)
)
    comment '员工表';

 两张表消除笛卡尔积的方法:emp.dept_id=dept.id

三、多表查询分类 

3.1 连接查询


内连接:相当于查询A、B交集部分数据。
外连接:
 左外连接:查询左表所有数据,以及两张表交集部分数据 。
 右外连接:查询右表所有数据,以及两张表交集部分数据。

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

 

3.2 内连接语法

3.2.1隐式内连接

select 字段名 from 表1,表2 where 条件....;

3.2.2 显式内连接

select 字段名 from 表1 [inner] join 表2 no 连接条件;

内连接是两张表交集的部分 

3.3 内连接练习

3.3.1 查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)

select emp.name,dept.name from emp,dept where emp.id=dept.id;

3.3.2 查询每一个员工的姓名,及关联的部门的名称(显示内连接实现)

select emp.name,dept.name from emp join dept on emp.id=dept.id;

3.4 外连接语法

左外连接

select 字段列表 from 表1 left [outer] join 表2 on 条件...;

相当于查询表1(左表)的所有数据 包含 表1和表2交集部分的数据 

右外连接

select 字段列表 from 表1 right [outer] join 表2 on 条件...;

相当于查询表2(右表)的所有数据 包含 表1和表2交集部分的数据 

3.5 外连接练习

连接条件:emp.id=dept.id

3.5.1 查询emp表的所有数据,和对应部门信息(左外连接)

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

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

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

右连接可以改为左连接

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

 

3.6 自连接语法

select 字段列表 from 表A 别名A join 表B 别名B on 条件;

子连接查询,可以是内连接查询,也可以是外连接查询。

3.7 联合查询 union,union all

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

 union 语法

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

注意:

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

union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。

四、总结 

  今天的课程就到此结束了,今天所学的课程为多表查询的一部分,在下一期的课程中我们主要学习子查询,期待我们下次再见!

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

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

相关文章

【数据库三】数据库的存储引擎

存储引擎 1.存储引擎1.1 概念介绍1.2 常用存储引擎 2.MyISAM2.1 特点介绍2.2 支持的存储格式2.3 适用的生产场景 3.InnoDB3.1 特点介绍3.2 适用生产场景分析4.企业选择存储引擎依据 5.MyISAM和InnoDB的区别命令操作 1.存储引擎 1.1 概念介绍 MySQL数据库中的组件,负…

深层神经网络

1、深层网络中的前向传播 一个训练样本 x 前向传播 第一层需要计算 𝑧 [1] 𝑤[1]𝑥 𝑏 [1],𝑎 [1] 𝑔 [1] (𝑧 [1] )(𝑥可以看做 𝑎 [0] &am…

软件工程导论期末救急包(中)

目录 用户需求 需求分析常用的分析方法 软件设计 创建良好设计的原则 内聚性 耦合性 UML中各种视图及其作用 用例视图VS逻辑视图 UML中的主要图及其作用 软件开发过程与UML可视化建模 MVC模式 MVVM模式 面向对象模型主要哪些模型组成? 概要设计阶段的基本任务是什…

联想小新 Pro 16 2022 锐龙版开启S3睡眠模式方法,解决S0睡眠发热耗电容易唤醒等烦恼

联想小新 Pro 16 2022 锐龙版,CPU为AMD Ryzen 7 6800H 默认为S0睡眠模式,经常发热睡死过去,并且无法禁止鼠标唤醒电脑 本文借助“Universal AMD Form Browser”软件,在固件层面修改笔记本的睡眠方式。 本文所用到的软件Univer…

【Unity】 基础入门 编译错误排查与调试方法

基础入门 编译错误排查与调试方法 一、常见编译错误原因1、环境问题2、代码命名问题二、代码调试方法1、基础调试方法2、高级玩法3、unity调试工具插件一、常见编译错误原因 1、环境问题 1、Win11系统不兼容部分unity版本 考虑换系统吧! 2、可能是系统权限问题,访问不到部分…

jmeter工具介绍

Jmeter性能测试工具介绍 Jmeter的背景介绍Jemter过程类元件介绍Jmeter结果查看类元件介绍Jmeter其他介绍 Jmeter背景介绍: Apache JMeter是Apache组织的开放源代码项目,是一个100%纯Java桌面应用,用于压力测试和性能测试。它最初被设计用于…

C++技能系列 ( 2 ) - const的几种使用【详解】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 C技能系列 期待你的关注哦!!! 生活就是上帝发给你的一张手牌,无论多烂,你都得拿着。 Life is god give you a hand, no matter ho…

【前端面试手册】CSS系列-01

本专栏收录于《前端面试手册-CSS篇》如果该文章对您有帮助还希望你能点一个小小的订阅,来增加博主创作的动力✍🏻 一、什么是盒子模型,说说你的理解? 首先,如果你要对一个文档进行布局的时候,浏览器的渲染…

[进阶]Java:对象序列化、反序列化

对象序列化: 使用到的流是对象字节输出流:ObjectOutputStream作用:以内存为基础,把内存中的对象存储到磁盘文件中去。称为对象序列化。 代码演示如下: 学生类: /**对象如果要序列化一定要实现Serializab…

力扣题库刷题笔记7--N字型变换

1、题目如下: 2、个人Python代码实现: 看到此题的第一反应就是,生成一个类似二维数组的多个字符串,然后用个标志位控制N字符中字符的方向,例如flag True,在每次循环时候以flag flag * -1来控制。 由于示例…

Oracle-ASM磁盘组HIGH模式丢盘问题处理

背景: 用户一套Oracle19c的RAC集群ASM磁盘组使用了3个存储作为HIGH以及NORMAL冗余模式,每个存储分别对应一个failgroup,其中2个存储出现了故障导致ASM磁盘组对应的failgroup磁盘全部offline,在存储恢复正常之后,需要将offline的磁…

2020年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

2020年英语二联考真题 一、完形填空 Directions: Read the following text. Choose the best word for each numbered blank and mark A, B, C or D on the ANSWER SHEET (10 points) Being a good parent is what every parent would like to be. But defining what it mea…

《Java黑皮书基础篇第10版》 第17章【习题】

Java语言程序设计 习题第十七章 17.2章节习题 17.1什么是文本文件,什么是二进制文件?可以使用文本编辑器来查看文本文件或者二进制文件吗? 文本文件是字符组成的文件,二进制文件是0和1组成的文件 文本编辑器只能访问文本文件 17…

一文教你彻底学会SPI协议

一文教你彻底学会IIC协议 一.概况SPI二.SPI连接2.1 一主一从2.2 一主多从 三.SPI通信过程3.1 CPOL(极性)和CPHA(相位)3.2 SPI时序图3.1 SPI起始信号3.2 SPI停止信号3.3 数据的有效性 四.代码实例 一.概况SPI SPI 协议是由摩托罗拉…

腾讯云服务器开Minecraft配置怎么选择?

腾讯云服务器Minecraft我的世界服务器配置怎么选择?10人以内玩2核4G就够用了,腾讯云开我的世界服务器选择轻量应用服务器就够了,轻量CPU采用至强白金处理器,大型整合包一般1.12版本的,轻量2核4G配置都差不多的&#xf…

智慧加油站卸油作业行为分析算法 opencv

智慧加油站卸油作业行为分析系统通过opencvpython网络模型技术,智慧加油站卸油作业行为分析算法实现对卸油作业过程的实时监测。当现场出现卸油作业时人员离岗,打电话人员抽烟等违规行为,灭火器未正确摆放,明火和烟雾等异常状态&a…

VMware 逃逸基础知识

虚拟化相关概念 VMM:即 VM Monitor ,也被称为 Hypervisor(虚拟机监控程序)。VMM 是 guest os 的管理器,管理虚拟机运行。例如 Windows 的 Hyper-V ,linux 的 KVM 以及裸机上安装的 Xen 和 VMware ESXi 都属…

《MySQL是怎么运行的》阅读笔记

mysql运行的整体架构简介 Mysql是由两部分构成,一部分是服务器程序,一部分是客户端程序。 服务器程序又包括两部分: 第一部分server层包括连接器、查询缓存、分析器、优化器、执行器等。涵盖 MySQL 的大多数核心服务功能,以及所有…

【Android复习笔记】Glide核心原理

Glide 核心流程 Glide中RequestManager会管理两个队列,一个请求队列,一个等待队列,当生命周期onStop停止时,把运行队列中的任务添加到等待队列中,当生命周期onResume恢复时,又从等待队列中添加到运行队列执行。 关于 Glide.with(this).load(url).into(iv); 主要搞清楚三…

Doris初认识

Doris初认识 文章目录 Doris初认识1. Doris 概述2. 核心特性3. 使用场景4. 架构 1. Doris 概述 Apache Doris 是由百度大数据部研发(之前叫百度 Palo,2018 年贡献到 Apache 社区后,更名为 Doris ),在百度内部&#xff…