MySQL第11讲--多表查询的介绍

news2024/11/16 13:43:02

文章目录

      • 前言
      • 多表关系
      • 多表查询概述
      • 多表查询的分类
        • 连接查询
          • 内链接
          • 外链接
          • 自连接
        • 联合查询
        • 子查询
          • 标量子查询
          • 列子查询
          • 行子查询
          • 表子查询

前言

  在MySQL第10讲–约束的介绍中讲了数据库的几种约束条件:非空约束、唯一约束、主键约束、外键约束、检查约束、默认约束。下图对着几种约束做了总结:
在这里插入图片描述
  接下来我们将要介绍数据库多表查询

多表关系

概述:在项目开发中进行数据库表结果设计时,会根据业务需求和模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着某种关联,基本上分为三种:一对多(多对一)、一对一、多对多。
  接下来我们依次介绍一下这几种关联关系:

  • 一对多
    案例:部门与员工之间的关系
    关系:一个部门对应多个员工,一个员工对应多个部门。
    实现:在多的一方建立外键,指向一的一方主键。
    在这里插入图片描述
  • 多对多
    案例:学生和课程之间的关系
    关系:一个学生可以选多门课程,一门课程可以被对个学生选择;
    实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键;
    在这里插入图片描述
      接下来通过一个实例展现一下多对多的关系:
      首先创建一个学生列表:

create table student(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '姓名',
    num varchar(10) comment '学号'
) comment '学生表';
# 给表表结构添加数据
insert into student values (null,'李元昊','1011001'),(null,'李德明','1011002'),(null,'李集钱','1011003'),(null,'李勉县','1011004');

  其次创建一个课程列表并添加数据;

create table course(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '课程名称'

)comment '课程表';
# 添加课程表的数据
insert into course values (null,'C++'),(null,'python'),(null,'java'),(null,'mysql');

  最后我们创建一个课程表和学生表之间的中间表来维护课程表和学生表之间的关系;
创建中间表并添加相应的数据:

create table student_coures(
    id int auto_increment primary key comment '主键',
    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_coures values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);

  创建完这三个表之后我们可以用可视化的界面展示三个表之间的关系如下图所示:
在这里插入图片描述

  • 一对一
    案例:用户与用户详情之间的关系
    关系:一对一关系,多用于单表拆分,将一张表的基础字段放到一张表上,其他详情字段放到另一张表上,可以提升操作效率。
    实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)。
    如下图所示可以看到一张表中包含的信息比较多,操作起来不是很便利,我们可以对这张表进行拆分,
    在这里插入图片描述
    如下图所示,上面的表拆分成了两张表
    在这里插入图片描述
    两个表的键相互关联,并且是唯一的。
    在这里插入图片描述
    接下来我们演示一下一对一的关系;
    首先创建两个表tb_user和tb_user_edu,创建两个表的语句如下:

创建tb_user

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

创建tb_user_edu

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 '用户教育信息表';

分别给这两张表添加信息:
给tb_user添加信息:

insert into tb_user(id, name, age, gender, phone) VALUES (null, '黄渤','45','男','18033575534'),
                                                         (null, '冰冰','35','女','18033575535'),
                                                         (null, '马芸','36','女','18033575536'),
                                                         (null, '艳红','35','女','18033575537');

给tb_user_edu添加信息:

insert into tb_user_edu(id, degree, major, primaryschool, middleschool, university, userid) VALUES
                                          (null,'本科','表演','静安第一小学','静安第一中学','北京电影学院','1'),
                                          (null,'本科','舞蹈','武汉第一小学','武汉第一中学','上海电影学院','2'),
                                          (null,'本科','英语','浙江第一小学','浙江第一中学','杭州电子科技','3'),
                                          (null,'本科','数学','南宫第一小学','南宫第一中学','北京工业大学','4');

打开tb_user_edu可以看到有一个外键userid,他关联的就是主键的基本id,由于我们为userid加上了约束,所以一条约束就会有一个基本信息。
在这里插入图片描述

多表查询概述

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

多表查询的分类

  • 多表查询的分类:连接查询和子查询;
连接查询
  • 连接查询又分为内链接和外链接
    在这里插入图片描述
内链接

  定义:相当于查询上图A和B交集的部分
  内链接查询语法:隐式内连接和显示内链接

  • 隐式内连接语法
SELECT 字段列表 FROM 表1, 表2 WHERE 条件...;

实例1:

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

结果:
在这里插入图片描述

  • 显示内连接语法
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 连接条件...;

实例1:

select d.name, e.name from dept d inner join emp e on d.id = e.depth_id;

结果:
在这里插入图片描述

外链接

  外链接分为:左外链接右外链接

  • 左外链接:查询左表所有数据,以及两张表交集部分数据。
    查询语法:
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件...;

实例1:

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

结果:
在这里插入图片描述

  • 右外链接:查询右表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;

实例1:

select e.name, d.name from emp e right join dept d on d.id = e.depth_id;

结果:
在这里插入图片描述

自连接

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

  • 自连接语法:
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;
# 自连接查询,可以是内链接查询,也可以是外链接查询
联合查询

  联合查询:关键字union或union all ;
对于联合查询就是把多次查询的结果合并起来,形成一个新的查询结果集。

  • 查询语法
SELECT 查询列表 FROM 表A...
UNION [ALL]
SELECT 查询列表 FROM 表B...

注意:(1) UNION ALL :是直接对查询结果进行合并;(2) UNION:是对查询结果进行去重;
(3 )联合查询多张表的列数必须保持一致,字段类型也必须保持一致;

子查询

  子查询:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。

  • 查询语法
SELECT * FROM t1 WHERE column1= (SELECT column1 FROM t2);
标量子查询

   标量子查询:子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
   标量子查询常用的操作符:= <> > < >= <=
案例1:查询 “财务部” 所有员工信息。

select * from emp where depth_id=(select id from dept where name='财务部');
# 括号内是子查询,括号内的查询结果直接当做外面查询的条件

查询结果:
在这里插入图片描述

案例2:查询在“张三”之后入职的所有员工

select * from emp where entrydata>(select entrydata from emp where name='张三');

查询结果:
在这里插入图片描述

列子查询

   列子查询:子查询返回的结果是一列(可以是多行),这种子查询称为列子查询;
   列子查询常使用的操作符:IN 、 NOT IN 、 ANY、SOME、ALL

操作符描述
IN在指定的集合范围之内,多选一
NOT IN不在指定的集合范围之内
ANY子查询返回列表中,有任意一个满足即可
SOME与 ANY等同使用 SOME 的地方都可以使用ANY
ALL子查询返回列表所有值都必须满足

案例1:查询 “财务部"和"测试部” 的所有员工信息。

select * from emp where depth_id in(select id from dept where name='财务部' or name='测试部');

查询结果:
在这里插入图片描述

案例2:查询 比"财务部"所有人工资都高的员工信息;

select * from emp where salary > all(select salary from emp where depth_id=(select id from dept where name='财务部'));

查询结果:
在这里插入图片描述

行子查询

   行子查询:子查询返回的结果是一行(可以是多列),这种子查询称为行子查询;
   行子查询常使用的操作符:IN 、 NOT IN 、 =、<>
案例1:查询 与“李四”薪资相同的所有员工信息。

select * from emp where salary=(select salary 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/2170942.html

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

相关文章

数字人实战第六天——DH_live 训练自己的数字人

一、简介 数字人是一种基于人工智能和数字化技术构建的虚拟人物或代理&#xff0c;能够进行人类式的交互和沟通。这些技术主要包括&#xff1a; 人工智能&#xff08;AI&#xff09;&#xff1a;AI 是数字人的核心&#xff0c;包括自然语言处理&#xff08;NLP&#xff09;、机…

[深度学习]循环神经网络

1 自然语言处理概述 语料:一个样本,句子/文章语料库:由语料组成词表:分词之后的词语去重保存成为词表2 词嵌入层 import jieba import torch.nn as nn import torch # 文本数据 text=北京东奥的进度条已经过半,不少外国运动员在完成自己的比赛后踏上归途。 # 分词 words=j…

11.梯度下降法的思想——举足轻重的模型优化算法

引言 优化算法在机器学习和人工智能中扮演者至关重要的角色。机器学习模型的训练过程本质上是一个优化问题&#xff0c;即通过调整模型参数来最小化损失函数。梯度下降法(Gradient Descent)在优化算法中占据着重要的地位&#xff0c;因其简单、有效且易于实现。 通过阅读本篇…

阿里云服务器挖矿木马清除

这里写自定义目录标题 阿里云服务器挖矿木马清除清除步骤&#xff1a; 阿里云服务器挖矿木马清除 直接看图&#xff1a; 清除步骤&#xff1a; 是的&#xff0c;根据您提供的 systemctl 输出&#xff0c;c3pool_miner.service 看起来非常可疑&#xff0c;因为它的描述是 “…

langchain v0.3更新了什么?

版本改动 这是具体改动的链接 官方blog首先说明了&#xff1a; 所有软件包已在内部从 Pydantic 1 升级到 Pydantic 2。 所有软件包都完全支持在用户代码中使用 Pydantic 2&#xff0c;而无需使用 langchain_core.pydantic_v1 或 pydantic.v1 等桥接程序。 由于 Pydantic 1 已…

Django 配置邮箱服务,实现发送信息到指定邮箱

一、这里以qq邮箱为例&#xff0c;打开qq邮箱的SMTP服务 二、django项目目录设置setting.py 文件 setting.py 添加如下内容&#xff1a; # 发送邮件相关配置 EMAIL_BACKEND django.core.mail.backends.smtp.EmailBackend EMAIL_USE_TLS True EMAIL_HOST smtp.qq.com EMAIL…

18724 二叉树的遍历运算

### 思路 1. **递归构建树**&#xff1a; - 先序遍历的第一个节点是根节点。 - 在中序遍历中找到根节点的位置&#xff0c;左边部分是左子树&#xff0c;右边部分是右子树。 - 递归构建左子树和右子树。 2. **递归生成后序遍历**&#xff1a; - 递归生成左子树的…

《Python编程:从入门到实践》数据可视化

一、项目 数据可视化学习 二、库依赖 matplotlib&#xff0c;pygal&#xff0c; 三、生成数据 1.绘制简单的折线图 import matplotlib.pyplot as pltsquares [1, 4, 9, 16, 25] plt.plot(squares) plt.show() 模块pyplot包含很多用于生成图表的函数。 &#xff08;1&am…

Excel求和为什么是0?结果不对的来跟着步骤排查

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f522; Excel求和功能是日常工作中常用的工具&#xff0c;但有时我们可能会遇到求和结果意外地显示为0&#xff0c;这可能会让我们感到困惑。今天&#xff0c;我们就来具体分析一下可能导致Excel求和结果为0的原因&a…

100套顶刊配色方案!Matlab超绝配色包TheBestColor

两三年前&#xff0c;我刚开始研究制作Matlab配色包&#xff0c;那时Matlab几乎只能用自带的默认配色&#xff0c;选择极少。 时至今日&#xff0c;Matlab配色已不是问题。 实际体验下来&#xff0c;在某些层面&#xff0c;甚至比隔壁R、Python吃得还要好一些。 但吃得太好&…

TARA分析方法论——威胁分析和风险评估方法

一、什么是TARA分析方法论 威胁分析和风险评估&#xff08;Threat Analysis and Risk Assessment&#xff09; 通过识别整车/项目的网络安全资产&#xff0c;分析其中的潜在的安全威胁&#xff0c;综合考虑威胁攻击可行性、危害影响等因素&#xff0c;识别出整车/项目可能存在…

【技巧】移动云手机如何防止1小时自动关机

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景介绍 领的免费云手机&#xff0c;如果1或2小时内不登录&#xff0c;就会被自动关机&#xff0c;这非常影响使用。本方法可以实现自动刷新页面&…

西门子:觅最佳的生态伙伴,筑最好的数字平台|商业创新同行者

沧海桑田&#xff0c;时光变幻。 纵观全球&#xff0c;历经百年仍能保持基业长青的公司少之又少&#xff0c;而像西门子这样依旧矗立在顶峰的企业可谓凤毛麟角&#xff0c;成功的数字化转型更是为这家企业带来了持续不断的澎湃活力。 作为当代数字化时代的创新经济模式&#…

智能手机取证: 专家如何从被锁定设备中提取数据?

在数字取证领域&#xff0c;从被锁定的手机中检索数据的能力是决定调查成功与否的关键技能。由于智能手机往往是解决复杂案件的关键&#xff0c;智能手机取证已经成为打击犯罪和恐怖主义战争中的一个关键组成部分。通话记录、短信、电子邮件&#xff0c;甚至位置数据都可能被发…

【机器学习(十一)】机器学习分类案例之是否患糖尿病预测—XGBoost分类算法—Sentosa_DSML社区版

文章目录 一、XGBoost算法二、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入和统计分析(二)数据预处理(三)模型训练与评估(四)模型可视化 三、总结 一、XGBoost算法 关于集成学习中的XGBoost算法原理&#xff0c;已经进行了介绍与总结&#xff0c;相关内容可参考【…

代理IP获取工具:轻松获取可靠的代理IP

在网络世界中&#xff0c;代理IP是一个非常有用的工具。无论是为了提升隐私保护&#xff0c;还是为了访问特定的网络资源&#xff0c;代理IP都能提供极大的帮助。本文将介绍几种常见的代理IP获取工具&#xff0c;帮助你轻松获取可靠的代理IP。 什么是代理IP获取工具&#xff1…

c++反汇编逆向还原——for循环(笔记)

c反汇编逆向还原代码for循环的实现&#xff0c;for循环和while循环在逆向还原的区别 一、汇编 mov &#xff1a;将源操作数复制到目的操作数 lea &#xff1a;与mov类似 mov a&#xff0c;b 表示将b赋值给a 若是 mov a&#xff0c;[b] 这是将b的地址赋值给a&#xff0c;相…

RTMP播放器全解析

一、RTMP 播放器概述 &#xff08;一&#xff09;RTMP 播放器的定义与作用 RTMP 播放器是一种专门用于播放采用 RTMP&#xff08;Real Time Messaging Protocol&#xff09;协议的视频流的工具。在当今的流媒体播放领域中&#xff0c;它扮演着至关重要的角色。RTMP 播放器能够…

找不到d3dx9_43.dll怎么办,d3dx9_43.dll丢失的多种解决方法

在现代计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dx9_43.dll,无法继续执行代码”。这个错误提示通常出现在运行某些游戏或应用程序时&#xff0c;它会导致程序无法正常运行。本文将针对这个问题进行原因分析&#xff0c;并提供…

Ubuntu18升级cmake和python

Ubuntu18升级cmake和python 1、升级cmake至3.22.12、升级python至3.82.1 安装依赖包2.2 添加deadsnakes PPA源2.3 安装python3.82.4 将python各版本添加到update-alternatives2.5 配置python3默认指向python3.82.6 测试python3版本2.7 配置python默认指向python32.8 测试python…