一、嵌套查询

嵌套查询我们以mybatis中的嵌套查询举例:

1.1、创建数据库

CREATE TABLE `teacher` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
​
INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师');
​
CREATE TABLE `student` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,`tid` INT(10) DEFAULT NULL,PRIMARY KEY (`id`),KEY `fktid` (`tid`),CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

其中是n个学生对应1个老师,因此pojo层的学生多了一个teacher属性,

按照查询嵌套处理:

<mapper namespace="com.dao.StudentMapper"><!--思路:1、查询所有的学生信息。2、根据查询出来的学生的tid,寻找对应的老师。即子查询。--><select id="getStudents" resultMap="StudentTeacher">select * from student</select><resultMap id="StudentTeacher" type="Student"><result property="id" column="id"/><result property="name" column="name"/><!--复杂的属性,我们需要单独处理。对象用association,集合用collection--><association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/></resultMap><select id="getTeacher" resultType="Teacher">select * from teacher where id = #{id}</select>
</mapper>

注意:子查询效率低,原因是因为需要查询两次表格。

按照结果嵌套处理(推荐且常用)

<select id="getStudent2" resultMap="StudentTeacher2">select s.id sid,s.name sname,t.name tnamefrom student s,teacher twhere s.tid = t.id;
</select>
​
<resultMap id="StudentTeacher2" type="Student"><result property="id" column="sid"/><result property="name" column="sname"/><association property="teacher" javaType="Teacher"><result property="name" column="tname"/></association>
</resultMap>

嵌套查询和嵌套结果区别:

嵌套查询:

1、嵌套查询是在查询SQL中嵌入一个子查询SQL;

2、嵌套查询会执行多条SQL语句;

3、查询效率低,要多查一轮

嵌套结果:

1、嵌套结果是一个嵌套的多表查询SQL;

2、嵌套结果只会执行一条复杂的SQL语句;

二、连接查询

2.1 内连接

关键字:inner join......on

说明:组合两个表中的记录,返回关联字段符合查询条件的记录,也就是返回两个表的交集(阴影)部分。

select *
from table1 inner join table2
where table1.id = table2.id

2.2 左外连接

关键字:left outer join......on

说明:左(外)连接,左表(table1)的记录将会全部表示出来,而右表(table2)只会显示符合查询条件的记录。右表记录不足的地方均为NULL。或者:是指以左边的表的数据为基准,去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null

SELECT t1.col1, t2.col2
FROM table1 t1 LEFT OUTER JOIN table2 t2
ON t1.id = t2.id;

2.3 右外连接

和左外连接同理,不赘述

2.4 全外连接

顾名思义,把两张表的字段都查出来,没有对应的值就显示null,但是注意:MySql是没有全外连接的(MySql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接。

select e.empName,d.deptNameFROM t_employee e left JOIN t_dept dON e.dept = d.id
UNION
select e.empName,d.deptNameFROM t_employee e RIGHT JOIN t_dept dON e.dept = d.id;

UNION求两个结果集的并集,UNION连接的查询也较组合查询或符合查询。UNION会自动去除重复行,如果不喜欢去除重复行可以用UNION ALL。

2.5 自连接

自连接查询就是当前表与自身的连接查询,关键点在于虚拟化出一张表给一个别名

例如:查询员工以及他的上司的名称,由于上司也是员工,所以这里虚拟化出一张上司表

SELECT e.empName,b.empNamefrom t_employee e LEFT JOIN t_employee bON e.bossId = b.id;
​

三、嵌套查询和连接查询的区别

查询嵌套是利用子查询来实现多表对应,结果嵌套是利用一句复杂的sql语句来实现多表对应(下列对比以嵌套查询为例);而连接查询则是先对要查询的表进行笛卡尔积之后,筛选对比。

本人认为存在以下两种情况:

情况一

如果只是对应一个连接条件的话,两种查询都是一样的,效率无太多差距。但是相比于嵌套查询,连接查询的学习成本和使用体验会更加好。同时,连接查询可以通过调整主关联表,来先查询数据少的表,提高效率。

情况二:

如果存在多种连接的情况,比如多对一关系,我们可以使用嵌套查询来清晰的写出关系逻辑,对查询进行修改时,也会更加方便。在效率上,由于嵌套结果查询是直接执行一个复杂的sql语句来进行多表的查询,而虽然连接查询也是通过对多个表的查询,但它多出了一个使用笛卡尔积的过程,因此效率不如嵌套查询。

注意:本文是作者通过查阅和学习网上资料整理,但并没找到真实书本依据,如有错误,本人虚心请教。

Mysql中嵌套查询和连接查询的区别相关推荐

  1. mysql 嵌套查询性能_MySQL数据库之嵌套查询与连接查询的性能详解

    本文主要向大家介绍了MySQL数据库之嵌套查询与连接查询的性能详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 嵌套查询与连接查询的性能:连接查询一般较快:子查询很难被优化. ...

  2. MySQL中嵌套子查询删除出错解决方案

    MySQL中嵌套子查询做删除操作会出错,例如下面的SQL: delete from table1 where number in (select number from table2) 执行提示: Y ...

  3. 笔记:3.4 《数据库系统概论》之数据查询---SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    对 3.2 数据查询-SELECT(单表查询.连接查询.嵌套查询.集合查询.多表查询)的转载与学习笔记: 0.前言 本篇文章是对<数据库系统概论>王珊老师主编的数据库查询SELECT部分做 ...

  4. MySQL 多表查询、连接查询(内连接、外连接)

    文章目录 1. 多表查询 2. 连接查询 练习 LeetCode 175. 组合两个表 练习 LeetCode 181. 超过经理收入的员工 练习 LeetCode 1378. 使用唯一标识码替换员工 ...

  5. mysql 连接 分组_MySQL 基础 (四) 分组查询及连接查询

    MySQL 基础 (四) 分组查询及连接查询 MySQL 基础(四) 进阶 5 分组查询 语法: SELECT 分组函数, 列(要求出现在 group by 的后面) FROM 表 [where 筛选 ...

  6. db2嵌套查询效率_嵌套查询与连接查询的性能

    嵌套查询与连接查询的性能:连接查询一般较快:子查询很难被优化.(当然和DB优化有关,也可能子查询比连接查询快)其实不能一概而论的~~ 不过,问了下DBA同学,他建议是能用join的,尽量不要用嵌套查询 ...

  7. 【MySQL】多表联合查询、连接查询、子查询

    文章目录 [1]连接查询 内连接查询 外连接查询 左连接 右连接 [2]联合查询 [3]子查询 带in关键字的子查询 带比较运算符的子查询 带exists的子查询 带any关键字的子查询 带all关键 ...

  8. MySQL 表关系及多表操作(联合查询、连接查询、子查询)

    文章目录 表关系 一对一关系 一对多关系 多对多关系 总结 MySQL多表操作 联合查询 联合查询排序 连接查询 交叉连接 内连接 外连接 自然连接 using关键字 子查询 表关系 表关系:一个表代 ...

  9. mysql的查询、子查询及连接查询(商城查询常用)

    mysql的查询.子查询及连接查询 一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数) 1.whe ...

最新文章

  1. mysql ldap_OpenLDAP 使用MySQL作为数据库
  2. QT5生成可执行文件总结
  3. vn.py 2.0.1 发布,全功能交易程序开发框架
  4. 魔术师发牌问题 java_魔术师发牌问题--java实现
  5. lucene索引word/pdf/html/txt文件及检索(搜索引擎)
  6. 文艺平衡树 Splay 学习笔记(1)
  7. python网页爬虫例子_Python网络爬虫 - 一个简单的爬虫例子
  8. asic面试题目 英伟达_免笔试!不限量!全球可编程图形处理技术领袖英伟达2021校园招聘火热进行中!...
  9. php javascript对象,JavaScript 对象
  10. 三星Galaxy S22或放弃Exynos 2200?假消息!依旧双版本
  11. Guava cache
  12. JavaScript中的高级特性及特别对象、属性和方法
  13. mysql always as_MySQL always returning BIT values as blank
  14. (Mirage系列之四)Mirage经典案例之集中桌面管理
  15. 教你如何在Ubuntu中创建 Sudo用户
  16. Oracle 导出DMP
  17. (转载)C++面试宝典2011版
  18. IPV6之DHCPV6
  19. 完美解决“word无法创建工作文件,请检查临时环境变量”
  20. java语言中cpu数据_重塑云上的 Java 语言

热门文章

  1. Windows PC 微信不显示头像或表情
  2. Laya 将传统的bitmap字体 转换成 Laya可以识别的字体
  3. php 二维码在线识别api
  4. GEE-Scholars MODIS地表温度LST时间变化趋势
  5. 图像处理评价指标之模糊度(更新中)
  6. 基础图像处理 python+opencv
  7. 圣诞之歌:クリスマス タイム和My Baby Grand~ぬくもりが欲しくて~ ZARD
  8. LATEX之对文章排版的相关设置
  9. ONF推出第二版Atrium 获OpenDaylight支持
  10. linux mysql 开发环境_RedHat Linux下QT平台MySQL数据库开发环境配置