文章目录

  • 概述
  • where型子查询
  • from型子查询
  • EXISTS型子查询
  • 复制表子查询

概述

在某些情况下,当进行一个查询时,需要的条件或数据要用另一个select语句的结果,这个时候,就要用到**子查询**。

为了给主查询(外部查询)提供数据而首先执行的查询(内部查询)被叫做子查询

一般根据子查询的嵌入位置分为:where型子查询、from型子查询、exists型子查询。

说明:以下相关的演示SQL语句涉及到的表及数据,详见:MySQL基础篇:SELECT几种子句.

where型子查询

where型子查询即把内层sql语句查询的结果作为外层sql查询的条件。

  • 子查询要包含在括号内;
  • 建议将子查询放在比较条件的右侧;
  • 单行操作符对应单行子查询,多行操作符对应多行子查询
    • 单行操作符 ——右边子查询必须返回的是单个值,单行比较运算符(=,>,>=,<=,<,<>)
    • 多行操作符——右边子查询可以返回多行,但必须是单列,ALL、ANY、IN其中,ALL和ANY运算符必须与单行比较运算符(=,>,>=,<=,<,<>)结合使用

IN:等于任何一个

ALL:和子查询返回的所有值比较。

例如:sal>ALL(1,2,3)等价于sal>1&&sal>2&&sal>3,即大于所有

ANY:和子查询返回的任意一个值比较。

例如,sal> ANY(1,2,3)等价于sal>1 or sal >2 or sal >3 ,即大于任意一个就可以

EXISTS:判断子查询是否有返回结果(不关心具体行数和内容),如果返回则为true,否则为false。

#子查询
#where型子查询#查询比“李四”的工资高的员工编号
mysql> select * from salary where basic_salary >(select basic_salary from employee inner join salary on employee.eid=salary.eid where employee.ename='李四');
+-----+--------------+--------------------+
| eid | basic_salary | performance_salary |
+-----+--------------+--------------------+
|   1 | 12000        | 6000               |
|   3 | 11000        | 5500               |
+-----+--------------+--------------------+
2 rows in set
#查询和张三、王五在同一个部门的员工
mysql> select * from employee where dept_id IN(select dept_id from employee where ename='张三' OR ename='王五');
+-----+-------+--------+--------------------+-------+---------+
| eid | ename | gender | card_id            | ‘mid‘ | dept_id |
+-----+-------+--------+--------------------+-------+---------+
|   1 | 张三  | 男     | 123456789012345678 | NULL  |       1 |
|   4 | 王五  | 男     | 123456789012115678 |     1 |       1 |
|   5 | 谷雨  | 男     | 123456789012115978 |     1 |       1 |
+-----+-------+--------+--------------------+-------+---------+
3 rows in setmysql> select * from employee where dept_id = ANY(select dept_id from employee where ename='张三' OR ename='王五');
+-----+-------+--------+--------------------+-------+---------+
| eid | ename | gender | card_id            | ‘mid‘ | dept_id |
+-----+-------+--------+--------------------+-------+---------+
|   1 | 张三  | 男     | 123456789012345678 | NULL  |       1 |
|   4 | 王五  | 男     | 123456789012115678 |     1 |       1 |
|   5 | 谷雨  | 男     | 123456789012115978 |     1 |       1 |
+-----+-------+--------+--------------------+-------+---------+
3 rows in set
#查询全公司工资最高的员工编号、基本工资
mysql> select eid,basic_salary from salary where basic_salary =(select max(basic_salary) from salary);
+-----+--------------+
| eid | basic_salary |
+-----+--------------+
|   1 | 12000        |
+-----+--------------+
1 row in setmysql> select eid,basic_salary from salary where basic_salary >= ALL(select basic_salary from salary);
+-----+--------------+
| eid | basic_salary |
+-----+--------------+
|   1 | 12000        |
+-----+--------------+
1 row in set

from型子查询

from型子查询即把内层sql语句查询的结果作为临时表供外层sql语句再次查询使用。

# from型
#找出比部门平均工资高的员工编号、基本工资
mysql> select employee.eid,basic_salary -> from salary inner join employee inner join(-> select emp.dept_id as did,avg(s.basic_salary) as avg_salary-> from employee emp,salary s-> where emp.eid=s.eid-> group by emp.dept_id) as temp-> on salary.eid=employee.eid and employee.dept_id=temp.did-> where salary.basic_salary > temp.avg_salary;
+-----+--------------+
| eid | basic_salary |
+-----+--------------+
|   1 | 12000        |
|   3 | 11000        |
+-----+--------------+
2 rows in set

EXISTS型子查询

mysql> select * from depart
ment;
+-----+--------+--------------+------------+
| did | dname  | description  | manager_id |
+-----+--------+--------------+------------+
|   1 | 研发部 | 业务平台研发 | NULL       |
|   2 | 市场部 | 市场推广     | NULL       |
|   3 | 财务部 | 财务管理     | NULL       |
+-----+--------+--------------+------------+
3 rows in setmysql>
mysql>
#exists型
#查询部门信息,该部门必须有员工
mysql> select * from department -> where exists (select * from employee where employee.dept_id=department.did);
+-----+--------+--------------+------------+
| did | dname  | description  | manager_id |
+-----+--------+--------------+------------+
|   1 | 研发部 | 业务平台研发 | NULL       |
|   2 | 市场部 | 市场推广     | NULL       |
+-----+--------+--------------+------------+
2 rows in setmysql>

复制表子查询

(1)复制表

1、拷贝表结构

CREATE TABLE newtable like oldtable;

2、拷贝表结构和数据(但约束与索引除外)

CREATE TABLE newtable AS (SELECT * FROM oldtable);

3、拷贝表结构+数据

CREATE TABLE newtable like oldtable;
INSERT INTO newtable SELECT * FROM oldtable;

4、跨数据库拷贝表

CREATE TABLE newtable like poss.oldtable;
CREATE TABLE newposs.newtable like oldposs.oldtable;

5、拷贝一个表中其中的一些字段(指定新名),其中一些数据

CREATE TABLE newtable AS
(SELECT id,username AS ename,password AS pass FROM user WHERE id <100
);

(2)复制数据

  • 在INSERT语句中加入了子查询

  • 不必书写VALUES子句

  • 子查询中的值列表应与INSERT子句中的列名对应

INSERT INTO emp2
SELECT * FROM employees WHERE department_id = 90;
或
INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees WHERE job_id LIKE '%REP%';

MySQL基础篇:子查询相关推荐

  1. SQL Server 调优系列基础篇 - 子查询运算总结

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

  2. MYSQL基础八--子查询和连接

    1.子查询是出现在其他SQL语句内的SELECT子句. 子查询指嵌套在查询内部,且必须始终出现在圆括号内. 子查询可以包含多个关键字或条件,如DISTINCT,GROUP BY,ORDER BY,LI ...

  3. mySQL基础之子查询

    进阶7:子查询 含义:出现在其他语句中的select语句,称为子查询或内查询外部的查询语句,称为主查询或外查询 分类:按子查询出现的位置:SELECT后面:仅仅支持标量子查询FROM后面:支持表子查询 ...

  4. MySQL基础篇 | 连接查询、子查询(嵌套)

    ✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步!

  5. 最全MySQL基础篇

    文章目录 导入表的问题 第三章_最基本的SELECT语句 1. SQL语言的规则和规范 1) 基本规则 2) SQL大小写规范(建议遵守) 3) 注释 4) 命名规则 2. 基本的SELECT语句 1 ...

  6. MySQL基础篇——第11章 DML(数据操作):增删改

    MySQL基础篇--第11章 DML(数据操作):增删改 1. 插入数据(增) INSERT INTO ... 使用 INSERT INTO 语句向表中插入数据(记录) 1.1 方式1:VALUES ...

  7. MySQL——基础篇

    MySQL--基础篇 一.数据库的相关概念 数据库(database) 保存有组织的数据的容器(通常是一个文件或一组文件). 表(table) 某种特定类型数据的结构化清单. 模式(schema) 关 ...

  8. mysql 基础篇(二) 账号、权限管理

    mysql 基础篇(二) 账号.权限管理.备份与还原 建立账号密码: Grant all on test.* to "cj"@"localhost" ident ...

  9. Mysql基础篇(1)—— 基础概念、DML基本语法和表连接

    前言 Mysql基础篇相关的内容是看了康师傅的视频做的笔记吧 数据库相关概念 DB: 数据库(Database) ​ 存储数据的仓库,本质是一个文件系统.它保存了一系列有组织的数据. DBMS:数据库 ...

最新文章

  1. python androidhelper 语音识字_Android语音播报、后台播报、语音识别
  2. nvm 下载node 下载不下来_一键下载网页所有图片,把美丽存下来
  3. Java-NIO(九):管道 (Pipe)
  4. 探秘重编译(Recompilations)(1/2)
  5. Java 对象锁和类锁全面解析
  6. 自定义编译gdal库
  7. spring boot二:搭建环境
  8. linux-basic(8)linux磁盘与文件系统管理
  9. leetcode107. 二叉树的层次遍历 II
  10. 下拉选择框 其他_列表框 vs 下拉列表,哪个更好?
  11. linux git ssh_Git年满13岁,可以了解Linux和SSH命令,Python编程等等
  12. 终于搞懂了Java 8 的内存结构,再也不纠结方法区和常量池了!!
  13. [转]Mysql FROM_UNIXTIME as UTC
  14. 解决Emacs输出PDF文件时Tex缺少.sty文件的方法
  15. 苹果电脑win10蓝牙音响卡顿_Macbook Pro 2017安装win10以后蓝牙鼠标卡顿
  16. 「创作之秋」| 参赛成员- 获奖名单(参与奖)
  17. 使用Driftnet通过Wifi Pumpkin捕获移动图像
  18. 用IntelliJ IDEA看Java类图
  19. 绷紧数据安全这根弦 数据安全法 实施参考发布
  20. 过滤文件内容(windows和Mac及ubuntu)

热门文章

  1. xp系统电脑ntp服务器,xp 设置ntp服务器
  2. ssh协议是osi_TCP/IP协议和三次握手四次挥手
  3. Tomcat怎样将配置文件放在外部
  4. 习题4-3 求分数序列前N项和 (15 分)
  5. [NC21228]货币系统
  6. 两个文件比对_Edlib:方便快速的长序列比对软件包
  7. 差分阻抗为多少_谈谈差分信号
  8. (树上启发式合并)CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
  9. SP5971 LCMSUM - LCM Sum(莫比乌斯反演 ,推柿子,经典)
  10. 解题报告:线性规划与网络流24题