上一篇有关聚合查询的博客: MySQL表中的聚合查询_徐憨憨!的博客-CSDN博客主要是针对单个表进行查询操作,但是实际的开发环境中,数据往往来自己于不同的数据表,此时就需要使用联合查询进行操作!

联合查询

多表查询的基本执行过程:进行笛卡尔积然后设置条件删除无效数据进行筛选

1.示例一

假设创建两个表,学生表(包含id,name,classId),班级表(包含classId,name),在不使用外键的情况下查询学生所属班级的情况:

第一步:笛卡尔积

笛卡尔积之后产生的新表的行数等于两个表的行数之积(因为笛卡尔积的结果就是排列组合的结果),列数等于两个表的列数之和

第二步:指定连接条件删除无效数据

进行笛卡尔积之后,发现很多数据都是错误的数据(即无效数据),比如这里的张三同时属于classId为1和classId为2两个班级,这里设置的条件也是基于两个表中的classId应该相同

注意:这里设置的条件是两个表的classId要相等,所以在SQL语法中,要明确指出每个classId属于哪个表的,使用时需要使用表名.classId,否则会报错(提示字段名有歧义)!

第三步:对查询结果进行精简(删除不必要的列)

通过查询所需要的列来对查询结果进行精简

2.示例二

假设创建四个表,班级表(包含id,name,desc),课程表(id,name),分数表(score,student_id,course_id),学生表(包含id,sn,name,qq_mail,classes_id),其中学生和班级是一对多的关系,学生和课程是多对多的关系,在没有设置外键约束的情况下进行查询时需要使用多表查询.

此时我们需要查询'许仙'同学的成绩(涉及到学生表和成绩表,所以需要对这两个表进行多表查询)

第一步:笛卡尔积

第二步:指定连接条件删除无效数据

第三步:加入条件进行筛选

第四步:对查询结果进行精简(删除不必要的列)

同样使用join on也可以实现多表查询(查询时也可以设置别名)

3.内连接和外连接

内连接和外连接大多数情况下是没什么区别的:上述查询时使用from就是内连接,而join on既可以实现外连接也可以实现内连接;
当要连接的两个表里面的数据是一一对应的时候没有区别,
当要连接的两个表里面的数据不是一一对应的时候有区别.

两个表之间的数据一一对应时:

两个表之间的数据不是一一对应时:

但是如果使用了外连接则会不同(外连接分为左外连接和右外连接);

左外连接:会把左表的结果尽量列出来,哪怕在右表中没有对应的记录,就使用NULL填充

右外连接:会把右表的结果尽量列出来,哪怕在左表中没有对应的记录,就使用NULL填充

4.自连接

自连接也是多表查询的一种,只是自连接是针对于同一个表进行笛卡尔积运算,自连接的效果就是把行转成列(因为SQL中无法针对行与行之间使用条件,但是有的需求需要行与行进行比较,此时就可以使用自连接把行转换成列进行比较)

现在有一个需求:查询所有"计算机原理"成绩比"Java"成绩高的成绩信息,这个需求需要将成绩表进行自连接

第一步:笛卡尔积

注意:这里对同一个表进行笛卡尔积运算时,必须对表名起别名(所以起别名不仅针对表达式,也可以针对表)

第二步:指定连接条件删除无效数据

第三步:找出满足左侧为该同学计算机原理成绩,右侧为java成绩的记录

第四步:筛选出计算机原理成绩比Java成绩高的记录

5.子查询

子查询的本质就是把多个SQL语句组合成一个复杂的语句,但是复杂的代码可读性会较差,需要谨慎使用

子查询分为单行子查询(返回一行记录的子查询)和多行子查询(返回多行记录的子查询);

单行子查询:

查询与"不想毕业"同学的同班同学:先去查询"不想毕业"这个同学的班级id,再按照班级id来查哪些同学和他一个班;

分步查询:

子查询:

注意:后面的子查询必须只返回一条记录,此时写=才是可以的(把一个查询作为另一个查询的一部分条件)

多行子查询(使用关键字in):

查询"语文"或"英文"课程的成绩信息:先根据名字查询出课程id,再根据课程id查询出课程分数

分步查询:

子查询:

注意:查询结果是在内存中,如果查询结果太大了,内存放不下,in就用不了了,就可以使用exists代替(exists关键字可读性较差,执行效率也大大低于in写法,使用这个一般都是用来解决特殊场景)

6.合并查询

合并查询本质上就是把两个查询的结果集(要求这两个结果集的列相同才能合并)

查询id小于3,或者名字为"英文"的课程

union和or的区别:

or只能查询来自于同一个表的数据,union查询结果可以来自于不同的表,只要查询的结果的列匹配即可!

MySQL表中的联合查询相关推荐

  1. 【MySQL】根据数据表中日期字段查询某个月每一天的数据量?查询数据表中所有日期每天的数据量?近三天每天数据量?

    前提这个table有一个日期字段date_time之类的 1.根据数据表中日期字段查询某个月每一天的数据量 如果要获取8月的数据,可以这么写: SELECT count(*), DATE_FORMAT ...

  2. 如何查询MySQL表中的数据,这些操作你得明白!

    前言 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可 ...

  3. 怎么有效地查询MySQL表中的重复数据

    在MySQL数据库中,偶尔会遇到需要查找表中出现的重复数据的情况.这种情况下,我们可以通过编写一些SQL查询语句轻松地找到并处理这些重复行.本文将介绍一些常见的方法和技巧,帮助你有效地查询MySQL表 ...

  4. mysql获取删除的条数_如何从mysql表中删除数百万条记录而不会减速

    有没有一种很好的方法来删除很多记录而不会减慢网站的速度? 我需要从没有索引和主键的MySQL表中删除数百万条记录.我阅读了SO和网上的各种教程,基本策略是限制删除查询,在删除之间休眠一两秒钟,然后重复 ...

  5. 温故知新MySQL--如何在MySQL表中删除重复行

    2019独角兽企业重金招聘Python工程师标准>>> 如何在MySQL表中删除重复行 在实际应用中,会有需要删除重复数据的场景.这里简单介绍下如何删除重复的数据 1. 准备数据 C ...

  6. 随机从mysql中读取_如何实现MySQL表数据随机读取?从mysql表中读取随机数据

    文章转自 http://blog.efbase.org/2006/10/16/244/ 如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysq ...

  7. mysql 搜索标题中字符串_如何在MySQL表中搜索特定字符串?

    使用等于运算符进行完全匹配-select *from yourTableName where yourColumnName=yourValue; 让我们首先创建一个表-mysql> create ...

  8. mysql 添加表索引_如何向MySQL表中添加索引?

    如何向MySQL表中添加索引? 我有一个非常大的MySQL表,包含大约15万行数据.目前,当我试着运行SELECT * FROM table WHERE id = '1'; 代码运行良好,因为ID字段 ...

  9. php 去掉无关数据,php 读取 mysql 表中的double数据,去掉多余的0

    php 读取 mysql 表中的double数据,去掉多余的0 mysql 中有 ttt 表结构和数据如下 CREATE TABLE `ttt` ( `id` int(11) NOT NULL AUT ...

最新文章

  1. 自动刷新某个指定网页
  2. 36所高校强基计划大学的计算机专业排名,36所强基计划大学,综合实力大排名!高校专业怎么选?...
  3. 华为虚拟home键关闭_苹果iPhone12或放弃静音键,学华为mate30Pro,发力虚拟按键
  4. “约见”面试官系列之常见面试题之第九十六篇之active-class是谁的属性(建议收藏)
  5. LeetCode 529. 扫雷游戏(广度优先搜索BFS/深度优先搜索DFS)
  6. 深圳linux测试题库,Linux认证考试题库及答案
  7. 傅里叶变换及其应用 pdf_应用傅里叶-小波检测方式的并联型有源电力滤波器,电能质量高...
  8. 网易云与腾讯音乐的“虚假式恩爱”
  9. HPE 发布严重的 RCE 0day 漏洞,影响服务器管理软件 SIM,无补丁
  10. VisualBox 克隆CentOS 7.6 后,ip,源,禁止root远程登录,主机,防火墙,ssh密钥登录
  11. UITextFiled和UITextView限制字数和输入特殊字符的总结
  12. Microsoft Store 微软商店中 APP 独立安装包下载方法
  13. 最近华为笔试题(9.1)第二题
  14. WarDrive:使用Backtrack 4中的Kismet进行嗅探并使用GE绘制地图的简明攻略
  15. c语言vc里设置光标位置,VC设置鼠标光标方法
  16. 使用bat脚本上传文件到Linux服务器
  17. 大学生web前端期末大作业实例代码 (1500套,建议收藏) HTML+CSS+JS
  18. 【云服务器 ECS 实战】专有网络 VPC、弹性网卡的概述与配置
  19. HITCSAPP大作业 2021 春
  20. android 键盘隐藏监听,Android监听键盘显示和隐藏

热门文章

  1. OpenCv图像处理之图像视频摄像头读取和保存
  2. c++实现推箱子游戏(带链表)
  3. 计算机网络各层的协议
  4. 腾讯再次投资国外著名游戏开发商 入股Epic布局长远
  5. 如何在linux下查看服务器的型号
  6. netty的epoll和linux的epoll是如何实现的
  7. AUTOCAD二次开发-----删除一个图层里面的所有对象
  8. sprintf与snprintf区别
  9. CreateCompatibleDC工作原理
  10. 如何检索IDC研究报告?