1. 处理null值
处理 null 值,可以使用 nvl 函数,nvl(comm, 0) 如果 comm 为空,用 0 代替,否则就是 comm。
例:显示每个雇员的年工资
select sal*12 + nvl(comm, 0)*12 "年工资", ename, comm from emp;
2. 连接字符串||
例:select ename || 'is a' || job from emp;
3. 使用like操作符
%:表示 0 到多个字符。 _:表示任意单个字符。
例:显示首字符为 S 的员工姓名和工资。
select ename, sal from emp where ename like 'S%';
例:显示第三个字符为大写 O 的所有员工姓名和工资。
select ename, sal from emp where ename like '__O';
4. 在where字句中使用in
例:如何显示 empno 为 7844,7839,7788 的雇员。
select * from emp where empno in (7844, 7839, 7788);
5. 使用order by排序
例:按照工资从低到高的顺序显示雇员的信息。
select * from emp order by sal;
例:按照部门号升序而雇员工资降序输出雇员。
select * from emp order by deptno, sal desc;
6. 数据分组:max、min、avg、sum、count
例:显示所有员工中的最高工资和最低工资。
select max(sal), min(sal) from emp;
例:显示最高工资的雇员。
错误写法:select ename, sal from emp where sal=max(sal);
正确写法:select ename, sal from emp where sal=(select max(sal) from emp);
易错:select ename, max(sal) from emp; 这个语句执行时会报错,说非单组分组函数。因为 max 是分组函数,而 ename 不是分组函数,但是 select min(sal), max(sal) from emp; 该语句是对的,因为 min 和 max 都是分组函数。
所以,如果列里面有一个分组函数,那么每列都必须是分组函数,否则会出错。
7. group by和having子句
(1). group by:用于对查询的结果分组统计。
(2). having 子句:用于限制分组显示结果。
例:如何显示每个部门的平均工资和最高工资?
select avg(sal), max(sal), deptno from emp group by deptno;
例:显示每个部门的每种岗位的平均工资和最低工资。
select avg(sal), max(sal), deptno from emp group by deptno, job;
例:显示平均工资低于 2000 的部门号和它的平均工资。
select deptno, avg(sal) from emp group by deptno having avg(sal)<2000;
(3). 对数据分组的总结:
a. 分组函数只能出现在选择列、having、order by 子句中。
b. 如果在 select 语句中同时包含有 group by、having、order by 子句,那么它们的顺序是 group by、having、order by。
c. 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在 group by 子句中,否则会出错。
8. 多表查询
(1). 多行子查询:指返回多行数据的子查询。
在多行子查询中使用all操作符
例:如何显示工资比部门 30 的所有员工的工资高的员工姓名、工资和部门号?
select ename, sal, deptno from emp where sal > all (select sal from emp where deptno=30);
在多行子查询中使用any操作符
例:如何显示工资比部门 30 的任意一个员工的工资高的员工姓名、工资和部门号?
select ename, sal, deptno from emp where sal > any (select sal from emp where deptno=30);
(2). 多列子查询:指返回多个列数的子查询语句。
例:如何查询smith的部门和岗位完全相同的所有雇员。
select * from emp where (job, deptno)=(select job, deptno from emp where ename='SMITH');