MySQL基础篇:子查询
文章目录
- 概述
- 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基础篇:子查询相关推荐
- SQL Server 调优系列基础篇 - 子查询运算总结
前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...
- MYSQL基础八--子查询和连接
1.子查询是出现在其他SQL语句内的SELECT子句. 子查询指嵌套在查询内部,且必须始终出现在圆括号内. 子查询可以包含多个关键字或条件,如DISTINCT,GROUP BY,ORDER BY,LI ...
- mySQL基础之子查询
进阶7:子查询 含义:出现在其他语句中的select语句,称为子查询或内查询外部的查询语句,称为主查询或外查询 分类:按子查询出现的位置:SELECT后面:仅仅支持标量子查询FROM后面:支持表子查询 ...
- MySQL基础篇 | 连接查询、子查询(嵌套)
✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步!
- 最全MySQL基础篇
文章目录 导入表的问题 第三章_最基本的SELECT语句 1. SQL语言的规则和规范 1) 基本规则 2) SQL大小写规范(建议遵守) 3) 注释 4) 命名规则 2. 基本的SELECT语句 1 ...
- MySQL基础篇——第11章 DML(数据操作):增删改
MySQL基础篇--第11章 DML(数据操作):增删改 1. 插入数据(增) INSERT INTO ... 使用 INSERT INTO 语句向表中插入数据(记录) 1.1 方式1:VALUES ...
- MySQL——基础篇
MySQL--基础篇 一.数据库的相关概念 数据库(database) 保存有组织的数据的容器(通常是一个文件或一组文件). 表(table) 某种特定类型数据的结构化清单. 模式(schema) 关 ...
- mysql 基础篇(二) 账号、权限管理
mysql 基础篇(二) 账号.权限管理.备份与还原 建立账号密码: Grant all on test.* to "cj"@"localhost" ident ...
- Mysql基础篇(1)—— 基础概念、DML基本语法和表连接
前言 Mysql基础篇相关的内容是看了康师傅的视频做的笔记吧 数据库相关概念 DB: 数据库(Database) 存储数据的仓库,本质是一个文件系统.它保存了一系列有组织的数据. DBMS:数据库 ...
最新文章
- python androidhelper 语音识字_Android语音播报、后台播报、语音识别
- nvm 下载node 下载不下来_一键下载网页所有图片,把美丽存下来
- Java-NIO(九):管道 (Pipe)
- 探秘重编译(Recompilations)(1/2)
- Java 对象锁和类锁全面解析
- 自定义编译gdal库
- spring boot二:搭建环境
- linux-basic(8)linux磁盘与文件系统管理
- leetcode107. 二叉树的层次遍历 II
- 下拉选择框 其他_列表框 vs 下拉列表,哪个更好?
- linux git ssh_Git年满13岁,可以了解Linux和SSH命令,Python编程等等
- 终于搞懂了Java 8 的内存结构,再也不纠结方法区和常量池了!!
- [转]Mysql FROM_UNIXTIME as UTC
- 解决Emacs输出PDF文件时Tex缺少.sty文件的方法
- 苹果电脑win10蓝牙音响卡顿_Macbook Pro 2017安装win10以后蓝牙鼠标卡顿
- 「创作之秋」| 参赛成员- 获奖名单(参与奖)
- 使用Driftnet通过Wifi Pumpkin捕获移动图像
- 用IntelliJ IDEA看Java类图
- 绷紧数据安全这根弦 数据安全法 实施参考发布
- 过滤文件内容(windows和Mac及ubuntu)
热门文章
- xp系统电脑ntp服务器,xp 设置ntp服务器
- ssh协议是osi_TCP/IP协议和三次握手四次挥手
- Tomcat怎样将配置文件放在外部
- 习题4-3 求分数序列前N项和 (15 分)
- [NC21228]货币系统
- 两个文件比对_Edlib:方便快速的长序列比对软件包
- 差分阻抗为多少_谈谈差分信号
- (树上启发式合并)CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
- SP5971 LCMSUM - LCM Sum(莫比乌斯反演 ,推柿子,经典)
- 解题报告:线性规划与网络流24题