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

一.多表关系介绍

        项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也会存在着各种联系,分为如下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.mzph.cn/news/635295.shtml

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

相关文章

探索设计模式的魅力:一篇文章让你彻底搞懂建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,旨在将一个复杂对象的创建过程与其表示分离,使得同样的构建过程可以创建不同的表示形式。 主要角色: 产品(Product):表示正在构建…

论rtp协议的重要性

rtp ps流工具 rtp 协议,实时传输协议,为什么这么重要,可以这么说,几乎所有的标准协议都是国外创造的,感叹一下,例如rtsp协议,sip协议,webrtc,都是以rtp协议为基础&#…

springboot知识04

1、集成swaggershiro放行 (1)导包 (2)SwaggerConfig(公共) package com.smart.community.common.swagger.config;import io.swagger.annotations.ApiOperation; import org.springframework.beans.facto…

开发实践8_REST

一、Django REST Framework, Django View & APIView MTV模式实现前后端分离。Representational State Transfer 表现层状态转化。Representation 资源(Resource a specific info. on net.)具体呈现形式。ST 修改服务端的数据。修改数据 POST请求。…

java使用AES加密数据库解密

目录 前言代码加密(AES)sql解密 前言 在一些项目中,客户要求一方面把一些敏感信息进行加密存储到数据库中,另一方面又需要通过加密的信息进行查询,这时就需要在sql对加密的字段进行解密后再进行查询。 代码加密&#x…

数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)二

第五部分、数组和广义表详解 数组和广义表,都用于存储逻辑关系为“一对一”的数据。 数组存储结构,99% 的编程语言都包含的存储结构,用于存储不可再分的单一数据;而广义表不同,它还可以存储子广义表。 本章重点从矩阵…

对多种股权激励方式进行分析,明确按照业绩贡献确定激励对象

一、背景 某生物创新材料有限公司创立于1990年,坐落于成都某高新技术产业开发区,是一家以研发、生产和销售医疗器械、医用高分子材料、生物技术等生物、能源方面的产品为主的大型企业,该公司与美国某科技研究所结成合作伙伴,研发出…

[python语言]数据类型

目录 知识结构​编辑 复数类型 整数类型、浮点数类型 1、整型 2、浮点型 字符与字符串 1、转义字符 2、字符串的截取 3、字符串的拼接级连 4、字符串的格式化 1、format格式化 2、字符格式化 3、f标志位格式化--(推荐) 5、字符串的常用属性 1、对字符串做出判断…

电脑上怎么进行pdf合并?这几招分分钟解决

电脑上怎么进行pdf合并?在现代办公中,PDF文件已经成为了我们处理文档的常用格式之一。有时候,我们需要将多个PDF文件合并成一个文件,以方便阅读或打印。那么,如何在电脑上进行PDF合并呢?下面就给大家介绍几…

知识图谱的演进

目录 前言1 Memex:信息存储的雏形2 超文本和Web:链接的崛起3 Semantic Web:从文本链接到数据链接4 Linked Big Data:规范化的语义表示5 谷歌的知识图谱搜索引擎6 多种语义网/知识图谱项目结语 前言 随着人工智能和互联网的飞速发…

Keil下载芯片包(DFP)时找不到根目录的解决办法

目录 1 发现的问题 2 想到的可能解决问题的措施 1 发现的问题 打开Keil时Pack Installer 自动打开下载芯片包,但弹出如下提示,无法下载: Refresh Pack description E: the specified CMsls Pack Root directorydoes NoT exist! Please tak…

go语言(一)----声明变量

package mainimport ("fmt""time" )func main() {fmt.Print("hello go!")time.Sleep(1 * time.Second)}运行后,结果如下: 1、golang表达式中,加;和不加;都可以 2、函数的{和函数名一…

眼镜用超声波清洗机洗会有损坏吗?超声波清洗机有必要买吗

相信很多朋友都十分清楚超声波清洗机,虽然知道但是迟迟不敢下手入一款属于自己超声波清洗机!会担心超声波清洗机会不会把自己的眼镜给清洗坏了呢?什么样的超声波清洗机比较适合我呢?买一台超声波清洗机回来真的有必要吗&#xff1…

小程序系列--9.生命周期

1. 什么是生命周期? 2. 生命周期的分类 3. 什么是生命周期函数 4. 生命周期函数的分类 5. 应用的生命周期函数 6. 页面的生命周期函数

ASP.NET Core 对象池化技术

写在前面 Microsoft.Extensions.ObjectPool 是 ASP.NET Core 基础结构的一部分,当对象的初始化成本较高,并且可能被频繁使用时,才适合采用对象池技术;被ObjectPool管理的对象不会进入垃圾回收,使用时通过由实例对象实…

记录Qt和opencv 新环境配置过程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Qt是什么?二、Qt的版本三、安装步骤1.下载Qt2.双击安装包.exe开始安装3. 需要登陆才能继续安装,没有的就用邮箱注册账号4.注意安装路…

Message queue 消息队列--RabbitMQ 【基础入门】

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门…

Docker进阶篇-安装MySQL主从复制

一、MySQL主服务器 1、新建主服务器容器实例3307 docker run -p 3307:3306 \--name mysql-master \--privilegedtrue \-v /mydata/mysql-master/log:/var/log/mysql \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/conf:/etc/mysql \-e MYSQL_ROOT_…

Linux编辑器---vim

目录 1、vim的基本概念 2正常/普通/命令模式(Normal mode) 2、1命令模式下一些命令(不用进入插入模式) 3插入模式(Insert mode) 4末行/底行模式(last line mode) 4、1底行模式下的一些命令 5、普通用户无法进行sudo提权的解决方案 6、vim配置问题 6、1配…

基于 Redis 实现高性能、低延迟的延时消息的方案演进

1、前言 随着互联网的发展,越来越多的业务场景需要使用延迟队列。比如: 任务调度:延时队列可以用于任务调度,将需要在未来某个特定时刻执行的任务放入队列中。消息延迟处理: 延时队列可以用于消息系统,其中一些消息需要在一段时间后才能被消…