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.mfbz.cn/a/337992.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法详解】力扣162.寻找峰值

​ 目录 一、题目描述二、思路分析 一、题目描述 力扣链接:力扣162.寻找峰值 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个…

Vulnhub靶机:FunBox 2

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

【LeetCode每日一题】2788. 按分隔符拆分字符串

2024-1-20 文章目录 [2788. 按分隔符拆分字符串](https://leetcode.cn/problems/split-strings-by-separator/)思路: 2788. 按分隔符拆分字符串 思路: 对于每个单词,使用一个可变字符串 StringBuilder 来构建拆分后的单词。初始时&#xff0…

蓝桥杯单片机零基础到国二经验分享

我参加的是第十三届蓝桥杯大赛,从最开始的零基础,毫无头绪,到拿下国二,颇有体会,在这里将我的备赛经验分享给大家,希望可以帮到一些正在备赛的蓝桥杯er 目录 一. 蓝桥杯-单片机组介绍 二 . 零基础到国二历程 客观题&…

web架构师编辑器内容-图层拖动排序功能的开发

新的学习方法 用手写简单方法实现一个功能然后用比较成熟的第三方解决方案即能学习原理又能学习第三方库的使用 从两个DEMO开始 Vue Draggable Next: Vue Draggable NextReact Sortable HOC: React Sortable HOC 列表排序的三个阶段 拖动开始(dragstart&#x…

【机器学习】李梅的餐饮帝国:美食与数据中隐藏的秘密

从小,李梅就对美食有着浓厚的兴趣。她常常看着母亲在厨房里忙碌,熟练的手法、诱人的香气,都让她对烹饪产生了极大的好奇。随着年龄的增长,她对美食的热爱与日俱增,最终决定投身餐饮业。 李梅的第一家餐厅开在了一个繁…

JVM:Java类加载机制

Java类加载机制的全过程: 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始, 这是为了支持Java…

vue2 点击按钮下载文件保存到本地(后台返回的zip压缩流)

// import ./mock/index.js; // 该项目所有请求使用mockjs模拟 去掉mock页面url下载 console.log(res, res)//token 是使页面不用去登录了if (res.file) {window.location.href Vue.prototype.$config.VUE_APP_BASE_IDSWAPI Vue.prototype.$config.VUE_APP_IDSW /service/mode…

VRPSolverEasy:支持VRP问题快速建模的精确算法Python包

文章目录 前言一步步安装免费版主要模块介绍1. depot point2. customer point3. links4. vehicle type VRPTW 算例数据说明模型建立输出求解状态及结果 前言 VRPSolverEasy 是用于车辆路径问题(VRP)的最先进的分支切割和定价算法求解器1,它的…

基于Servlet建立表白墙网站

目录 一、设计思想 二、设计表白墙页面(前端--VSCode) 1、效果图 2、html部分(网页上有哪些内容) 3、css部分(页面内容的具体样式) 4、js部分(页面行为) 三、借助Servlet实现客…

攻防世界——Mysterious

运行就是一个要你输入的题型,这种题我们要么得到password,要么直接不管这个得到flag int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4) {int v4; // eaxchar Source[260]; // [esp50h] [ebp-310h] BYREF_BYTE Text[257]; // [esp154h] [eb…

4.postman批量运行及json、cvs文件运行

一、批量运行collection 1.各个接口设置信息已保存,在collection中点击run collection 2.编辑并运行集合 集合运行时,单独上传图片时报错。需修改postman设置 二、csv文件运行 可新建记事本,输入测试数据,后另存为新的文本文件&…

call_once 单例模式 Singleton / condition_variable 与其使用场景

一、call_once 单例模式 Singleton 大家可以先看这篇文章&#xff1a;https://zh.cppreference.com/w/cpp/thread/call_once /*std::call_oncevoid call_once( std::once_flag& flag, Callable&& f, Args&&... args ); */ #include <iostream> #i…

【算法与数据结构】474、LeetCode一和零

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题要找strs数组的最大子集&#xff0c;这个子集最多含有 m m m个0和 n n n个1。本题也可以抽象成一个…

云仓酒庄的品牌雷盛红酒LEESON分享从事酒行业有前途吗?

化在全球都有着悠久的传承文化&#xff0c;每逢传统节日&#xff0c;新朋好友相聚庆贺&#xff0c;酒在好多场合都是不可或缺的选项。酒的消费群体也是十分庞大&#xff0c;有不少朋友问云仓酒庄&#xff0c;从事酒的行业能不能挣钱&#xff0c;有没有前途&#xff1f;回答好这…

【Qt之模型视图】1. 模型和视图架构

1. 模型/视图架构是什么及有什么用 MVC&#xff08;Model-View-Control&#xff09;是一种源自Smalltalk的设计模式&#xff0c;通常用于构建用户界面。 MVC由三种类型的对象组成。模型是应用对象&#xff0c;用来表示数据&#xff1b;视图是模型的用户界面&#xff0c;用来显…

Windows 拦截系统睡眠、休眠

前言 在前一篇文章中&#xff0c;我们分析了以编程方式拦截 Winlogon 相关回调过程的具体做法&#xff0c;我们给出了一种拦截 RPC 异步回调的新方法——通过过滤特征码&#xff0c;我们可以对很多系统热键以及跟电源有关的操作做出“提前”响应。但是我们给出的代码并不能真正…

代码随想录第十八天 513 找树左下角的值 112 路径之和 106 从中序与后序遍历序列构造二叉树

LeetCode 513 找树左下角的值 题目描述 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 思路 1.确定递…

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

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

课题学习(十九)----Allan方差:陀螺仪噪声分析

一、介绍 Allan方差是一种分析时域数据序列的方法&#xff0c;用于测量振荡器的频率稳定性。该方法还可用于确定系统中作为平均时间函数的本征噪声。该方法易于计算和理解&#xff0c;是目前最流行的识别和量化惯性传感器数据中存在的不同噪声项的方法之一。该方法的结果与适用…
最新文章