一、为什么会使用子查询

虽然可以通过连接查询来实现多表查询数据记录,但不建议使用,因为连接查询的性能很差,为什么呢?我们来进行分析,例如 我们要查询部门表t_dept 和雇员表t_employee中的数据记录,一般可能会写成:

SELECT * FROM t_dept t1,t_employee t2

      WHERE t1.deptno=t2.deptno;

对于这条SQL语句,在数据库执行的时候,会先对两个表进行笛卡尔积操作,然后再选取符合条件 t1.deptno=t2.deptno的数据记录。由于笛卡尔积时是将两个表中的记录数做乘积生成新的记录,如果当两个表中的数据记录都比较多时,进行乘积操作时性能将会很差,甚至造成死机。为了解决该问题,我们可以使用子查询来实现多表查询。

二、什么是子查询

子查询,就是在一个查询中嵌套了其他若干查询,即在一个SELECT查询语句的FROM或WHERE字句中包含另一个SELECT查询语句,在这种嵌套的查询语句中,外层的SELECT查询语句称为主查询,WHERE或FROM中的查询语句称为子查询,也叫嵌套查询。通过子查询可以实现多表查询,子查询经常出现在WHERE或FROM字句中。

  • WHERE子句中的子查询:该位置处的子查询一般返回单行单列,多行单列,单行多列数据。就是返回能够作为WHERE子句查询条件的值。
  • FROM子句中的子查询:该位置处的子查询一般返回多行多列数据,相当于是返回一张临时表,符合FROM子句后面是表的规则,就是通过这种方式来实现多表查询的。

三、子查询的具体使用

1.WHERE子句后使用子查询

  a.返回结果为单行单列的子查询(就是有一个查询字段一个取值的情况)

  

    

  b.返回结果为单行多列的子查询(就是有多个查询字段)

  

  

  c.返回结果为单列多行的子查询(就是一个查询字段,有多个值的情况)

  对于这种情况,在WHERE子句中就可以使用IN,ANY,ALL,EXISTS等关键字。

  

  

  

  

  

  2.FROM子句后使用子查询

  FROM子句后的子查询返回的结果为多行多列的数据记录,就类似一个虚拟的表,可以使用该种方式实现多表查询。举例说明,有以下两张表:

  

  查询雇员表t_employee表中各部门中的部门号、部门名称、雇员人数和平均工资,这些数据位于两张表中,所以,我们先将两张表连接起来,然后对连接后的表进行分组查询,采用连接查询的实现方式如下:

  

  采用子查询的方式实现。有了子查询,由于想要得到的数据时位于两个表中,所以我们还是需要使用连接来使两个表建立新的关系,只要连接,就一定是先对两个表做笛卡尔积操作。但有了子查询,我们可以将另一张表中需要的数据通过子查询的方式先查出来,然后再通过连接将结果和另一个表中的结果根据连接条件组合在一起,由于连接之前先做了一次查询,查询的结果只是符合要求的数据记录,而不是所有的,这样其实就减少了连接时表的数据记录。这样一来,笛卡尔积时的数据记录就会大大减少,我们来看实现方式:

    、

至此,有关单表操作,多表连接查询方面的一些常用操作就介绍完了,进行总结:

  1.多表连接,其实就是两个或两个以上的表进行连接行成一个新的关系表,然后再按照操作单表时的方法来操作这个新的关系表。

  2.多表连接时,如果使用子查询的方式,可以先将多余的数据剔除,行成我们想要的数据表(可以理解成是一个虚拟表),然后再进行连接,能够提高表连接时的效率。

  3.多表连接,本质上最后还是单表操作,所以单表操作查询语句一定要掌握透彻,不管多么复杂的多表连接SQL语句,先分清外层查询是什么,再看嵌套的子查询是什么。

数据库常用SQL语句(三):子查询的更多相关文章

  1. GP数据库 常用SQL语句

    GP数据库 常用SQL语句 --1,查看列名以及类型 select upper(column_name) ,data_type from information_schema.columns wher ...

  2. Oracle数据库常用Sql语句大全

    一,数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...

  3. mysql(数据库,sql语句,普通查询)

    第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. l 什 ...

  4. Oracle常用sql语句(三)之子查询

    子查询 子查询要解决的问题,不能一步求解 分为: 单行子查询 多行子查询 语法: SELECT select_list FROM table WHERE expr operator (SELECT s ...

  5. 数据库常用SQL语句(一):常用的数据库、表操作及单表查询语句

    以MySql数据库为例进行说明 1.数据库操作语句 2.表的操作语句 3.表中的字段操作语句 4.MYSQL支持的完整性约束 数据库管理系统提供了一致机制来检查数据库表中的数据是否满足规定的条件,以保 ...

  6. 整理总结数据库常用sql语句,建议收藏,忘记了可以来看一下

    第一节课:sql语言介绍(参照PPT)及基本查询sql学习 1.数据库表的介绍 emp表:员工表 dept表:部门表 salgrady:薪资水平表 Balance: 2.基本的查询语句: 知识点: s ...

  7. ios数据库常用sql语句

    SQlite常用语句 由于sql语句在程序代码中以字符串的形式存在,没有代码提示,不细心很容易出错,而且不容易被查出来.sql语句字符串是单引号. 写sql语句的时候一定要细心呀.如果写不好可以找公司 ...

  8. oracle数据库常用SQL语句(11.29更新)

    笔者日常工作中常用到的sql语句,现总结如下,留作日后查看. 1.按照两列中的最大值取 ,只取两列其中的一列 SELECT * FROM t_doc T ORDER BY GREATEST(T.Loa ...

  9. SQL语句:子查询

    一,子查询定义: 子查询就是嵌套在主查询中的查询. 子查询可以嵌套在主查询中所有位置,包括SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY. 但并不是每个位置嵌套子 ...

随机推荐

  1. 如何让传统ASP.NET网站在Docker中运行

    本文主要描述如何让传统ASP.NET网站在Docker中运行,侧重Docker image 搭建. 使用条件: Docker for windows 用户切换到Windows 容器模式 Windows ...

  2. JAVA基础知识(三):input.nextLine() 和input.next()

    next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其过滤掉:只有在读取到有效字符之后,next()方 ...

  3. Paxos算法原理

    1.从ACID到CAP 我们知道传统集中式系统中实现ACID是很简单的,在分布式环境中,涉及到不同的节点,节点内的ACID可以控制,那么节点间的ACID如何控制呢?构建一个可用性和一致性的分布系统成为 ...

  4. Linux系统上安装OpenOffice

    项目需求需要在linux上安装openOffice,本以为很简单,现在看来还是入了很多坑.理清楚就好了. 官网地址 http://download.openoffice.org/other.html ...

  5. 浅谈osi模型 三次握手 四次挥手 ddos攻击原理

    C/S B/S 架构 C:client 端 B:browser 浏览器 S:server 端 C/S架构,基于客户端与服务端之间的通信 例如:QQ,抖音,快手,微信,支付宝等等 优点:个性化设置,响应 ...

  6. HTML5标签的使用和作用

    在菜鸟教程中找了一些关于HTML5的知识点,觉得很有用,可以整理一下,以后使用. 这是一个基本的HTML5文档: <!DOCTYPE html><html><head&g ...

  7. npm install 安装很慢

    npm install 安装很慢 设置国内镜像 npm config set registry https://registry.npm.taobao.org npm install

  8. LoRaWAN stack移植笔记(五)__调试1

    先废话一小段 在将LoRaWAN的程序移植的过程中,调试发现了很多的问题. 做好记录工作,防止以后再踩坑 移植使用的是LoRaMac-node库,使用的是STM32L151CBT6 MCU,需要要移植 ...

  9. SpringIoC和SpringMVC的快速入门

    更多内容,欢迎关注微信公众号:全菜工程师小辉~ Spring的优势? 降低了组件之间的耦合性 ,实现了软件各层之间的解耦 可以使用容易提供的众多服务,如事务管理,消息服务等 容器提供单例模式支持 容器 ...

  10. junit单元测试框架

    一般我们写代码总想对方法测试一下结果,就存在这些问题: 1.如果方法需要测试,都需要在main方法上调用 2.目前的结果都需要我们人工对比 所以就需要用到 junit 进行测试: 1·下载 junit ...