Oracle學習筆記(二):基本SELECT語句

對於SQL 語言來講,最強大的莫過於SELECT 語言

1,FROM字句(這是最簡單的)

SQL> SELECT e.empno "僱員編號", e.ename "僱員名稱" , e.hiredate "受僱日期", e.de
ptno "部門編號"
  2  FROM emp e ;

  僱員編號 僱員名稱   受僱日期         部門編號
---------- ---------- -------------- ----------
      7369 SMITH      17-12月-80             20
      7499 ALLEN      20-2月 -81             30
      7521 WARD       22-2月 -81             30
      7566 JONES      02-4月 -81             20
      7654 MARTIN     28-9月 -81             30
      7698 BLAKE      01-5月 -81             30
      7782 CLARK      09-6月 -81             10
      7788 SCOTT      19-4月 -87             20
      7839 KING       17-11月-81             10
      7844 TURNER     08-9月 -81             30
      7876 ADAMS      23-5月 -87             20
      7900 JAMES      03-12月-81             30
      7902 FORD       03-12月-81             20
      7934 MILLER     23-1月 -82             10

已選擇14行。
2,WHERE語句
SQL> SELECT e.empno "僱員編號", e.ename "僱員名稱", e.hiredate "受僱日期", e.dep
tno "部門編號"
  2  FROM emp e WHERE e.empno>=1900 ;

  僱員編號 僱員名稱   受僱日期         部門編號
---------- ---------- -------------- ----------
      7369 SMITH      17-12月-80             20
      7499 ALLEN      20-2月 -81             30
      7521 WARD       22-2月 -81             30
      7566 JONES      02-4月 -81             20
      7654 MARTIN     28-9月 -81             30
      7698 BLAKE      01-5月 -81             30
      7782 CLARK      09-6月 -81             10
      7788 SCOTT      19-4月 -87             20
      7839 KING       17-11月-81             10
      7844 TURNER     08-9月 -81             30
      7876 ADAMS      23-5月 -87             20
      7900 JAMES      03-12月-81             30
      7902 FORD       03-12月-81             20
      7934 MILLER     23-1月 -82             10

已選擇14行。

3,WHERE語句的作用主要是指定檢索條件

WHERE條件中可以使用的操作符

= 等於
<>,!= 不等於
>= 大於等於
<= 小於等於
> 大於
< 小於
ANY 與列表中的任何值進行比較
ALL 與列表中的所有值進行比較
BETWEEN 指定的兩個值之間,包括邊界值
LIKE 匹配的字符樣式,一般用於模糊查詢
IN 匹配的一個列表值
IS NULL 匹配空值

ALL ANY 操作符

~注:ALL與ANY的區別:
ANY是指列表中每一個值進行比較,只需要滿足列表中的其中一個條件就可以輸出
ALL是值列表中的所有的值進比較,必須滿足所有條件纔可以

SQL> SELECT empno FROM emp
  2  WHERE empno > ANY (7788 , 7800 , 7900) ;

     EMPNO
----------
      7839
      7844
      7876
      7900
      7902
      7934

已選擇6行。

SQL> SELECT empno FROM emp
  2  WHERE empno > ALL (7788 , 7800 , 7900) ;

     EMPNO
----------
      7902
      7934

IN 操作符
檢索列表中的數據,進行匹配。

SQL> SELECT empno FROM emp
  2  WHERE empno  IN (7788 , 7800 , 7900) ;

     EMPNO
----------
      7788
      7900

In與ANY 與ALL的不同是,IN只是匹配,沒有進行比較

BETWEEN操作符:

a BETWEEN b and c 的作用相當於a<=b and a>=c

SQL> SELECT empno FROM emp WHERE empno BETWEEN 7000 AND 7500 ;

     EMPNO
----------
      7369
      7499

SQL> SELECT empno FROM emp WHERE empno >= 7000 AND empno <= 7500 ;

     EMPNO
----------
      7369
      7499

LIKE 操作符
下劃線(_):匹配指定位置的一個字符
百分號(%):匹配從指定位置開始的任意個字符      

下面我們嘗試在scott.emp查詢ename第三個字母爲O的人的名字:

     

SQL> SELECT ename FROM emp WHERE ename LIKE '__O%' ;

ENAME
----------
SCOTT


主要用於模糊查詢

4,ORDER BY字句

SQL> SELECT ename FROM emp ORDER BY ename DESC ;

ENAME
----------
WARD
TURNER
SMITH
SCOTT
MILLER
MARTIN
KING
JONES
JAMES
FORD
CLARK

ENAME
----------
BLAKE
ALLEN
ADAMS

已選擇14行。

#DESC爲降序,由大到小;ASC爲升序,由小到大;

5,GROUP BY子句

使用GROUP BY語句,可以根據表中的某一列或某激烈對錶中的數據進行分組,多個列之間用逗號隔開。若進行多列分組,Oracle會對第一列進行分組,然後在分出來的組按第二列再進行分組。
 GROUP BY clause must contain only aggregates or grouping columns.    (Oracle文檔)
 
 必須含有聚合函數和Group by右面的是前面所選的列,聚合函數根據Group所返回的結果進行計算

這裏是只分一組的情況

SQL>  SELECT deptno AS "部門編號" ,COUNT(*) AS "員工人數"  --查詢scott用戶表中每一個部門的員工號
  2  FROM emp GROUP BY deptno ;

  部門編號   員工人數
---------- ----------
        30          6
        20          5
        10          3

分兩組的情況:

SQL> select deptno ,job from emp group by job , deptno ;

    DEPTNO JOB
---------- ---------
        20 MANAGER
        10 PRESIDENT
        10 CLERK
        30 SALESMAN
        20 ANALYST
        30 MANAGER
        10 MANAGER
        30 CLERK
        20 CLERK

已選擇9行。


~注:我們可以嘗試這樣理解GROUP BY字句:當被分組的列只有一列時,被分組的列把相同的數據合併,就像Java裏面的List與Set,把List轉化爲Set的時候,相同的數據去掉。返回的結果就是這個Set的值。

這也可以解釋爲什麼“沒有使用聚合函數的列,必須出現在 group by 後面“,否則分組之後,未分組的數據與分組的數據將形成一對多的關係,如上面的關係,deptno=10的數據有很多行,而同時對應的其他列的數據

卻有很多行。當被分組的列有多列時,我們把之前分好組的數據當成是一個表,再進行類似的分組方法,最後輸出全部的分組結果:

deptno=10是分好的一組,我們把它看成是一個表,再對job分組,就如上面所示,

SQL> SELECT deptno ,job FROM emp WHERE DEPTNO = 10 ;

    DEPTNO JOB
---------- ---------
        10 MANAGER
        10 PRESIDENT
        10 CLERK

6,HAVING字句

HAVING語句:
HAVING字句經常與GROUP BY 字句一起用,完成統計後,再對分組的結果進行篩選結果

SQL> SELECT deptno AS "部門編號" ,COUNT(*) AS "員工人數"
  2  FROM emp GROUP BY deptno
  3  HAVING COUNT(*)>3 ;

  部門編號   員工人數
---------- ----------
        30          6
        20          5


#綜:如果再SELECT語句中同時包含GROUP BY , HAVING , ORDER BY三個字句,那麼這些字句在SELECT語句中出現的順序應爲:GROUP BY , HAVING , ORDER BY;


7,DISTINCT關鍵字

DISTINCT關鍵字
用來限定在檢索結果中顯示不重複的數據
對於重複值,只顯示一個。如果不指定將默認使用ALL

SQL> select distinct deptno from emp ;

    DEPTNO
----------
        30
        20
        10

SQL> select all deptno from emp ;

    DEPTNO
----------
        20
        30
        30
        20
        30
        30
        10
        20
        10
        30
        20
        30
        20
        10

已選擇14行。

~注:Distinct的用法過程:select查詢結果,再把相同的合併,有點類似於集合的唯一性特點。


對Oracle SQL查詢的基本知識就總結到這裏,可能會有很多問題,希望有讀者可以指出。


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