MySQL基础笔记(8)多表查询

news2024/11/24 16:54:56

一.多表关系介绍

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

  • 一对一
  • 一对多或者多对一
  • 多对多

一对一:

  • 用户与用户详情的关系
  • 常见于单表的拆分,以提高工作效率——将一张表中一部分的信息放在一张表中,其他详细的信息则放在另一张表中
  • 在任意一方加入外键关联另一方的主键,并且为外键设置唯一约束unique~

一对多:

  • 一个员工只能在一个部门,但一个部门可以有多个员工
  • 实现:在的一方建立外键,指向的一方的主键

多对多:

  • 一个学生可以学多门课,每门课也可以被多个 学生学

  • 实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
  • DataGrip有不错的可视化功能(下图)

二.概述

最基础的多表查询写法:

select * from student,class;

        查询的多张表只需要用逗号分别隔开,但是此时查出来的数据并无什么实际意义:假设有50个学生,6个课程,则会查出来50*6=300条记录——相当于互相匹配,也就是学生会学全部的课,而每一门课都会被所有的学生学。该情况称为笛卡尔积。

笛卡尔积是指:数学中的集合A和集合B所有的组合情况。在多表查询中,需要消除无效的笛卡尔积

将上述的SQL语句改为:

select * from student,class where student.dept_id=class.id;

 其中id是class表的主键,dept_id为student关联class主键的外键。

多表查询的分类:

1.连接查询

  • 内连接:查询A、B两表交集部分的数据
  • 外连接:左外查询左表和交集,右外查询右表和交集
  • 自连接:只有一张表,与自身进行连接查询(必须使用表别名

2.子查询

三.内连接

1.隐式内连接

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

在多表查询时为了方便书写,经常采用起别名的形式。(紧随其后加空格即可)

select e.name,d.name from emp e,dept d where e.dept_id=d.id;

2.显式内连接

select e.name,d.name from emp e inner join dept d on e.dept_id=d.id;
  • inner可以直接省略
  • on后面加的是去除笛卡尔积的条件 

四.外连接

1.左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件...;
2.右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件;

(实际开发中左外连接用的更多,在不改变业务需求的情况下直接将两表对调顺序即可~) 

(要求查询结果完全包含哪个,就将其作为查询偏向的一侧

五.自连接

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

(在用到自连接的场合里,往往需要将目标的一张表拆分为逻辑上的两张表~) 

六.联合查询union

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

select 字段列表 from 表A……
union [all]
select 字段列表 from 表B……
  • 如果将union all 改成 union ,则会去除重复的字段
  • 需要注意的是,只有查询字段一致时才能使用联合查询

七.子查询

SQL语句中嵌套select语句,就叫做子查询,又称为嵌套查询~

select * from t1 where column = (select column 1 from t2);

外部的sql语句,可以是insert、update、delete、select中的任何一个~ 

根据查询结果的不同,将子查询分为:

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

根据子查询的位置:又可以分为where、from、select之后的子查询~ 

八.标量子查询

返回的结果是单个值,最简单的形式~

本质上是两步的查询过程一次性合并为一步~

        当某种需要的条件暂时没有显式表出时,可以采用标量子查询将该条件作为标量查询出来,然后再将该标量作为目标条件再次查询~

select * from emp where dept_id = (select id from dept where name='软件工程');

九.列子查询

列子查询返回的结果是一列,即结果可以有很多行~

常见的操作符有:in、not in、any、some、all~

同理,比如此处查询计算机科学与技术和软件工程的全部学生的信息: 

select * from emp where depi_id in(select id from dept where name='计科'
or name='软工');

再比如,选出所有考研数学一成绩比所有计科和软工学生都要高的人的信息:

select * from student where num>all(select num from student where depi_id in
(select id from dept where name='计科'or name='软工'));

 容易犯低级错误的地方是:子查询的SQL语句不需要加额外的分号!

十.行子查询

结果会返回一行,即可以是多列共存~

如下:查询出所有俱乐部和国籍均与穆勒相同的球员信息~ 

select * from emp where (country,club)=(select country,club from player where 
name='托马斯穆勒');

十一.表子查询

常用于from之后——将表子查询的结果作为一张新的临时表,再度进行查询~常用的操作符为in~

 

道理相同,不再赘述~要注意的是:由于结果有多个,所以常用in而不能用等于号~ 

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

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

相关文章

【C++提高编程(二)】

一、STL初识 1.1、STL的诞生 长久以来,软件界一直希望建立一种可重复利用的东西 C的面向对象和泛型编程思想,目的就是复用性的提升 大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作 为了建立数据结构和算法的一套标…

神经网络算法 —— 一文搞懂Transformer !!

文章目录 前言 一、Transformer的本质 1. Transformer架构 2. Encoder-Decoder(编码器-解码器) 二、Transformer的原理 1. Multi-Head Attention(多头自注意力) 2. Scaled Dot-Product Attention(缩放点积注意力&#…

坦克大战游戏代码

坦克大战游戏 主函数战场面板开始界面坦克父类敌方坦克我方坦克子弹爆炸效果数据存盘及恢复图片 主函数 package cn.wenxiao.release9;import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing.JFrame; import javax.swing.JMenu; impor…

2024年【金属非金属矿山(地下矿山)安全管理人员】证考试及金属非金属矿山(地下矿山)安全管理人员模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 2024年【金属非金属矿山(地下矿山)安全管理人员】证考试及金属非金属矿山(地下矿山)安全管理人员模拟考试题库,包含金属非金属矿山(地下矿山&…

RabbitMQ-消息延迟

一、死信交换机 1、描述 一个队列接收到的消息有过期时间,消息过期之后,如果配置有死信队列,消息就会进去死信队列。 2、图解 3、过程 当生产者将消息发送到exchange1,然后交换机将消息路由到队列queue1,但是队列que…

探索指针的奇妙世界,程序中的魔法箭头(上)

目录 一.指针是什么二.指针和指针类型1.指针加减整数2.指针的解引用 三.野指针1.野指针形成的原因(1)指针未初始化指针越界访问 2.如何规避野指针(1)指针初始化(2)小心指针越界(3)指…

SpringSecurity+JWT前后端分离架构登录认证

目录 1. 数据库设计 2. 代码设计 登录认证过滤器 认证成功处理器AuthenticationSuccessHandler 认证失败处理器AuthenticationFailureHandler AuthenticationEntryPoint配置 AccessDeniedHandler配置 UserDetailsService配置 Token校验过滤器 登录认证过滤器接口配置…

理解PCIE设备透传

PCIE设备透传解决的是使虚拟机直接访问PCIE设备的技术,通常情况下,为了使虚拟机能够访问Hypervisor上的资源,QEMU,KVMTOOL等虚拟机工具提供了"trap and emulate", Virtio半虚拟化等机制实现。但是这些实现都…

用通俗易懂的方式讲解:使用 Langchain 和 Hugging Face ,轻松实现大模型 RAG 用法

检索增强生成(RAG)是一种与预训练的大型语言模型(LLM)和自己的数据一起工作的模式,用于生成响应。 现在我将向大家介绍在代码中实现 RAG 的过程。让我们开始使用 Langchain 和 Hugging Face 实现 RAG! 文章…

matlab appdesigner系列-常用14-树(复选框)

之前系列常用9,为单个复选框。树,就是多个复选框形成的选项组 示例:列举湖北省的几个城市 湖北省 武汉 宜昌 襄阳 荆州 1)将树(复选框)拖拽到画布上,方式1就是:文字可以在右侧…

【线上问题】CompletableFuture与线程池使用不当导致服务整个挂掉

Informal Essay By English It is always a pleasure to learn 背景 在某一个风和日丽的早上,小组同事说昨晚线上服务有20分钟左右的不可用,当时内心一紧,不会是我写的代码有bug导致的吧👀,我正了正心态&#xff0c…

[小程序]样式与配置

一、外部样式导入 使用import加外部样式表的相对路径并以 ; 表示语句结束。 import "common.wxss"; 二、全局样式和局部样式 全局样式位于app.wxss中,会作用于整个项目中所有页面中。 局部样式位于对应的wxss文件中,仅作用于当前页面&#x…

WebDriverWait太强大

selenium webdriver及wait 1 implicitly包打天下2 Linkedin无法登录返回值很乱,怎么破? 1 implicitly包打天下 有了implicitly之后,基本上不再关注网速之类的影响。 self.driver.implicitly_wait(511)2 Linkedin无法登录返回值很乱&#xf…

Vulnhub-TECH_SUPP0RT: 1渗透

文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、使用smb服务获取信息三、密码破解四、获取webshell五、反弹shell六、web配置文件获取信息七、提权 一、前言 由于在做靶机的时候,涉及到的渗透思路是非常的广泛,所以在写…

ad18报错:clearance constraint

最常见的报错,直译过来的意思:间隙约束。也就是约束PCB中的电气间距,比如阻容各类元件的焊盘间距小于规则中的设定值,即报警。 Altium Designer 中的 Clearance Constraint 错误如何修改-CSDN博客 【Altium Designer21】DRC规则…

Vulnhub靶机:FunBox 2

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:FunBox 2(10.0.2.27) 目标:获取靶机root权限和flag 靶机下载地址:https://download.vulnhub.com/funbo…

决策树的分类

概念 决策树是一种树形结构 树中每个内部节点表示一个特征上的判断,每个分支代表一个判断结果的输出,每个叶子节点代表一种分类结果 决策树的建立过程 1.特征选择:选取有较强分类能力的特征。 2.决策树生成:根据选择的特征生…

【代码随想录07】344.反转字符串 541. 反转字符串II 05.替换空格 151.翻转字符串里的单词 55. 右旋转字符串

目录 344. 反转字符串题目描述做题思路参考代码 541. 反转字符串 II题目描述参考代码 05. 替换数字题目描述参考代码 151. 反转字符串中的单词题目描述参考代码 55. 右旋转字符串题目描述参考代码 344. 反转字符串 题目描述 编写一个函数,其作用是将输入的字符串反…

HTML以及CSS相关知识总结(一)

近日就开始回顾html和css相关知识啦,并且会学习html5和css3的新知识,以下是我对记忆不太深刻的地方以及新知识点的总结: Web标准: 结构:用于对网页元素进行整理和分类,即HTML 表现:用于设置网页…

CentOS Linux操作系统源码安装最新Redis版本,使用JSON数据类型踩入新坑

最近有空查阅了redis官网,发现redis数据类型不止Strings、Lists、Sets、Hashes、Sorted sets,还多了几种,决定先试用下JSON数据类型 1、安装Redis软件 JSON数据类型,对Redis版本有要求,需要大于4.0版本。下图是华为云…