Oracle數據庫學習整理【原創】

一、select語句

  1. 日期和數值型字段可以進行加減乘除

  2. 關于NULL
    NULL表示不可用,未賦值,不知道,不適用,所以它既不是0,也不是空格。NULL和數值進行四則運算,結果是NULL。

  3. 字符串連接符:“||”

  4. 去除重復行:“distinct”

二、條件和限制

  1. 比較操作符
比較操作符 意義
=          等于
>          大于
>=         大于等于
<          小于
<=         小于等于
<>         不等于
BETWEEN ..AND..  在兩個值之間
IN(set)     在一個集合范圍內
LIKE       匹配一個字符串樣子,可以使用%通配符
  1. 使用like進行模糊匹配
    可使用% 或者_ 作為通配符:%代表 0個或者多個字符;而 _代表一個單個字符。

如果要是查找有%的記錄,使用關鍵字escape
舉例:
select * from t_char where a like '%\%%' escape '\';

  1. 邏輯操作符
邏輯操作符 意義
AND 所有條件都滿足,返回TRUE
OR 只要有一個條件滿足,返回TRUE
NOT 如果條件是FALSE,返回TRUE
  1. 排序:“order by
  • asc 升序
  • desc 降序

三、單行函數

1.大小寫轉換函數

函數 結果
LOWER('SQL Course') sql course
UPPER('SQL Course') SQL COURSE
INITCAP('SQL course') Sql Course

注意:Oracle數據庫中的數據是大小寫敏感的

2.字符串操作函數

函數 結果
CONCAT('Hello', 'World') HelloWorld
SUBSTR('HelloWorld',1,5) Hello
LENGTH('HelloWorld') 10
INSTR('HelloWorld', 'W') 6
LPAD(salary,10,'*') *****24000
RPAD(salary, 10, '*') 24000*****
TRIM('H' FROM 'HelloWorld') elloWorld
TRIM(' HelloWorld') HelloWorld
TRIM('Hello World') Hello World

3.數字操作函數

函數 結果
ROUND(45.926, 2) 45.93
TRUNC(45.926, 2) 45.92
MOD(1600, 300) 100

4.日期操作函數

函數 結果
MONTHS_BETWEEN ('01-SEP-95','11-JAN-94') 19.6774194
ADD_MONTHS ('11-JAN-94',6) 11-Jul-94
NEXT_DAY ('01-SEP-95','FRIDAY') 8-Sep-95
NEXT_DAY ('01-SEP-95',1) 3-Sep-95
NEXT_DAY ('1995-09-01',1) ORA-01861:literal does not match format string
NEXT_DAY (to_date('1995-09-01','YYYY-MM-DD'),1) 3-Sep-95
LAST_DAY('01-FEB-95') 28-Feb-95
ROUND('25-JUL-95','MONTH') 1-Aug-95
ROUND('25-JUL-95' ,'YEAR') 1-Jan-96
TRUNC('25-JUL-95' ,'MONTH') 1-Jul-95
TRUNC('25-JUL-95','YEAR') 1-Jan-95
  • 日期運算操作
SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS, sysdate+1 as
tomorrow , hire_date + 8/24
FROM employees
WHERE department_id = 90;

5. Oracle數據類型的隱私轉換規則

VARCHAR2 or CHAR NUMBER
VARCHAR2 or CHAR DATE
NUMBER VARCHAR2
DATE VARCHAR2

注意:對于表達式比較操作僅可以:

VARCHAR2 or CHAR NUMBER
VARCHAR2 or CHAR DATE
SELECT last_name, TO_CHAR(hire_date, 'fmDD "of" Month YYYY') AS
HIREDATE
FROM employees;

6. 日期到字符串的轉換:TO_CHAR(date, 'format_model');

日期格式化元素 意義
YYYY 4位數字表示的年份
YEAR 英文描述的年份
MM 2位數字表示的月份
MONTH 英文描述的月份
MON 三個字母的英文描述月份簡稱
DD 2位數字表示的日期
DAY 英文描述的星期幾
DY 三個字母的英文描述的星期幾簡稱
HH24:MI:SS AM 時分秒的格式化
DDspth 英文描述的月中第幾天
fm 格式化關鍵字,可選

7. 數字到字符串的轉換TO_CHAR(number, 'format_model');

數字格式化元素 意義
9 表示一個數字
0 強制顯示0
$ 放一個美元占位符
L 使用浮點本地幣種符號
. 顯示一個小數點占位符
, 顯示一個千分位占位符
SELECT TO_CHAR(salary, 'L99,999.00') SALARY FROM employees
WHERE last_name = 'Ernst';

8. 字符串到數字和日期的轉換

TO_NUMBER(char[, 'format_model']);
TO_DATE(char[, 'format_model']);

9. 其它單行函數

函數 用途
NVL (expr1, expr2) 如果expr1為空,這返回expr2
NVL2 (expr1, expr2, expr3) 如果expr1為空,這返回expr3(第2個結果)否則返回expr2
NULLIF (expr1, expr2) 如果expr1和expr2相等,則返回空
COALESCE (expr1, expr2, ..., exprn) 如果expr1不為空,則返回expr1,結束;否則計算expr2,直到找到一個不為NULL的值或者如果全部為NULL,也只能返回NULL
SELECT last_name, salary, NVL(commission_pct, 0),
(salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL
FROM employees;

10. 條件表達式

CASE語句:

SELECT last_name, job_id, salary,
CASE job_id
WHEN 'IT_PROG' THEN 1.10*salary
WHEN 'ST_CLERK' THEN 1.15*salary
WHEN 'SA_REP' THEN 1.20*salary
ELSE salary
END "REVISED_SALARY"
FROM employees;

DECODE語句:

SELECT last_name, job_id, salary,
 DECODE(job_id, 'IT_PROG', 1.10*salary,
 'ST_CLERK', 1.15*salary,
'SA_REP', 1.20*salary,
 salary) REVISED_SALARY
FROM employees;

四、多表關聯查詢

不同的數據庫廠商對鏈接類型有不同的定義,但國際上有個凌駕于各廠商的工業標準定義(SQL 1999), 我們先來看Oracle定義的鏈接類型:
1、等于鏈接
2、不等鏈接
3、外連接(可細分為左外連接、右外連接)
4、自鏈接

1.等于連接

語法:

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;

舉例:

SELECT employees.employee_id, employees.last_name,
employees.department_id,
departments.department_id,departments.location_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;

2. 不等于連接

“不等鏈接” 語法: 使用不等鏈接符,包括> , < , !=, between

語法:

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 > table2.column2;

舉例:

SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary
BETWEEN j.lowest_sal AND j.highest_sal;

3.外連接

外連接包括左外連接和右外連接

舉例:

SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;

記憶方式:

哪邊沒加好,就是那種外連接。比如:加號在右面,就叫左外連接,此時右面對應的空數據也會查詢出來

4.自連接

 “自鏈接” :其實是一種概念,某個table和自己本身鏈接 ,比如:table1給另一個“自己”起別名為table2

舉例:

SELECT worker.last_name || ' works for ' || manager.last_name
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;

五、 分組計算函數和“GROUP BY”字句

  • 常用的分組計算函數包括:
作用 關鍵字
求和 (SUM)
求平均值 (AVG)
計數 (COUNT)
求標準差 (STDDEV)
求方差 (VARIANCE)
求最大值 (MAX)
求最小值 (MIN)
  • count()的用法
函數用法 意義
COUNT(*) 返回滿足選擇條件的所有行的行數,包括值為空的行和重復的行
COUNT(expr) 返回滿足選擇條件的且表達式不為空行數
COUNT(DISTINCT expr) 返回滿足選擇條件的且表達式不為空,且不重復的行數

注意:

SELECT 查詢語句中同時選擇分組計算函數表達式和其他獨立字段時 ,其他字段必須出現在Group By子句中,否則不合法。
不能在Where 條件中使用分組計算函數表達式,當出現這樣的需求的時候,使用Having 子句。
分組計算函數可以嵌套使用

六、子查詢

語法:

SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
 FROM table);

注意點:

  • 單行比較必須對應單行子查詢(返回單一結果值的查詢); 比如= , >
  • 多行比較必須對應多行子查詢(返回一個數據集合的查詢);比如 IN , > ANY, > ALL 等

七、DML語句

  1. insert語句
    形式一:
    不允許為空的列,必須寫出來。
INSERT INTO table [(column [, column...])]
VALUES (value [, value...]);

形式二:僅寫出列名,這種形式必須顯式的給出所有列的數據。

INSERT INTO departments
VALUES (100, 'Finance', NULL, NULL);

形式三:從另一個表中copy

INSERT INTO sales_reps(id, name, salary, commission_pct)
 SELECT employee_id, last_name, salary, commission_pct
 FROM employees
 WHERE job_id LIKE '%REP%';

形式四:使用子查詢作為插入目標

INSERT INTO
 (SELECT employee_id, last_name,
 email, hire_date, job_id, salary, department_id
 FROM employees
 WHERE department_id = 50)
VALUES (99999, 'Taylor', 'DTAYLOR', TO_DATE('07-JUN-99', 'DD-MON-RR'),
 'ST_CLERK', 5000, 50);
  1. update語句
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];

注意:存在約束條件的時候,可能會更新失敗

  1. delete語句
DELETE [FROM] table
[WHERE condition];

刪除所有:delete刪除語句沒有where條件時,意為刪除所有數據,但是表依然存在,刪除表實體使用drop
注意:當存在約束時,有可能會刪除失敗。

  1. meger比較整合語句
    舉例:
MERGE INTO copy_emp c
 USING employees e
 ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
 UPDATE SET
 c.first_name = e.first_name,
 c.last_name = e.last_name,
 ...
 c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
 e.email, e.phone_number, e.hire_date, e.job_id,
 e.salary, e.commission_pct, e.manager_id,
 e.department_id);

七、事務控制

隱式的事務提交或者回滾:

Commit, rollback 是顯式的提交和回滾語句,還有一些隱式的提交和回滾是大家需要知道并引起注意的:
當如下事件發生是,會隱式的執行Commit動作:
1、數據定義語句被執行的時候,比如新建一張表:Create Table …

2、數據控制語句被執行的時候,比如賦權 GRANT …( 或者 DENY)

3、正常退出 iSQL*Plus 或者PLSQL DEVELOPER, 而沒有顯式的執行 COMMIT 或者 ROLLBACK 語句 。
當如下事件發生時,會隱式執行Rollback 動作:

九、數據庫對象-表

表的命名要求和表中列的命名要求:
1、必須以字母開頭
2、長度不能超過30個字符
3、只能包含 A–Z, a–z, 0–9, _, $, and #
4、不能與數據庫中的已有對象重名
5、不能使用Oracle 數據庫的保留字

語法:

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

中間部分省略

十四、GROUP BY 增強

  1. GROUP BY 中使用Rollup產生常規分組匯總行以及分組小計
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY ROLLUP(department_id, job_id);

這樣會產生三維的統計數據:department_id, job_id為一個維度,department_id為一個維度,job_id為一個維度。

  1. GROUP BY 中使用cube產生Rollup結果集+多維度交叉表數據來源
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY CUBE (department_id, job_id) ;

這樣就會有四個維度,相當于再反向的rollup一次

  1. GROUPING函數
    關鍵字: grouping(column) rename
    舉例:
SELECT department_id DEPTID, job_id JOB,
  SUM(salary),
  GROUPING(department_id) GRP_DEPT,--用了哪個維度,哪個維度就顯示為0,否則為1
  GROUPING(job_id) GRP_JOB
FROM employees
WHERE department_id < 50
GROUP BY ROLLUP(department_id, job_id);
  1. GROUPING STES 來代替多次的union
    舉例:
SELECT department_id, job_id,
 manager_id,avg(salary)
FROM employees
GROUP BY GROUPING SETS
((department_id,job_id), (job_id,manager_id));

此時,就會按照(department_id,job_id)(job_id,manager_id)兩個組合來進行分組匯總,最后再union

十五、子查詢進階

  1. 非相關子查詢,即把子查詢的結果當做一張表來使用
    舉例:
SELECT a.last_name, a.salary,
 a.department_id, b.salavg
FROM employees a, (SELECT department_id,
                   AVG(salary) salavg
                   FROM employees
                   GROUP BY department_id) b
WHERE a.department_id = b.department_id
AND a.salary > b.salavg;
  1. 相關子查詢,即子查詢中參考了外部主查詢的中的表
    舉例:
SELECT last_name, salary, department_id
FROM employees outer
WHERE salary > (SELECT AVG(salary)
                FROM employees
                WHERE department_id =
                outer.department_id) ; 
  1. 使用Existsnot exists操作

  2. 使用innot in操作

注意:Not In 里面只要有一個NULL ,就不成立了,這是很容易出錯的地方; 正確的方法請在后面的子查詢中加上where department_id is not null;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • SQL語言基礎 本章,我們將會重點探討SQL語言基礎,學習用SQL進行數據庫的基本數據查詢操作。另外請注意本章的S...
    厲鉚兄閱讀 5,347評論 2 46
  • 1、Check規則 Check (Agebetween15and30 )把年齡限制在15~30歲之間 2、新SQL...
    姜海濤閱讀 868評論 0 4
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • (一)Oracle數據庫 1.oracle中row_id理解 ORACLE的row_id是一個偽列,其個是為18個...
    獨云閱讀 5,660評論 0 10
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,835評論 0 11