Oracle中的一些细节问题

本文探讨了SQL中的子查询应用,包括按部门统计员工人数的正确语法,以及使用ANY和ALL关键字进行多行子查询的方法。同时,文章纠正了常见的错误,如在GROUP BY子句中不当使用列名,以及WHERE语句中错误地使用逗号代替AND运算符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子语句查询列名

例:

--按部门统计各部门员工人数,要求显示部门号,部门名,人数,并按照降序排列
select 
d.deptno,count(e.empno),d.dname
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno,d.dname
order by count(e.empno) desc
;

运行显示:不是GROUP BY表达式

原因:
select子语句后面出现的列名要么出现在聚合函数中,要么出现在group by后
正确方式:将d.dname放到group by后

--按部门统计各部门员工人数,要求显示部门号,部门名,人数,并按照降序排列
select 
d.deptno,count(e.empno)
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno,d.dname
order by count(e.empno) desc
;

ANY和ALL

例:

--查询工资比20号部门【任意any】一个员工工资【低<】的员工信息(多行子查询,使用any关键字) 
select sal from emp where deptno=20;

select *
from emp
where 
sal < any
(
 select sal from emp where deptno=20
);

ANY:在oracle中代表小于最大的
ALL:在oracle中代表小于最小的

查询工资比20号部门【所有all】员工【低<】的员工信息(多行子查询,使用all关键字) 
select *
from emp
where 
sal < all
(
 select sal from emp where deptno=20
);

AND和“ ,”

例:

--查询每个员工编号,姓名,部门名,工资等级
select
e.empno,e.ename,d.dname,s.grade
from emp e,salgrade s,dept d
where e.sal between s.losal and s.hisal,e.deptno=d.deptno
;

运行显示:不是GROUP BY表达式

原因:where语句中连接条件不能使用“,”,应使用and

--查询每个员工编号,姓名,部门名,工资等级
select
e.empno,e.ename,d.dname,s.grade
from emp e,salgrade s,dept d
where e.sal between s.losal and s.hisal and e.deptno=d.deptno
;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值