Introduction to Object Technology

Download Report

Transcript Introduction to Object Technology

Structured Query Language II
SQL2
(SA&D-7)
1
Structured Query Language:
SQL II

การใช้ ฟังก์ชันใน SQL
ในภาษา SQL ประกอบด้วยฟั งก์ชนั การคานวณทางสถิติที่จะ
ช่ ว ยประมวลผลในการค านวณหาค่ า จากกลุ่ ม แถวของข้อ มู ล ใน
คอลัม น์ ที่ ต ้อ งการ ฟั ง ก์ ชั น เหล่ า นี้ จะใช้ ร่ วมกั บ ค าสั่ ง SELECT
ผลลัพธ์ของฟั งก์ชนั การคานวณคือข้อสรุ ปของข้อมูลในกลุ่มแถวของ
ข้อมูลที่ถกู ระบุดงั นี้
ฟังก์ชนั
COUNT()
ความหมาย
นับจานวนแถวของข้อมูล
SUM()
หาผลรวมของข้อมูลตัวเลขในคอลัมน์ที่กาหนด
AVG()
หาค่าเฉลี่ยของข้อมูลตัวเลขในคอลัมน์ที่กาหนด
MAX()
หาค่าข้อมูลตัวเลขที่มากที่สุดในคอลัมน์
MIN()
หาค่าข้อมูลตัวเลขที่นอ้ ยที่สุดในคอลัมน์ที่กาหนด
ตารางที่ 7.1 สรุ ปฟังก์ชนั ทางสถิติในภาษา SQL
2
Structured Query Language:
SQL II

การใช้ ฟังกชัน COUNT()
ฟั งก์ชนั COUNT() จะใช้ในการนับจานวนแถวของข้อมูล ฟั งก์ชนั นี้ใช้
ร่ วมกับประโยค SELECT รู ปแบบคือให้มี COUNT แล้วอาจตามด้วย
DISTINCT แล้วตามด้วยชื่อคอลัมน์ที่ตอ้ งการ ถ้ามีการใช้คาว่า DISTINCT จะ
เลือกนับเพิม่ เฉพาะข้อมูลที่แตกต่างกันคือถ้าข้อมูลซ้ ากันจะไม่นบั ข้อมูลเพิม่
COUNT ([DISTINCT] <ชื่อคอลัมน์>)
ตัวอย่ างที่ 1
STUDENT
SELECT
FROM
ต้องการนับดูว่ามี ขอ้ มูลของนักศึ กษาทั้งหมดกี่ แถวในตาราง
COUNT(*)
STUDENT
ผลการทางานคาสั่งนี้คือ 8
3
Structured Query Language:
SQL II
ตัวอย่ างที่ 2
ต้องการนับดูวา่ สาขาวิชาที่แตกต่างกันมีกี่สาขา
SELECT COUNT (DISTINCT Major)
FROM STUDENT
ผลการทางานของคาสั่งคือ 3 เนื่ องจากมีการใช้คาว่า DISTINCT จะเลือกนับ
เฉพาะสาขาวิชาที่แตกต่างกัน

การจัดกลุ่มแถวข้ อมูลโดยใช้ GROUP BY
ในบางกรณี อาจมีความจาเป็ นที่จะต้องแบ่งข้อมูลออกเป็ นกลุ่ม
ๆเช่นการจัดกลุ่มของนักศึกษาจากตาราง STUDENT ตามสาขา
วิ ช าเอก ซึ่ งจะจั ด ได้ เ ป็ น 3 กลุ่ ม คื อ สาขาวิ ช าเอก HISTORY,
ACCOUNTING และ MATH
ในภาษา SQL จะใช้ประโยค GROUP BY ในคาสั่ง SELECT เพื่อจัด
กลุ่มแถวของข้อมูลที่มีในคอลัมน์ที่ถูกระบุไว้หลังคาสัง่ GROUP BY
4
Structured Query Language:
SQL II
SELECT
<ชื่อคอลัมน์>
FROM
<ชื่อตาราง>
[WHERE
<เงื่อนไข>]
[GROUP BY <ชื่อคอลัมน์ทีใช้ในการจัดกลุ่มแถวข้อมูล>]
[ORDER BY <ชื่อคอลัมน์หรื อกลุ่มคอลัมน์ที่ใช้ในการจัดเรี ยงข้อมูล>]
การใช้ประโยค GROUP BY จะต้องปรากฏชื่อคอลัมน์ที่เป็ น
เงื่อนไขของการจัดกลุ่มแถวข้อมูลไว้ที่คาสั่ง SELECT ด้วย
หลัง จากจัด กลุ่ ม แถวข้อ มู ล แล้ว จะสามารถใช้ฟั ง ก์ชัน การ
คานวณต่าง ๆ กับกลุ่มของแถวข้อมูลในตารางที่มีค่าภายใต้คอลัมน์
ที่กาหนดเท่านั้น
5
Structured Query Language:
SQL II
ตัวอย่ างที่ 3 ต้องการแสดงจานวนนักศึกษาจากตาราง STUDENT
ในแต่ละวิชาเอก
SELECT
Major, COUNT(*)
FROM
STUDENT
GROUP BY Major
จากคาสั่งจะทาให้แถวของข้อมูลในตาราง STUDENT ถูก
จัดกลุ่มตามสาขาวิชาเอก ซึ่ งจัดได้เป็ น 3 กลุ่ม หลังจากนั้นฟั งก์ชนั
COUNT จะทาการนับว่าในแต่ละกลุ่มมีขอ
้ มูลกี่แถว ซึ่ งจะได้ผล
การทางานของคาสั่ง ดังนี้
6
Structured Query Language:
SQL II
จากคาสั่งจะทาให้แถวของข้อมูลในตาราง STUDENT ถูก
จัดกลุ่มตามสาขาวิชาเอก ซึ่ งจัดได้เป็ น 3 กลุ่ม หลังจากนั้นฟั งก์ชนั
COUNT จาทาการนับว่าในแต่ละกลุ่มมีขอ
้ มูลกี่แถว ซึ่ งจะได้ผล
การทางานของคาสั่ง ดังนี้
Major
(สาขาวิชาเอก)
COUNT(*)
HISTORY
3
ACCOUNTING
3
MATH
2
จากตัวอย่างข้างต้น ถ้าต้องการให้แสดงผลการทางานของ
คาสั่งเรี ยงตามลาดับชื่อสาขาวิชาเอก จะทาได้โดยการใช้ประโยค
ORDER BY ร่ วมด้วย
7
Structured Query Language:
SQL II
SELECT
FROM
Major, COUNT(*)
STUDENT
GROUP BY
Major
ORDER BY
Major
ประโยค ORDER BY จะทาการเรี ยงผลการทางานของคาสั่ง
ตามลาดับชื่อสาขาวิชาเอก ซึ่งจะทาให้ผลการทางานของคาสัง่ ข้างต้น ดังนี้
Major
(สาขาวิชาเอก)
COUNT(*)
ACCOUNTING
3
HISTORY
3
MATH
2
8
Structured Query Language:
SQL II

การใช้ ฟังกชัน SUM()
ฟั งก์ชนั SUM()
ใช้เพื่อหาผลรวมของค่าที่ เป็ นตัวเลขใน
คอลัมน์ที่กาหนด รู ปแบบของฟังก์ชนั SUM() คือ
SUM ([DISTINCT] <นิพจน์ทางตรรกศาสตร์>)
ตัวอย่างที่ 4 ค าสั่ ง ค านวณหาโบนัส รวมกรณี ใ ห้เ งิ นโบนัส เป็ น
5% ของเงินเดือนแก่พนักงานในแผนก COMPUTER
SELECT
FROM
WHERE
SUM (Salary*0.05)
EMPLOYEE
dept=‘COMPUTER’
9
Structured Query Language:
SQL II
ตัวอย่างที่ 5
คาสัง่ คานวณเงินเดือนรวมแยกตามแผนก
SELECT
FROM
GROUP BY
dept, SUM (Salary)
EMPLOYEE
dept
10
Structured Query Language:
SQL II

การใช้ ฟังกชัน AVG()
ฟั งก์ชนั AVG() แสดงค่าเฉลี่ยของข้อมูลตัวเลขในคอลัมน์ที่
กาหนด รู ปแบบ คือ
AVG ([DISTINCT] <นิพจน์ทางตรรกศาสตร์>)
ค า สั่ ง ค า น ว ณ เ งิ น เ ดื อ น เ ฉ ลี่ ย ข อ ง แ ผ น
ACCOUNTING กับแผนก COMPUTER
ตัวอย่างที่ 6
SELECT
FROM
WHERE
GROUP BY
dept, AVG (Salary)
EMPLOYEE
dept=‘COMPUTER’ OR dept =
‘ACCOUNTING’
dept
11
Structured Query Language:
SQL II

การใช้ ฟังกชัน MAX(), MIN()
ฟั งก์ชนั MAX(), MIN() ใช้เพื่อแสดงค่าสู งสุ ด ต่าสุ ด ของคอลัมน์ที่
กาหนด โดยพิจารณาเฉพาะค่าที่เป็ นตัวเลขเท่านั้น รู ปแบบของฟั งก์ชนั MAX(),
MIN() คื่อ
MAX ([DISTINCT] <นิพจน์ทางตรรกศาสตร์>)
MIN ([DISTINCT] <นิพจน์ทางตรรกศาสตร์>)
ตัวอย่ างที่ 7
ค าสั่ ง ให้ แ สดงค่ า สู ง สุ ด ค่ า ต่ า สุ ด และช่ ว งเงิ น เดื อ นของ
พนักงานแต่ละแผนก
SELECT
FROM
ORDER BY
dept, MAX (Salary), MAX (Salary) –
MAX (Salary)
EMPLOYEE
dept
12
Structured Query Language:
SQL II

การใช้ ประโยค HAVING()
ประโยค HAVING() ใช้ในกรณี ที่ไม่ตอ้ งการพิจารณาข้อมูลทุก ๆ กลุ่ม
คื อต้องการระบุเฉพาะกลุ่มย่อยจากข้อมูลกลุ่ มใหญ่ที่ถู กแบ่ งโดยใช้ประโยค
GROUP BY เช่นต้องการจัดกลุ่มนักศึกษาตามสาขาวิชาเอกแล้วต้องการ
เรี ยกดูเฉพาะกลุ่มที่มีนกั ศึกษาไม่เกิน 2 คนเท่านั้น
ตัวอย่ างที่ 8
ค าสั่ ง ให้ แ สดงชื่ อ สาขาวิ ช าเอกและจ านวนนัก ศึ ก ษาของ
สาขาวิชาที่มีนกั ศึกษาไม่เกิน 2 คน
SELECT
FROM
GROUP BY
ORDER BY
Major, COUNT(*)
STUDENT
Major
COUNT(*)<=2
13
Structured Query Language:
SQL II
คาสั่ง HAVING() จะมีลกั ษณะเช่นเดียวกับคาสั่ง WHERE คือ
จะต้องตามด้วยเงื่อนไข โดยที่ HAVING จะใช้เมื่อมีประโยค GROUP BY
เพื่อใช้ในการจัดกลุ่มเท่านั้น ประโยค HAVING จะทาการตัดกลุ่มที่ ไม่
ต้องการออกไป ซึ่งจะทาให้ได้ผลการทางานของคาสัง่ คือ
Major
(สาขาวิชาเอก)
COUNT(*)
MATH
2
ตัวอย่ างที่ 9
คาสัง่ ให้แสดงชื่อสาขาวิชาเอกและอายุเฉลี่ยของนักศึกษาที่อยู่
ปี 4 เฉพาะสาขาวิชาเอกที่มีนกั ศึกษามากกว่า 1 คน
SELECT
Major, AVG (Age)
FROM
STUDENT
WHERE
GradeLevel=‘SN’
GROUP BY
Major
HAVINGCOUNT(*)>1
14
Structured Query Language:
SQL II
ล าดับ การท างานของค าสั่ ง ข้า งต้น คื อ จะท างานตามประโยค
WHERE ก่อนคือจะเลือกเฉพาะแถวข้อมูลของนักศึกษาชั้นปี ที่ 4 (SN)
แล้วจัดกลุ่มนักศึกษาเหล่านั้นตามสาขาวิชาเอก แล้วเลือกเฉพาะกลุ่มที่มี
ข้อมูลมากกว่า 1 แถว แล้วหาค่าเฉลี่ยของอายุนกั ศึกษาในกลุ่มนั้น
ผลการทางานของคาสัง่
Major
(สาขาวิชาเอก)
COUNT(*)
MATH
2
สรุ ปรู ปแบบของประโยคเรี ยกดู ข้ อ มู ล ที่ มี ก ารใช้ ป ระโยค
WHERE, GROUP BY, HAVING และ ORDER BY ดังนี้
15
Structured Query Language:
SQL II
สรุ ปรู ปแบบของประโยคเรี ยกดู ข้ อ มู ล ที่ มี ก ารใช้ ป ระโยค
WHERE, GROUP BY, HAVING และ ORDER BY ดังนี้
SELECT
FROM
[WHERE
[GROUP BY
[HAVING
[ORDER BY
<ชื่อคอลัมน์ที่ตอ้ งการเรี ยกดู>
<ชื่อตาราง>
<เงื่อนไข>]
<ชื่อคอลัมน์ที่ใช้ในการจัดกลุ่มแถวข้อมูล>]
<เงื่อนไขที่ใช้ในการจัดกลุ่มแถว>]
<ชื่อคอลัมน์หรื อกลุ่มคอลัมน์ที่ใช้ในการจัดเรี ยง
ลาดับข้อมูล>]
16
Structured Query Language:
SQL II
• ประโยค WHERE จะใช้กาหนดเงื่อนไขให้กบั ข้อมูลเฉพาะ
บางแถวมากถู ก จัด รวมอยู่ใ นกลุ่ ม โดยจะมี ก ารไปท างานที่
WHERE
ก่อนข้อมูลที่ ตรงตามเงื่ อนไขของ WHERE
เท่านั้นที่จะนามาถูกจัดกลุ่มโดยการ GROUP BY
• ประโยค GROUP BY ใช้แบ่งแถวข้อมูลออกเป็ นกลุ่ม ๆ แล้ว
สามารถใช้ฟังก์ชนั การคานวณหลังจากการจัดกลุ่ม
• ประโยค HAVING จะใช้ในการกาหนดเงื่อนไขเพื่อเลือก
เฉพาะกลุ่มที่ควรจะถูกส่ งค่ากลับมาให้คาสั่ง SELECT โดย
เงื่อนไขส่ วนใหญ่ในประโยคจะมีการใช้ฟังก์ชนั การคานวณ
• ประโยค ORDER BY ในกรณี น้ ี จะใช้ในการกาหนดการ
จัดเรี ยงผลของแต่ละกลุ่มตามลาดับ
17
Structured Query Language:
SQL II

การเชื่อมโยงข้ อมูลจากหลาย ๆ ตาราง
โดยปกติแล้วข้อมูลที่เกี่ยวข้องกับเรื่ องต่าง ๆ จะเก็บอยูภ่ ายในตารางหลาย
ๆ ตาราง ซึ่ ง เป็ นผลจากกระบวนการนอร์ ม อลไลท์เ ซชัน ดัง นั้น ในบางกรณี
สารสนเทศที่เราต้องการจะต้องได้มาจากการเชื่อมโยงข้อมูลจากหลาย ๆ ตาราง
การเชื่อมโยงข้อมูลจากตารางหลาย ๆ ตารางทาได้โดย กาหนดชื่อตาราง
ที่ตอ้ งการนามาเชื่อมโยงกันไว้ในประโยค FROM กาหนดเงื่อนไขที่ตอ้ งการ
จะใช้ในการเชื่อมตารางเข้าด้วยกันไว้ในประโยค WHERE ในรู ปแบบ
SELECT
FROM
WHERE
<ชื่อคอลัมน์ที่ตอ้ งการดูขอ้ มูล>
<ชื่อตาราง>
<เงื่อนไข>
18
Structured Query Language:
SQL II
กรณี การเชื่อมโยงข้อมูลจาก 2 ตาราง การกาหนดเงื่อนไขที่ใช้ในการ
เชื่อมตารางเข้าด้วยในประโยค WHERE มีรูปแบบคือ
WHERE
ชื่อตารางที่ 1.ชื่อคอลัมน์ เงือ่ นไข ชื่อตารางที่ 2.ชื่อคอลัมน์
ตัวอย่างเงื่อนไขที่ใช้ในการเชื่ อมตารางคือ การมีค่าเท่ากันของค่าใน
คอลัมน์ที่ใช้ในการเชื่อม 2 ตาราง ถ้าเราไม่ได้กาหนดเงื่อนไขไว้ในการเชื่อม
ตาราง ทุก ๆ แถว ในตารางแรกจะมาเชื่ อมโยงกับทุก ๆ แถว ในตารางที่ 2
เรี ยกว่าการหา ผลคูณคาร์ ทิเชียน (Cartesian Product) หมายถึงการ
จับคู่ขอ้ มูลทุกแถวในตารางเข้าด้วยกันเช่ น พิจารณาข้อมูลของนักกี ฬาของ
Italy กับนักกีฬาของ France ดังนี้
19
Structured Query Language:
SQL II
Player
Skill
Sex
Andrew
Advanced
Male
Betty
Beginner
Female
ตารางนักกีฬาของ Italy
Player
Skill
Sex
Anita
Beginner
Female
Frank
Advanced
Male
ตารางนักกีฬาของ France
20
Structured Query Language:
SQL II
ตัวอย่างที่ 10 คาสั่งจับคู่นกั กีฬาแต่ละคนของ Italy กับนักกีฬา
ทุก ๆ คนของ France
SELECT *
FROM Italy, France
Italy.Player
Italy.Skill
Italy.Sex
France.Player
France.Skill
France.Sex
Andrew
Advanced
Male
Anita
Beginner
Female
Andrew
Advanced
Male
Frank
Advanced
Male
Betty
Beginner
Female
Anita
Beginner
Female
Betty
Beginner
Female
Frank
Advanced
Male
21
Structured Query Language:
SQL II
กรณี การเชื่อมโยงข้อมูลจากตารางเดียวกันจะใช้วธิ ี การตั้งชื่อ
สมมติให้กบั ตารางนั้น 2 ชื่อ ดังตัวอย่าง
ตัวอย่างที่ 11 คาสั่งการจัดให้นกั กีฬาของประเทศ Italy แข่งกัน
SELECT X.Player, X.Skill, X.Sex
Y.Player,Y.Skill,Y.Sex
FROM
Itlay X, Italy Y
WHERE
X.Player != Y.Player
Italy.Player
Italy.Skill
Italy.Sex
Italy.Player
Italy.Skill
Italy.Sex
Andrew
Advanced
Male
Betty
Beginner
Female
22
Structured Query Language:
SQL II
ตัวอย่ างที่ 12 ถ้าต้องการให้แสดง รหัสนักศึกษา ชื่ อนักศึกษา และ
รหั ส วิ ช า ของนั ก ศึ ก ษาแต่ ล ะคน จะต้ อ งท าการเชื่ อ มโยงข้ อ มู ล
STUDENT และตางราง ENROLLMENT เข้าด้วยกัน ดังนี้
SELECT STUDENT.SID, STUDENT.Name,
ENROLLMENT.ClassName
FROM STUDENT, ENROLLMENT
WHERE STUDENT.SID =
ENROLLMENT.StudentName
ในประโยค FROM แสดงให้เห็ นว่าจะมี การเชื่ อมโยงตาราง
STUDENT และตาราง ENROLLMENT แล้วจึงเลือกเฉพาะแถวข้อมูล
โดยเงื่อนไขที่อยู่หลังประโยค WHERE คือแถวที่มีรหัสนักศึกษาจาก
ตาราง STUDENT
เท่ า กับ แถวที่ มี ร หั ส นั ก ศึ ก ษาจากตาราง
ENROLLMENT
23
Structured Query Language:
SQL II
ผลการทางานของคาสั่ง
SID
Name
ClassName
41100
JAMES
BD445
41150
PIM
BA220
41200
BIRD
BD445
41200
BIRD
CS250
41300
RUM
CS150
41400
RUM
BA200
41400
RUM
BF400
41400
RUM
CS250
41450
JAMES
BA200
24
Structured Query Language:
SQL II
ตัวอย่างที่ 13 ต้องการแสดงเฉพาะรหัสนักศึกษาและรหัสวิชาของ
นักศึกษาชื่อ RUM เฉพาะวิชาที่เขาลงทะเบียนเป็ นอันดับที่ 1 ในชั้น
เรี ยน
SELECT
STUDENT.SID,
ENROLLMENT.ClassName
FROM
STUDENT, ENROLLMENT
WHERE
STUDENT.SID =
ENROLLMENT.StudentNumber
AND
STUDENT.Name = ‘RUM’
AND
ENROLLMENT.PositionNumber = 1
SID
(รหัสนักศึกษา)
ClassName
(รหัสวิชา)
41400
BF410
25
Structured Query Language:
SQL II
ตัวอย่างที่ 14 ตารางแสดงรหัสนักศึกษา รหัสวิชา เวลาเรี ยน และ
ลาดับที่นกั ศึกษาลงทะเบียนของนักศึกษาที่ BIRD
SELECT STUDENT.SID,
CLASS.Name,
CLASS.Time,
ENROLLMENT.PositionNumber
FROM
STUDENT, ENROLLMENT, CLASS
WHERE STUDENT.SID=ENROLLMENT.StudentNumber
AND
ENROLLMENT.ClassName = CLASS.Name
AND
STUDENT.Name = ‘BIRD’
26
Structured Query Language:
SQL II
ผลการทางานของคาสั่ง
SID
(รหัสนักศึกษา)
Name
(ชื่อ)
Time
(เวลาเรียน)
PositionNumber
อันดับการลงทะเบียน
41200
BIRD
MWF3
2
41200
BIRD
MWF12
1
41300
BIRD
MWF3
1
27
Structured Query Language:
SQL II

การสื บค้ นข้ อมูลแบบซ้ อนกัน (Retrieval Using Subquery)
ในการเรี ยกดูขอ้ มูลบางลักษณะที่มีความซ้บซ้อนมาก ๆ อาจจะต้ องใช้
คาสัง่ SELECT ซ้อนกัน ซึ่ งทาได้โดยการซ้อนประโยค SELECT ที่ใช้เรี ยกดู
ข้อ มู ล ไว้ใ นส่ ว นของประโยค WHERE โดยใช้ร่ ว มกับ ตัว กระท าเช่ น IN,
NOT IN, EXIST
หรื อเครื่ องหมายการเปรี ยบเทียบค่าเช่น =, !=, >, >=, การทางานของ
การมีคาสั่งเรี ยกดูขอ้ มูลซ้อนกันนี้ จะเริ่ มจากคาสั่งเรี ยกดูขอ้ มูลที่ซ้อนอยูภ่ ายใน
สุ ดออกมาสู่ ภายนอก เราสามารถที่จะกาหนดให้มีคาสั่งเรี ยกดูขอ้ มูลซ้อนกันอยู่
ได้หลาย ๆ ชั้น และสามารถที่จะซ้อนคาสั่งเรี ยกดูขอ้ มูลไว้กบั คาสั่ง INSERT,
UPDATE และ DELETE ได้ดว้ ย
28
Structured Query Language:
SQL II
ตัวอย่างที่ 15 พิจารณาคาสัง่ เพื่อดูวา่ มีนกั ศึกษาคนใดบ้างที่
ลงทะเบียนเรี ยนวิชา CS250
SELECT
FROM
WHERE
StudentNumber
ENROLLMENT
ClassName = ‘CS250’
ผลการทางานของคาสั่ง
StudentNmber
(รหัสนักศึกษา)
41200
41400
29
Structured Query Language:
SQL II
และเมื่อคาสัง่ SELECT ในลักษณะซ้อนกันดังนี้
SELECT
FROM
WHERE
Name
STUDENT
SID IN
(SELECT StudentNumber
FROM ENROLLMENT
WHERE ClassName = ‘CS250’)
30
Structured Query Language:
SQL II
จะทาให้ได้ผลการทางานคือการดูวา่ นักศึกษาที่ลงทะเบียนใน
วิชา CS250 มีชื่อว่าอะไร เนื่องจากการทางานจะเริ่ มทางจาก
ประโยค SELECT ประโยคในสุ ดก่อน
คือจะค้นหารหัสของนักศึกษาที่ลงทะเบียนวิชา CS250 ก่อน
แล้วจึงค้นหาชื่อของนักศึกษาที่มีรหัสที่ได้จากขั้นตอนแรกให้กบั
คาสั่งเรี ยกดูขอ้ มูลประโยคถัดมา จะได้ผลการทางานของคาสั่งคือ
Name
(ชื่อ)
GARY
RUM
31
Structured Query Language:
SQL II
ดังนั้นการใช้คาสั่ง SELECT ซ้อนกันตามตัวอย่างข้างต้นจึงมี
ความหมายเช่นเดียวกับการใช้คาสั่ง
SELECT
FROM
WHERE
Name
STUDENT
SID IN [41200, 41400]
กรณี การเรี ยกดูขอ้ มูลซ้อนกันหลายชั้น
ตัวอย่างที่ 16 ต้องการดูวา่ มีนกั ศึกษาชื่ออะไรบ้างที่ลงทะเบียน
เรี ยนในเวลา 8 โมงเช้าวันจันทร์ พุธ และศุกร์ นัน่ คือมีค่าในคอลัมน์
เวลาเรี ยนเป็ น MWF8
32
Structured Query Language:
SQL II
SELECT
STUDENT.Name
FROM
WHERE
STUDENT
STUDENT.SID IN
(SELECT ENROLLMENT.StudentNumber
FROM
ENROLLMENT
WHERE ENROLLMENT.ClassName IN
(SELECT CLASS.Name
FROM
CLASS
WHERE CLASS.Time =
‘MWF18’))
33
Structured Query Language:
SQL II
จากค าสั่ง การเรี ย กค้น ข้อ มู ล ออกมาจาก 3 ตารางคื อ
CLASS,
ENROLLMENT และ STUDENT ดังนี้ ขั้นแรกค้นรหัสวิชาที่มีเวลาเรี ยน
คือ MWF8 ซึ่ งหมายถึงเรี ยนตอน 8 โมง วันจันทร์ พุธ และศุกร์ จากตาราง
CLASS ก่อนซึ่ งจะได้ผลจากการทางานของคาสั่งคือ BF410 แล้วส่ งไปให้
คาสัง่ SELECT ในลาดับถัดมาคือ
การเรี ยกค้นรหัสนักศึกษาจากตาราง ENROLLMENT โดยเลือก
เฉพาะนักศึกษาที่ลงทะเบียนในวิชา BF410 ซึ่ งจะได้นกั ศึกาษาเพียงคนเดียวคือ
นักศึกษารหัส 41400 ผลการทางานของคาสัง่ นี้จะส่ งไปให้คาสัง่ SELECT ใน
ลาดับนอกสุ ดคือการเรี ยกค้นชื่อนักศึกษาที่มีรหัสเป็ น BF410 ซึ่ งจะได้ผลการ
ทางานของคาสัง่ ดังนี้
Name
(ชื่อ)
RUM
34
Structured Query Language:
SQL II

การเปรี ยบเทียบระหว่ างการใช้ วิธีการเชื่ อมโยงข้ อมูลระหว่ างตารางและการใช้
การสื บค้ นข้ อมูลแบบซ้ อนกัน
เราสามารถใช้วิธีการเชื่อมโยงข้อมูลระหว่างตารางแทนการสื บค้นข้อมูล
แบบซ้อนกันได้ ตัวอย่างเช่ น กรณี ตอ้ งการแสดงข้อมูลนักศึ กษาที่ ลงทะเบี ยน
เรี ยนวิชา CS250 ซึ่ งแสดงในตัวอย่างที่ 15 จะสามารถเขียนได้อีกรู ปแบบหนึ่ ง
โดยใช้ วิ ธี ก ารเชื่ อ มโยงข้อ มู ล ระหว่ า งตาราง STUDENT
และ
ENROLLMENT โดยใช้คาสัง่ รู ปแบบ
SELECT STUDENT.Name
FROM STUDENT, ENROLLMENT
WHERE STUDENT.SID =
ENROLLMENT.StudentNumber
AND
ENROLLMENT.ClassName = ‘CS250’
35
Structured Query Language:
SQL II
แต่ในกรณี ที่ตอ้ งการทั้งรหัสวิชาและชั้นปี ของนักศึกษาที่ลงทะเบียนเรี ยน
ในวิชานั้น ๆ โดยสนใจเฉพาะนักศึกษาที่ไม่ใช่นกั ศึกษาในระดับปี 5 (GR)
จะต้องใช้เชื่ อมโยงข้อมูลระหว่างตารางเท่ านั้น ไม่ สามารถที่ จะใช้การสื บค้น
ข้อมูลแบบซ้อนได้ เนื่องจากคาตอบที่ตอ้ งการจะมาจาก 2 ตารางคือ รหัสวิชามา
จากตาราง ENROLLMENT และชั้นปี จะมาจากตาราง STUDENT จึง
จะต้องใช้คาสัง่ ดังตัวอย่างที่ 19
SELECT DISTINCT ENROLLMENT.ClassName,
STUDENT.GradeLevel
FROM STUDENT, ENROLLMENT
WHERE ENROLLMENT.StudentNumber = STUDENT.SID
AND
STUDENT.GradeLevel NOT = ‘GR’
36
Structured Query Language:
SQL II
มีบางกรณี ที่การเชื่อมโยงข้อมูลระหว่างตารางจะไม่สามารถใช้
แทนการสื บค้นข้อมูลแบบซ้อนกันได้ และในบางกรณี จะไม่สามารถ
ใช้การเรี ยกค้นข้อมูลแบบซ้อนกันแทนการเชื่ อมโยงข้อมูลระหว่าง
ตารางได้ เนื่องจากเมื่อใช้การเชื่อมโยงข้อมูลระหว่างตาราง
คอลัมน์ที่เป็ นผลลัพธ์จะมาจากตารางไหนในกลุ่มตารางที่ ถูก
เชื่ อมโยงถึ งกันก็ได้ แต่ในกรณี การใช้การเรี ยกค้นข้อมูลแบบซ้อน
คอลัม น์ ที่ เ ป็ นผลลัพ ธ์ จ ะต้อ งมาจากตารางที่ ถู ก กล่ า วในประโยค
FROM ของคาสั่ง SELECT ในระดับนอกสุ ดเท่านั้น
37
Structured Query Language:
SQL II
ตั วอย่ างที่ 17 ต้อ งการทราบว่า มี วิช าใดบ้า งที่ มี นักศึ กษาในระดับ ที่ ไ ม่ ใช่ ปี 5
(GR) ลงทะเบียนเรี ยนจากตัวอย่างสามารถที่จะใช้ประโยคคาสั่งการเชื่ อมโยง
ข้อมูลระหว่างตาราง ENROLLMENT และตาราง STUDENT ดังนี้
SELECT DISTINCT ENROLLMENT.ClassName
FROM
STUDENT, ENROLLMENT
WHERE ENROLLMENT.StudentNumber =
STUDENT.SID
AND
STUDENT.GradeLevel NOT = ‘GR’
หรื ออาจจะใช้ประโยคคาสัง่ เพื่อสื บค้นข้อมูลแบบซ้อน ซึ่ งจะทาให้ผล
การทางานเหมือนกัน ได้ตวั อย่างที่ 18
38
Structured Query Language:
SQL II
ตั ว อย่ า งที่ 18 ต้อ งการทราบว่า มี วิ ช าใดบ้า งที่ นัก ศึ ก ษาในระดับ ที่
ไม่ใช่ปี 5 (GR) ลงทะเบียนเรี ยนโดยใช้ประโยคคาสั่งเพื่อสื บค้น
ข้อมูลแบบซ้อน
SELECT DISTINCT ClassName
FROM
ENROLLMENT
WHERE StudentNumber IN
(SELECT SID
FROM
STUDENT
WHERE GradeLevel NOT = ‘GR’)
39
Structured Query Language:
SQL II
ซึ่ งจะได้ผลลัพธ์การทางานดังนี้
ClassName
(รหัสวิชา)
GradeLevel
(ชั้นปี )
BA200
SO
CS150
SN
BA200
FR
BF410
FR
CS250
FR
BA200
SN
40
Structured Query Language:
SQL II

วิว (View)
วิวคื อ ตารางสมมติ (Virtual Table) ที่ ถูกสร้ างขึ้ นมาจาก
ข้อมูลบางคอลัมน์ของตารางพืน้ ฐาน (Base Table) ซึ่ งเป็ นตาราง
จริ งตั้งแต่ 1 ตารางขึ้นไป วิวจึงเป็ นเค้าร่ าง (Schema) ของระบบ
ฐานข้อมูลที่ผใู ้ ช้แต่ละคนมองเห็น ในการจัดการระบบฐานข้อมูลจะมี
การกาหนดวิวที่ แตกต่างกันให้กบั ผูใ้ ช้ต่าง ๆ ทาให้ผูใ้ ช้สามารถใช้
ข้อ มู ล ได้เ ฉพาะส่ ว นที่ ก าหนดให้ เ ท่ า นั้ น ซึ่ งเป็ นการเพิ่ ม ความ
ปลอดภัยและประสิ ทธิ ภาพให้กบั ระบบฐานข้อมูล
41
Structured Query Language:
SQL II

การสร้ างวิว
การสร้างวิวใช้คาสั่ง CREATE VIEW ตามด้วยชื่อวิวที่ตอ้ งการสร้างขึ้น
และอาจตามด้วยโครงสร้างวิวซึ่ งได้แก่ชื่อคอลัมน์ต่าง ๆ ของวิว แล้วตามด้วย
คาสั่ง SELECT เพื่อกาหนดข้อมูลส่ วนที่จะเลือกจากตารางพื้นฐานมาสร้างวิว
ดังนี้
CREATE VIEW <ชื่อวิว> [(<ชื่อคอลัมน์ที่ 1>,< ชื่อคอลัมน์ที่ 2 >),…,<
ชื่อ
คอลัมน์ที่ n >)] AS <คาสัง่ ประโยค SELECT>
กรณี ที่ไม่กาหนดชื่อคอลัมน์ต่าง ๆ ของวิวแสดงว่ากาหนดให้คอลัมน์ของ
วิวมีชื่อเช่นเดียวกับคอลัมน์จากตารางพื้นฐานของวิวนั้น
42
Structured Query Language:
SQL II
คาสัง่ ประโยค SELECT มีรูปแบบเช่นเดียวกับที่ได้อธิบายไว้ก่อนหน้า
นี้ เราไม่สามารถเปลี่ยนแปลงโครงสร้างของวิวได้ ต้องใช้วิธีการสร้างวิวขึ้นมา
ใหม่โดยให้ลบวิวเก่าทิ้งไป
Emp-Id
Name
Dept
Salary
420215
PANTIP SAICHON
ACCOUNTING
35000
410207
PHONG RUKDEE
ACCOUNTING
37500
410309
SRIWAN JAIDEE
COMPUTER
37500
390304
CHATCAI ARTHON
COMPUTER
40000
….
43
Structured Query Language:
SQL II
ตัวอย่ างที่ 20 คาสั่งสร้างวิวชื่ อ
MONTHLY-PAYMENT
จากตาราง
EMPLOYEE ในรู ปที่ 7.2 ให้มี 2 คอลัมน์ซ่ ึ งเลือกข้อมูลจากคอลัมน์ Emp_Id
และ Salary
CREATE VIEW MONTHLY-PAYMENT
AS
SELECT Emp_Id, Salary
FROM
EMPLOYEE
Emp-Id
Salary
420215
35000
410207
37500
410309
37500
390304
40000
….
44
Structured Query Language:
SQL II

ประโยชน์ ของการใช้ ววิ
◦ เพื่อรักษาข้อมูลบางส่ วนไว้เป็ นความลับ โดยเราสามารถจะสร้าง
วิวให้ผใู้ ช้บางคนเห็นเฉพาะบางคอลัมน์ของตารางพื้นฐานเท่านั้น
◦ เพื่อรักษาความปลอดภัยและความคงสภาพของข้อมูล โดยการ
สร้างวิวขึ้นแล้วกาหนดสิ ทธิ เฉพาะให้กบั ผูใ้ ช้งานบางคนให้ทา
การเปลี่ยนแปลงแก้ไขข้อมูลในวิวนั้นได้
◦ เพื่อ ใช้วิว แทนค าสั่งเรี ย กดู ข ้อ มูล ที่ ใช้ในการท างานที่ จ ะท าซ้ า
เสมอ ๆ
45
Structured Query Language:
SQL II

การเรียกดูข้อมูลจากวิว
การเรี ยกดูขอ้ มูลจากวิวที่สร้างขึ้นจะใช้คาสั่ง SELECT เช่นเดียวกับ
การเรี ยกดูขอ้ มูลจากตาราง ดังนี้
SELECT
FROM
[WHERE
<ชื่อคอลัมน์ที่ตอ้ งการดูขอ้ มูล>
<ชื่อวิว>
<เงื่อนไข>]
การที่ วิวเป็ นเพียงตารางสมมติ ซ่ ึ งไม่ ถูกเก็บไว้จริ งในระบบฐานข้อมูล
การเรี ยกดูขอ้ มูลจากวิวจะส่ งผลไปที่ตารางพื้นฐานของวิวนั้น ๆ โดยคาสั่งเรี ยกดู
ข้อมูลจากวิวจะถูกเปลี่ยนไปเป็ นคาสัง่ ที่มีการกระทาต่อตารางพื้นฐานดังตัวอย่าง
46
Structured Query Language:
SQL II
ตัวอย่ างที่ 21 คาสั่งเรี ยกดูขอ้ มูลในคอลัมน์ Emp-Id จากวิว MONTHLYPAYMENT โดยให้แสดงเฉพาะแถวที่มีขอ้ มูลในคอลัมน์ Salary มากกว่า
35000
SELECT
FROM
WHERE
Emp-Id
MONTHLY-PAYMENT
Salary > 35000
ระบบจัดการฐานข้อมูลจะแปลงคาสั่งในตัวอย่างที่ 21 เป็ นคาสั่งเรี ยกดู
ข้อมูลจากตาราง EMPLOYEE ซึ่ งเป็ นตารางพื้นฐานที่วิว MONTHLYPAYMENT ถูกสร้างขึ้น ดังนี้
SELECT
FROM
WHERE
Emp-Id
EMPLOYEE
Salary > 35000
47
Structured Query Language:
SQL II
เนื่ องจากวิวเป็ นตารางสมมติไม่ถูกเก็บไว้จริ งในระบบฐานข้อมูล
การทาการเพิ่มเติ มเปลี่ ยนแปลงหรื อลบข้อมูลออกจากวิวโดยใช้คาสั่ง
INSERT, DELETE และ UPDATE จะส่ งผลไปที่ตารางพื้นฐานของ
วิวนั้น ๆ โดยคาสั่ง SQL ในการจัดการกับวิวที่ ถูกสร้างจากตาราง
พื้นฐานหนึ่งตารางจะถูกเปลี่ยนไปเป็ นคาสัง่ ที่ใช้กบั ตารางพื้นฐาน ดังนี้
◦ การเพิ่มข้อมูลโดยผ่านวิวโดยใช้คาสัง่ INSERT INTO จะทาให้การไปเพิ่ม
ข้อมูลในตารางพื้นฐานของวิวนั้น โดยจะใส่ ค่าลงไปเฉพาะใต้คอลัมน์ที่กาหนดใน
คาสัง่ INSERT INTO นั้น เท่านั้น
◦ เราสามารถจะใช้คาสั่ง UPDATE กับวิว เพื่อที่จะไปเปลี่ยนแปลงค่าที่อยู่ใน
ตารางพื้นฐานของวิวนั้น
◦ การใช้คาสั่ง DELETE กับวิวจะทาให้มีการไปลบแถวทั้งแถวที่อยู่ในตาราง
พื้นฐานของวิวนั้นถูกสร้างขึ้นมา
48
Structured Query Language:
SQL II

การลบวิว
การลบวิวใช้คาสัง่ DROP VIEW ตามด้วยชื่อวิว ดังนี้
DROP VIEW
<ชื่อวิวที่ตอ้ งการลบ>
ตัวอย่ างที่ 22 ต้องการลบวิวที่ชื่อ MONTHLY-PAYMENT ที่สร้างไว้
แล้วจะทาได้โดยใช้คาสัง่
DROP VIEW
MONTHLY-PAYMENT
49
Structured Query Language:
SQL II

การกาหนดสิ ทธิในการใช้ ข้อมูล
เพื่ อ ความถู ก ต้อ งและปลอดภัย ในการใช้ข ้อ มู ล ในระบบ
ฐานข้อมูล ควรมี การกาหนดว่าอะไรจะให้ผใู ้ ช้คนใดมีสิทธิ อย่างไร
ในการเข้ามาใช้ขอ้ มูลใด
ตัวอย่าง เช่ นกาหนดให้ผูใ้ ช้ทุกคนมี สิทธิ ในการเข้ามาเรี ยกดู
ข้อมูลในตารางได้ แต่เฉพาะหัวหน้าหน่วยงานเท่านั้นที่มีสิทธิ ในการ
เพิ่ ม เติ ม ข้อ มู ล หรื อ กาหนดให้บุ ค คลากรในแต่ ละฝ่ ายเห็ น เฉพาะ
ข้อมูลแถวที่เป็ นของฝ่ ายนั้น ๆ เท่านั้น
50
Structured Query Language:
SQL II

การให้ สิทธิ
ใช้คาสัง่ GRANT เพื่อให้สิทธิในการใช้ตารางหรื อวิว หรื อเฉพาะบาง
คอลัมน์ของตารางนั้น โดยกาหนดว่าจะให้สิทธิ ในการทาอะไรซึ่ งหมายถึงการ
เรี ยกดูขอ้ มูล (SELECT) เพิ่มเติมข้อมูล (INSERT) เปลี่ยนแปลงข้อมูล
(UPDATE) และลบข้อมูล (DELETE) กับตารางหรื อวิวใดให้ผใู ้ ช้ใดบ้าง
รู ปแบบคาสั่งในภาษา SQL ที่ใช้เพื่อกาหนดสิ ทธิคือ GRANT ตาม
ด้วยสิ ทธิ ที่อนุญาตให้กระทากับข้อมูล ตามด้วย ON แล้วตามด้วยชื่อตาราง
หรื อชื่อวิว และอาจตามด้วยชื่อของคอลัมน์เฉพาะส่ วนที่ตอ้ งการกาหนดสิ ทธิให้
เท่านั้น ตามด้วย TO แล้วตามด้วยกลุ่มผูใ้ ช้ที่ได้รับสิ ทธิ น้ นั แล้วอาจตามด้วย
WITH GRANT OPTION ดังนี้
51
Structured Query Language:
SQL II
GRANT<สิ ทธิที่อนุญาตให้กระทากับข้อมูลได้แก่ SELECT, INSERT,
DELETE, UPDATE หรื อ ALL>
ON
<ชื่อตารางหรื อวิว>
TO
<กลุ่มผูใ้ ช้ที่ได้รับสิ ทธิน้ นั >
[WITH GRANT OPTION]
WITH GRANT OPTION คือการอนุญาตให้ผใู ้ ช้ให้ สิทธิ่ต่อ
กันเป็ นทอด ๆ ได้เช่น ผูใ้ ช้ A ให้สิทธิ แก่ผใู้ ช้ B ในการใช้ขอ้ มูลจากตาราง
Table1 พร้อมด้วย WITH GRANT OPTION จะทาให้ผใู ้ ช้ B
สามารถให้สิทธิในการใช้ขอ้ มูลจะเก็บไว้ในการใช้ขอ้ มูลของ Table1 แก่
ผูใ้ ช้ C ผูใ้ ช้ D หรื อผูใ้ ช้อื่น ๆ ต่อไปได้
52
Structured Query Language:
SQL II
ตัวอย่ างที่ 23 คาสั่งให้สิทธิ ในการเรี ยกดูขอ้ มูล และเพิ่มเติ มข้อมูลใน
ตาราง EMPLOYEE ให้กบั KATHY และ JAMES โดยให้
KATHY และ JAMES สามารถให้สิทธิน้ ีแก่ผใู ้ ช้อื่นต่อไปได้อีก
GRANT
SELECT, INSERT
ON
EMPLOYEE
TO
KATHY, JAMES
WITH GRANT OPTION
การกาหนดสิ ทธิ ให้กระทาได้ ทุกอย่ างคือ เรี ยกดูขอ้ มู ล เพิ่มเติ ม
ข้อมูล ลบข้อมูล และเปลี่ยนแปลงข้อมูล จะใช้คาว่า ALL
53
Structured Query Language:
SQL II
ตั ว อย่ า งที่ 24 ค าสั่ง ให้สิ ท ธิ ใ นการเรี ย กดู ข ้อ มู ล เพิ่ ม เติ ม ข้อ มู ล และ
เปลี่ยนแปลงข้อมูล ในตาราง EMPLOYEE ให้กบั JOHN
GRANT
ON
TO
ALL
EMPLOYEE
JOHN
การระบุวา่ ให้สิทธิกบั ผูใ้ ช้งานทุกคนใช้คาว่า PUBLIC
ตัวอย่ างที่ 25 คาสั่งให้สิทธิ ในการเรี ยกดูขอ้ มูลในตาราง EMPLOYEE
ให้กบั ผูใ้ ช้ทุกคน
GRANT
ON
TO
SELECT
EMPLOYEE
PUBLIC
54
Structured Query Language:
SQL II

การยกเลิกสิ ทธิ
การยกเลิกสิ ทธิที่ให้ไว้ ใช้คาสัง่ REVOKE แล้วตามด้วยสิ ทธิที่
ต้องการถอดถอน ตามด้วยชื่อตาราง หรื อ ชื่อวิว ตามด้วยรายชื่อ ผูใ้ ช้ที่ถูก
ถอดถอนสิ ทธิ ดังนี้
REVOKE
ON
FROM
<สิ ทธิที่ถอนการอนุญาต>
<ชื่อตารางหรื อวิว>
<กลุ่มผูใ้ ช้>
ตั วอ ย่ า ง ที่ 2 4 ค า สั่ ง ย กเ ลิ กสิ ท ธิ ใน กา รเ พิ่ ม เ ติ มข้ อ มู ล ใน ตารา ง
EMPLOYEE ที่ให้ JAMES ไว้ในคาสัง่ ที่จากตัวอย่างที่ 23
REVOKE
ON
FROM
INSERT
EMPLOYEE
JAMES
55