Oracle數據庫 總結

SELECT * FROM TABLE;

SELECT DISTINCT COLUMN FROM TABLE;

SELECT * FROM emp WHERE empno IN(1, 2, 3);

  1. 在IN之中使用NULL——現在沒有任何的影響,
  2. 在NOT NULL之中使用NULL——不滿足的原因是數據庫自身的保護機制,避免大數據所帶來的問題。

SELECT * FROM emp WHRER ename LIKE “A%”;

“_”:匹配任意一個字符, “%”:匹配0個、1個或多個任意字符。

SELECT * FROM emp ORDER BY sal ASC(默認); \ DEAS;

在數據量大的時候絕對不要採用多表查詢,而且就算是數據量小,也別用多表查詢。

COUNT(*):會實際的統計出表的數據量;

COUNT(字段):如果統計的字段上不包含有null,那麼與COUNT(*)結果相同;如果統計的字段上包含有null,null不參與統計;

COUNT(DISTINCT 字段):消除掉重複數據後的統計

執行順序:

SELECT  [DISTINCT] *| 列名稱  [別名 ] ,  列名稱 [別名 ] ,.... | 統計函數 ?  5、確定查詢列
FROM FROM 數據表 [別名 ] ,數據表 [別名 ]... ?                              1、數據來源
[WHERE 條件 (s)]?                                                         2、過濾數據行
[GROUP BY 分組字段,分組字段 ,...] ?                                        3、執行分組操作
[HAVING 分組後過濾]                                                       4、針對分組後的數據過濾
[ORDER BY 字段[ASC | DESC], 字段[ASC | DESC],...]                         6、數據排序

SELECT job, AVG(sal), MAX(sal), MIN(sal), COUNT(*)
FROM emp
GROUP BY job;

提示:關於統計查詢的幾個重要說明,
以上的代碼只是根據基礎語法實現了統計的操作,但是在整個操作之中還會存在有三個顯示:
1. 限制一:統計函數單獨使用時(沒有GROUP By字句)只能夠出現統計函數,不能夠出現吉他字段
2. 限制二:使用統計查詢時(存在GROUP BY 字句),SELECT子句之中之允許出現統計函數與字段,
3. 限制三:統計函數在分組之中可以嵌套使用,但是嵌套之後的統計查詢之中,SELECT子句中不循序再出現任何的字段,包括分組字段。

WHERE子句:是在分組前使用,而且不能夠使用統計函數進行驗證,經過WHERE篩選後的數據纔可以分組;

HAVING子句:必須結合GROUP BY 子句一起出現,是在分組後的過濾,可以使用統計函數。

關於子查詢的時候,給出一些參考方式,供選擇(95%的問題都可以解決):

子查詢返回單行單列:HAVING、WHERE
子查詢返回多行單列:WHERE
子查詢返回多行多列:FROM

子查詢返回單行列

要求統計出所有高於公司平均工資的全部僱員信息
SELECT AVG(sal)FROM emp WHERE sal>(
SELECT AVG(sal) FROM emp);

子查詢返回單行多列(瞭解)

SELECT * FROM emp WHERE (hiredate, sal)=(
SELECT MIN(hiredate), MIN(sal) FROM emp);
SELECT * FROM emp WHERE (sal,job)=(
SELECT sal, job FROM emp WHERE name='SCOTT')
AND ename <> 'SCOTT';

子查詢返回多行單列 IN

SELECT * FROM emp WHERE sal IN(
SELECT sal FROM emp WHERE job='MANAGER');

SELECT * FROM emp WHERE sal NOT IN (
SELECT sal FROM emp WHERE job='MANAGER');

此時 有一個需要注意的小問題了:在使用 NOT IN的時候子查詢之中必須不能包含 null ,否則不會有任何數據返回。

  • =ANY: 此功能與IN操作完全一樣
  • >ANY: 比子查詢的最小值要大

實現方法一:利用多表查詢

SELECT d.deptno, d.dname, d.loc, COUNT(e.empno), AVG(e.sal)
FROM emp e, dept d
WHERE e.deptno(+)= d.deptno
GROUP BY d.deptno, d.dname, d.loc;

實現方法二:採用子查詢完成

SELECT d.deptno, d.dname, d.loc, temp.cout, temp,avg
FROM dept d,(
SELECT deptno, COUNT(empno), AVG(sal) 
FROM emp
GROUP BY deptno)temp
WHERE d.deptno=temp.deptno(+);


  1. LEFT JOIN或LEFT OUTER JOIN

左向外聯接的結果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均爲空值。

  • RIGHT JOIN 或 RIGHT OUTER JOIN
    右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將爲左表返回空值。

  • Oracle 僞列ROWNUM ROWID

    約束
    CONSTRAINT uk_email UNIQUE(email)

    CONSTRAINT pk_mid PRIMARY KEY(mid)

    CONSTRAINT ck_age CHECK(age BETTWEEN 0 AND 250)
    一般不這麼用,在程序裏檢查

    CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid)

    序列:Oracle實現序列

    CREATE SEQUENCE 序列名稱
    * 取得序列下一個增長數據(每次調用序列值都增長制定的步長):序列.nextval
    * 取得序列當前數據(每次調用序列值都不會增長):序列.currval
    在使用currval之前一定要首先使用nextval 不然會報錯 CURRVAL尚未在此會話中定義
    實際上當用戶每次進行數據增長控制的時候,LAST_NUMBER 都表示已經處理完的一批序列內容,
    噹噹前序列的數值等於了LAST_NUMBER數據時,那麼會自動再增加指定個”CACHE” 大小的序列
    但是有序數據有存在緩存的問題,所以當數據庫重新啓動之後,那麼所操作的序列就可能出現調好的情況。
    如果想要避免調好的問題出現,那麼最簡單的做法是取消緩存,使用NOCACHE表示
    * INSERT INTO matab(mid, title) VALUES(myseq.nextval, ‘JAVA’);

    瞭解就行

    增加表約束
    ALTER TABLE 表名稱 ADD CONSTRAINT 約束名稱 約束類型(約束名稱)[選項]
    ALTER TABLE member ADD CONSTRAINT pk_mid PRIMARY KEY(mid)
    
    刪除約束
    ALTER TABLE 表名稱 DROP CONSTRAINT 約束名稱
    ALTER TABLE member DROP CONSTRAINT pk_mid
    

    視圖不是真實數據,而是真實數據的映射。 不要做查詢以外的操作

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