135 MySQL子查询

[TOC]

一、子查询的概念

将一条sql语句执行的结果作为另一个sql语句的条件

二、子查询的规则

1# 以下是基于对表的增删改查操作的 21.增数据时: insert into 表名 select 子查询 3注解: 对一个表插入数据时,插入的数据可以是另外一个sql语句查询结果,但是首先要创建这个表 4 52.删除数据时: delete from 表名 条件是 select子查询(表不能与delete表相同) 6注解: 删除一个表的某些数据时,他的条件是另一个sql查询语句结果 7 83.: select 字段 from 表 条件是select子查询 9注解: 查询一个表的数据的条件是一个sql语句的执行结果 10 114.: update 表 set 字段=条件是select子查询(表不能与update表相同) 12注解: 更新一个表的数据,他的条件是另一个sql语句的执行结果

三、子查询的实例

1# 数据来源:在单表emp下 2# 此处显示emp的数据 3mysql> select * from emp; 4+----+------+------+------+--------+--------+-----------+-----------+ 5| id | name | sex | age | salary | area | addr | dep | 6+----+------+------+------+--------+--------+-----------+-----------+ 7| 1 | aaa || 42 | 10.5 | 上海 | 浦东 | 教职部 | 8| 2 | bbb || 38 | 9.4 | 山东 | 济南 | 教学部 | 9| 3 | ccc || 30 | 3 | 江苏 | 张家港 | 教学部 | 10| 4 | ddd || 28 | 2.4 | 广州 | 广东 | 教学部 | 11| 5 | eee || 28 | 2.4 | 江苏 | 苏州 | 教学部 | 12| 6 | fff || 18 | 8.8 | 中国 | 黄浦 | 咨询部 | 13| 7 | ggg || 18 | 8.8 | 安徽 | 宣城 | 教学部 | 14| 8 | hhh || 28 | 9.8 | 安徽 | 巢湖 | 教学部 | 15| 9 | iii || 36 | 1.2 | 安徽 | 芜湖 | 咨询部 | 16| 10 | jjj || 36 | 5.8 | 山东 | 济南 | 教学部 | 17| 11 | kkk || 28 | 1.2 | 山东 | 青岛 | 教职部 | 18| 12 | lll || 30 | 9 | 上海 | 浦东 | 咨询部 | 19| 13 | mmm || 30 | 6 | 上海 | 浦东 | 咨询部 | 20| 14 | nnn || 30 | 6 | 上海 | 浦西 | 教学部 | 21| 15 | ooo || 67 | 2.501 | 上海 | 陆家嘴 | 教学部 | 22+----+------+------+------+--------+--------+-----------+-----------+

3.1 案例(基于emp表)

1# 题目:每个部门最高薪资的那个人所有信息 2 31.先创建一个子查询sql(对emp表的部门进行分组,查询每个部门的最高薪资) 4select dep,max(salary) from emp group by dep; 5mysql> select dep,max(salary) from emp group by dep; 6+-----------+-------------+ 7| dep | max(salary) | 8+-----------+-------------+ 9| 咨询部 | 9 | 10| 教学部 | 9.8 | 11| 教职部 | 10.5 | 12+-----------+-------------+ 13 142.查操作:通过子查询去进行对emp数据的查找(将子查询作为查询每个部门工资最高的员工的所有信息) 15select * from emp where (dep,salary) in (select dep,max(salary) from emp group by dep); 16mysql> select * from emp where (dep,salary) in (select dep,max(salary) from emp group by dep); 17+----+------+------+------+--------+--------+--------+-----------+ 18| id | name | sex | age | salary | area | addr | dep | 19+----+------+------+------+--------+--------+--------+-----------+ 20| 1 | aaa || 42 | 10.5 | 上海 | 浦东 | 教职部 | 21| 8 | hhh || 28 | 9.8 | 安徽 | 巢湖 | 教学部 | 22| 12 | lll || 30 | 9 | 上海 | 浦东 | 咨询部 | 23+----+------+------+------+--------+--------+--------+-----------+ 24 25 263.增加数据操作:通过子查询去对一张表进行增加数据操作 27 1.首先是先创建一张空表 28 create table t1(dep_name varchar(64), max_salary decimal(5,2)); 29 2.将子查询的结果作为数据添加到t1表里(将子查询的sql语句直接作为t1表的插入数据) 30 insert into t1 select dep,max(salary) from emp group by dep; 31 mysql> select * from t1; 32 +-----------+------------+ 33 | dep_name | max_salary | 34 +-----------+------------+ 35 | 咨询部 | 9.00 | 36 | 教学部 | 9.80 | 37 | 教职部 | 10.50 | 38 +-----------+------------+ 39 3.完成上述题目的需求(查出每个部门中薪资最高的员工的姓名,部门,工资) 40 select name,dep_name,salary from emp join t1 on emp.dep=t1.dep_name and 41 emp.salary=t1.max_salary; 42 mysql> select name,dep_name,salary from emp join t1 on emp.dep=t1.dep_name and 43 emp.salary=t1.max_salary; 44 +------+-----------+--------+ 45 | name | dep_name | salary | 46 +------+-----------+--------+ 47 | aaa | 教职部 | 10.5 | 48 | lll | 咨询部 | 9 | 49 +------+-----------+--------+ 50 51 524.更新操作:给(update更新的表不能 与 子查询select的表同表) 53 1.给每个部门最大薪资+1 54 update t1 set max_salary=max_salary+1; 55 mysql> select * from t1; 56 +-----------+------------+ 57 | dep_name | max_salary | 58 +-----------+------------+ 59 | 咨询部 | 10.00 | 60 | 教学部 | 10.80 | 61 | 教职部 | 11.50 | 62 +-----------+------------+ 63 64 2.给t1额外增加一个新部门 65 insert into t1 values ('打杂部', 100); 66 mysql> select * from t1; ); 67 +-----------+------------+ 68 | dep_name | max_salary | 69 +-----------+------------+ 70 | 咨询部 | 10.00 | 71 | 教学部 | 10.80 | 72 | 教职部 | 11.50 | 73 | 打杂部 | 100.00 | 74 +-----------+------------+ 75 76 3.修改t1表中的最大工资+1,条件是他的部门必须存在于emp表中的dep_anme中(修改的条件是一个子查询) 77 update t1 set max_salary=max_salary+1 where dep_name in (select distinct dep from 78 emp); 79 mysql> select * from t1; 80 +-----------+------------+ 81 | dep_name | max_salary | 82 +-----------+------------+ 83 | 咨询部 | 11.00 | 84 | 教学部 | 11.80 | 85 | 教职部 | 12.50 | 86 | 打杂部 | 100.00 | 87 +-----------+------------+ 88 89 4.错误:update更新的表 与 子查询select的表 相同 90 update t1 set max_salary=max_salary+1 where dep_name in (select distinct dep_name 91 from t1); 92 93 945.删除操作:删除t1表中部门在emp中也有的部门 95delete from t1 where dep_name in (select distinct dep from emp); 96# 错误: delete删除的表 与 子查询select的表 相同 97delete from t1 where dep_name in (select distinct dep_name from t1);
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

sql注入

反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''