杭州10期旷李明 发表于 2021-8-14 21:08:49

mysql之子查询

mysql之子查询
定义:一个查询嵌套另一个查询
案例:
请:求出IT技术部门的姓名和员工编号?
it部门                     dept   中的dept_name
name   sid                emp表
内连接(先合表在根据条件查询):select   name,sidfromdeptinnerjoin   empondept1=dept2where dept_name="IT技术";
子查询案例:selectname,sid from   empwhere dept2=(selectdept1from deptwhere dept_name="IT技术" )
========================================================================
子查询分类:
1、标量子查询
2、列子查询
3、行子查询
4、表子查询
1、标量子查询(返回一个值)
标量子查询 把一个sql执行返回的一个值,作为另一sql执行的一个条件,得到的结果是一行一列,一般出现在where 之后
案例:
selectdept1from deptwhere dept_name="IT技术" ;
标量子查询:selectname,sid from   empwhere dept2=(selectdept1from deptwhere dept_name="IT技术" )
========================================================================
C:\Users\l1774\AppData\Local\YNote\data\weixinobU7VjrfpVh6PoJ9DxQOzizgtyRg\c4badc6a0b514055abbd1b567839fd86\a1076f45cabc.png

注意点:标量子查询允许使用符号:= ,!=(不等于),>,<, >=,<=,<> (不等于)
========================================================================
2、列子查询(返回一个列)
定义:返回的是一列值
注意:通常在where 条件后使用,in或not in   ,不能使用=,<,>等比较运算符。
案例:   selectdept1from deptwhere dept_name="财务"or dept_name="IT技术" ;
            selectname,sid from   empwhere dept2in (selectdept1from deptwhere dept_name="财务"or dept_name="IT技术")
C:\Users\l1774\AppData\Local\YNote\data\weixinobU7VjrfpVh6PoJ9DxQOzizgtyRg\3293e2602b274399a20557a10b98bff2\30289cddac49.png

C:\Users\l1774\AppData\Local\YNote\data\weixinobU7VjrfpVh6PoJ9DxQOzizgtyRg\1d50fe09abe348c4b2306beb5fb8d5a1\9f329a548d9f.png
========================================================================
3、行子查询:(返回一行多列)
指子查询返回的结果集是一行多列,一般出现在where后面
案例:selectage,incoming fromemp where name="马十二" ;
select* from   empwhere (age,incoming) =any (selectage,incoming fromemp where name="马十二" )

select* from   empwhere (age,incoming) in (selectage,incoming fromemp where name="马十二" )
C:\Users\l1774\AppData\Local\YNote\data\weixinobU7VjrfpVh6PoJ9DxQOzizgtyRg\ec3570c07d7e4dc8a6b5c791400c4e85\3cc9d0a278d3.png
C:\Users\l1774\AppData\Local\YNote\data\weixinobU7VjrfpVh6PoJ9DxQOzizgtyRg\90bb43fd82564926a3a717538d4fb44e\57bcdd52acb9.png

C:\Users\l1774\AppData\Local\YNote\data\weixinobU7VjrfpVh6PoJ9DxQOzizgtyRg\1d50fe09abe348c4b2306beb5fb8d5a1\9f329a548d9f.png
========================================================================
4、表子查询(重点)(返回一个表)
一般都是接from后面
select * fromdept,emp where dept1=dept2 ;
selectname,sid from( select * fromdept,emp where dept1=dept2)s where age=64;
临时表:给表取一个别名   聚合函数 最好取别名


===================================================
案例:求财务部门的收入总和;
解法一:
子查询方法:selectsum(incoming) fromempwhere dept2=(selectdept1fromdept where dept_name="财务") ;

解法二:
SELECT SUM(incoming)   FROM dept inner joinempondept.dept1=emp.dept2 WHERE dept_name="财务";
解法三:
select sum(s.incoming) from(select*fromemp ,deptwhere dept1=dept2)s where dept_name="财务" ;

页: [1]
查看完整版本: mysql之子查询