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');