连接查询和子查询哪个效率高

连接查询和子查询哪个效率高需要进行多表查询的情况下,用连接查询和子查询哪个效率高?1、什么是子查询?举个简单的例子,那么子查询有什么优劣呢?子查询(内查询)在主查询之前一次执行完成。子查询的结果被主查询(外查询)使用。可以用一个子查询替代上边的的表名。子查询,将查询操作嵌套在另一个查询操作中。先执行子查询,再执行外查询注:在查询时基于未知的值时,应使用子查询子查询可以返回多个结果/单个结果,结果个数不同应该使用不同的操作符通过子查询不难看出,可以根据employee_id查到department_

大家好,又见面了,我是你们的朋友全栈君。

需要进行多表查询的情况下,用连接查询和子查询哪个效率高?

1、什么是子查询?举个简单的例子,那么子查询有什么优劣呢?

在这里插入图片描述

子查询 (内查询) 在主查询之前一次执行完成。
子查询的结果被主查询(外查询)使用 。
可以用一个子查询替代上边的的表名。
子查询,将查询操作嵌套在另一个查询操作中。先执行子查询,再执行外查询

注:在查询时基于未知的值时,应使用子查询 子查询可以返回多个结果/单个结果,结果个数不同应该使用不同的操作符

通过子查询不难看出,可以根据employee_id查到department_id,然后根据deparment_id查到location_id然后查city字段就行了

//根据上述表查询emloyee_id的所在城市是长沙的(相当于就是无限套娃)

SELECT employee_id FROM employees WHERE department_id IN (
    
    SELECT  department_id FROM departments WHERE location_id IN(
        
        SELECT location_id FROM location WHERE city='长沙')

2、什么是连接查询呢?又有多少中连接查询?其中又各有什么优劣呢?连接查询主要分为三种:内连接、外连接、交叉连接。

内连接 INNER JOIN

内连接(INNER JOIN),返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

img

SELECT a.*, b.* FROM employees a INNER JOIN departments b ON a.department_id=b.department_id

外连接(外连接分为左外连接、右外链接、全外连接)

​ 外连接分为左外连接、右外链接、全外连接三种。从保证某个表的数据的完整性来说的话,LEFT JOIN 左外连接,保证左表的完整性,RIGHT JOIN 右外连接,保证右表的完整性

(1)左外连接LEFT JOIN或LEFT OUTER JOIN

左外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

img

SELECT a.* FROM employees a LEFT JOIN departments b ON b.department_id=a.department_id

注:查询结果,会将左表全部查询出来,如果未匹配到连接(b表中未找到和a表中的department_id相等的字段),则右表为null。

(2)右外链接RIGHT JOIN 或 RIGHT OUTER JOIN

右外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

img

SELECT a.* FROM employees a RIGHT JOIN departments b ON b.department_id=a.department_id

注:查询结果,会将左表全部查询出来,如果未匹配到连接(a表中未找到和b表中的department_id相等的字段),则左表为null。

(3)全外连接(全连接)FULL JOIN 或 FULL OUTER JOIN

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

FULL JOIN的基本语法如下:
在这里插入图片描述
oracle里面有full join,但是在mysql中没有full join。我们可以使用union来达到目的。

//oracle写法
SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;
//mysql写法
SELECT a.* FROM employees  a LEFT JOIN departments b ON a.department_id = b.department_id UNION 
 SELECT a.* FROM employees  a RIGHT JOIN departments b ON a.department_id = b.department_id

等值连接和自然连接

1.等值连接(相等连接):

使用”=”关系将表连接起来的查询,其查询结果中列出被连接表中的所有列,包括其中的重复列。

2.自然连接:

等值连接中去掉重复的列,形成的连接。说真的,这种连接查询没有存在的价值,既然是SQL2标准中定义的。自然连接无需指定连接列,SQL会检查两个表中是否相同名称的列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。不允许使用ON语句,不允许指定显示列,显示列只能用*表示(ORACLE环境下测试的)。对于每种连接类型(除了交叉连接外),均可指定NATURAL。

数据库应用中最常用的是“自然连接”,它在目标列中去除相同的字段名。进行自然连接运算要求两个表有共同属性(列),自然连接运算的结果表是在参与操作的两个表的共同属性上进行等值连接后,再去除重复的属性后所得的新表。

等值连接和自然连接的区别:

1)等值连接中不要求相等属性值的属性名相同,而自然连接要求相等属性值的属性名必须相同,即两关系只有在同名属性才能进行自然连接。

2)等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。

3、连接查询和子查询哪个效率高呢?

​ 首先两者不存在谁优于谁的说法,只是那种更适应某种环境。一般要看你是什么用途,如果数据量少的话可以子查询,或者经常用的数据就使用子查询,不经常用的就连接查询,适习惯而定,当然是指数据量少的情况下。

​ 一般来讲连接查询效率更高,因为子查询会多次遍历数据,而连接查询只遍历一次,但是如果数据量较少的话子查询更加容易控制。但如果数据量大的话两者的区别就会很明显,对于数据量多的肯定是用连接查询快些,原因:因为子查询会多次遍历所有的数据(视你的子查询的层次而定),如果你的子查询是在无限套娃,且每张表数据量不大,使用子查询效率高。

​ 连接查询只会遍历一次,但是数据量少的话也就无所谓是连接查询还是子查询,多表数据量大建议采用连接查询。

注:连接查询是SQL查询的核心,连接查询的连接类型选择依据实际需求。如果选择不当,非但不能提高查询效率,反而会带来一些逻辑错误或者性能低下。下面总结一下两表连接查询选择方式的依据:

1、 查两表关联列相等的数据用内连接。

2、 左表是右表的子集时用右外连接。

3、 右表是左表的子集时用左外连接。

4、 左表和右表彼此有交集但彼此互不为子集时候用全外连接(全连接)。

5、 求差操作的时候用联合查询。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139816.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 用java代码实现九九乘法表

    用java代码实现九九乘法表分析乘法表发现,整体有九行,第一行是一列,第二行是两列,第三行三列…..第九行对应有九列,所以它的行数对应就有多少列,这样我们可以通过借助行数来控制它的列数,以此来实现乘法表的打印。具体代码实现:for循环publicclassMultTable{ publicstaticvoidmain(String[]args){ //此处调用九九乘法表方法实现打印 multMethod(); } publicstaticvoidmultMethod(){ /

  • 电脑使用哪个录制视频软件比较好

    电脑使用哪个录制视频软件比较好如今社会从一个开放的年代发展为开放的信息时代,人们对于自我表达越发的大胆。追求标新立意,而视频正好迎合了人群的需要。视频的表现方式比图纸更加直观具有冲击力,更展现更加生动丰富的内容。想要录制视频其实不难,只需要一款专业的录制视频软件就可以帮搜我们达到我们想要的效果。使用工具:电脑(有网络)迅捷屏幕录像工具操作步骤:1、首先电脑在线进入百度浏览器搜索迅捷屏幕录像,并且安装在电脑上进行运行。…

  • when和while的区别和用法_when后面加do还是doing

    when和while的区别和用法_when后面加do还是doingwhen和while的区别主要有:指代不同、从句动词不同、时间状态不同、用法不同等。1、指代不同:when是atorduringthetimethat既指时间点,也可指一段时间,while是duringthetimethat只指一段时间。2、从句动词不同:when引导的时间状语从句中的动词可以是终止性动词,也可以是延续性动词,而while从句中的动词必须是延续性动词。3、时间状态不同:when说明从句的动作和主句的动作可以是同时,也可以是先后发生,while则强调主句的动作在从句

    2022年10月21日
  • mac如何装windows系统_bootcamp您的磁盘未能分区

    mac如何装windows系统_bootcamp您的磁盘未能分区问题:启动磁盘不能被分区或恢复成单个分区苹果电脑装了双系统,但是一直用的mac系统,所以打算把windows卸载。看到网上说直接用Bootcamp助理卸载就行,但是点“继续”的时候出现问题:启动磁盘不能被分区或恢复成单个分区。接下来就是要解决这个问题啦!可以看到我现在有三个盘,MachintoshHD为mac系统所在盘,这是我要保留的,另外两个是装windows分配的盘,所以需要卸载这…

  • React之redux学习日志(redux/react-redux/redux-saga)

    React之redux学习日志(redux/react-redux/redux-saga)

    2020年11月19日
  • 将oracle端口1521共享_[转载]Oracle 1521端口不通 telnet不通

    将oracle端口1521共享_[转载]Oracle 1521端口不通 telnet不通今天启动工程,突然提示无法连接远程Oracle。我试着telnetOracle服务器1521端口,提示连接失败。D:DocumentsandSettingsAdministrator>telnet10.201.70.681521正在连接到10.201.70.68…不能打开到主机的连接,在端口1521:连接失败Oracle服务器与本机都在局域网内,不存在网络不通问题,怎么会…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号