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