Oracle表查詢

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章