boykap.files.wordpress.com · web viewการใช้ oracle sql functions. expression. sql...
TRANSCRIPT
การใช Oracle SQL Functions
ExpressionSQL Expression คอ การรวมเอาคาตวแปรหรอขอมลตงแต 1 ตวขนไป รวมถง SQL Operator, SQL function ทสามารถกำาหนดคาของขอมลได โดย SQL Expression คอ การเปรยบเสมอนสตร หรอ ประโยค ในภาษาเขยน ซงใชในการดงขอมล (query) ทำาใหเราสามารถเลอกขอมลทเราตองการจากฐานขอมล หรอ database
รปแบบพนฐาน (Syntax)พจารณาจากรปแบบพนฐาน (Syntax) ของ SQL select statement ตอไปน
SELECT column1, column2, columnN
FROM table_name
WHERE [CONDITION|EXPRESSION];
SQL expression มดวยกนหลายชนดดงน
การตดสนใจ (Boolean) ตวเลข (Numeric) วนเวลา (Date)
1. การตดสนใจ (Boolean)SQL Boolean Expression จะดงเอาขอมลจากฐานขอมล หรอ database ดวยเงอนไขทตรงตามคาทกำาหนด
SELECT column1, column2, columnN
FROM table_name
WHERE SINGLE VALUE MATCHING EXPRESSION;
จากตวอยางคอ Customer tableSQL> SELECT * FROM CUSTOMERS;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
Boolean Expression กำาหนดใหเลอกขอมลแถวท Salary เทากบ 10,000SQL> SELECT * FROM CUSTOMERS WHERE SALARY = 10000;
+----+-------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+-------+-----+---------+----------+
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+-------+-----+---------+----------+
2. ตวเลข (Numeric)SQL Numberic Expression คอการคำานวณคาทางคณตศาสตร
SELECT numerical_expression as OPERATION_NAME
[FROM table_name
WHERE CONDITION] ;
numerical_expression เปรยบเสมอนสตรทางคณตศาสตร
SQL> SELECT (15 + 6) AS ADDITION
From dual;
+----------+
| ADDITION |
+----------+
| 21 |
+----------+
บาง function ใชกระบวนการคำานวณแบบคณตศาสตร เชน avg(), sum(), count()SQL> SELECT COUNT(*) AS "RECORDS" FROM CUSTOMERS;
+---------+
| RECORDS |
+---------+
| 7 |
+---------+
3. วนเวลา (Date)SQL Date Expression ใชแสดงขอมลเวลา และ วนทปจจบน
SQL> SELECT CURRENT_TIMESTAMP
From dual;
+---------------------+
| Current_Timestamp |
+---------------------+
| 2016-11-19 16:21:56 |
+---------------------+
SQL> SELECT sysdate
From dual;
+-------------------------+
| GETDATE |
+-------------------------+
| 2009-10-22 12:07:18.140 |
+-------------------------+
1 row in set (0.00 sec)
การใช Oracle SQL Functions
ผใชงานระบบฐานขอมลสามารถเรยกใชโปรแกรมเหลานใหทำางานรวมกบคำาสง SQL เพอการเลอกดขอมลหรอการจดการฐานขอมลใหฐานขอมลมประสทธภาพมากขน
เพอใหงายตอการศกษาใชงาน จะแบง Oracle SQL Functions ออกเปน 2 ประเภทดงน
1. Single Row Functions2. Group Functions
Single Row Functions
จะเปรยบเสมอนโปรแกรมทรบคาการเรยกใช โดยคาทรบเขาไปอาจจะเปน คาทกำาหนดขน หรอ คาจากคอลมนทเลอกขนมาจหากฐานขอมล หรออาจจะรบทงคาทกำาหนดขนรวมกบคาจากคอลมนทเลอกขนมาจากฐานขอมลกได จากนน Single Row Functions จะทำางานและสงผลลพธกลบมาในลกษณะ 1 ผลลพธตอ 1 row ทเรยกขนมาจากฐานขอมล ทำาให SQL Function ประเภทนถกเรยกวา Single Row Functions
รปแบบการใช Single Row Functions
การใชฟงกชน AVG และฟงกชน SUM
SELECT Single Row function (cloumn),………FROM table[WHERE condition][ORDER BY cloumn];
Single Row Functions ทใชในการเปลยนชนดขอมล
จะรบคาชนดขอมลประเภทหนงเพอเปลยนเปนชนดขอมลอกประเภทหนง เพอประโยชนในการแสดงผล หรอ การนำาผลลพธไปคำานวณ หรอ การดำาเนนการอนๆตามตองการ
- Single Row Functions ทสามารถแปลงขอความ อกขระใหอยในรปของตวเลข และวนทได
Function ToVARCHAR or CHAR NUMBERVARCHAR or CHAR DATE
- Single Row Functions ทสามารถแปลงตวเลข หรอวนท ใหเปนตวหนงสอ ขอความได
Function ToNUMBER VARCHAR or CHARDATE VARCHAR or CHAR
การใชฟงกชน TO_CHAR กบ วนท (date) เพอเปลยนแปลงคาทเปนวนท ใหอยในรปของขอความหรอตวอกษร ตาม format ทเราตองการไดรปแบบ
หมายเหต:- รปแบบของวนทตองอยภายใตเครองหมาย ‘’- ตวเลกตวใหญสำาคญ ตองพมพใหตรงกบฐานขอมล- หากวนททเปนตวเลขหลกเดยวใหใส fm ขางหนา เชน เดอน มนาคม หากใส fm ขางหนากจะเปน 3
TO_CHAR (date, ‘format_model’)
- หากตองการเรยกขอมลวนท มากกวา 1 ตว ใหใสเครองหมายคอมมา (,) คน
องคประกอบของการจดรปแบบขอมล (Format Model)
องคประกอบ ผลทไดYYYY ชอป คศ. ทเขยนดวยตวเลข เชน 2018YEAR ชอป คศ. ทเขยนเปนตวอกษร MM ชอเดอนทเปนตวเลข เชน เดอนมนาคม กไดเปน
03MOUNT ชอเตมของเดอน เชนเดอน มถนายน กจะเปน
JUNEMON ชอยอของเดอน คอ เอาตวอกษรสามตวแรกมา
เขยน เชน JANDY ชอยอของวน คอ เอาตวอกษรสามตวแรกมา
เขยน เชน MONDAY ชอเตมของวน เชน วนจนทร กจะเปน
MONDAYDD ชอวนทเปนตวเลข เชน วนท 2 กจะเปน 02
ตวอยางการใชฟงกชน TO_CHAR กบ Dates (วนท)
SELECT last_name, TO_CHAR (hire_date,'fmDD Month YYYY') AS HIREDATEFROM employees;
เปนการใชฟงชน TO_CHAR ในการแปลงขอมลวนทใหอยในรปของตวอกษร และใช fm ในการตดวนทใหเหลอเพยงหลกเดยว จากนนนำาไป
ตวอยางการใชฟงกชน TO_CHAR กบ NUMBER (ตวเลข) เพอเปลยนแปลงคาทเปนตวเลข ใหอยในรปของขอความหรอตวอกษร ตาม format ทเราตองการได
รปแบบ
Single Row Functions ททำางานกบขอมลประเภท Character
ชอฟงกชน
ความหมาย ตวอยาง ผลทได
CONCAT
การเชอมคำา CONCAT (‘Hello’, ‘World’)
HelloWorld
SUBSTR
การตดเอา SUBSTR (‘HelloWorld’,1,5)
Hello
SELECT TO_CHAR (salary,'$99,999.00') SALARYFROM employees;
เปนการใชฟงชน TO_CHAR ในการแปลงขอมลเงนเดอน ใหเปนแบบตวอกษรทเราตองการ ในทนแปลงเงนเดอนใหมเครองหมาย $ นำาหนา ใหมคอมมาคนเมอตวเลขเกน 3 หลก และกใหมทศนยม 2 ตำาแหนง** เลข 9 แทนจำานวนตวเลข
เฉพาะตวทตองการ
LENGTH
การนบจำานวนตวอกษร
LENGTH (‘HelloWorld’)
10
INSTR นบตวทตองการวาอยตวไหน
INSTR (‘HelloWorld’, W’)
6
LPAD การใชเครองหมายแทนคาวางจากดานซาย
LPAD (salary,8, ‘*’) ***24000
RPAD การใชเครองหมายแทนคาวางจากดานขวา
RPAD (salary,10, ‘*’) 24000*****
REPLACE
การแทนท REPLACE (‘JACK and JUE’, ‘J’, ‘BL’)
BLACK and BLUE
TRIM การตดตวทไมตองการออก
TRIM (‘H’ FROM ‘HelloWorld’)
elloWorld
LOWER ใชในการแปลงตวพมพใหญใหเปนตวพมพเลก
LOWER (‘SQL’) sql
UPPER ใชในการแปลงตวพมพเลกใหเปนตวพมพใหญ
UPPER (‘sql’) SQL
INICAP ใชแปลงตวอกษรตวแรกเปนพมพใหญ ทเหลอเปนพมพ
INICAP (‘sql course’) Sql Course
เลก
ตวอยางการใชฟงกชน LOWER
ตวอยางการใชฟงกชน UPPER
ตวอยางการใชฟงกชน LENGTH
ตวอยางการใชฟงกชน SUBSTR
Single Row Functions ททำางานกบขอมลประเภท Number
ชอฟงกชน ความหมาย ตวอยาง ผลทไดROUND ใชในการตดทศนยมให
เหลอ 3 ตำาแหนงตำาแหนงท 4 มากกวาหรอเทากบ 5 ใหปดขน
ROUND (45.92652,3)
45.927
TRUNC ใชในการตดทศนยมให TRUNC 45.92
SELECT region_name, LOWER(region_name)FROM regions;
SELECT region_name, UPPER(region_name)FROM regions;
SELECT region_name, LENGTH(region_name)FROM regions;
SELECT region_name, SUBSTR (region_name,3,2), SUBSTR (region_name,3)FROM regions;
เหลอ 2 ตำาแหนงโดยทไมตองปดขน
(45.92652,2)
MOD ใชในการหารเอาเศษ MOD (1600,300)
100
ตวอยางการใชฟงกชน ROUND
ตวอยางการใชฟงกชน TRUNC
Single Row Functions สำาหรบจดเกบคาทเปน NULL
ฟงกชน NVL - แปลงคาวาง ใหเปนคาทเราสนใจ แตชนดขอมลตองเขากนได- หากคลอลมนทเราสนใจเปนชนดขอมลแบบไหน เราตองเปลยนเปนชนดเดยวกนเทานนเชน
ถาคาไหนใน commission_pct ทเปนคาวาง ใหเปลยนจากคาวางนนเปนเลข 0
- NVL(commission_pct,0)
ถาคาไหนใน hire_date ทเปนคาวาง ใหเปลยนจากคาวางนนเปน 01-JAN-97
SELECT ROUND(45.92652,3), ROUND(45.92652,2), ROUND(45.92652,-3)FROM dual;
SELECT TRUNC(45.92652,3), TRUNC(45.92652,2), TRUNC(45.92652,-3)FROM dual;
- NVL (hire_date,’01-JAN-97’)
ถาคาไหนใน job_id ทเปนคาวาง ใหเปลยนจากคาวางนนเปนคำาวา No Job Yet
- NVL (job_id, ‘No Job Yet’)
หมายเหต: ถาคาใดๆ ทจะทำาการเปลยนจากคาวาง แลวเปนตวอกษร หรอ format ตางๆ คาใดๆนน จะตองเขยนไวภายใตเครอง ‘’
ตวอยางการใชฟงกชน NVL
Output
การใช Single Row Functions หลาย ๆ ฟงกชนซอนกน
SELECT last_name, salary, NVL(commission_pct,0), (salary * 12) + (salary * 12*NVL(commission_pct,0)) AN_SALFROM employees;
เปนการใชฟงชน NVL ทำาการแปลงคาใน commission_pct ทมคาวางใหเปนเลข 0 จากนนนำาคาใน salary ไปคณ กบ 12 ไดคาเทาไหรใหเอามา
- Single Row Functions สามารถซอนกนไดหลายระดบ- ฟงกชนทซอนกนจะถกทำาการประมวลผลจากฟงกชนทอยในสดกอน แลวคอยทำาออกมาเรอย ๆ
รปแบบ
ตวอยาง การใชหลาย ๆ ฟงกชนในโคดเดยวกน
output
SELECT last_name, UPPER(CONCAT(SUBSTR(LAST_NAME,1,8),'_US'))
F3 (F2 (F1 (col,arg1), arg2), arg3)
Step 1=
Step 3= Result 3
Step 2= Result 2
เปนการใชฟงชน 3 ฟงชนซอนกน โดยจะเรมทำาฟงชนทอยขางในสดกอน คอ SUBSTR เปนการตดคำาตวท 1 และ 8 ออก จากนนกใชฟงชน CONCAT ในการเชอมคำาทอยในคลอลมนเขากบ _US และสดทายกเปน
Single Row Functions ททำางานกบขอมลประเภท Character
Group Functions
การใชฟงกชนแบบ GROUP จะรบคาทผใชกำาหนดให จากนนการทำางานของ Group Function จะทำากบกลมของ row และแสดงผลกลบมาในลกษณะ 1 ผลลพธ ตอ 1 กลมของ row ทำาให SQL Function ประเภทนถกเรยกวา Group Function ตวอยางการทำางานของ Group Function เชน การหาคาเฉลย (ขอมลหลายๆคา จะหาคาเฉลยของขอมลทงหมดได 1 คา) การหาผลรวม (ขอมลหลายๆคา จะหาผลรวมได 1 คา) ฯลฯ
- ประเภทของฟงกชนแบบ GROUPชอฟงกชน ความหมาย
AVG หาคาเฉลย (จำานวนทงหมดบวกกน หารดวย จำานวนสมาชก)
COUNT นบจำานวนสมาชกMAX หาคาสงสดMIN หาคาตำาสดVARIANCE หาความแปรปรวนSTDDEV หาสวนเบยงเบนมาตรฐานSUM หาผลรวม
หมายเหต: สามารถใชไดกบขอมลทเปนตวเลขเทานน แตจะมบางตวทสามารถใชไดทงในตวเลข ตวอกษร และ format date-timeรปแบบการใช GROUP FunctionSELECT group_function (cloumn),………FROM table[WHERE condition][ORDER BY cloumn];
การใชฟงกชน AVG และฟงกชน SUM
ตวอยางการใช GROUP Function
การใชฟงกชน MIN และฟงกชน MAX
- สามารถใชฟงกชน MIN และฟงกชน MAX กบ ตวเลข ตวอกษร และกวนท ได
SELECT AVG(salary),MAX(salary),MIN(salary),SUM(salary)FROM employees
เปนการใชฟงชนแบบ GROUP เขามาชวยในการเรยกดขอมล โดยหาคาเฉลยของเงนเดอน หาคาสงสดของเงนเดอน หาคาตำาสดของเงนเดอน และกหาผล
SELECT MIN(hire_date),MAX(hire_date)FROM employees;
เปนการใชฟงชน MIN ในการหาคาตำาสดของคลอลมน HIRE_DATE และใชฟงชน MAX ในการหาคาสงสดของ
การใชฟงกชน COUNT- ใหผลออกมาเปนตวเลขของจำานวนแถว
Output
COUNT(*) ---------- 45
ในกรณทมการเรยกใชงาน Group Function กบคอลลมนทมคาวาง
หมายเหต: กรณทคอลมนมคาวางเกดขน group function จะนบเฉพาะจำานวนทมคาเทานน โดยจะ ignore คาวางไป
SELECT COUNT(*) FROM employees WHERE department_id = 50;
เปนการใชฟงชน CONUT ในการนบจำานวนสมาชกของ ทงหมดของตาราง
SELECT COUNT(commission_pct) FROM employees WHERE department_id = 80;
เปนการใชฟงชน CONUT ในการนบจำานวนสมาชกของคลอลมน commission_pct
การใชคำาสง DISTINCT- เปนการยบรวมเอาตวทซำากนออกมาแค 1 คาเทานน
outputDEPARTMENT_ID------------- 100 30 null 20 70 90 110 50 40 80
10 60
12 rows selected.
จากนนเรยกใช FUNCTION COUNT เขามาครอบคำาสง DISTINCT (department_id))SELECT COUNT(DISTINCT (department_id)) FROM employees;
กอนการใชคำาสง
SELECT DISTINCT (department_id)FROM employees;
ฟงกชนแบบ GROUP และคาวาง (NULL)
การใชฟงกชน NVL รวมกบฟงกชนแบบ GROUP และคาวาง
เปนการใชฟงชน COUNT รวมกน DISTINCT ในการเรยกดขอมลจากคลอลมน department_id โดยการ
SELECT AVG(commission_pct)FROM employees;
เปนการหาคาเฉลยของขอมลในคลอลมน commission_pct โดยทหากคาใดใน commission_pct เปนคาวาง ไมจะมองขามไป
SELECT AVG(NVL(commission_pct,0))
เปนการหาคาเฉลยของขอมลในคลอลมน commission_pct โดยทใชฟงชน NVL แปลงขอมลในคลอลมน commission_pct ทเปนคาวางใหเปน
การจดกลมของขอมล ดวยคำาสง GROUP BY- คำาสง GROUP BY จะอยระหวางคำาสง WHERE คำาสง ORDER BYรปแบบ
ตวอยาง การใชฟงกชน GROUP BY
ตวอยาง
SELECT colum,group_function(column)FROM table[WHERE condition][GROUP BY group_by_expression][ORDER BY column];
SELECT department_id,AVG(salary)FROM employees
เปนการเรยกดขอมลจากคลอลมน department_id และคลอลมน salary โดยทำาการหาคาเฉลยในคลอลมน salary กอนดงขอมลออกมาโชวและทำาการจด
SELECT AVG(salary)FROM employeesGROUP BY department_id;
ตวทใชในการ GROUP BY ไมจำาเปนตองอยในสวนของ SELECT กได
การจดกลมขอมล(GROUP BY) มากกวา 1 คลอลมน
ในกรณทมการเลอกขอมลทมเงอนไขหากใชฟงกชนแบบ GROUP จะใชคำาสง WHERE ไมได จะตองใชคำาสง HAVING แทน
การใชคำาสง HAVING
\
output
SELECT department_id dept_id, job_id, SUM(salary)FROM employees GROUP BY department_id, job_idORDER BY department_id desc;
เปนการเรยกดขอมลจากคอลลมน department_id แลวนำาไปเกบทคอลลมนใหมชอ dept_id จากคอลลมน job_id และหาผลรวมของคอลลมน salary จากนนทำาการจดกลมขอมลจากคอลลมน department_id และคอลลมน job_id และทำาการเรยงลำาดบ
SELECT department_id,MAX(salary)FROM employeesGROUP BY department_id HAVING MAX(salary) > 10000;
เปนการเรยกดขอมลจากคลอลมน department_id และหาคาสงสดของคลอลมน salary หลงจากนนทำาการจดกลมขอมลดวย
สามารถใชฟงกชน HAVING รวมกบคำาสง WHERE ได
เปนการเรยกดขอมลจากคลอลมน department_id และหาคาสงสดของคลอลมน salary หลงจากนนทำาการจดกลมขอมลดวย
SELECT job_id, SUM(salary) PAYROLLFROM employeesWHERE job_id NOT LIKE '%RAP%'GROUP BY job_idHAVING SUM(salary) > 13000ORDER BY PAYROLL;
เปนการเรยกดขอมลจากคลอลมน job_id และหาผลรวมของคลอลมน salary จากนนนำาไปไวทคลอลมนใหมชอ PAYROLL หลงจากนนทำาการจดกลมขอมลดวยคลอลมน job_id โดยมเงอนไขวา jbo_id ตองไมมคำาวา RAP (ใช WHERE) จดกลมขอมลดวย
การใชฟงกชน ซอนฟงกชน
คำาสง CASE เปนคำาสงทใชในการตรวจสอบเงอนไขคลาย ๆ กบคำาสง IF-THEN-ELSE
รปแบบ
หมายเหต: CASE จะเกดขนในสวนของ Select command
โดยท
SELECT MAX (AVG (salary))FROM employeesGROUP BY
เปนการเรยกดขอมลจากคลอลมน salary โดยทำาการหาคาเฉลยของ salary กอน จากนนทำาการหาคาสงสดของ salary และทำาการจดกลม
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_expr3 THEN return_exprn3
- expr คอ ชอคลอลมนทเราจะใชในการตดสนใจ- comparison คอ เงอนไข- return_expr คอ ผลลพธทจะใหออกมา
ตวอยางการใชคำาสง CASE
ฟงกชน DECODE
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 as "REVISED SALARY"
เปนการใชคำาสง CASE ในการเรยกดขอมล โดยดวาคลอลมน job_id ตรงกบชอใดใน 3 คา หากตรงกบ IT_PROG กเอา salary ไปคณกบ 1.10 หากตรงกบ ST_CLERK กเอา salary ไปคณกบ 1.15 หากตรงกบ SA_REP กเอา salary ไปคณกบ 1.20 แตหากไมตรงกบคาใด ๆ ใน
- ลกษณะการทำางานกจะคลาย ๆ กบคำาสง CASE และ คำาสง IF-THEN-ELSE
รปแบบ
- ถาใช CASE จะมคำาวา WHEN, THEN, ELSE และ END- หากใช DECODE ใหตวคำาพวก คอ WHEN, THEN, ELSE และ END นนออก แลวแทนดวยเครองหมายคอมมา (,) ยกเวนตรงคำาสง END ไมตองใส- ทสำาคญ มวงเลบครอบ คำาสงดวย
ตวอยางการใชฟงกชน DECODE
DECODE (col | expression, rearch1,result1
[, search2 , result2,……,……….][, default])
SELECT last_name,job_id,salary, DECODE (job_id , 'IT_PROG' , 1.10*salary , 'ST_CLERK' , 1.15*salary , 'SA_REP' , 1.20*salary
ผลทไดกจะเหมอนกบการใชคำาสง CASE เพยงแคเปลยนรปแบบจากการเรยกดขอมลจากคำาสง CASE เปนฟงชน DECODE