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

文章目录

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

前言

  在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.xdnf.cn/news/1548268.html

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

相关文章

Splashtop 加入 Microsoft 智能安全协会

2024年9月25日 美国加利福尼亚州库比蒂诺 Splashtop Inc . 今天宣布已正式加入 Microsoft 智能安全协会&#xff08;MISA&#xff09;。MISA 由独立软件供应商&#xff08;ISV&#xff09;和托管安全服务提供商&#xff08;MISA&#xff09;组成&#xff0c;他们将其解决方案与…

渗透测试-文件上传绕过思路

文件上传绕过思路 引言 分享一些文件上传绕过的思路&#xff0c;下文内容多包含实战图片&#xff0c;所以打码会非常严重&#xff0c;可多看文字表达&#xff1b;本文仅用于交流学习&#xff0c; 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#x…

深度解析APP软件开发:构建卷轴式分销系统的实践探索

在移动互联网的浪潮中&#xff0c;APP软件的开发与应用不断推动着商业模式的创新与发展。其中&#xff0c;卷轴模式分销系统作为一种新兴的营销手段&#xff0c;正逐渐受到市场的青睐。作为程序员&#xff0c;深入探索并实践这一模式的系统开发&#xff0c;不仅是对技术能力的挑…

C++ STL初阶(14): map和set

1.关联式容器与键值对 前导文章&#xff1a;C 二叉树进阶-CSDN博客 之前我们学习的线性的容器&#xff0c;如&#xff1a;vector deque list等都叫作序列式容器 与之对立的概念是关联式容器 关联式容器 也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其 里面…

【Linux】图解详谈HTTPS的安全传输

文章目录 1.前置知识2.只使用对称加密3.只使用非对称加密 因为私钥加密只能公钥解开&#xff0c;公钥加密只能私钥解开4.双方都是使用非对称加密5.非对称加密 对称加密6.非对称加密对称加密CA认证&#xff08;一&#xff09;CA认证&#xff08;二&#xff09;https &#xff0…

Ks渲染做汽车动画吗?汽车本地渲染与云渲染成本分析

Keyshot是一款强大的实时光线追踪和全域光渲染软件&#xff0c;它确实可以用于制作汽车动画&#xff0c;包括汽车模型的渲染和动画展示。Keyshot的动画功能允许用户创建相机移动、物体变化等动态效果&#xff0c;非常适合用于汽车动画的制作。 至于汽车动画的渲染成本&#xff…

手机如何五开玩梦幻西游端游?用GameViewer远程手机免费畅玩梦幻西游

用手机就能免费玩梦幻西游端游&#xff0c;还可以随时查看挂机进度&#xff01; 想要实现这一点&#xff0c;就用网易GameViewer远程&#xff0c;而且不光手机可以玩梦幻西游端游&#xff0c;平板也能免费玩&#xff0c;并为你实现五开玩梦幻西游端游。 那么&#xff0c;通过Ga…

[001-03-007].第28节:SpringBoot整合Redis:

6.1.Redis的介绍&#xff1a; 1.Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。2.它支持多种类型的数据结构&#xff0c;如 字符串&#xff08;strings&#xff09;&#xff0c; 散…

Python制作进度条,18种方式全网最全!(不全去你家扫厕所!)

想象一下&#xff0c;你的程序在执行复杂任务时&#xff0c;不再是冷冰冰的等待光标&#xff0c;而是伴随着色彩斑斓、动态变化的进度条&#xff0c;不仅让等待变得有趣&#xff0c;更让用户对你的作品刮目相看。从基础的文本进度条到高级的图形界面进度条&#xff0c;从简单的…

Excel FIND函数用法详解,附FIND函数提取文本示例

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f50e; 在处理文本数据时&#xff0c;我们经常需要在字符串中查找特定词语或字符的位置。Excel中的FIND函数是一个非常实用的工具&#xff0c;可以帮助我们在文本字符串中查找子字符串的位置。今天&#xff0c;我们将…

Ubuntu环境下字体安装

本文介绍Ubuntu环境下字体安装。 软件&#xff08;如Qt应用软件&#xff09;开发过程中经常会涉及到字体的选择&#xff0c;有时候Ubuntu环境下并没有我们想要的字体&#xff0c;本文介绍常用字体及在Ubuntu环境下如何安装。 1.常用开源字体 有些字体商用并不是免费的&#…

【解答篇】什么是SSL证书?它为什么很重要?

什么是SSL证书&#xff1f;它为什么很重要&#xff1f; 1 数据保护的金钟罩2 身份验证的守护者3 信任度与SEO的双重提升4 合规经营的必要条件5 某宝案例 SSL证书&#xff0c;全称安全套接层证书&#xff0c;是互联网安全通信的坚固基石。它并非仅仅是一份文档&#xff0c;而是用…

落魄前端搞副业之 改造淘宝首页(淘宝换肤)

事情发生是这样的: 无意间看到一个淘宝的网页版本换肤大赛, 本来我也是不懈看一眼的. 一脸高傲. 因为各种比赛, 要么就是对手太厉害, 拿不到奖, 要么就是主办方潜规则多, 最终坑人. 那, 按照我的性子, 那必然不会参加啊, /高傲 (奖金不多, 设计开发麻烦, 竞争还大, 说不定还…

智能制造的生产力基础设施

由于全球大多数细分市场的半导体工厂都满负荷运转&#xff0c;因此&#xff0c;生产力如今成为整个行业关注的重要问题也就不足为奇了。工厂经理会仔细监控关键绩效指标 (KPI)&#xff0c;以发现任何生产力下降的迹象&#xff0c;以便快速做出反应&#xff0c;找出并解决这些偏…

Metasploit渗透测试之服务端漏洞利用

简介 在之前的文章中&#xff0c;我们学习了目标的IP地址&#xff0c;端口&#xff0c;服务&#xff0c;操作系统等信息的收集。信息收集过程中最大的收获是服务器或系统的操作系统信息。这些信息对后续的渗透目标机器非常有用&#xff0c;因为我们可以快速查找系统上运行的服…

Spring5入门

Spring5 课程&#xff1a;3、IOC理论推导_哔哩哔哩_bilibili 文档&#xff1a;狂神SSM教程- 专栏 -KuangStudy 一.Spring概述 1.介绍 Spring : 春天 —->给软件行业带来了春天2002年&#xff0c;Rod Jahnson首次推出了Spring框架雏形interface21框架。2004年3月24日&…

AI驱动的智能运维:行业案例与挑战解析

华为、蚂蚁、字节跳动如何引领智能运维&#xff1f; ©作者|潇潇 来源|神州问学 引言 OpenAI 发布的 ChatGPT 就像是打开了潘多拉的魔盒&#xff0c;释放出了生产环境中的大语言模型&#xff08;LLMs&#xff09;。一些新的概念&#xff1a;“大语言模型运维 (LLMOps)”…

防火墙会话表解析

华为防火墙的会话表是防火墙用于记录和管理网络会话的重要数据结构&#xff0c;它对于实现精确的流量控制和安全管理起着至关重要的作用。以下是对华为防火墙会话表的详细解析&#xff1a; 一、会话表的作用 会话表主要用于记录TCP、UDP、ICMP等协议连接的状态信息&#xff0c;…

数据结构:链表算法题

目录 题1.删除链表中的某个元素val题目表述&#xff1a;思路1:在源链表中进行删除更改思路2:创建一个新链表 题2:反转一个链表问题描述&#xff1a;思路1:在源链表内部进行操作思路2:创建一个新链表 题3:寻找链表中间位置题目描述:思路1:思路2:快慢指针 题1.删除链表中的某个元…

003、网关路由问题

1. nginx配置404跳转回默认路由 https://blog.csdn.net/masteryee/article/details/83689954 https://blog.csdn.net/IbcVue/article/details/133230460 https://www.jb51.net/server/317970ynk.htm https://blog.csdn.net/u014438244/article/details/120531287 https://blog…