数据库常用SQL语句(三):子查询
一、为什么会使用子查询
虽然可以通过连接查询来实现多表查询数据记录,但不建议使用,因为连接查询的性能很差,为什么呢?我们来进行分析,例如 我们要查询部门表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语句(三):子查询的更多相关文章
- GP数据库 常用SQL语句
GP数据库 常用SQL语句 --1,查看列名以及类型 select upper(column_name) ,data_type from information_schema.columns wher ...
- Oracle数据库常用Sql语句大全
一,数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...
- mysql(数据库,sql语句,普通查询)
第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. l 什 ...
- Oracle常用sql语句(三)之子查询
子查询 子查询要解决的问题,不能一步求解 分为: 单行子查询 多行子查询 语法: SELECT select_list FROM table WHERE expr operator (SELECT s ...
- 数据库常用SQL语句(一):常用的数据库、表操作及单表查询语句
以MySql数据库为例进行说明 1.数据库操作语句 2.表的操作语句 3.表中的字段操作语句 4.MYSQL支持的完整性约束 数据库管理系统提供了一致机制来检查数据库表中的数据是否满足规定的条件,以保 ...
- 整理总结数据库常用sql语句,建议收藏,忘记了可以来看一下
第一节课:sql语言介绍(参照PPT)及基本查询sql学习 1.数据库表的介绍 emp表:员工表 dept表:部门表 salgrady:薪资水平表 Balance: 2.基本的查询语句: 知识点: s ...
- ios数据库常用sql语句
SQlite常用语句 由于sql语句在程序代码中以字符串的形式存在,没有代码提示,不细心很容易出错,而且不容易被查出来.sql语句字符串是单引号. 写sql语句的时候一定要细心呀.如果写不好可以找公司 ...
- oracle数据库常用SQL语句(11.29更新)
笔者日常工作中常用到的sql语句,现总结如下,留作日后查看. 1.按照两列中的最大值取 ,只取两列其中的一列 SELECT * FROM t_doc T ORDER BY GREATEST(T.Loa ...
- SQL语句:子查询
一,子查询定义: 子查询就是嵌套在主查询中的查询. 子查询可以嵌套在主查询中所有位置,包括SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY. 但并不是每个位置嵌套子 ...
随机推荐
- Codeforces Round #527 (Div. 3) 总结 A B C D1 D2 F
传送门 A 贪心的取 每个字母n/k次 令r=n%k 让前r个字母各取一次 #include <bits/stdc++.h> using namespace std; typedef lo ...
- 【精选】Markdown 语法汇总
博客园也能Markdown?美滋滋,Markdown真的是好用QAQ. 本文档按照Markdown各种常用语法类别,以文字描述+演示的方式来展现markdown语法的使用.Markdown 的目标是实 ...
- mybatis学习笔记(一)
mybatis学习笔记 mybatis简介 Mybatis 开源免费框架.原名叫iBatis,2010在googlecode,2013年迁移到 github 作用: 数据访问层框架,底层对JDBC进行 ...
- Java——检测其他线程的状态以及启动已死亡的线程
这次这个的思路是在主类中维护一个map,map的key是线程名,value是线程的状态,然后创建周期执行的线程通过检测这个map来判断进程的状态,如果有死亡的进程就把该进程启动. 首先是主类,这里的m ...
- android ——Toolbar
Toolbar是我看material design内容的第一个 官方文档:https://developer.android.com/reference/android/support/v7/widg ...
- 网络编程网络协议篇(osi七层协议)
一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...
- flask项目部署到云服务器+域名绑定
一.效果演示 首页展示 播放页面 该项目部署只为学习,所以用的服务器是腾讯云服务器10元/月,域名也是在腾讯云买的.com 55元/年 因为本人比较穷 哈哈
- Mysql优化-mysql分区
背景:由于我负责i西科教务处系统,i西科用户量达到20000人左右,那么假设每人每星期10门讲课,数据库记录信息将是20万条,如果不将课程表进行分区或分表,就会造成爆表的情况,如此看来,分区是必须要做 ...
- windows如何访问wsl系统下的文件
windows如何访问wsl系统下的文件 可以在wsl终端输入以下命令 explorer.exe . 会出现如下界面 这样就可以很方便的查看wsl的文件了
- React预备知识点
1.react中的状态提升 react的状态提升就是用户对子组件操作,子组件不改变自己的状态,而是通过自己的props把操作改变的数据传递给父组件,改变父组件的状态,从而改变受父组件控制的所有子组件的 ...