MySQL:复合查询和内外连接
1. 复合查询
我们前面在表的基本操作中讨论的表的查询都是基础的查询操作,在实际开发中这远远不够。
1.1 多表查询
select * from `tb_1`, `tb_2`;
以两表为例,上述查询的结果是:
- 从第一张表中选取第一条记录,和第二张表中的所有记录分别组合。
- 从第一张表中选取第一条记录,和第二张表中的所有记录分别组合。以此类推 ……
不加过滤条件,得到的结果被称为笛卡尔集。
多表查询实际上也就是将多个表组合成一张表,所以我们也就要把多个表看成一个表。
我们认为,所有 select 查询出来的“记录”,都可以把它看作表。
where dept.deptno = emp.deptno
多表查询中一定会包含这样的where子句条件,将主表的主键和从表的外键对应起来,可以将排列组合产生的无意义的记录抛弃。
多表查询步骤
- 先把多表查询转化为单表查询;
- 筛去排列组合产生的无意义数据;
- 然后再根据要求进一步筛选;
- 选定好需要展示的字段。
1.2 自连接
同一张表自己和自己拼接的叫做自连接。
select * from emp wkr, emp ldr;
给两张相同的表起别名,就可以放到一起。
where wkr.mgr = ldr.empno;
自连接的话,排列组合产生的无意义数据就不是主键外键不一致产生的了,而是要根据实际需求筛去不满足条件的数据。
把员工和领导联系在一起,就要依靠员工的领导编号和员工编号两个字段必须相等,就可以把员工和其领导放在一条记录中。
1.3 子查询
子查询也称嵌套查询,是指将select语句嵌套在另一个select语句中,也就是将select的结果作为另一个select的条件。
单行子查询
返回一行记录的查询称为单行子查询。
select * from emp where deptno=(select deptno from emp where ename='SMITH');
多行子查询
返回多行记录的查询称为多行子查询。关键字有:in,all,any。
- in 表示是否存在于返回的多个结果的集合中,存在即满足条件。
# 显示和10号部门具有的工作岗位相同的员工
select * from emp where job in (select distinct job from emp where deptno=10);
- all 表示返回的多个结果的集合的全体
# 显示工资比10号部门所有人工资都高的员工
select * from emp where sal > all (select distinct sal from emp where deptno=10);
- any 表示返回的多个结果的集合的任意一个结果
# 显示工资比30号部门任意员工工资高的员工
select * from emp where sal > any (select distinct sal from emp where deptno=10);
不管是单行还是多行子查询,都叫做单列子查询,返回的都是单列的一个字段的数据。
多列子查询
# 查询和SMITH的部门和岗位完全相同的所有雇员
select * from emp where (deptno, job) = (select deptno, job from emp where ename='SMITH');
可以认为,()
就是表示MySQL内部实现的集合。
在from子句中使用子查询
from跟是的表名,既然我们查询出来的记录都可以看作表结构。这里就是一个数据查询的技巧,把子查询当作临时表使用。
# 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
select ename, emp.deptno, sal, myavg# 作笛卡尔集 from emp, (select deptno, avg(sal) myavg from emp group by deptno) avg_tb # 过滤无效数据where emp.deptno=avg_tb.deptno;# 显示每个部门的部门名,编号,地点和人员数量
select dname, dept.deptno, loc, cnt# 作笛卡尔集 from emp, dept, (select deptno, count(*) cnt from emp group by deptno) cnt_tb# 过滤无效数据where cnt_tb.deptno=emp.deptno and cnt_tb.deptno=dept.deptno;
将查询出来的记录看作临时表和原有表作笛卡尔集,再筛选出有效数据,这就是我们需要创造出的表。在这个表中就能查询我们想要的数据。
合并查询
合并查询是就是合并多个 select 的查询结果,可使用集合操作符 union,union all。、
关键字 | 解释 |
---|---|
union | 取并集,将多个 select 结果合并到一起,自动去掉重复行 |
union all | 取并集,将多个 select 结果合并到一起,但不去重 |
# 取并集
select * from emp where sal > 2500
union # +
select * from emp where job='MANAGER';
1.4 OJ连接
- https://www.nowcoder.com/practice/23142e7a23e4480781a3b978b5e0f33a
- https://www.nowcoder.com/practice/355036f7f0c8429a85281f7ac05b457a
- https://www.nowcoder.com/practice/32c53d06443346f4a2f2ca733c19660c
- https://www.nowcoder.com/practice/e50d92b8673a440ebdf3a517b5b37d62
2. 表的内连和外连
表的连接分两种,内连接和外连接。内连接实际上利用 where 子句对多表聚合形成的笛卡尔集进行筛选,我们前面使用的都是内连接。
2.1 内连接
select `field` from `tb_1` inner join `tb_2` on 连接条件 and 其他条件;
这样的写法更加专业。
2.2 外连接
外连接又分左外连接和右外连接两种。
在使用内连接过滤笛卡尔集中非法数据的时候,我们是直接抛弃的。如果是左外连接,就不能直接抛弃,需要将右半部分置空并保留下来,反之右外连接。
左外连接
左外连接和内连接几乎没有区别。唯一的区别就是,拿着左表的数据到右表进行拼接,如果匹配不上不会过滤右表数据而是置空显示。
右外连接
右外连接,就是以右表为主。其他不变。
外连接就是为了显示出匹配不上的数据,从而确定哪些数据不满足条件。
2.3 OJ练习
- https://leetcode.com/problems/rank-scores/
- https://leetcode.com/problems/exchange-seats/description/
MySQL:复合查询和内外连接相关推荐
- MySQL —— 复合查询
目录 MySQL复合查询 一.基本查询回顾 二.多表查询 三.自连接 四.子查询 1. 单行子查询 2. 多行子查询 3. 多列子查询 4. 在from子句中使用子查询 五.合并查询 MySQL复合查 ...
- MySQL复合查询(多表查询)
文章目录 一.基本查询回顾 二.多表查询 1.最基本的复合查询 三.自查询 四.子查询 1.单行子查询 2.多行子查询 (1)in关键字 (2)all关键字 (3)any关键字 3.多列子查询 4.在 ...
- mysql嵌套查询效率低,连接查询代替嵌套查询提高select效率
当数据库中含有大量数据时,而我们所需要的信息不再是仅仅局限于一个表中的数据信息,这时我们需要将对一个表进行信息查询转而变成对多个表进行信息搜索并进行组合. 解决这样的问题我们通常是运用嵌套查询的方法, ...
- MYSQL基础之多表查询:内外连接以及等值非等值连接
其实前面说过数据库一句话: 这个就设计到一个E-R(entity -relatiosn 实体--联系)模型,其主要设计到三个主要概念:实体集,属性,联系集. 联系集本质就是表之间的关系,现在聊一些表之 ...
- jdbc mysql 存储过程查询数据_JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...
主要内容: JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十一 ...
- c#连接mysql数据库查询语句_C#连接MySQL数据库(增删改查)
using System; using MySql.Data.MySqlClient; namespace CSharp直接连接MySQL { class Program { static void ...
- oracle左连接查询代码,ORACLE连接查询,内外连接
事情的起源是这样子的: 在<剑破冰山>这本书里看到了一个用 where限制外连接的例子,当时不明白,查了下资料,做个总结. 测试代码. CREATE TABLE a (ID NUMBER, ...
- 【MySQL联合查询】外连接查询详解
外连接可以做什么 当我们在查询数据时,要求返回所操作表中至少一个表的所有数据记录,通过SQL语句"OUTER JOIN-ON"来实现.外连接数据查询语法形式如下: SELECT f ...
- mysql条件查询出现or连接时会使用索引的场景
在做sql优化时,通常会避免使用or来进行条件连接,是因为大多数情况下or的条件连接会导致sql查询进行全表扫描而不会使用索引去查询.但并不是所有使用or的场景都会全表扫描,有些场景下使用or依旧会走 ...
- MySQL数据库基础(多表关联查询、内外全连接、复合条件查询、子查询)
文章目录 一.笛卡尔积查询 二.内.外.全连接查询 三.复合条件查询 四.子查询 五.EXIST判断 本篇文章主要介绍MySQL里的多表关联查询,其中包括了笛卡尔积查询.内连接查询.外连接查询.全连接 ...
最新文章
- tpcc mysql 基准测试_使用tpcc-mysql 对mysql进行基准测试
- Windows Server 2016 + Exchange 2016 +Office365混合部署(四)
- 1019 数字黑洞 (20 分)java
- 中职计算机基础课堂传统教学,中职计算机基础知识教学创新
- SGU 183. Painting the balls( dp )
- LeetCode 322. 零钱兑换(DP)
- win32SDK的hello,world程序(二)
- java 字符串随机排列_Java 随机字符串排序
- matlab支持向量回归,支持向量回归 MATLAB代码
- ADS1115使用之电路与程序
- 刘强东,一个农村孩子的自卑!
- 【计算机网络】第六部分 应用层(26) 远程登录、电子邮件与文件传输
- 使用U盘制做CentOS7.6安装盘并安装CentOS7.6系统
- 代码的侵入式和非侵入式是什么意思
- Python案例1—人民币与美元的汇率兑换V_3.0
- .net core 中使用confluent kafka构建生产者
- runtime 黑魔法
- 如何快速完成事业单位继续教育
- Python计算越南出线概率
- arduino交通信号灯
热门文章
- 1.1Vue安装以及使用(node安装)
- 手机图片如何识别成文字
- 戴尔服务器r420系统安装系统,DELLR420+R720服务器raid+驱动安装教程.docx
- fd在python_python中fd()是什么
- PAT A1038 Recover the Smallest Number ——醉里挑灯看剑
- python高级数据筛选的方法_使用python对多个txt文件中的数据进行筛选的方法
- 微信小程序实践——实验2天气查询小程序
- 小程序 蓝牙连接(出现的问题和一些解决方法)
- 合并多个集合同类项{aaa,bbb,ccc},{bbb,ddd},{eee,fff},{ggg},{ddd,hhh}通过编程实现结果为:{aaa,bbb,ccc,ddd,hhh},{eee,fff},
- QLabel实现超链接,设置超链接颜色,去掉超链接下划线方法