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;
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查詢的基本知識就總結到這裏,可能會有很多問題,希望有讀者可以指出。