Oracle數(shù)據(jù)庫學(xué)習(xí)整理【原創(chuàng)】

一讹俊、select語句

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

  2. 關(guān)于NULL
    NULL表示不可用丸卷,未賦值,不知道箩做,不適用虫腋,所以它既不是0骄酗,也不是空格。NULL和數(shù)值進行四則運算悦冀,結(jié)果是NULL趋翻。

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

  4. 去除重復(fù)行:“distinct”

二、條件和限制

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

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

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

三寒屯、單行函數(shù)

1.大小寫轉(zhuǎn)換函數(shù)

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

注意:Oracle數(shù)據(jù)庫中的數(shù)據(jù)是大小寫敏感的

2.字符串操作函數(shù)

函數(shù) 結(jié)果
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.數(shù)字操作函數(shù)

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

4.日期操作函數(shù)

函數(shù) 結(jié)果
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數(shù)據(jù)類型的隱私轉(zhuǎn)換規(guī)則

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

注意:對于表達(dá)式比較操作僅可以:

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

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

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

7. 數(shù)字到字符串的轉(zhuǎn)換TO_CHAR(number, 'format_model');

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

8. 字符串到數(shù)字和日期的轉(zhuǎn)換

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

9. 其它單行函數(shù)

函數(shù) 用途
NVL (expr1, expr2) 如果expr1為空,這返回expr2
NVL2 (expr1, expr2, expr3) 如果expr1為空,這返回expr3(第2個結(jié)果)否則返回expr2
NULLIF (expr1, expr2) 如果expr1和expr2相等靴患,則返回空
COALESCE (expr1, expr2, ..., exprn) 如果expr1不為空仍侥,則返回expr1,結(jié)束;否則計算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. 條件表達(dá)式

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;

四农渊、多表關(guān)聯(lián)查詢

不同的數(shù)據(jù)庫廠商對鏈接類型有不同的定義,但國際上有個凌駕于各廠商的工業(yè)標(biāo)準(zhǔn)定義(SQL 1999), 我們先來看Oracle定義的鏈接類型:
1或颊、等于鏈接
2砸紊、不等鏈接
3、外連接(可細(xì)分為左外連接囱挑、右外連接)
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;

記憶方式:

哪邊沒加好平挑,就是那種外連接游添。比如:加號在右面,就叫左外連接通熄,此時右面對應(yīng)的空數(shù)據(jù)也會查詢出來

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 ;

五唇辨、 分組計算函數(shù)和“GROUP BY”字句

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

注意:

SELECT 查詢語句中同時選擇分組計算函數(shù)表達(dá)式和其他獨立字段時 赏枚,其他字段必須出現(xiàn)在Group By子句中亡驰,否則不合法。
不能在Where 條件中使用分組計算函數(shù)表達(dá)式饿幅,當(dāng)出現(xiàn)這樣的需求的時候凡辱,使用Having 子句。
分組計算函數(shù)可以嵌套使用

六栗恩、子查詢

語法:

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

注意點:

  • 單行比較必須對應(yīng)單行子查詢(返回單一結(jié)果值的查詢)煞茫; 比如= , >
  • 多行比較必須對應(yīng)多行子查詢(返回一個數(shù)據(jù)集合的查詢)摄凡;比如 IN , > ANY, > ALL 等

七、DML語句

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

形式二:僅寫出列名,這種形式必須顯式的給出所有列的數(shù)據(jù)纫版。

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%';

形式四:使用子查詢作為插入目標(biāo)

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條件時,意為刪除所有數(shù)據(jù),但是表依然存在癞己,刪除表實體使用drop膀斋。
注意:當(dāng)存在約束時,有可能會刪除失敗痹雅。

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

七仰担、事務(wù)控制

隱式的事務(wù)提交或者回滾:

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

2愉耙、數(shù)據(jù)控制語句被執(zhí)行的時候贮尉,比如賦權(quán) GRANT …( 或者 DENY)

3、正常退出 iSQL*Plus 或者PLSQL DEVELOPER, 而沒有顯式的執(zhí)行 COMMIT 或者 ROLLBACK 語句 朴沿。
當(dāng)如下事件發(fā)生時猜谚,會隱式執(zhí)行Rollback 動作:

九、數(shù)據(jù)庫對象-表

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

語法:

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

中間部分省略

十四、GROUP BY 增強

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

這樣會產(chǎn)生三維的統(tǒng)計數(shù)據(jù):department_id, job_id為一個維度货岭,department_id為一個維度路操,job_id為一個維度。

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

這樣就會有四個維度千贯,相當(dāng)于再反向的rollup一次

  1. GROUPING函數(shù)
    關(guān)鍵字: 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. 非相關(guān)子查詢峰弹,即把子查詢的結(jié)果當(dāng)做一張表來使用
    舉例:
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. 相關(guān)子查詢,即子查詢中參考了外部主查詢的中的表
    舉例:
SELECT last_name, salary, department_id
FROM employees outer
WHERE salary > (SELECT AVG(salary)
                FROM employees
                WHERE department_id =
                outer.department_id) ; 
  1. 使用Exists芜果、not exists操作

  2. 使用in鞠呈、not in操作

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旱爆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窘茁,更是在濱河造成了極大的恐慌怀伦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件山林,死亡現(xiàn)場離奇詭異房待,居然都是意外死亡,警方通過查閱死者的電腦和手機捌朴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門吴攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人砂蔽,你說我怎么就攤上這事洼怔。” “怎么了左驾?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵镣隶,是天一觀的道長。 經(jīng)常有香客問我诡右,道長安岂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任帆吻,我火速辦了婚禮域那,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猜煮。我一直安慰自己次员,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布王带。 她就那樣靜靜地躺著淑蔚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愕撰。 梳的紋絲不亂的頭發(fā)上刹衫,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音搞挣,去河邊找鬼带迟。 笑死,一個胖子當(dāng)著我的面吹牛囱桨,可吹牛的內(nèi)容都是我干的邮旷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蝇摸,長吁一口氣:“原來是場噩夢啊……” “哼婶肩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起貌夕,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤律歼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啡专,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體险毁,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年们童,在試婚紗的時候發(fā)現(xiàn)自己被綠了畔况。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡慧库,死狀恐怖跷跪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情齐板,我是刑警寧澤吵瞻,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站甘磨,受9級特大地震影響橡羞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜济舆,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一卿泽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滋觉,春花似錦签夭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肺蔚,卻和暖如春煌妈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宣羊。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工璧诵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仇冯。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓之宿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親苛坚。 傳聞我的和親對象是個殘疾皇子比被,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • SQL語言基礎(chǔ) 本章色难,我們將會重點探討SQL語言基礎(chǔ),學(xué)習(xí)用SQL進行數(shù)據(jù)庫的基本數(shù)據(jù)查詢操作等缀。另外請注意本章的S...
    厲鉚兄閱讀 5,320評論 2 46
  • 1枷莉、Check規(guī)則 Check (Agebetween15and30 )把年齡限制在15~30歲之間 2、新SQL...
    姜海濤閱讀 820評論 0 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法尺迂,類相關(guān)的語法笤妙,內(nèi)部類的語法,繼承相關(guān)的語法噪裕,異常的語法蹲盘,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • (一)Oracle數(shù)據(jù)庫 1.oracle中row_id理解 ORACLE的row_id是一個偽列,其個是為18個...
    獨云閱讀 5,606評論 0 10
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,810評論 0 11