Oracle之SQL查詢

1. 數據類型

數據類型 描述
VARCHAR2(size) 可變長字符數據
CHAR(size) 定長字符數據
NUMBER(p,s) 可變長數值數據
DATE 日期類型數據
LONG 可變長字符數據,最大可達到2G
CLOB 字符數據,最大可達4G
RAW and LONG RAW 裸二進制數據
BLOB 二進制數據,最大可達4G
BFILE 存儲外部文件的二進制數據,最大可達4G
ROW_ID 行地址

2. 常用數據類型

2.1 字符型

  • varchar2(n):變長字符串,n代表允許的最大字節長度,最大4000字節,例如 varchar2(8)
  • char(n):同上,定長字符串,最大2000字節,例如 char(8) ,長度不夠會填充半角空格,查詢效率高
  • clob:大字符串數據,最大4G ,默認數據在4000字節內,存儲在表段空間中,超過4000字節就會用LOB段存儲,查詢效率低

2.2 數字型

  • number:存儲整型或者浮點型,最大38位精度

  • number(n):僅存儲整數,n代表最大位數 例如number(4) -9999~9999

  • number(p,s):存儲浮點數,p代表最大精度,s代表小數位數 例如 number(6,2);

    如:Number(5,2): 123.89

123.89 NUMBER 123.89
123.89 NUMBER(3) 124
123.89 NUMBER(6,2) 123.89
123.89 NUMBER(6,1) 123.9
123.89 NUMBER(4,2) exceeds precision
123.89 NUMBER(6,-2) 100

2.3 日期型

  • date:存儲年月日時分秒,精確到秒

  • timestamp(n):時間戳,精確到納秒,n代表秒後面的位數 例如 timestamp(3)

2.4 二進制型

  • blob:大二進制數據,最大4G存儲文件,圖片等。

3. 數據庫語言分類

  • 數據查詢語言(DQL:Data Query Language
  • 數據操作語言(DML:Data Manipulation Language
  • 數據定義語言(DDL: Data Definition Language
  • 數據控制語言(DCL:Data Control Language

3.1 DDL

  • 數據定義語言
  • 作用於創建,修改,刪除,管理數據庫對象
  • 會自動提交當前事務

3.1.1 創建表

必須具備: CREATE TABLE權限;存儲空間。

CREATE TABLE [schema.]table
	    (column datatype [DEFAULT expr][, ...]);

必須指定: 表名; 列名, 數據類型, 尺寸。

實例:

CREATE TABLE dept	(deptno 	NUMBER(2),
		dname 	VARCHAR2(14),
		loc 	VARCHAR2(13) DEFAULT 'BJ') ;

3.1.2 修改表

使用 ALTER TABLE 語句可以:

  • 追加新的列
  • 修改現有的列
  • 爲新追加的列定義默認值
  • 刪除一個列

使用 ALTER TABLE 語句追加, 修改, 或刪除列的語法.

ALTER TABLE table
ADD (column datatype [DEFAULT expr] [, column datatype]...);
ALTER TABLE table
MODIFY	   (column datatype [DEFAULT expr] [, column datatype]...);
ALTER TABLE table  DROP (column);

3.1.3重命名

執行RENAME語句改變表, 視圖, 序列, 或同義詞的名稱

RENAME 原表名 TO 新表名;

3.1.4 清空表

TRUNCATE TABLE 語句 : 刪除表中所有的數據;釋放表的存儲空間。

  • TRUNCATE語句不能回滾
  • 可以使用 DELETE 語句刪除數據
TRUNCATE TABLE detail_dept;

3.1.5 用select創建表

  • 將已知表的結構和數據都複製到新表中

    create table new_dept  As select * from dept;
    
  • 只複製表的結構不復制數據

    create table new_dept  As select * from dept where 1=2;
    

3.1.6 刪除表

  • 數據和結構都被刪除

  • 所有正在運行的相關事務被提交

  • 所有相關索引被刪除

  • DROP TABLE 語句不能回滾

    DROP TABLE dept80;
    

4. DML

DML 可以在下列條件下執行:

  • 向表中插入數據
  • 修改現存數據
  • 刪除現存數據

4.1 插入數據

使用 INSERT 語句向表中插入數據。

INSERT INTO	table [(column [, column...])]
VALUES		(value [, value...]);

使用這種語法一次只能向表中插入一條數據。

4.2 更新數據

UPDATE 語句更新數據。

UPDATE		table
SET		column = value [, column = value, ...]
[WHERE 		condition];

可以一次更新多條數據。

4.3 刪除數據

使用 DELETE 語句從表中刪除數據

DELETE [FROM]	  table
[WHERE	  condition];

5. DQL

5.1 多表查詢

SELECT	table1.column, table2.column
FROM	table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2 
  ON(table1.column_name = table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2 
  ON (table1.column_name = table2.column_name)];

5.2 內連接與外連接

  • 在SQL: 1999中,內連接只返回滿足連接條件的數據。
  • 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行 ,這種連接稱爲左(或右) 外聯接。
  • 兩個表在連接過程中除了返回滿足連接條件的行以外還返回兩個表中不滿足條件的行 ,這種連接稱爲滿 外聯接。
5.2.1 左外連接
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
LEFT OUTER JOIN departments d
ON   (e.department_id = d.department_id) ;
5.2.2 右外連接
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
RIGHT OUTER JOIN departments d
ON    (e.department_id = d.department_id) ;
5.2.3 滿外連接
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
FULL OUTER JOIN departments d
ON    (e.department_id = d.department_id) ;

5.3 子查詢

SELECT last_name
FROM   employees
WHERE  salary >
               (SELECT salary
                FROM   employees
                WHERE  last_name = 'Abel');
5.3.1 注意事項
  • 子查詢要包含在括號內。
  • 將子查詢放在比較條件的右側。
  • 儘量不要在子查詢中使用ORDER BY 子句。
  • 單行操作符對應單行子查詢,多行操作符對應多行子查詢。
5.3.2 單行子查詢
  • 只返回一行。
  • 使用單行比較操作符=、>、<、<=、>=、<>
5.3.3 多行子查詢
  • 返回多行。

  • 使用多行比較操作符。

    操作符 含義
    IN 等於列表中的任何一個
    ANY 和子查詢返回的任意一個值比較
    ALL 和子查詢返回的所有值比較
5.3.4 子查詢的空值問題
SELECT emp.last_name
FROM   employees emp
WHERE  emp.employee_id NOT IN
                             (SELECT mgr.manager_id
                              FROM   employees mgr);

no rows selected
5.3.5 相關子查詢

相關子查詢按照一行接一行的順序執行,主查詢的每一行都執行一次子查詢.

SELECT last_name, salary, department_id
FROM   employees outer
WHERE  salary >(SELECT AVG(salary)
 FROM   employees
 WHERE  department_id =  
        outer.department_id)

5.4 EXISTS操作符

EXISTS 操作符檢查在子查詢中是否存在滿足條件的行
如果在子查詢中存在滿足條件的行:

  • 不在子查詢中繼續查找

  • 條件返回 TRUE

如果在子查詢中不存在滿足條件的行:

  • 條件返回 FALSE

  • 繼續在子查詢中查找

SELECT employee_id, last_name, job_id, department_id
FROM   employees outer
WHERE  EXISTS ( SELECT 'X'
                 FROM   employees
                 WHERE  manager_id = 
                        outer.employee_id);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章