SQL——子查询

文章详细介绍了SQL中的子查询概念,包括WHERE子句中的子查询用于筛选高于平均工资的员工,FROM子句中的子查询用于获取每个部门的平均薪资并结合薪资等级,SELECT子句中的子查询用于显示员工名及其所在部门名。此外,还讨论了何时使用子查询而非多表连接的情况,例如统计选修特定课程的学生的选课门数和平均成绩。
摘要由CSDN通过智能技术生成

在SQL语言中,一个SELECT-FROM-WHERE语句 称为一个查询块。

子查询(或内层查询)是一个 SELECT 查询,它嵌套在

(1)SELECT、UPDATE、INSERT、DELETE 语句的  WHERE

(2)带GROUP BY 的 HAVING 子句内,

(3)或其它子查询中

 (与比较(6个)或逻辑(3个)运算符一起构成查询条件) 子查询的 SELECT 查询总是使用圆括号括起来

(从语法上讲,子查询就是一个用括号括起来的特殊“条件”,它完成的是关系运算,因此,子查询可以出现在允许表达式出现的地方)

1 where嵌套子查询

查询高于平均工资的员工信息。

1:先查询平均工资

mysql> select avg(sal) from emp;
+-------------+
| avg(sal)    |
+-------------+
| 2073.214286 |
+-------------+

2:查询高于平均工资

select * from emp 
where sal > (select avg(sal) from emp);

2 from 嵌套子查询

查询每个部门平均薪资的薪资等级。 

1:查找每个部门的平均薪水,当作临时表t

mysql> select deptno,avg(sal) as avgsal from emp group by deptno;
+--------+-------------+
| deptno | avgsal      |
+--------+-------------+
|     20 | 2175.000000 |
|     30 | 1566.666667 |
|     10 | 2916.666667 |
+--------+-------------+

2:将t表和salgrade表连接,条件(t.avgsal between s.losal and s.hisal)

select 
    t.*,s.grade
from
    (select deptno,avg(sal) as avgsal from emp group by deptno) t
join
    salgrade s
on
    t.avgsal between s.losal and s.hisal;

3 select 嵌套子查询

查询每个员工所在部门的部门名称,显示员工名和部门名.

emp表中ename对应的depnto,dept表中的deptno对应dname

select 
    e.ename,(select d.dname from dept d where e.deptno=d.deptno) as dname
from 
    emp e;

多表连接查询 

select 
    e.ename,d.dname
from
    emp e
join
    dept d
on
    e.deptno=d.deptno;

例56:统计选修了“VB”课程的这些学生的选课门数和平均成绩。

SELECT 
    SNO 学号, count(*) 选课门数,AVG(GRADE) 平均成绩          
from 
    sc 
where  
    sno 
in 
    (Select sno from sc join course c On c.cno=sc.cno Where cname='vb')
Group by 
    sno 

不能用多表连接(当查询需分步骤时,只能用子查询.即查询 目标列来源于一张表,但涉及统计函数且条件来源于它表时用子查询而非多表连接):

#  (结果错误)
select sno 学号, count(*) 选课门数 , avg(grade) 平均成绩
from
    sc 
join 
    course c 
on
    c.cno=sc.cno
where 
    cname='vb'
group by 
    sno;                           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值