SlideShare une entreprise Scribd logo
1  sur  92
SQL⼀一天之旅
講師:申建忠

frank_shen@uuu.com.tw
課程⼤大綱
正規化

SQL語⾔言簡介

基本的SELECT Statement

進階的SELECT Statement

常⽤用的SQL函數

GROUP BY/HAVING

表格結合-INNER/OUTER JOIN

SubQuery

DML Statement介紹

常⽤用的虛擬欄位
正規化-Normalization
Edgar F. Codd:在1970提出First Normal Form(1NF)
的觀念,接著在1971年繼續提出Second Normal
Form(2NF)與Third Normal Form(3NF)。︒。最後在1974
年與Raymond F. Boyce共同提出Boyce-Codd
Normal Form(BCNF)。︒。⼤大多數的正規化到此為⽌止。︒。

4NF(Ronald Fagin:1977),5NF(Ronald Fagin:1979)

6NF(C.J.Date,Hugh Darwen,Nikos Lorentzos:2002)

⼀一系列的步驟:藉由刪除重複資料以及將⼤大表格⼀一
個分割為多個⼩小表格的⽅方式,以減少資料儲存空間
與資料內容不⼀一致。︒。
第三正規化
第⼆二正規化
第⼀一正規化
⾮非正規化
BCNF
未正規化表格
學號 姓名 班級 國語 數學 英⽂文 總分 導師
1 Frank A 90 80 70 240 Richard
2 Linda B 80 70 80 230 Vivi
3 Gigi B 90 90 100 280 Vivi
4 Wilson A 70 100 80 250 Richard
資料列
欄位
第⼀一正規化-1NF
刪除資料列的重複欄位

每個欄位只能儲存⼀一個純量資料

每筆資料列必須有⼀一個且只能有⼀一個主鍵,
⽤用來辨識資料列。︒。
姓名 班級 學號 學科 成績 導師
Frank A 1 國語 90 Richard
Frank A 1 數學 80 Richard
Frank A 1 英⽂文 70 Richard
Linda B 2 國語 80 Vivi
Linda B 2 數學 70 Vivi
Linda B 2 英⽂文 80 Vivi
Gigi B 3 國語 90 Vivi
Gigi B 3 數學 90 Vivi
Gigi B 3 英⽂文 100 Vivi
Wilson A 4 國語 70 Richard
Wilson A 4 數學 100 Richard
Wilson A 4 英⽂文 80 Richard
主鍵
第⼆二正規化-2NF
滿⾜足第⼀一正規化

所有⾮非主鍵欄位必須與主鍵完全地功能性相
依(Fully Functional Dependency),不能部分
相依於主鍵。︒。
學號 學科 成績
1 國語 90
1 數學 80
1 英⽂文 70
2 國語 80
2 數學 70
2 英⽂文 80
3 國語 90
3 數學 90
3 英⽂文 100
4 國語 70
4 數學 100
4 英⽂文 80
學號 姓名 班級 導師
1 Frank A Richard
2 Linda B Vivi
3 Gigi B Richard
4 Wilson A Vivi
主鍵
第三正規化-3NF
滿⾜足第⼆二正規化

所有⾮非主鍵欄位之間不能有完全地功能性相
依。︒。也就是所有⾮非主鍵欄位與主鍵間沒有遞
移性相依(transitive dependency)。︒。
學號 學科 成績
1 國語 90
1 數學 80
1 英⽂文 70
2 國語 80
2 數學 70
2 英⽂文 80
3 國語 90
3 數學 90
3 英⽂文 100
4 國語 70
4 數學 100
4 英⽂文 80
學號 姓名 班級
1 Frank A
2 Linda B
3 Gigi B
4 Wilson A
班級 導師
A Richard
B Vivi
Boyce Codd Normal Form
主鍵由多個欄位組成

滿⾜足第三正規化

複合主鍵的欄位與⾮非主鍵欄位沒有相依性
反正規化-
DeNormalization
如何得到每個學⽣生的總分

每次需要時,由各科成績加總

優點:資料正確性

缺點:Run-Time計算的成本

事先計算並儲存在表格,需要時直接取得。︒。

優點:不需要Run-Time計算

缺點:維護資料正確的成本
學號 學科 成績
1 國語 90
1 數學 80
1 英⽂文 70
2 國語 80
2 數學 70
2 英⽂文 80
3 國語 90
3 數學 90
3 英⽂文 100
4 國語 70
4 數學 100
4 英⽂文 80
學號 姓名 班級
1 Frank A
2 Linda B
3 Gigi B
4 Wilson A
班級 導師
A Richard
B Vivi
學號 總分
1 240
2 230
3 280
4 250
反正規化表格
SQL語⾔言
Structure English Query Language(SEQUL)

SQL

1970s:IBM開發

1986:American National Standards Institute(ANSI)

1987:International Standard Organization(ISO)

SQL-86,SQL-89,SQL-92,SQL:1999,SQL:2003,SQL:
2006,SQL:2008,SQL:2011
SQL Statement 種類
資料操作語⾔言(Data Manipulate Language)

SELECT/INSERT/UPDATE/DELETE/MERGE

資料定義語⾔言(Data Definition Language)

CREATE/DROP/ALTER/TRUNCATE

資料控制語⾔言(Data Control Language)

GRANT/REVOKE

交易控制語⾔言(Transaction Control Language)

COMMIT/ROLLBACK/SAVEPOINT
SQL and Database
SQL
SQL
SQL
Result
Result
Result
SQL結構
SQL Statement(敘述句)是⼀一連串SQL Command
所組成。︒。分號(;)表⽰示該SQL敘述句的結束。︒。

這些Commands由Keyword(關鍵字)、︑、
Identifier(辨識⼦子)、︑、Literal(字⾯面)、︑、Operator(運
算⼦子)所組成。︒。SQL Commands之間使⽤用Single
white space/Multiple white space/Tab/
Carriage return/Comments/New Line當做間
隔。︒。
SQL敘述句結構
SELECT last_name, salary*12
FROM emp
WHERE dept_id=100;
關
鍵
字
辨識⼦子
字⾯面運算⼦子
空⽩白
空⽩白
空⽩白
New 

Line
分隔符號
New 

Line
SELECT Statements的執⾏行順序
SELECT

FROM

WHERE

GROUP BY

HAVING

ORDER BY
範例表格
基本的SELECT敘述句-1
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
SELECT * --(顯⽰示所有的欄位)

FROM 表格名字; --分號表⽰示執⾏行此SQL
基本的SELECT敘述句-2
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--只想要顯⽰示部分欄位時

--可將所需欄位,直接寫在SELECT之後

--但欄位之間需要使⽤用逗號(,)當作分隔

SELECT 欄位名字,欄位名字,欄位名字 

FROM 表格名字;
基本的SELECT敘述句-3
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--可使⽤用+ - * /算術運算⼦子對欄位值進⾏行運算

--優先律如同⼀一般數學觀念,先乘除後加減

--每回傳⼀一筆資料列將會計算運算式⼀一次

SELECT 欄位名字,欄位名字,運算式

FROM 表格名字;
算術運算⼦子
+ (unary,標記為正數)

- (標記為負數)

* (binary,進⾏行乘法計算)

/ (binary,進⾏行除法計算)

+ (binary,進⾏行加法計算)

- (binary,進⾏行減法計算)
空值表⽰示該欄位並沒有儲存任何值。︒。

空值不等於空⽩白或0,⽽而是沒有。︒。

任何與空值進⾏行數學運算後,其結果還是空值。︒。

但使⽤用||連接空值時,並不會影響原本的欄位值。︒。

可以直接使⽤用NULL表⽰示空值或連續兩個單引
號’’。︒。
空值 - Null
基本的SELECT敘述句-4
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--使⽤用||將兩個欄位值連接為⼀一個⽂文字形態的字⾯面

SELECT 欄位名字,欄位名字,欄位名字||欄位名字

FROM 表格名字;
基本的SELECT敘述句-5
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--可以將欄位當做函數的輸⼊入參數

--函數的結果將取代欄位值顯⽰示

--每筆回傳的資料列都會呼叫函數⼀一次

SELECT 欄位名字,函數名字(欄位名字)

FROM 表格名字;
基本的SELECT敘述句-6
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--使⽤用欄位別名將運算式或欄位名字更名

--欄位別名與運算式之間必須使⽤用空⽩白間隔

SELECT 欄位名字,運算式,運算式 欄位別名

FROM 表格名字 表格別名;
基本的SELECT敘述句-7
在SQL敘述句裡使⽤用到字⾯面(literal)時,

必須使⽤用單引號

將⽂文字或⽇日期形態的字⾯面包括起來
Literal(字⾯面):出現在SQL statement裡,
但不是關鍵字/辨識⼦子/運算⼦子/註解/分隔
符號。︒。有數字/⽂文字/⽇日期等形態的字⾯面。︒。
DISTINCT
⽐比較運算⼦子-Single Row
= 等於

!=,^=,<> 不等於

> ⼤大於

< ⼩小於

>= ⼤大於等於

<= ⼩小於等於

BETWEEN x AND y ⼤大於等於x並⼩小於等
於y

LIKE 部分相同

IS NULL 是空值

IS NOT NULL 不是空值
salary = 10000

salary != 10000

salary > 10000

salary < 10000

salary >= 10000

salary <= 10000

salary BETWEEN 10000 and
20000

emp_name LIKE ‘_a%’

salary IS NULL

salary IS NOT NULL
⽐比較運算⼦子-Multiple Row
IN 等於其中任何⼀一個

NOT IN不等於其中任何
⼀一個

ANY/ALL必須與single
comparison operator搭配

ANY 任⼀一條件滿⾜足即可

ALL 所有條件皆滿⾜足才⾏行
IN (10,20,30)

=10 OR =20 OR =30

NOT IN (10,20,30)

<>10 AND <>20 AND <>30

>ANY(10,20,30)

>10 OR >20 OR >30

<ALL(10,20,30)

<10 AND <20 AND <30
進階的SELECT敘述句-1
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--使⽤用WHERE⼦子句加上過濾條件(謂詞-predicate)

--限制回傳到SELECT⼦子句的資料筆數

--謂詞由欄位名字 ⽐比較運算⼦子 字⾯面

-- dpet_id = 50

SELECT 欄位名字,欄位名字,欄位名字

FROM 表格名字

WHERE 謂詞;
進階的SELECT敘述句-2
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--LIKE為部分相同的⽐比較運算⼦子

--所使⽤用的literal必須被包括在兩個單引號裡

--%表⽰示零/⼀一個/多個任意字元。︒。

--_ 表⽰示只有⼀一個任意字元。︒。

SELECT 欄位名字,欄位名字,欄位名字

FROM 表格名字

WHERE 欄位名字 LIKE ‘literal%’;
R開頭即可,

不論總⾧長度為何
Ri開頭,

且總⾧長度為3個字
進階的SELECT敘述句-3
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--如果有多個過濾條件(謂詞),

--則必須使⽤用AND/OR/NOT等邏輯運算⼦子結合

--只有讓WHERE⼦子句條件為True的資料列

--才能回傳到SELECT⼦子句

SELECT 欄位名字,欄位名字,欄位名字

FROM 表格名字

WHERE 謂詞1 AND 謂詞2;
進階的SELECT敘述句-4
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
SELECT 欄位名字,欄位名字,欄位名字

FROM 表格名字

WHERE 謂詞1 OR 謂詞2;
進階的SELECT敘述句-5
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--空值不能使⽤用<,>,=等⽐比較運算⼦子

--必須使⽤用IS / IS NOT NULL

SELECT 欄位名字,欄位名字,欄位名字

FROM 表格名字

WHERE 欄位名字 IS NULL;
邏輯運算⼦子
NOT:回傳TRUE如果謂詞結果為FALSE,若謂
詞結果為TRUE,則回傳FALSE

WHERE NOT(salary>10000)

AND:使⽤用AND所連接的兩個謂詞,其結果必須
都為TRUE,才會回傳TRUE。︒。

WHERE salary>10000 AND dept_id=50

OR:使⽤用OR所連接的兩個謂詞,只要任⼀一結果
為TRUE,就會回傳TURE。︒。

WHERE salary>10000 OR dept_id=50
Truth Table
TRUE FALSE UNKNOWN
NOT FALSE TRUE UNKNOWN
AND TRUE FALSE UNKOWN
TRUE TRUE FALSE UNKOWN
FALSE FALSE FALSE FALSE
UNKNOWN UNKOWN FALSE UNKOWN
OR TRUE FALSE UNKNOWN
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE UNKNOWN
UNKNOWN TRUE UNKNOWN UNKNOWN
進階的SELECT敘述句-6
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--ORDER BY對資料列進⾏行排序

--欄位名字、︑、欄位別名、︑、SELECT list位置、︑、運算式

SELECT 欄位名字,欄位名字,欄位名字

FROM 表格名字

WHERE 謂詞

ORDER BY 欄位名字;
預設條件:空值為最⼤大
NULLS LAST

將空值放到最後⼀一筆
1 2 3
Single Row Function
Character Function

Numeric Function

Datetime Function

NULL-Related Function
Character Function-1
函數 結果
UPPER(‘HeLLo frAnk’) HELLO FRANK
LOWER(‘HeLLo frAnk’) hello frank
INITCAP(‘HeLLo frAnk’) Hello Frank
LENGTH(‘HeLLo frAnk’) 11
CHR(70) F
ASCII(‘F’) 70
Character Function-2
函數 結果
SUBSTR(‘HeLLo frAnk’,3,5) LLo f
SUBSTR(‘HeLLo frAnk’,-3,5) Ank
INSTR(‘HeLLo frAnk’,’L’) 3
INSTR(‘HeLLo frAnk’,’L’,2,2) 4
Character Function-3
函數 結果
LPAD(‘HeLLo frAnk’,15,’#’) ####HeLLo frAnk
RPAD(‘HeLLo frAnk’,15,’#’) HeLLo frAnk####
TRIM(‘H’ FROM ‘HeLLo frAnk’) eLLo frAnk
TRIM(LEADING ‘H’ FROM ‘HeLLo frAnk’) eLLo frAnk
TRIM(TRAILING ‘H’ FROM ‘HeLLo frAnk’) HeLLo frAnk
REPLACE(‘Black and Blue’,’Bl’,’J’) Jack and Jue
Numeric Function-1
函數 結果
ROUND(123.45) 123
ROUND(123.45,1) 123.5
ROUND(123.45,2) 123.45
ROUND(123.45,-1) 120
Numeric Function-2
函數 結果
TRUNC(123.45) 123
TRUNC(123.45,1) 123.4
TRUNC(123.45,2) 123.45
TRUNC(123.45,-1) 120
Numeric Function-3
函數 結果
MOD(100,8) 4
CEIL(123.45) 124
FLOOR(123.45) 123
POWER(3,2) 9
Datetime Function
函數 結果
ADD_MONTHS(’21-MAR-13’,3) 21-JUN-13
LAST_DAY(’21-MAR-13’) 31-MAR-13
MONTHS_BETWEEN(’21-JUN-13’,’21-MAR-13’) 3
NEXT_DAY(’21-MAR-13’,‘SAT’) 23-MAR-13
SYSDATE 現在時間
Conversion Function
函數 結果
TO_CHAR(12345,’$999,999.99’) $12,345
TO_CHAR(SYSDATE,‘YYYY-MM-DD’) 2013-03-21
TO_NUMBER(’$12,345.00’,’$999,999.99’) 12345
TO_DATE(‘2013-03-21’,‘YYYY-MM-DD’) 21-MAR-13
SCN_TO_TIMESTAMP(123456) 18-SEP-11 12.48.16
TIMESTAMP_TO_SCN(SYSDATE) 1704636
NULL-Related Function-1
NVL(expr1,expr2)

IF expr1 IS NOT NULL

THEN RETURN expr1

ELSE RETURN expr2
NULL-Related Function-2
NVL2(expr1,expr2,expr3)

IF expr1 IS NOT NULL

THEN RETURN expr2

ELSE RETURN expr3
NULL-Related Function-3
NULLIF(expr1,expr2)

IF expr1=expr2

THEN RETURN NULL

ELSE RETURN expr1
NULL-Related Function-4
COALESCE(expr1,expr2,expr3,literal)

IF expr1 IS NOT NULL

THEN RETURN expr1

ELSIF expr2 IS NOT NULL

THEN RETURN expr2

ELSIF expr3 IS NOT NULL

THEN RETURN expr3

ELSE RETURN listeral
Aggregate Function
函數 結果
COUNT(*) 有幾筆資料列
COUNT(salary) 有幾筆資料列的salary欄位值為⾮非空值
SUM(salary) 所有資料列的salary欄位值的總合
AVG(salary) 所有資料列的salary欄位值的平均
MIN(salary) 所有資料列裡salary欄位值的最⼩小值
MAX(salary) 所有資料列裡salary欄位值的最⼤大值
COUNT
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--Aggregate Function只能出現在SELECT list

--與HAVING/ORDER⼦子句

--執⾏行順序為FROM->WHERE->SELECT

SELECT COUNT(*),COUNT(column)

FROM 表格名字

WHERE 謂詞;
SUM/AVG/MIN/MAX
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--Aggregate Function只能出現在SELECT list

--與HAVING/ORDER⼦子句

--⾃自動跳過空值,不納⼊入相關計算

--執⾏行順序為FROM->WHERE->SELECT

SELECT SUM(column),AVG(column),

MIN(column),MAX(column)

FROM 表格名字

WHERE 謂詞;
COUNT/AVG and NULL
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--AVG(欄位)是以⾮非空值欄位的個數當做分母。︒。

--AVG(NVL(欄位,0))將欄位空值變成0,

--此時分母將加⼊入原本為空值的資料列筆數。︒。

SELECT SUM(column),COUNT(column),AVG(column)

COUNT(column),AVG(NVL(column,0))

FROM 表格名字

WHERE 謂詞;
GROUP BY
GROUP BY將通過FROM/WHERE後的資料
列,進⼀一步地分為更細微的⼦子群組。︒。

屬於同⼀一個⼦子群組的資料列將產⽣生⼀一個
Aggregate Function的結果。︒。
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--GROUP BY 欄位

--欄位值相同的資料列分為同⼀一⼦子群

--每個⼦子群組產⽣生⼀一個Aggregate Function結果
SELECT 欄位,Aggregate_Function(欄位)

FROM 表格

GROUP BY 欄位;
GROUP BY
HAVING
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
--HAVING⽤用來過濾GROUP BY後的結果

--HAVING只能使⽤用Aggregate Function或

--GROUP BY欄位當作謂詞

SELECT 欄位,Aggregate_Function(欄位)

FROM 表格

GROUP BY 欄位

HAVING 謂詞;
表格結合
Inner Join

滿⾜足Join條件的資料列

Outer Join

滿⾜足與不滿⾜足Join條件的資料列

Right/Left/Full
JOIN語法
ANSI 92之前

FROM emp,dept

WHERE emp.dept_id=dept.dept_id 

ANSI 92標準 

FROM emp JOIN dept ON(emp.dept_id=dept.dept_id)

寫法不同,但執⾏行效能相同。︒。
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
DEPT_ID DEPT_NAME DEPT_MGR
10 業務 1
20 財務
30 會計 7
40 ⼈人事 3
50 資訊管理 5
60 總務 4
70 秘書
EMP DEPT
NATURAL JOIN
NATURAL JOIN的表格裡,所有欄位名字相
同的欄位,⾃自動成為JOIN條件。︒。同時使⽤用等
式結合(Equality join)
JOIN USING
JOIN USING可以選擇部分欄位名字相同的
欄位,當做成為JOIN條件。︒。同時使⽤用等式結
合(Equality join)
JOIN ON
JOIN ON可以選擇任何欄位,當做JOIN條件。︒。同
時不要求使⽤用等式結合(Equality join),⽽而且如果
兩個表格的欄位名字相同,應該在該欄位前⾯面加
上表格名字或表格別名,⽤用以辨別欄位所屬的表
格。︒。
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
EMP
DEPT_ID DEPT_NAME DEPT_MGR
10 業務 1
10 業務 1
40 ⼈人事 3
60 總務 4
50 資訊管理 5
50 資訊管理 5
30 會計 7
40 ⼈人事 3
50 資訊管理 5
50 資訊管理 5
DEPT
INNER JOIN
LEFT OUTER JOIN
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
11 Tony 10-MAR-13
EMP
DEPT_ID DEPT_NAME DEPT_MGR
10 業務 1
10 業務 1
40 ⼈人事 3
60 總務 4
50 資訊管理 5
50 資訊管理 5
30 會計 7
40 ⼈人事 3
50 資訊管理 5
50 資訊管理 5
DEPT
RIGHT OUTER JOIN
EMP_ID EMP_NAME HIRE_DATE SALARY DEPT_ID
1 Green 11-OCT-98 30000 10
2 Katy 20-OCT-98 20000 10
3 Kelly 11-NOV-98 19000 40
4 Anita 21-OCT-98 18000 60
5 Richard 21-MAY-00 25000 50
6 Vivi 20-JAN-10 15000 50
7 Rita 01-DEC-01 13000 30
8 Kathy 11-FEB-03 7000 40
9 Jacky 19-SEP-04 12000 50
10 Linda 25-JUL-06 9000 50
DEPT_ID DEPT_NAME DEPT_MGR
10 業務 1
10 業務 1
40 ⼈人事 3
60 總務 4
50 資訊管理 5
50 資訊管理 5
30 會計 7
40 ⼈人事 3
50 資訊管理 5
50 資訊管理 5
20 財務 1
70 秘書
DEPTEMP
ANSI 92之前
INNER JOIN LEFT OUTER JOIN
SubQuery
SubQuery(⼦子查詢):這個查詢被包括在另⼀一個查詢裡。︒。

⼦子查詢可以出現在SELECT/FROM/WHERE/START
WITH/HAVING/ORDER BY等⼦子句裡。︒。

⼦子查詢還可以出現在UPDATE/DELETE⼦子句。︒。

不過出現在SELECT/HAVING/ORDER BY/UPDATE/
DELETE的⼦子查詢必須為Scalar SubQuery。︒。

出現在FROM的⼦子查詢必須使⽤用表格別名。︒。
找出⽐比Vivi薪資⾼高的員⼯工
Single/Multiple Row⽐比較運算⼦子
Inline View
Scalar Subquery
Scalar Subquery只回傳⼀一筆資料列,且此資料列只有⼀一個欄位。︒。
DML
INSER(新增)

INSERT INTO 表格 VALUES(值1,值2,值3,..)

INSERT INTO 表格 SELECT 欄位1,欄位2,.. FROM 表格

UPDATE(異動)

UPDATE 表格 SET 欄位1=值1,欄位2=值2 WHERE 謂詞

DELETE(刪除)

DELETE FROM 表格 WHERE 謂詞
INSERT
UPDATE
DELETE
虛擬欄位-PseudoColumn
虛擬欄位與⼀一般的表格欄位類似,實際上它不
存在於表格之內。︒。

虛擬欄位的內容可以被查詢,但不能被新增、︑、
修改或刪除。︒。

使⽤用⽅方式類似不帶參數的函數。︒。

每筆資料列所使⽤用的函數,基本上都回傳相
同值。︒。

每筆資料列所使⽤用到的虛擬欄位,所回傳的
值都不相同。︒。
常⾒見的虛擬欄位
ROWID

每⼀一筆資料列都有⼀一個獨⼀一ID,⽤用來顯⽰示該
筆資料列的相對位置。︒。

ROWNUM

顯⽰示該資料列為結果集裡,第幾筆被回傳的
資料列。︒。

ORA_ROWSCN

顯⽰示資料列最後⼀一次被異動時的SCN。︒。
ROWID
ROWNUM
ORA_ROWSCN
預設表格只有⼀一個
ORA_ROWSCN值。︒。

所以只能⽤用來觀察此表格
最後⼀一次的DML操作。︒。
TOP-N
前五名的薪資

第五名的薪資

每個部⾨門的前兩名薪資
薪資前五名
SQL> SELECT rownum sal_rank,emp_name,salary
3> FROM (SELET emp_name,salary
4> FROM emp
5> ORDER BY salary)
6> )
7 WHERE rownum<=5;
SQL> SELECT sal_rank,emp_name,salary
2> FROM (SELECT rank() OVER(ORDER BY salary DESC)
sal_rank,emp_name,salary FROM emp)
3> WHERE sal_rank<=5;
薪資第五名
SQL> SELECT *
2> FROM (SELECT rownum sal_rank,emp_name,salary
3> FROM (SELET emp_name,salary
4> FROM emp
5> ORDER BY salary)
6> )
7 WHERE sal_rank=5;
SQL> SELECT sal_rank,emp_name,salary
2> FROM (SELECT rank() OVER(ORDER BY salary DESC)
sal_rank,emp_name,salary FROM emp)
3> WHERE sal_rank=5;
每部⾨門的薪資前2名
SQL>SELECT *
2>FROM (SELECT rank() OVER(PARTITION BY dept_id
3> ORDER BY salary DESC) sal_rank,
4> emp_name,salary FROM emp)
3> WHERE sal_rank<=2;
問題與回答

Contenu connexe

Tendances

Oracle使用者安全設定
Oracle使用者安全設定Oracle使用者安全設定
Oracle使用者安全設定Chien Chung Shen
 
Oracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptOracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptChien Chung Shen
 
Oracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptOracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptChien Chung Shen
 
Oracle Database Management - Backup/Recovery
Oracle Database Management - Backup/RecoveryOracle Database Management - Backup/Recovery
Oracle Database Management - Backup/RecoveryChien Chung Shen
 
Ash masters : advanced ash analytics on Oracle
Ash masters : advanced ash analytics on Oracle Ash masters : advanced ash analytics on Oracle
Ash masters : advanced ash analytics on Oracle Kyle Hailey
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuningGuy Harrison
 
Oracle Database Management Basic 1
Oracle Database Management Basic 1Oracle Database Management Basic 1
Oracle Database Management Basic 1Chien Chung Shen
 
SQLチューニング勉強会資料
SQLチューニング勉強会資料SQLチューニング勉強会資料
SQLチューニング勉強会資料Shinnosuke Akita
 
簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪Yohei Azekatsu
 
Part1 of SQL Tuning Workshop - Understanding the Optimizer
Part1 of SQL Tuning Workshop - Understanding the OptimizerPart1 of SQL Tuning Workshop - Understanding the Optimizer
Part1 of SQL Tuning Workshop - Understanding the OptimizerMaria Colgan
 
Oracle db performance tuning
Oracle db performance tuningOracle db performance tuning
Oracle db performance tuningSimon Huang
 
Performance Tuning With Oracle ASH and AWR. Part 1 How And What
Performance Tuning With Oracle ASH and AWR. Part 1 How And WhatPerformance Tuning With Oracle ASH and AWR. Part 1 How And What
Performance Tuning With Oracle ASH and AWR. Part 1 How And Whatudaymoogala
 
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門Akira Shimosako
 
Autonomous Database で Oracle Database19c 新機能 を味わう。
Autonomous Database で Oracle Database19c 新機能 を味わう。Autonomous Database で Oracle Database19c 新機能 を味わう。
Autonomous Database で Oracle Database19c 新機能 を味わう。歩 柴田
 
DB2の使い方 管理ツール編
DB2の使い方 管理ツール編DB2の使い方 管理ツール編
DB2の使い方 管理ツール編Akira Shimosako
 
アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門Akira Shimosako
 
SQL Server チューニング基礎
SQL Server チューニング基礎SQL Server チューニング基礎
SQL Server チューニング基礎Microsoft
 
Oracle Performance Tuning Fundamentals
Oracle Performance Tuning FundamentalsOracle Performance Tuning Fundamentals
Oracle Performance Tuning FundamentalsEnkitec
 

Tendances (20)

Oracle Instance 介紹
Oracle Instance 介紹Oracle Instance 介紹
Oracle Instance 介紹
 
Oracle使用者安全設定
Oracle使用者安全設定Oracle使用者安全設定
Oracle使用者安全設定
 
Oracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptOracle Database SQL Tuning Concept
Oracle Database SQL Tuning Concept
 
Oracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptOracle Database Performance Tuning Concept
Oracle Database Performance Tuning Concept
 
Oracle Database Management - Backup/Recovery
Oracle Database Management - Backup/RecoveryOracle Database Management - Backup/Recovery
Oracle Database Management - Backup/Recovery
 
Ash masters : advanced ash analytics on Oracle
Ash masters : advanced ash analytics on Oracle Ash masters : advanced ash analytics on Oracle
Ash masters : advanced ash analytics on Oracle
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuning
 
Oracle Database Management Basic 1
Oracle Database Management Basic 1Oracle Database Management Basic 1
Oracle Database Management Basic 1
 
SQLチューニング勉強会資料
SQLチューニング勉強会資料SQLチューニング勉強会資料
SQLチューニング勉強会資料
 
簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪
 
Part1 of SQL Tuning Workshop - Understanding the Optimizer
Part1 of SQL Tuning Workshop - Understanding the OptimizerPart1 of SQL Tuning Workshop - Understanding the Optimizer
Part1 of SQL Tuning Workshop - Understanding the Optimizer
 
Oracle db performance tuning
Oracle db performance tuningOracle db performance tuning
Oracle db performance tuning
 
Performance Tuning With Oracle ASH and AWR. Part 1 How And What
Performance Tuning With Oracle ASH and AWR. Part 1 How And WhatPerformance Tuning With Oracle ASH and AWR. Part 1 How And What
Performance Tuning With Oracle ASH and AWR. Part 1 How And What
 
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
 
Autonomous Database で Oracle Database19c 新機能 を味わう。
Autonomous Database で Oracle Database19c 新機能 を味わう。Autonomous Database で Oracle Database19c 新機能 を味わう。
Autonomous Database で Oracle Database19c 新機能 を味わう。
 
DB2の使い方 管理ツール編
DB2の使い方 管理ツール編DB2の使い方 管理ツール編
DB2の使い方 管理ツール編
 
アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門
 
SQL Server チューニング基礎
SQL Server チューニング基礎SQL Server チューニング基礎
SQL Server チューニング基礎
 
Using AWR for IO Subsystem Analysis
Using AWR for IO Subsystem AnalysisUsing AWR for IO Subsystem Analysis
Using AWR for IO Subsystem Analysis
 
Oracle Performance Tuning Fundamentals
Oracle Performance Tuning FundamentalsOracle Performance Tuning Fundamentals
Oracle Performance Tuning Fundamentals
 

Plus de Chien Chung Shen

Oracle 12cR1 In-Memory Column Store
Oracle 12cR1 In-Memory Column StoreOracle 12cR1 In-Memory Column Store
Oracle 12cR1 In-Memory Column StoreChien Chung Shen
 
Oracle Database Undo Segment Operation Concept
Oracle Database Undo Segment Operation ConceptOracle Database Undo Segment Operation Concept
Oracle Database Undo Segment Operation ConceptChien Chung Shen
 
Hadoop Essential for Oracle Professionals
Hadoop Essential for Oracle ProfessionalsHadoop Essential for Oracle Professionals
Hadoop Essential for Oracle ProfessionalsChien Chung Shen
 

Plus de Chien Chung Shen (7)

Databases on AWS
Databases on AWSDatabases on AWS
Databases on AWS
 
Awsomeday ntc
Awsomeday ntcAwsomeday ntc
Awsomeday ntc
 
MySQL SQL Tutorial
MySQL SQL TutorialMySQL SQL Tutorial
MySQL SQL Tutorial
 
Oracle 12cR1 In-Memory Column Store
Oracle 12cR1 In-Memory Column StoreOracle 12cR1 In-Memory Column Store
Oracle 12cR1 In-Memory Column Store
 
Mssql to oracle
Mssql to oracleMssql to oracle
Mssql to oracle
 
Oracle Database Undo Segment Operation Concept
Oracle Database Undo Segment Operation ConceptOracle Database Undo Segment Operation Concept
Oracle Database Undo Segment Operation Concept
 
Hadoop Essential for Oracle Professionals
Hadoop Essential for Oracle ProfessionalsHadoop Essential for Oracle Professionals
Hadoop Essential for Oracle Professionals
 

Oracle SQL 1 Day Tutorial