MySQL表中的联合查询
上一篇有关聚合查询的博客: 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表中的联合查询相关推荐
- 【MySQL】根据数据表中日期字段查询某个月每一天的数据量?查询数据表中所有日期每天的数据量?近三天每天数据量?
前提这个table有一个日期字段date_time之类的 1.根据数据表中日期字段查询某个月每一天的数据量 如果要获取8月的数据,可以这么写: SELECT count(*), DATE_FORMAT ...
- 如何查询MySQL表中的数据,这些操作你得明白!
前言 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可 ...
- 怎么有效地查询MySQL表中的重复数据
在MySQL数据库中,偶尔会遇到需要查找表中出现的重复数据的情况.这种情况下,我们可以通过编写一些SQL查询语句轻松地找到并处理这些重复行.本文将介绍一些常见的方法和技巧,帮助你有效地查询MySQL表 ...
- mysql获取删除的条数_如何从mysql表中删除数百万条记录而不会减速
有没有一种很好的方法来删除很多记录而不会减慢网站的速度? 我需要从没有索引和主键的MySQL表中删除数百万条记录.我阅读了SO和网上的各种教程,基本策略是限制删除查询,在删除之间休眠一两秒钟,然后重复 ...
- 温故知新MySQL--如何在MySQL表中删除重复行
2019独角兽企业重金招聘Python工程师标准>>> 如何在MySQL表中删除重复行 在实际应用中,会有需要删除重复数据的场景.这里简单介绍下如何删除重复的数据 1. 准备数据 C ...
- 随机从mysql中读取_如何实现MySQL表数据随机读取?从mysql表中读取随机数据
文章转自 http://blog.efbase.org/2006/10/16/244/ 如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysq ...
- mysql 搜索标题中字符串_如何在MySQL表中搜索特定字符串?
使用等于运算符进行完全匹配-select *from yourTableName where yourColumnName=yourValue; 让我们首先创建一个表-mysql> create ...
- mysql 添加表索引_如何向MySQL表中添加索引?
如何向MySQL表中添加索引? 我有一个非常大的MySQL表,包含大约15万行数据.目前,当我试着运行SELECT * FROM table WHERE id = '1'; 代码运行良好,因为ID字段 ...
- php 去掉无关数据,php 读取 mysql 表中的double数据,去掉多余的0
php 读取 mysql 表中的double数据,去掉多余的0 mysql 中有 ttt 表结构和数据如下 CREATE TABLE `ttt` ( `id` int(11) NOT NULL AUT ...
最新文章
- 自动刷新某个指定网页
- 36所高校强基计划大学的计算机专业排名,36所强基计划大学,综合实力大排名!高校专业怎么选?...
- 华为虚拟home键关闭_苹果iPhone12或放弃静音键,学华为mate30Pro,发力虚拟按键
- “约见”面试官系列之常见面试题之第九十六篇之active-class是谁的属性(建议收藏)
- LeetCode 529. 扫雷游戏(广度优先搜索BFS/深度优先搜索DFS)
- 深圳linux测试题库,Linux认证考试题库及答案
- 傅里叶变换及其应用 pdf_应用傅里叶-小波检测方式的并联型有源电力滤波器,电能质量高...
- 网易云与腾讯音乐的“虚假式恩爱”
- HPE 发布严重的 RCE 0day 漏洞,影响服务器管理软件 SIM,无补丁
- VisualBox 克隆CentOS 7.6 后,ip,源,禁止root远程登录,主机,防火墙,ssh密钥登录
- UITextFiled和UITextView限制字数和输入特殊字符的总结
- Microsoft Store 微软商店中 APP 独立安装包下载方法
- 最近华为笔试题(9.1)第二题
- WarDrive:使用Backtrack 4中的Kismet进行嗅探并使用GE绘制地图的简明攻略
- c语言vc里设置光标位置,VC设置鼠标光标方法
- 使用bat脚本上传文件到Linux服务器
- 大学生web前端期末大作业实例代码 (1500套,建议收藏) HTML+CSS+JS
- 【云服务器 ECS 实战】专有网络 VPC、弹性网卡的概述与配置
- HITCSAPP大作业 2021 春
- android 键盘隐藏监听,Android监听键盘显示和隐藏