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.hqwc.cn/news/416776.html

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

相关文章

node.js笔记

再看一遍node.js吧 Node.js REPL(交互解释器)Node.js 回调函数node.js事件循环Node.js EventEmitterNode.js Buffer(缓冲区)(二进制操作)Node.js Stream(流) (文件操作读取写入文件)Node.js 模块系统Node.j…

C++ BuilderXE关于FDQuery组件记录限制设定

这样修改就可以查询返回所有记录。 TFDQuery.RecordCount,或TDateSet.RecordCount只显示了可见的50条数据,但实际上数据的总量超过了这个数量。为了解决这个问题,我们可以通过更改TFDConection.FetchOptions.RecordCountMode属性为fmTotal,以…

展锐T618_虎贲T618紫光展锐安卓核心板规格参数

基于紫光展锐八核T618平台的纯国产化方案,采用了开放的智能Android操作系统,并集成了4G网络、2.5G5G双频WIFI(可支持1*1 MIMO)、BLUETOOTH近距离无线传输技术以及GNSS无线定位技术。用户可以根据特定场合的需求,选择合适的嵌入式ARM核心模块&…

使用 Node 创建 Web 服务器

Node.js 提供了 http 模块,http 模块主要用于搭建 HTTP 服务端和客户端,使用 HTTP 服务器或客户端功能必须调用 http 模块,代码如下: var http require(http); 以下是演示一个最基本的 HTTP 服务器架构(使用 8080 端口)&#x…

【Spring Boot 3】【Redis】基本数据类型操作

【Spring Boot 3】【Redis】基本数据类型操作 背景介绍开发环境开发步骤及源码工程目录结构 背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工…

Ubuntu 22.04安装使用easyconnect

EasyConnect 百度百科,EasyConnect能够帮助您在办公室之外使用公司内网的所有系统及应用。在您的公司部署深信服远程应用发布解决方案后,您的公司所有业务系统及应用都可以轻松迁移至移动互联网上。您可以通过手机、PAD等智能移动终端随时随地开展您的业…

运筹说 第56期 | 整数规划的数学模型割平面法

前几章讨论过的线性规划问题的一个共同特点是:最优解的取值可以是分数或者小数。然而,在许多实际问题中,决策者要求最优解必须是整数,例如公交车的车辆数、员工的人数、机器的台数、产品的件数等。那么,我们能否将得到…

java使用AES加密数据库解密

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

基于SkyEye仿真飞腾处理器:运行U-Boot并加载Phytium-FreeRTOS

仿真平台在帮助提升研发效率、加快产品面市时间上的作用已得到诸多验证,通过对处理器进行仿真来支持嵌入式系统及软件的虚拟化开发、测试和验证成为目前应用较为广泛的方法。天目全数字实时仿真软件SkyEye是一款基于可视化建模的硬件行为级仿真平台,在众…

嵌入式-stm32-江科大-OLED调试工具

文章目录 一:OLED调试工具1.1 OLED显示屏介绍1.2 实验:在OLED显示屏的使用1.3 自己新增功能测试道友:今天没有开始的事,明天绝不会完成。 一:OLED调试工具 1.1 OLED显示屏介绍 学习任何一门语言就需要进行调试&#…

3.C语言——函数

函数 1.什么是函数2.函数的分类1.库函数2.自定义函数 3.函数的参数1.实际参数(实参)2.形式参数(形参) 4.函数的声明1.同一个文件的函数声明2.多文件的函数声明 5.函数的调用6.函数的嵌套调用和链式访问1.嵌套调用2.链式访问 7.函数…

Git学习笔记(第6章):GitHub操作(远程库操作)

目录 6.1 远程库操作 6.1.1 创建远程库 6.1.2 命名远程库 6.1.3 本地库推送到远程库(push) 6.1.4 远程库拉取到本地库(pull) 6.1.5 远程库克隆到本地库(clone) 6.2 团队内协作 6.3 跨团队协作 6.4 SSH免密登录 6.1 远程库操作 命令 作用 git remote -v 查看所有远程…