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 ทเราตองการไดรปแบบ
หมายเหต:- รปแบบของวนทตองอยภายใตเครองหมาย ‘’- ตวเลกตวใหญสำาคญ ตองพมพใหตรงกบฐานขอมล
TO_CHAR (date, ‘format_model’)
- หากวนททเปนตวเลขหลกเดยวใหใส fm ขางหนา เชน เดอน มนาคม หากใส fm ขางหนากจะเปน 3- หากตองการเรยกขอมลวนท มากกวา 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 กบ NUMBER (ตวเลข) เพอเปลยนแปลงคาทเปนตวเลข ใหอยในรปของขอความหรอตวอกษร ตาม format ทเราตองการได
รปแบบ
Single Row Functions ททำางานกบขอมลประเภท Character
ชอฟง ความหมาย ตวอยาง ผลทได
เปนการใชฟงชน TO_CHAR ในการแปลงขอมลวนทใหอยในรปของตวอกษร และใช fm ในการตดวนทใหเหลอเพยงหลกเดยว จากนนนำาไป
SELECT TO_CHAR (salary,'$99,999.00') SALARYFROM employees;
เปนการใชฟงชน TO_CHAR ในการแปลงขอมลเงนเดอน ใหเปนแบบตวอกษรทเราตองการ ในทนแปลงเงนเดอนใหมเครองหมาย $ นำาหนา ใหมคอมมาคนเมอตวเลขเกน 3 หลก และกใหมทศนยม 2 ตำาแหนง** เลข 9 แทนจำานวนตวเลข
กชนCONCAT
การเชอมคำา CONCAT (‘Hello’, ‘World’)
HelloWorld
SUBSTR
การตดเอาเฉพาะตวทตองการ
SUBSTR (‘HelloWorld’,3,5)
Hello
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 ใชในการตดทศนยมให ROUND 45.927
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;
เหลอ 3 ตำาแหนงตำาแหนงท 4 มากกวาหรอเทากบ 5 ใหปดขน
(45.92652,3)
TRUNC ใชในการตดทศนยมใหเหลอ 2 ตำาแหนงโดยทไมตองปดขน
TRUNC (45.92652,2)
45.92
MOD ใชในการหารเอาเศษ MOD (1600,300)
100
ตวอยางการใชฟงกชน ROUND
ตวอยางการใชฟงกชน TRUNC
Single Row Functions สำาหรบจดเกบคาทเปน NULL
ฟงกชน NVL - แปลงคาวาง ใหเปนคาทเราสนใจ แตชนดขอมลตองเขากนได- หากคลอลมนทเราสนใจเปนชนดขอมลแบบไหน เราตองเปลยนเปนชนดเดยวกนเทานนเชน
ถาคาไหนใน commission_pct ทเปนคาวาง ใหเปลยนจากคาวางนนเปนเลข 0
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(commission_pct,0)
ถาคาไหนใน hire_date ทเปนคาวาง ใหเปลยนจากคาวางนนเปน 01-JAN-97
- NVL (hire_date,’01-JAN-97’)
ถาคาไหนใน job_id ทเปนคาวาง ใหเปลยนจากคาวางนนเปนคำาวา No Job Yet
- NVL (job_id, ‘No Job Yet’)
หมายเหต: ถาคาใดๆ ทจะทำาการเปลยนจากคาวาง แลวเปนตวอกษร หรอ format ตางๆ คาใดๆนน จะตองเขยนไวภายใตเครอง ‘’
ตวอยางการใชฟงกชน NVL
Output
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 หลาย ๆ ฟงกชนซอนกน
- 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
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
เปนการใชฟงชน 3 ฟงชนซอนกน โดยจะเรมทำาฟงชนทอยขางในสดกอน คอ SUBSTR เปนการตดคำาตวท 1 และ 8 ออก จากนนกใชฟงชน CONCAT ในการเชอมคำาทอยในคลอลมนเขากบ _US และสดทายกเปน
รปแบบการใช GROUP Function
การใชฟงกชน AVG และฟงกชน SUM
ตวอยางการใช GROUP Function
การใชฟงกชน MIN และฟงกชน MAX
- สามารถใชฟงกชน MIN และฟงกชน MAX กบ ตวเลข ตวอกษร และกวนท ได
SELECT group_function (cloumn),………FROM table[WHERE condition][ORDER BY cloumn];
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 กบคอลลมนทมคาวาง
SELECT COUNT(*) FROM employees WHERE department_id = 50;
เปนการใชฟงชน CONUT ในการนบจำานวนสมาชกของ ทงหมดของตาราง
SELECT COUNT(commission_pct) FROM employees WHERE department_id = 80;
เปนการใชฟงชน CONUT ในการนบจำานวนสมาชกของคลอลมน commission_pct
หมายเหต: กรณทคอลมนมคาวางเกดขน group function จะนบเฉพาะจำานวนทมคาเทานน โดยจะ ignore คาวางไป
การใชคำาสง DISTINCT- เปนการยบรวมเอาตวทซำากนออกมาแค 1 คาเทานน
outputDEPARTMENT_ID------------- 100 30 null 20 70 90 110 50 40 80
10 60
12 rows selected.
กอนการใชคำาสง
SELECT DISTINCT (department_id)FROM employees;
จากนนเรยกใช FUNCTION COUNT เขามาครอบคำาสง DISTINCT (department_id))
ฟงกชนแบบ GROUP และคาวาง (NULL)
การใชฟงกชน NVL รวมกบฟงกชนแบบ GROUP และคาวาง
SELECT COUNT(DISTINCT (department_id)) FROM employees;
เปนการใชฟงชน COUNT รวมกน DISTINCT ในการเรยกดขอมลจากคลอลมน department_id โดยการ
SELECT AVG(commission_pct)FROM employees;
เปนการหาคาเฉลยของขอมลในคลอลมน commission_pct โดยทหากคาใดใน commission_pct เปนคาวาง ไมจะมองขามไป
SELECT AVG(NVL(commission_pct,0))
การจดกลมของขอมล ดวยคำาสง GROUP BY- คำาสง GROUP BY จะอยระหวางคำาสง WHERE คำาสง ORDER BYรปแบบ
ตวอยาง การใชฟงกชน GROUP BY
ตวอยาง
เปนการหาคาเฉลยของขอมลในคลอลมน commission_pct โดยทใชฟงชน NVL แปลงขอมลในคลอลมน commission_pct ทเปนคาวางใหเปน
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