บทที่ 8 ภาษาสอบถามเชิงโครงสร้าง (Structured Query Language : SQL) ปัจจุบันหน่วยงานต่าง ๆ ได้นาระบบคอมพิวเตอร์มาใช้งานมากขึ้น โดยเฉพาะ อย่างยิ่งการจัดเก็บข้อมูล รูปแบบฐานข้อมูลที่ใช้จัดเก็บข้อมูลน้ันส่วนใหญ่จะเป็นแบบ ฐานข้อมูลเชิงสัมพันธ์ ซึ่งจัดเก็บข้อมูลในรูปของตาราง และการจะเก็บข้อมูลลงใน ฐานข้อมูล จาเป็นที่จะต้องทราบว่าชนิดของข้อมูลในตารางน้ันเป็นแบบใด มีขนาด เท่าใด เพื่อที่จะเก็บข้อมูลได้อย่างสะดวก ข้อมูลถูกต้อง เป็นระเบียบ และใช้งาน ฐานขอ้ มูลได้อย่างคุ้มค่า ภาษาสอบถามเชิงโครงสร้างหรือภาษา SQL (Structured Query Language) เป็นภาษามาตรฐานมีลักษณะคล้ายภาษาอังกฤษ เป็นภาษาที่ไม่ยาวนัก มีคาสั่งไม่มาก สามารถเรียนรู้ เข้าใจ และศกึ ษาการใช้งานได้ง่าย ภาษา SQL ใช้ในการสอบถาม และ จัดการข้อมูลจากฐานข้อมูลเชิงสัมพันธ์ ตามแนวคิดฐานข้อมูลเชิงสัมพันธ์ ที่ Codd คิดขึ้นเม่ือปี ค.ศ. 1970 โครงสร้างภาษา SQL ออกแบบให้รองรับพีชคณิตเชิงสัมพันธ์ คาสั่งเหล่านี้จะช่วยประหยัดเวลา ในการพัฒนาระบบงานต่าง ๆ ได้รวดเร็วยิ่งขึ้น วตั ถปุ ระสงค์หลักการใช้งานภาษา SQL คือการจัดการข้อมูลในฐานข้อมูล เช่นการเพิ่ม การลบ การปรบั ปรงุ ขอ้ มูล และการแปลงข้อมูลใหอ้ ยู่ในรปู สารสนเทศ ผู้คิดค้นและพัฒนาภาษา SQL ขึ้นเป็นรายแรกคือบริษัท IBM ทาการวิจัยและ พัฒนาใน ปี ค.ศ. 1974 ใช้ชื่อว่า “SEQUEL” (Structured English Query Language) จากน้ันจึงมีการปรับปรุงและเปลี่ยนชื่อเป็น “SQL” หลังจากน้ันผู้ผลิตซอฟท์แวร์ด้าน ระบบจัดการฐานข้อมูลเชิงสัมพันธ์ ได้พัฒนาระบบที่สนับสนุนภาษา SQL มากขึ้น ทา ให้รูปแบบการใช้ภาษา SQL มีรูปแบบที่หลากหลาย และมีการขยายการใช้งานให้ สามารถใช้ได้กับเคร่ืองคอมพิวเตอร์ได้หลายระดับต้ังแต่ระดับไมโครคอมพิวเตอร์ไป จนถึงระดบั เมนเฟรมคอมพิวเตอร์ ปีค.ศ. 1986 สถาบนั มาตรฐานแหง่ ชาติสหรัฐอเมริกา หรอื “ANSI” ได้กาหนด มาตรฐานรปู แบบภาษา SQL ในการสร้างชดุ คาสั่งใหอ้ ยู่ภายใต้มาตรฐานเดียวกนั และ ได้พัฒนาเพิ่มเติมมาตรฐานเพื่อให้รองรับฐานข้อมูลแบบอื่น ๆ ได้อีกนอกจาก ฐานข้อมูลเชิงสัมพันธ์ ในบทนี้ผู้เรียบเรียงจะได้อธิบายถึงคาสั่งต่าง ๆ ที่เป็นรูปแบบ คาสั่งมาตรฐานของภาษา SQL โดยทั่ว ๆไป
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 174 1. ลกั ษณะการใชง้ านของภาษา SQL ภาษา SQL เป็นส่วนประกอบหนึ่งของระบบจัดการฐานข้อมูล มักจะพบใน ระบบจัดการฐานข้อมูลเชิงสัมพันธ์ เป็นที่นิยมใชใ้ นปจั จบุ ัน การใชง้ านภาษา SQL แบ่ง เป็น 2 ลกั ษณะ คือ แบบโต้ตอบ (Interactive) แบบฝงั ในโปรแกรม (Embedded) ภาพที่ 8.1 การใช้งานภาษา SQL (บน) แบบโต้ตอบ (ล่าง) แบบฝังตัวในโปรแกรม (ทีม่ า : https://www.sqa.org.uk/e-learning/SoftDevRDS04CD/page_07.htm)
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 175 1.1 ภาษา SQL แบบโต้ตอบ (Interactive SQL) เปน็ การใชค้ าส่ังภาษา SQL สัง่ งานบนจอภาพ เพื่อเรียกดขู ้อมูลจากฐานข้อมลู ได้โดยตรงในขณะที่ทางาน เพื่อให้ได้ผลลัพธ์ทีน่ าไปใช้ได้ 1.2 ภาษา SQL แบบฝังตัวในโปรแกรม (Embedded SQL) เปน็ การนาคาส่งั SQL ไปใช้ร่วมกบั ชดุ คาสัง่ งานทีเ่ ขียนโดยภาษาต่าง ๆ เชน่ JAVA, C# และ Visual Basic ทีใ่ ส่ไว้ในโปรแกรม การใช้ภาษา SQL ฝังในโปรแกรมอืน่ จะทาให้ภาษา SQL มีความสามารถและมีประสิทธิภาพมากยิ่งขึน้ 2. ประเภทขอ้ มลู ทใ่ี ช้ในภาษา SQL (SQL Data Type) ประเภทข้อมูลของคอลัมน์ที่ใช้ในภาษา SQL เป็นการกาหนดคุณสมบัติของ โครงสร้างของตารางข้อมูลในฐานข้อมูล ในตารางจะขึ้นกับลักษณะของข้อมูลที่มีการ ใส่ลงไปในคอลัมน์แต่ละคอลัมน์นั้น ซึ่งระบบบริหารจัดการฐานข้อมูล หรือ DBMS แต่ ละตัวจะมีการกาหนดประเภทของข้อมูลของคอลัมน์ที่เหมือนหรือแตกต่างกันได้ ประเภทของข้อมูลของแต่ละคอลัมน์ จะขึ้นกับลักษณะของข้อมูลแต่ละคอลัมน์ ตัวอย่างประเภทข้อมูล เช่น ตัวอักขระ (Character) ตัวเลข (Numeric) และวันที่และ เวลา (Date/Time) เป็นต้น 2.1 ประเภทตวั อกั ขระ (character) ในภาษา SQL มี 2 แบบคือ 2.1.1 ตัวอักขระแบบความยาวคงที่ (Fixed-Length Character) จะใช้ char (n) หรือ character (n) แทนประเภทของข้อมูลที่เป็นตัวอักขระใด ๆ ที่มีความยาว ของข้อมูลคงที่ ตัวอักขระประเภทนี้จะมีการจองพื้นที่ตามความยาวที่คงที่ตามที่ กาหนดไว้ โดย n คือจานวนตัวอักขระที่มากที่สุด เช่น char(10) ถ้ามีข้อมูลเพียง 5 ตัว อักขระจะถูกใช้ตามจานวน 10 ตัวอักขระตามที่กาหนดเอาไว้ สามารถเก็บตัวเลขได้แต่ ไม่สามารถนามาคานวณได้ ข้อมูลประเภทนี้จะเก็บความยาวของข้อมูลได้มากทีส่ ุดได้ 255 ตัวอักขระ 2.1.2 ตัวอักขระแบบความยาวไม่คงที่ (Variable-Length Character) จะใช้ varchar (n) แทน สาหรับเก็บข้อมูลประเภทตัวอักขระใด ๆ ที่มีความยาวของ ข้อมูลไม่คงที่ จะต้องมีการกาหนดความยาวของข้อมูลลงไปด้วย เหมาะสาหรับการ เก็บข้อมูลสั้น ๆ เช่น ชื่อ นามสกุล หรือหัวข้อต่าง ๆ เป็นต้น ตัวอักขระประเภทนี้จะมี
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 176 การจองเน้ือที่ตามความยาวของข้อมูล โดยมีความยาว n จะเก็บความยาวของข้อมูล ได้มากที่สดุ ได้ 4,000 ตัวอักขระ ประเภท คาอธิบาย (Description) ขอ้ มลู • มีขนาดความยาวของตัวอักขระสงู สดุ 255 ตวั อกั ขระ CHAR (n) • จัดเก็บตวั อักขระที่ประกาศได้จานวน n ตวั อกั ขระ เป็นความ กว้างคงที่ เช่น CHAR(10) ถ้ามีขอ้ มูลเพียง 5 ตวั อักขระจะถกู ใช้ตามจานวน 10 ตวั อกั ขระตามที่กาหนดเอาไว้ • สามารถเกบ็ ตัวเลขได้แต่ไม่สามารถนามาคานวณได้ • เก็บขนาดข้อมลู ได้สงู สดุ 4,000 ตวั อักขระ เก็บขนาดตาม VARCHAR(n) ข้อมูลทีม่ อี ยู่จริง • จากัดจานวนตวั อกั ขระไม่มากกว่า n ตวั สามารถจดั เก็บตวั อักขระได้ถึง 255 ตวั อักขระ TEXT(n) • ขนาดข้อมูลสงู สดุ 2,147,483,647 ตวั อกั ขระ • เหมาะสาหรบั เก็บข้อมลู เน้ือหาต่าง ๆ ที่ยาว ๆ 2.1 ตัวเลขหรอื จานวนตัวเลข (Numeric) 2.2.1 จานวนตวั เลขทีม่ จี ดุ ทศนยิ ม (Decimal) จานวนตัวเลขที่มีจุดทศนิยมในภาษา SQL จะใช้ dec (m,n) หรือ decimal (m,n) แทน โดย m จะหมายถึงจานวนตัวเลขท้ังหมดรวมจุดทศนิยม และ n หมายถึงจานวนตวั เลขหลงั จดุ ทศนิยม 2.2.2 จานวนตวั เลขที่ไม่มีจุดทศนิยม ในภาษา SQL จะใช้ int หรือ integer เป็นเลขจานวนเต็มบวกหรือลบ ขนาดใหญ่ เป็นตวั เลข 10 หลัก ที่มคี ่าตั้งแต่ – 2,147,483,648 ถึง + 2,147,483,647 และในภาษา SQL จะใช้ smallint สาหรับข้อมูลประเภทที่เป็นเลขจานวนเต็มบวกหรือ ลบขนาดเล็ก เป็นตัวเลข 5 หลกั ที่มคี ่าตั้งแต่ – 32,768 ถึง + 32,767 ตวั เลขจานวน เตม็ ประเภทนี้จะมีการจองเนือ้ ทีน่ อ้ ยกว่าแบบ integer
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 177 ประเภท คาอธิบาย ข้อมลู (Description) DECIMAL(m,n) • จดั เก็บข้อมูลเป็นตวั เลขจุดทศนยิ ม โดย m คือจานวน ตัวเลขหลัก และ n คือจานวนตัวเลขหลังจุดทศนิยม • เชน่ DECIMAL(5,2) หมายถึง สามารถเกบ็ ข้อมลู ได้ 3 หลัก และทศนยิ ม 2 ตาแหน่งในระบบเลขฐานสิบ INT, INTEGER • จดั เก็บข้อมลู ทีเ่ ป็นตัวเลขจานวนเตม็ บวกหรอื ลบ ขนาดใหญ่เป็นตัวเลขที่มคี ่าต้ังแต่ -2,147,483,648 ถึง 2,147,483,647 • ประเภทข้อมลู นี้นิยมใชใ้ นการคานวณ SMALLINT • จัดเก็บข้อมูลที่เป็นตวั เลขจานวนเต็มบวกหรอื ลบ ขนาดเล็ก • เป็นตัวเลขที่มคี ่าต้ังแต่ - 32,768 ถึง 32,767 TINYINT • จดั เก็บข้อมูลที่เป็นตวั เลขจานวนเตม็ บวกหรอื ลบ ขนาดเล็ก • เป็นตัวเลขที่มคี ่าตั้งแต่ -128 ถึง 127 FLOAT(m) • จดั เก็บข้อมูลทีเ่ ป็นตวั เลขทีม่ ที ศนยิ ม กาหนดให้ m มีคา่ น้อยกว่า 24 2.2.3 ข้อมลู ในลกั ษณะอื่น ๆ เชน่ วันที่และเวลา (Date/Time) วันที่และเวลา เป็นชนิดวันที่หรือเวลาในภาษา SQL จะใช้ date เป็นข้อมูลวันที่ ซึง่ จะมีหลายรปู แบบให้เลือกใช้ เชน่ • yyyy-mm-dd (1999-10-31) • dd.mm.yyyy (31.10.1999) หรอื • dd/mm/yyyy (31/10/1999)
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 178 ประเภท คาอธิบาย ข้อมูล (Description) DATE DATETIME • สาหรับเกบ็ ข้อมูลประเภทวนั ที่ โดยเก็บได้จาก 1 มกราคม ค.ศ. 1000 ถึง 31 ธันวาคม ค.ศ. 9999 TIMESTAMP [(M)] • แสดงผลในรูปแบบ YYYY-MM-DD YYYY-MM-DD SET มีคา่ ต้ังแต่ 1000-01-01 ถึง 9999-12-31 • สาหรับเกบ็ ข้อมูลประเภท วันที่ และเวลา โดยจะเกบ็ ได้ตงั้ แต่ 1 มกราคม ค.ศ. 1000 เวลา 00:00:00 ไปจนถึง 31 ธนั วาคม ค.ศ. 9999 เวลา 23 : 59 : 59 • รปู แบบการแสดงผล เวลาที่ทาการสืบค้นออกมา จะเป็น YYYY-MM-DD HH : MM : SS • สาหรับเกบ็ ข้อมูลประเภทวันที่ และเวลาเชน่ กนั แตจ่ ะเกบ็ ในรูปแบบของ YYYYMMDDHHMMSS หรอื YMMDDHHMMSS หรือ YYYYMMDD หรอื YYMMDD แล้วแต่ วา่ จะระบุค่า M เปน็ 14, 12, 8 หรอื 6 ตามลาดับ • สามารถเก็บได้ตงั้ แต่วนั ที่ 1 มกราคม ค.ศ. 1000 ไปจนถึงประมาณปี ค.ศ. 2037 • สาหรบั เก็บข้อมลู ที่เป็นกลุ่มของขอ้ มลู ที่ยอม ให้เลือกได้ 1 ค่าหรอื หลาย ๆ ค่า ซึง่ สามารถ กาหนดได้ถึง 64 ค่า 3. ประเภทของภาษา SQL (Type of SQL Commands) รูปแบบภาษา SQL มีหลายรูปแบบ เช่น ภาษาสาหรับนิยามข้อมูล (Data Definition Language : DDL) ภ า ษ า ส า ห รั บ จั ด ก า ร ข้ อ มู ล ( Data Manipulation Language : DML) ภาษาสาหรับควบคมุ ข้อมลู (Data Control Language : DCL) แตใ่ น บทนี้ จะกล่าวเฉพาะภาษาสาหรับนิยามข้อมูล (DDL) และ ภาษาสาหรับจัดการข้อมูล (DML) ซึง่ เป็นกลุ่มคาสั่งพืน้ ฐานในการทางานรว่ มกับฐานขอ้ มูล
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 179 3.1 ภาษา SQL สาหรับการนยิ ามขอ้ มูล (ภาษา DDL) ภาษา SQL ในกลุ่มของภาษานิยามข้อมูล เป็นกลุ่มคาสั่งที่ใช้ในการสร้าง ฐานขอ้ มูล การกาหนดโครงสร้างข้อมูลว่ามีคอลัมน์หรอื แอททริบิวท์ใด ประเภทข้อมูล เป็นประเภทใด รวมท้ังการจัดการด้านการ เพิ่ม แก้ไข ลบ แอททริบิวท์ต่าง ๆ ใน ตารางขอ้ มูล ทาให้ทราบว่าฐานข้อมลู ทีจ่ ะสร้างจะประกอบด้วยตารางข้อมูลใดบ้าง คาสั่งภาษา SQL สาหรบั จัดการโครงสรา้ งของตารางขอ้ มูล คาสั่ง SQL คาอธิบาย CREATE TABLE กาหนดโครงสร้างขอ้ มูลในตารางข้อมูลทีส่ รา้ งข้นึ NOT NULL กาหนดให้คอลมั น์น้ันมีค่าว่าง(Null) ไม่ได้ UNIQUE กาหนดให้คอลมั น์น้ันมีค่าซ้ากบั คอลัมน์อ่นื ไม่ได้ PRIMARY KEY กาหนดให้คอลัมน์นั้นเปน็ คีย์หลกั FOREIGN KEY กาหนดให้คอลัมน์นั้นเป็นคีย์นอกเพือ่ ใชแ้ สดง ความสัมพันธ์ระหว่างตารางขอ้ มลู DROP TABLE ลบโครงสร้างตารางขอ้ มลู ALTER TABLE แก้ไขโครงสร้างตารางข้อมูล CREATE INDEX สร้างดัชนีของตารางข้อมูล DROP INDEX ลบดัชนขี องตารางข้อมลู CREATE VIEW กาหนดโครงสร้างวิว DROP VIEW ลบโครงสร้างวิว การใช้ภาษา SQL สร้างตารางในระบบจัดการฐานข้อมูล สามารถทาได้โดยใช้ คาสั่ง CREATE TABLE แล้วตามด้วยชื่อตารางที่ต้องการสร้าง พร้อมท้ังกาหนดชื่อ คอลัมน์และประเภทของข้อมลู ของแต่ละคอลมั น์ที่ตงั้ ข้นึ ในตาราง
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 180 1) รปู แบบคาส่ังการสร้างตาราง (CREATE TABLE) CREATE TABLE <ชื่อตารางท่ตี ้องการสรา้ ง> (<ชื่อคอลมั น์ ประเภทข้อมลู >,<ชื่อคอลมั น์ ประเภทข้อมลู >…, CONSTRAINT <ชื่อคยี ์หลกั > PRIMARY KEY (<ชื่อคอลัมน์ท่กี าหนดให้เปน็ คยี ์หลกั >), CONSTRAINT <ชือ่ คยี ์นอก> FOREIGN KEY (<ชื่อคอลมั นท์ ีก่ าหนดให้เป็นคยี น์ อก>) REFERENCES <ชือ่ ตารางข้อมลู ทีส่ มั พนั ธ์>(<ชื่อคอลมั น์ในตารางขอ้ มลู ทสี่ ัมพนั ธ์>) ; ตวั อยา่ งที่ 1 คาสง่ั SQL ในการสร้างตารางขอ้ มูลนิสติ (Student) คาสั่งที่แสดงนี้เป็นคาส่ังให้มีการสร้างโครงสร้างตาราง Student โครงสร้างนี้ จะประกอบด้วยคอลัมน์ 6 คอลมั น์ คือ • รหัสนสิ ิต (StudentID) - ข้อมูล “Char” ขนาดไม่เกิน 8 ตัวอักขระ • ชือ่ -สกุล (Name) - ข้อมลู “Char” ขนาดไม่เกิน 120 ตัวอกั ขระ • วันเกิด (Birthday) - ข้อมูล “Date” • ช้ันเรยี น (Class) - ข้อมูล “Char” ขนาดไม่เกิน 3 ตวั อักขระ • อาจารย์ทีป่ รึกษา (Advisor) - ข้อมูล “Char” ขนาดไม่เกิน 120 ตัวอักขระ • ชมรม (Club) - ข้อมูล “Char” ขนาดไม่เกิน 120 ตัวอกั ขระ CREATE TABLE Student (StudentID Char(8) NOT NULL, Name Char(120) NOT NULL, Birthday Date, Class Char(3) NOT NULL, Advisor Char(120) NOT NULL, Club Char(120), CONSTRAINT Student_pk PRIMARY KEY (StudentID) ;
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 181 ตัวอยา่ งที่ 2 คาสง่ั SQL ในการสร้างตารางขอ้ มูลลงทะเบียน (Register) คาส่ังที่แสดงข้างล่างนี้เป็นคาส่ังให้มีการสร้างโครงสร้างตาราง Register โครงสรา้ งตารางน้ีจะประกอบด้วยคอลมั น์ 5 คอลัมน์ คือ • รหัสนสิ ิต (StudentID) - ข้อมลู “Char” ขนาดไม่เกิน 8 ตัวอักขระ • รหสั วิชา(SubjectID) - ข้อมลู “Char” ขนาดไม่เกิน 8 ตัวอักขระ • เกรด(Grade)- ข้อมลู “Char” ขนาดไม่เกิน 2 ตัวอักขระ • คะแนน(Score) - ข้อมูล “Integer” • ภาคการศกึ ษา(Term) - ข้อมลู “Char” ขนาดไม่เกิน 6 ตวั อักขระ CREATE TABLE Regis (StudentID Char(8) NOT NULL, SubjectID Char(8) NOT NULL, Grade Char(2), Score Integer, Term Char(6) NOT NULL, CONSTRAINT Student_pk PRIMARY KEY (StudentID), CONSTRAINT Subject_pk PRIMARY KEY (SubjectID), CONSTRAINT Student_Subject_fk1 FOREIGN KEY (StudentID) REFERENCES Student(StudentD), CONSTRAINT Student_Subject_fk2 FOREIGN KEY (SubjectID) REFERENCES Subject(SubjectID)); คาสัง่ ทีแ่ สดงนเี้ ปน็ คาสงั่ ให้มกี ารสรา้ งโครงสร้างตาราง Subject กาหนดให้คีย์หลักของตารางข้อมูลเป็นคอลัมน์ “รหัสนิสิต (StudentID)” และ “รหัสวิชา (SubjectID)” นอกจากนี้กาหนดให้คีย์นอกของตารางข้อมูลที่ไปสัมพันธ์กับ ตารางนิสิต (Student) เป็นคอลัมน์ “รหัสนิสิต (StudentID) และคีย์นอกของ ตารางข้อมูลที่ไปสัมพันธ์กับตารางรายวิชา (Subject) เป็นคอลัมน์ “รหัสรายวิชา (SubjectID)”
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 182 กรณีที่มีการใช้คาว่า NOT NULL ใส่ต่อท้ายประเภทข้อมูลของคอลัมน์ ข้อมูลที่ ถกู เก็บอยู่ในคอลมั น์นีจ้ ะต้องไม่มีขอ้ มูลที่เปน็ ค่าว่าง แตค่ อลมั น์อน่ื ที่ไม่ได้กาหนด NOT NULL จะมีข้อมูลเป็นค่าว่างได้ เช่น กาหนดให้คอลัมน์รหัสนิสิต (StudentID) เป็น NOT NULL หมายความว่า ข้อมูลในคอลัมน์รหัสนิสิต (StudentID) จะจัดเก็บข้อมูลได้ก็ ต่อเม่อื มีการกรอกข้อมูลลงในคอลัมน์ดงั กล่าวแล้วเท่านั้น กรณีที่มีการกาหนดคีย์นอก (Foreign Key) ให้กับตารางข้อมูลจาเป็นต้องระบุ ตาราง ข้อมูลและคอลัมน์ที่ไปสัมพันธ์ด้วย เช่น ตารางข้อมูลลงทะเบียน มี ความสัมพันธ์กับตาราง ข้อมูลนิสิต (Student) การกาหนดคีย์นอกทาได้โดยใช้คาสั่ง CONSTRAINT Student_Subject_fk1 FOREIGN KEY (StudentID) REFERENCES Student (StudentID) หมายความว่า กาหนดให้คีย์นอกเป็นคอลัมน์รหัสนิสิต (StudentID) ใน ตารางข้อมูลลงทะเบียนที่ไปสัมพันธ์กับคอลัมน์รหัสนิสิต (StudentID) ในตารางข้อมูล นิสติ (Student) 2) รปู แบบคาสง่ั การลบตาราง (DROP TABLE) หากต้องการลบตารางข้อมูลออกจากฐานข้อมูล สามารถทาได้ด้วย คาส่ัง SQL ที่มีชื่อว่า “DROP TABLE” และระบุชื่อตารางที่ต้องการลบ โดยผลลัพธ์ที่ได้ จากคาส่ังนี้จะทาให้ตารางข้อมูลพร้อมโครงสร้างตารางและข้อมูลภายในหายไปจาก ฐานขอ้ มูล รปู แบบคาสงั่ การลบตาราง มีดังนี้ ตัวอยา่ งที่ 3 คาส่ัง SQL ในการลบตารางขอ้ มลู DROP TABLE <ชือ่ ตารางทีต่ อ้ งการลบ>; DROP TABLE Club; คาสงั่ ลบตาราง “คลับ(Club)” ออกจากฐานขอ้ มูล 3) รูปแบบคาสง่ั การแก้ไขโครงสรา้ งตาราง (ALTER TABLE) หลังจากที่สร้างตารางข้อมูลไปแล้ว อาจจาเป็นที่จะต้องมีการ เปลี่ยนแปลงโครงสร้างตารางที่ได้กาหนดไว้ก่อนหน้า เช่น ต้องการลบคอลัมน์บาง คอลัมน์ เพิ่มคอลัมน์ หรือเปลี่ยนประเภทข้อมูลของคอลัมน์ในตาราง สามารถทาได้
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 183 ด้วยคาสั่ง SQL ที่มชี ือ่ วา่ “ALTER TABLE” และตามด้วยข้อมลู คอลัมนท์ ีต่ อ้ งการเปลี่ยน ไข รูปแบบคาสง่ั การแก้ไขโครงสรา้ งตาราง มีดังนี้ ตวั อยา่ งที่ 4 คาสัง่ SQL ในการเพิม่ คอลมั น์ใหม่ (ADD) ให้กบั ตารางขอ้ มลู ALTER TABLE <ชือ่ ตารางทตี่ ้องการแกไ้ ข> ADD <ชื่อคอลัมน์ ประเภทขอ้ มลู >; ALTER TABLE Student ADD Address char(200); คาสั่งเปลีย่ นแปลงข้อมูลตาราง “นิสติ (Student)” โดยการเพิ่มคอลมั น์ “ ที่อยู่ (Address)” กาหนดประเภทข้อมูลเป็นตัวอักขระ (Char) และมีจานวนไม่เกิน 200 ตัว อักขระ ตัวอย่างท่ี 5 คาสั่ง SQL ในการเปลี่ยนแปลง (Alter) ประเภทข้อมูลหรือขนาด ของประเภทข้อมูลในคอลัมน์ ALTER TABLE <ชื่อตารางทต่ี ้องการแก้ไข> ALTER <ชื่อคอลมั น์ ประเภทขอ้ มูล>; ALTER TABLE Student ALTER Address Vachar (250) ; คาส่ังเปลี่ยนแปลงข้อมูลตาราง “นิสิต(Student)” โดยเปลี่ยนแปลงประเภทข้อมูล คอลัมน์ “ที่อยู่ (Address)” เป็น Varchar และเปลี่ยนแปลงจานวนตัวอักขระเป็นไม่เกิน 250 ตัวอักขระ
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 184 ตวั อยา่ งที่ 6 คาสั่ง SQL ในการลบคอลมั น์ ออกจากตารางขอ้ มูล ALTER TABLE <ชื่อตารางทต่ี ้องการแก้ไข> DROP COLUMN <ชื่อคอลมั น์>; ALTER TABLE Student DROP COLUMN Address; คาสง่ั เปลีย่ นแปลงข้อมลู ตาราง “นิสติ (Student)” โดยลบคอลัมน์ “ทีอ่ ยู่ (Address)” ออกจากตารางข้อมลู ตวั อย่างที่ 7 คาส่ัง SQL ในการกาหนดคีย์หลักให้กบั ตารางขอ้ มูล ADD CONSTRAINT<ชือ่ คยี ห์ ลกั >PRIMARY KEY (<ชือ่ คอลมั น์ท่กี าหนดให้คียห์ ลกั >) ; ALTER TABLE Subject ADD CONSTRAINT subject_PK PRIMARY KEY (subjectID) ; คาสั่งเปลี่ยนแปลงข้อมูลตาราง “วิชา (Subject)” โดยการกาหนดให้คอลัมน์ “รหัสวิชา (subjectID)” เป็นคีย์หลัก ตารางขอ้ มลู ตัวอยา่ งที่ 8 คาสงั่ SQL ในการกาหนดคยี ์นอกให้กับตารางขอ้ มลู คาสั่งเปลี่ยนแปลงข้อมูลตาราง “วิชา(Subject)” โดยการกาหนดให้คอลัมน์ “รหัสหนังสือ(bookID)” คีย์นอก(Forienge Key) ตารางข้อมูลที่ไปสัมพันธ์กับคอลัมน์ ” รหสั หนังสอื (bookID)” ของตาราง “หนงั สือ(Book)“ REFERENCES <ชื่อตารางขอ้ มูลทสี่ ัมพันธ์> (<ชือ่ คอลมั นใ์ นตารางข้อมูลทสี่ ัมพันธ์>); CONSTRAINT subject_FK FOREIGN KEY (bookID) REFERENCES Book(bookID) ;
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 185 3.2 ภาษา SQL สาหรบั การจดั การข้อมลู (ภาษา DML) ภาษา SQL ในกลุ่มของภาษาการจดั การข้อมูล โดยกลุ่มคาสั่งเหล่านจี้ ะมีหน้าที่ ในการจัดการข้อมูลในตารางและการสืบค้นด้วยแบบสอบถามข้อมูล ซึ่งถือว่าเป็น กลุ่มคาส่ังที่เป็นกระบวนการทางานหลักของภาษา SQL และมีรูปแบบการใช้งานที่ หลากหลาย ประกอบไปด้วยคาสงั่ SQL ดงั น้ี คาสง่ั SQL ทีใ่ ชส้ าหรับจัดการข้อมลู ในตาราง คาสั่ง SQL คาอธิบาย INSERT เพิ่มแถวข้อมูลลงไปในตาราง UPDATE ปรบั ปรุงแถวข้อมลู ในตาราง DELETE ลบแถวข้อมูลในตาราง SELECT ค้นหาแถวข้อมูลในตาราง ORDER BY การเรียงลาดับข้อมลู ในการแสดงผลลพั ธ์ของ GROUP BY แบบสอบถาม การจดั กลุ่มขอ้ มูลในการแสดงผลลพั ธ์ของ แบบสอบถาม 1) รูปแบบคาส่งั การเพิม่ แถวข้อมูล (Insert) ลงไปในตาราง ตวั อย่างที่ 9 คาสงั่ SQL ในการเพิม่ แถวข้อมูล (Insert) ลงไปในตาราง คาสั่งเพิ่มข้อมูลในตาราง “นิสิต(Student)” การระบุลาดับของข้อมูลที่ต้องการ เพิม่ จะต้องตรงกับลาดับของคอลัมน์ทีก่ าหนดไว้ เชน่ ข้อมูลรหสั นิสิต “5328002” จะ ถูกเพิ่มเข้าไปทีค่ อลัมน์ “รหัสนสิ ิต (studentID) เป็นต้น INSERT INTO <ชื่อตาราง>(<ชื่อคอลัมน์ลาดบั ที่ 1>,<ชือ่ คอลมั นล์ าดบั ที่ 2>,…….. ........<ชื่อคอลมั น์ลาดับที่ n >) VALUES (ขอ้ มลู ลาดับที่ 1, ข้อมลู ลาดบั ที่ 2, ……… ข้อมูลลาดบั ที่ n) ; INSERT INTO Student Student (studentID, name, birthday, class advisor, club) VALUES (‘53280002’, ‘นางสาวสมุ าลี มีสขุ ’, ‘10/11/2530’, นายสมชาย รกั เรียน,‘เทนนิส’) ;
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 186 2) รปู แบบคาส่ังการเปลี่ยนแปลงแก้ไขแถวข้อมูล (Update) ตัวอย่างที่ 10 คาสง่ั SQL ในการเปลีย่ นแปลงแก้ไขแถวข้อมูล (Update) คาสงั่ เปลี่ยนแปลงแก้ไขแถวข้อมูลในตาราง “นิสติ (Student)” โดยเปลี่ยนแปลง ข้อมูลในคอลัมน์ “อาจารย์ที่ปรึกษา(Adviser)” จากข้อมูลเดิมที่เป็นอาจารย์ที่ปรึกษา ชื่อ “นายสมชาย รักเรียน” เปลี่ยนไปเป็น “นายวรกฤต แสนโภชน์” จากตัวอย่างนี้จะ พบว่าข้อมูลในคอลัมน์อาจารย์ที่ปรึกษาในทุก ๆ แถวที่มีข้อมูลอาจารย์ที่ปรึกษาชื่อ “นายสมชาย รักเรียน” จะถูกเปลี่ยนเป็น “นายวรกฤต แสนโภชน์” ท้ังหมด หาก ต้องการเปลี่ยนแปลงแก้ไขข้อมูลเฉพาะบางแถว จะต้องกาหนดเง่ือนไขที่สามารถระบุ แถวดังกล่าวได้ เชน่ ระบเุ งื่อนไขไปที่ขอ้ มูลในคอลมั น์ที่เปน็ คีย์หลักของตาราง เปน็ ต้น UPDATE <ชือ่ ตาราง> SET<ชือ่ คอลัมน์ทีต่ ้องการเปลี่ยนแปลงแกไ้ ข> = <ข้อมลู เปลีย่ นแปลงแกไ้ ข> WHERE เงื่อนไขที่กาหนด ; UPDATE Student SET Advisor = “นายวรกฤต แสนโภชน์” WHERE Advisor = “นายสมชาย รักเรียน”; 3) รปู แบบคาส่งั ในการลบแถวข้อมูล (Delete) ในตาราง ตัวอย่างที่ 11 คาส่ัง SQL ในการลบแถวข้อมลู (Delete) ในตาราง DELETE FROM <ชื่อตาราง> WHERE เงื่อนไขทีก่ าหนด; DELETE FROM Student WHERE studentID = “53100578”;
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 187 คาส่ังลบแถวข้อมูลในตาราง “นิสิต(Student)” โดยการระบุเง่ือนไขของ แถวข้อมูลนิสิตที่ต้องการลบ โดยเป็นแถวข้อมูลนิสิตที่มีข้อมูลในคอลัมน์ “รหัส ประจาตัว(studentID)” เท่ากับ “53100578” 4) รปู แบบคาส่งั สร้างแบบสอบถาม (SELECT) ในตาราง เป็นคาสั่งที่ใช้ในการระบุคอลัมน์ที่ต้องการแสดงผลลัพธ์จากการค้นหาข้อมูล โดยในกรณีทีด่ ูบางคอลัมน์สามารถทาได้โดยระบุชื่อคอลมั น์ที่ต้องการ หากต้อง การดู ทุกคอลัมน์สามารถใส่เครื่องหมาย “ * ” แทนการระบชุ ื่อคอลัมนท์ ั้งหมด ตวั อยา่ งที่ 12 คาส่ัง SQL ในการสร้างแบบสอบถามข้อมลู เพือ่ ค้นหาแถว ข้อมูลในตารางข้อมลู เพือ่ ค้นหาข้อมลู ในตาราง “นิสิต (Student)” SELECT * หรอื <ชื่อคอลมั นท์ ี่ 1>, <ชือ่ คอลมั น์ท่ี 2>, ……. <ชือ่ คอลมั น์ท่ี n> FROM <ชือ่ ตาราง> WHERE เงื่อนไขทีก่ าหนด; SELECT * หรอื studentID, Name, Birthday, Club FROM Student • คาสง่ั FROM เป็นคาส่ังที่ใชใ้ นการระบุชือ่ ตารางขอ้ มูลที่ต้องการค้นหา ตัวอย่างที่ 13 คาสั่ง SQL ในการสร้างแบบสอบถามข้อมลู (Query) เพื่อ ค้นหาแถวข้อมูลในตารางข้อมลู แบบกาหนดรูปแบบการเรียงลาดับข้อมูล SELECT * หรอื <ชือ่ คอลมั น์ท่ี 1>, <ชื่อคอลมั น์ท่ี 2>, ……. <ชือ่ คอลมั น์ท่ี n> FROM <ชือ่ ตาราง> ORDER BY <ชื่อคอลมั น์> DESC หรอื ASC ; SELECT SubjectID, Name, Credit FROM Register ORDER BY Credit DESC;
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 188 คาสั่งสร้างแบบสอบถามเพื่อค้นหาข้อมูลในตาราง “ลงทะเบียน(Register)” โดยกาหนดให้แสดงผลลัพธ์การค้นหาข้อมูลโดยเรียงลาดับ จากข้อมูลในคอลัมน์ “หนว่ ยกิจ(Credit)” จากหน่วยกิจมากไปน้อย • คาสงั่ ORDER BY เปน็ คาสั่งที่ใชใ้ นการเรียงลาดับข้อมลู โดยระบชุ อ่ื คอลัมน์ทีต่ อ้ งการจัดเรียง • การเรียงลาดับข้อมลู ที่เป็นตวั เลข จะเรียงจากค่ามากไปหาค่าน้อย ต้ังแต่ 9-0 ใช้คาสง่ั “DESC” หรอื จากค่าน้อยไปค่ามากตั้งแต่ 0-9 ใช้คาส่ัง “ASC” • สาหรับข้อมูลที่เป็นตัวอักขระจะเรียงจากค่ามากไปค่าน้อย (จากตัว อักขระตัวท้ายสุดไปยังตัวอักขระตัวแรกสุด) เช่น ตั้งแต่ Z-A หรือ ฮ-ก และจาก ค่าน้อยไปค่ามากจะเรยี งต้ังแต่ A-Z หรอื ก-ฮ ตัวอย่างท่ี 14 คาสั่ง SQL ในการสร้างแบบสอบถามข้อมูล เพื่อค้นหาแถว ข้อมูลในตารางขอ้ มูล โดยการระบเุ ง่อื นไข คาส่ังสร้างแบบสอบถามเพื่อค้นหาข้อมูลในตาราง “นิสิต” โดยเลือกแสดง คอลัมน์ “รหัสนิสิต”,”ชื่อ-นามสกุลนิสิต”, “วันเกิด)”, “ชมรม” โดยกาหนดเง่ือนไขให้ แสดงขอ้ มลู เฉพาะนิสติ ที่เปน็ สมาชิกชมรม “คอมพิวเตอร์” เท่าน้ัน • คาสงั่ WHERE ใช้ในการระบุเง่ือนไขของการค้นหาข้อมูล โดยการระบุชื่อคอลัมน์และข้อมูลที่ ต้องการค้นหา โดยคอลัมน์ที่สามารถระบุได้จะต้องเป็นคอลัมน์ที่ปรากฎอยู่ใน ตารางขอ้ มลู จากคาส่ัง FROM เท่านั้น SELECT * หรอื <ชือ่ คอลัมนท์ ี่ 1>, <ชือ่ คอลมั น์ท่ี 2>, ……. <ชือ่ คอลมั น์ท่ี n> FROM <ชือ่ ตาราง> WHERE เงื่อนไขที่กาหนด ; SELECT studentID, Name, Birthday, Club FROM Student WHERE Club = “คอมพิวเตอร์”;
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 189 4. รปู แบบคาสง่ั SQL ในการสร้างแบบสอบถามขอ้ มูล คาส่งั Select เปน็ คาส่งั ที่ใชใ้ นการสร้างแบบสอบถามเพื่อค้นหาข้อมลู ในตาราง ตามเงอ่ื นไขทีร่ ะบไุ ว้ ซึง่ เปน็ คาสัง่ ที่มีรูปแบบการใชง้ านทีห่ ลากหลายดงั น้ี 4.1 คำส่ัง Select ใช้ร่วมกับตัวดาเนินการ (Operator) ต่าง ๆ เพื่อให้ค้นหา ข้อมูลให้ได้ตรงกับที่ผู้ใช้ต้องการ เช่น ใช้ร่วมกับตัวดาเนินการเกี่ยวกับการคานวณ การเปรียบเทียบ และตรรกศาสตร์ และ เปน็ ต้น เชน่ 4.1.1 คาสงั่ SELECT ใช้ร่วมกบั ตวั ดาเนินการเกี่ยวกบั การคานวณ ตวั ดาเนนิ การ คาอธบิ าย MAX หาค่ามากทสี่ ดุ ของข้อมลู ในคอลมั น์ MIN หาค่าน้อยที่สดุ ของข้อมลู ในคอลัมน์ SUM หาผลรวมของข้อมูลในคอลมั น์ AVG หาค่าเฉลีย่ รวมของขอ้ มลู ในคอลมั น์ COUNT เรียงแถวข้อมูลจาก นอ้ ย ไป มาก ตัวอย่างที่ 15 คาสั่ง SELECT ที่ใชร้ ่วมกับตัวดาเนินการที่เกีย่ วกบั การคานวณ คาส่ังสร้างแบบสอบถามเพื่อค้นหาค่าเฉลี่ยของค่าเฉลี่ยของคะแนนสอบจาก ข้อมูลในคอลัมน์ “คะแนน(Score)” ในตาราง “ลงทะเบียน(Register)” โดยกาหนดให้ แสดงผลลัพธ์เฉพาะค่าเฉลี่ยของวิชาที่มีรหัสวิชาเท่ากับ “I002” และให้ผลลัพธ์แสดง ในคอลัมน์ที่ชื่อวา่ “ค่าเฉลีย่ ของคะแนนสอบ” SELECT [MAX, MIN, SUM, AVG, COUNT] <ชื่อคอลัมน์> AS COLUMN_NAME FROM <ชือ่ ตาราง> WHERE เงือ่ นไขที่กาหนด ; SELECT AVG(Score) AS คา่ เฉลี่ยของคะแนนสอบ FROM Register WHERE SubjectID =”I002”;
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 190 ตัวดาเนินการที่เกี่ยวกับการคานวณ ได้แก่ MAX, MIN, AVG, และSUM จะให้ ผลลัพธ์ได้ตอ่ เมือ่ นาไปใช้กับคอลัมน์ประเภทข้อมลู เป็นตัวเลขเท่าน้ัน คาสง่ั COUNT จะ เป็นการนับจานวนข้อมูลที่ปรากฏในคอลัมน์ โดยใช้ได้กับคอลัมน์ประเภทข้อมูลเป็น ตวั เลข และตัวอักขระ 4.1.2 คาส่ัง SELECT ใช้ร่วมกบั ตัวดาเนินการการเปรียบเทียบ ตัวดาเนนิ การ คาอธิบาย = เท่ากับ > มากกว่า < น้อยกว่า >= <= มากกว่าหรือเท่ากับ <> น้อยกว่าหรอื เท่ากบั ไม่เท่ากับ ตัวอยา่ งที่ 16 คาส่งั SELECT ใช้ร่วมกบั ตัวดาเนินการเกีย่ วกับการเปรียบเทียบ SELECT * หรอื <ชื่อคอลัมนท์ ี่ 1>, <ชือ่ คอลัมน์ท่ี 2>, ……. <ชือ่ คอลมั น์ท่ี n> FROM <ชือ่ ตาราง> WHERE <ชือ่ คอลัมน์> [ตวั ดาเนินการเปรียบเทียบ] <ข้อมลู ที่ใชใ้ นการเปรียบเทยี บ>; SELECT StudentID, SubjectID, Grade, Score FROM Register WHERE Score > 80; คาสั่งสร้างแบบสอบถามเพื่อค้นหาข้อมูลนิสิตที่ลงทะเบียนเรียนในตาราง “ลงทะเบียน(Register)” โดยกาหนดให้แสดงผลลัพธ์เฉพาะนิสิตที่มีคะแนน(Score) มากกว่า 80 คะแนน ขึน้ ไปเท่านั้น
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 191 ตัวดาเนินการที่เกี่ยวกับการเปรียบเทียบ ได้แก่ >, <, >= และ <= จะให้ ผลลัพธ์ได้ก็ต่อเม่ือนาไปใช้กับคอลัมน์ที่ประเภทข้อมูลเป็นตัวเลขเท่าน้ัน ส่วนคาส่ัง = และ <> สามารถใช้ได้กับคอลมั น์ที่ประเภทข้อมูลเป็นตวั เลขและตวั อกั ขระ 4.1.3 คาสงั่ SELECT ใช้ร่วมกับตัวดาเนินการเกี่ยวกบั ตรรกศาสตร์ ตัวดาเนนิ การ คาอธิบาย AND แสดงแถวข้อมูลภายใต้เง่อื นไข “ข้อมลู ต้องตรงตาม เงื่อนไขท้ังหมด” OR แสดงแถวข้อมูลภายใต้เงอ่ื นไข “ข้อมลู ต้องตรงตาม เง่อื นไขใดเงื่อนหนึ่ง” NOT ใช้นาหน้าเงื่อนไขทีเ่ ป็นจริง โดยจะทาให้นพิ จน์เปน็ “เท็จ” แตถ่ ้านาหน้า เง่ือนไขที่เป็นจริง จะทาให้ นิพจน์เปน็ ”จรงิ ” ตวั อย่างที่ 17 คาสงั่ SELECT ใช้ร่วมกบั ตวั ดาเนินการเกี่ยวกบั ตรรกศาสตร์ SELECT * หรอื <ชื่อคอลมั นท์ ี่ 1>, <ชื่อคอลัมน์ท่ี 2>, ……. <ชื่อคอลมั น์ท่ี n> FROM <ชื่อตาราง> WHERE <ชื่อคอลัมน์> [ตวั ดาเนินการตรรกศาสตร์] <ข้อมลู ที่ใชใ้ นการเปรียบเทยี บ> ; • คาส่งั AND SELECT StudentID, SubjectID, Grade, Score FROM Register WHERE Score > 60 AND Score < 80 ;
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 192 คาส่ังสร้างแบบสอบถามเพื่อค้นหาข้อมูลนิสิตที่ลงทะเบียนเรียนในตาราง “ลงทะเบียน(Register)” โดยกาหนดให้แสดงผลลัพธ์เฉพาะนิสิตที่มีคะแนน (Score) มากกว่า 60 คะแนน และไม่เกิน 80 คะแนนเท่าน้ัน • คาสั่ง OR SELECT StudentID, SubjectID, Grade, Score FROM Register WHERE Grade = “A” OR Grade = “B”; คาสั่งสร้างแบบสอบถามเพื่อค้นหาข้อมูลนิสิตที่ลงทะเบียนเรียนในตาราง “ลงทะเบียน(Register)” โดยกาหนดให้แสดงผลลัพธ์เฉพาะนิสิตที่ได้เกรด (Grade) A หรอื B เท่านั้น • คาส่งั NOT SELEC•T StudentID, SubjectID, Grade, Score FROM Register WHERE NOT SubjectID = “S001”; คาสั่งสร้างแบบสอบถามเพื่อค้นหาข้อมูลนิสิตที่ลงทะเบียนเรียนในตาราง “ลงทะเบียน(Register)” โดยกาหนดให้แสดงผลลัพธ์เฉพาะนิสิตที่ได้ไม่ได้ลงทะเบียน เรียนในวิชาที่มรี หัสวิชา(SubjectID) เป็น “SOO1”
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 193 4.2 คาสั่ง SELECT ที่ใชร้ ่วมกบั ตัวดาเนินการอ่นื ทีไ่ ม่สามารถจดั กลุ่มได้ เชน่ DISTINC, IN, LIKE และ BETWEEN …AND เป็นต้น ตัวดาเนนิ การ คาอธบิ าย DISTINC แสดงขอ้ มลู ทไี่ ม่ซ้ากนั ในตารางข้อมลู IN เปรียบเทียบกลุ่มข้อมูล โดยขอ้ มลู ทีเ่ ป็นผลลพั ธ์จะต้องตรงกบั คา่ ใดคา่ หนึง่ ในกลุ่มขอ้ มลู LIKE เปรียบเทียบข้อมลู ประเภทข้อความทีต่ รงกบั รปู แบบทีก่ าหนด BETWEEN…AND เปรียบเทียบข้อมลู ในลกั ษณะเป็นช่วง เช่น A–Z, 0–9 เปน็ ตน้ ตวั อยา่ งที่ 18 คาสงั่ SELECT ที่ใชร้ ่วมกบั ตวั ดาเนินการ : DISTINC คาสั่งสร้างแบบสอบถามเพื่อค้นหาข้อมูลชมรม (Club) ที่มีนิสิตเป็นสมาชิก กาหนดให้แสดงผลลพั ธ์เฉพาะชมรมทีม่ นี ิสติ เปน็ สมาชิก โดยไม่ใหแ้ สดงชือ่ ชมรมซ้ากนั SELECT DISTINC <ชือ่ คอลมั น์> FROM <ชือ่ ตาราง>; SELECT DISTINC Club FROM Student ตัวอยา่ งที่ 19 คาส่ัง SELECT ทีใ่ ชร้ ่วมกับตัวดาเนินการ : IN SELECT <ชื่อคอลัมน์> FROM <ชื่อตาราง> WHERE <ชื่อคอลัมน์> IN (เงื่อนไขเปรยี บเทียบ) ; SELECT OrderD, ProductID, Price, Date FROM Order WHERE ProductID IN (“P01”, ”P02”, “P03”);
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 194 คาสงั่ สร้างแบบสอบถามเพื่อค้นหาข้อมลู จากตารางใบสงั่ ซื้อสนิ ค้า(Order) โดย กาหนดให้แสดงผลลพั ธ์เฉพาะข้อมลู เลขทีใ่ บส่ังซื้อสนิ ค้า (OrderID) ทีม่ ีการสง่ั ซือ้ สินค้า เลขที่ (ProductID) ตรงตามเงอ่ื นไข ดังตอ่ ไปนี้ 1) ส่งั ซื้อสนิ ค้าเลขที่ “P01” หรอื “P02” หรอื “P03” 2) ส่ังซื้อสินค้าเลขที่ “P01” และ “P02” หรือ “P01” และ “P03” หรอื “P02” และ “P03” 3) สงั่ ซื้อสนิ ค้าเลขที่ “P01” และ “P02” และ “P03” ตวั อยา่ งที่ 20 คาสง่ั SELECT ทีใ่ ชร้ ่วมกบั ตวั ดาเนินการ : LIKE SELECT <ชื่อคอลมั น์> FROM <ชื่อตาราง> WHERE <ชื่อคอลมั น์> LIKE (เงือ่ นไขเปรียบเทยี บ) ; SELECT Name, Class FROM Student WHERE Name LIKE ‘ก*’; คาสั่งสร้างแบบสอบถามเพื่อค้นหาข้อมูลนิสิตในตาราง “นิสิต (Student)” โดย กาหนดให้แสดงผลลัพธ์เฉพาะนิสิตที่ชื่อ-นามสกุล (Name) ขึ้นต้นด้วย “ก” เท่าน้ัน การกาหนดเง่ือนไขของคาสั่ง LIKE มดี ังน้ี • เครื่องหมาย “ * ” อยู่หลงั เง่อื นไขเปรียบเทียบ เช่น ‘A*’ หมายถึง แสดงผลลพั ธ์ข้อความในคอลัมน์เฉพาะข้อความที่ขนึ้ ต้นด้วยตวั อักขระ “ A ” เท่าน้ัน • เครือ่ งหมาย “ * ” อยู่หน้าเงอ่ื นไขเปรียบเทียบ เช่น ‘*A’ หมายถึง แสดงผลลพั ธ์ข้อความในคอลัมน์เฉพาะข้อความที่ลงท้ายด้วย ตวั อักขระ “ A ” เท่าน้ัน • เครื่องหมาย “ * ” อยู่หน้าและหลังเง่ือนไขเปรียบเทียบ เช่น ‘*A*’ หมายถึงแสดงผลลัพธ์ของข้อความในคอลัมน์เฉพาะข้อความมี ตัวอักขระ “ A ” เป็น องค์ประกอบ เท่านั้น ในบางระบบจดั การฐานข้อมูล จะใช้เครอื่ งหมายเปอร์เซ็นต์ “ % ” แทนเคร่อื ง หมาย “ * ” เชน่ ‘%A’ , ‘A%’ และ ‘%A%’ เปน็ ตน้
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 195 ตัวอย่างที่ 21 คาส่งั SELECT ใช้ร่วมกบั ตวั ดาเนินการ : BETWEEN...AND SELECT <ชือ่ คอลัมน์> FROM <ชื่อตาราง> WHERE <ชื่อคอลมั น์> BETWEEN <เงือ่ นไขเปรียบเทียบ> AND <เง่อื นไข เปรียบเทียบ>; SELECT StudentID, SubjectID, Score FROM Register WHERE Score BETWEEN 60 AND 70 ; คาส่ังสร้างแบบสอบถามเพื่อค้นหาข้อมูลนิสิตที่ลงทะเบียนเรียนในตาราง “ลงทะเบียน(Register)” โดยกาหนดให้แสดงผลลัพธ์เฉพาะนิสิตที่มีคะแนน(Score) อยู่ ระหว่าง 60 – 70 คะแนน เท่านั้น คาสัง่ BETWEEN…AND สามารถใช้ในการเปรียบเทียบช่วงขอ้ มลู วันเวลาได้ โดย คอลัมน์ทีน่ ามาเปรียบเทียบจะต้องถกู กาหนดโครงสร้างเป็นประเภทวัน/เวลา เชน่ SELECT * FROM Order WHERE Date BETWEEN ‘10/01/2017’ AND ‘20/01/2017’; คาส่ังสร้างแบบสอบถามเพื่อค้นหาข้อมูลในตาราง “ใบสั่งซื้อสินค้า(Order)” โดยกาหนดให้แสดงผลลัพธ์เฉพาะข้อมูลในช่วงวันที่ 10/01/2017 จนถึงวันที่ 20/01/2017 เท่าน้ัน
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 196 4.3 คาสง่ั SELECT ทีใ่ ชร้ ่วมกับการจดั กลุ่มขอ้ มูล (GROUP BY) จากตัวอย่างที่ผ่านจะเห็นได้ว่าการสร้างแบบสอบถามในการค้นหาข้อมูล จะ กระทากับข้อมูลทุกแถวในตาราง กรณีที่ตารางขอ้ มลู มีขอ้ มลู อยู่ภายในเปน็ จานวนมาก การจัดกลุ่มของข้อมูลที่ต้องการค้นหาจะช่วยให้ค้นหาข้อมูลได้รวดเร็วมากขึ้น เนื่องจากไม่ต้องไปค้นหาข้อมูลจากทุก ๆ แถว จะค้นหาข้อมูลจากบางแถวที่ได้มีการ จัดกลุ่มข้อมลู ไว้ SELECT <ชื่อคอลมั น์> FROM <ชือ่ ตาราง> GROUP BY <ชื่อคอลัมน์> HAVING <เงอื่ นไขในการจดั กลุ่มข้อมลู > ; ตัวอย่างที่ 22 คาสั่ง SELECT ทีใ่ ชจ้ ัดกลุ่มข้อมลู (GROUP BY) รถยนต์ (CAR) Car_ID Model Brand Year C001 Fortuner TOYOTA 2000 C002 HONDA 2017 C003 Civic TOYOTA 2018 C004 Altis NISSAN 1990 C005 Navara HONDA 2001 C006 C220 TOYOTA 2005 Yaris กรณีที่ 1 จากตารางข้อมลู รถยนต์ (CAR) ถ้าต้องการแสดงจานวนรถยนต์ของแต่ละ บริษทั ผผู้ ลติ (Brand) สามารถใช้คาสั่ง SQL ในการจดั กลุ่มขอ้ มลู (GROUP BY) ได้ดังน้ี SELECT Brand, COUNT(Car_ID), FROM CAR GROUP BY Brand;
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 197 ผลลพั ธ์ทีไ่ ด้เปน็ ดังน้ี Brand COUNT(Car_ID) TOYOTA 3 HONDA 2 NISSAN 1 กรณีที่ 2 จากตารางขอ้ มูลรถยนต์ (CAR) หากต้องการแสดงจานวนรถยนต์ของแต่ละ บริษทั ผผู้ ลติ (Brand) ทีม่ ีจานวนรถยนต์ต้ังแต่ 2 คนั ขึ้นไป สามารถใช้คาสั่ง SQL ในการ จดั กลุ่มข้อมลู (GROUP BY) ได้ดงั น้ี SELECT Brand, COUNT(Car_ID), FROM CAR GROUP BY Brand HAVING COUNT(Car_ID) >= 2 ; ผลลัพธ์ที่ได้เปน็ ดงั น้ี Brand COUNT(Car_ID) TOYOTA 3 HONDA 2 4.4 การสรา้ งแบบสอบถามจากตารางขอ้ มูลหลายตาราง จากตัวอย่างการสร้างแบบสอบถามที่ผ่านมา จะเป็นการสร้างแบบสอบถาม เพื่อค้นหาข้อมูลจากตารางข้อมูลเพียงตารางเดียวเท่าน้ัน แต่ในระบบฐานข้อมูล เชิงสัมพันธ์ จะเป็นฐานข้อมูลที่เกิดจากความสัมพันธ์ระหว่างตารางข้อมูลตั้งแต่ 2 ตาราง ขึ้นไป ซึ่งเกิดจากการ Join ตารางข้อมูลร่วมกันและการ Join แบ่งเป็น 2 ประเภทหลักคือ Inner Join และ Outer Join 4.4.1 Inner Join เป็นการเลือกเฉพาะข้อมูลที่มีคีย์ตรงกันเท่านั้นมา แสดงหรอื เปน็ การแสดงแถวของขอ้ มูลที่สอดคล้องกบั เงือ่ นไขที่กาหนดเท่าน้ัน
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 198 คาส่ัง SQL ในการสร้างแบบสอบถามข้อมูล (Query) จากหลายตารางด้วย วิธีการแบบ Inner Join มีโครงสรา้ งคาสั่ง SELECT <ชือ่ คอลัมน์> FROM <ชือ่ ตารางท_ี่ 1>,<ชือ่ ตารางท_ี่ 2>,…, <ชื่อตารางท_ี่ N> WHERE <เงือ่ นไขในการ Join>; 1) คาส่ัง SELECT ใช้สาหรับแสดงคอลัมน์ที่เป็นผลลัพธ์ โดยการ Join ตารางข้อมูล ต้ังแต่ 2 ตารางขึ้นไปมาประสานงานร่วมกัน กรณีที่คอลัมน์มีชื่อ เหมอื นกนั ในหลาย ๆ ตารางจะต้องระบุชื่อตารางของคอลัมน์น้ันด้วย เชน่ มีคอลมั น์ชื่อ “StudentID” อยู่ในตาราง Student และตาราง Register ถ้านาตารางท้ัง 2 ตาราง มา Join กนั การระบชุ ื่อคอลมั น์ “StudentID” คือ Student.StudentID จะหมายถึง คอลัมน์ StudentID ของตาราง Student และ Register.StudentID จะหมายถึง คอลัมน์ StudentID ของตาราง Register 2) คาส่ัง FROM ในการ Join ตารางขอ้ มลู เป็นการระบุตารางขอ้ มูล ทุกตารางทีม่ า Join กนั 3) คาส่ัง WHERE เป็นการระบุเง่ือนไขในการ Join ตารางข้อมูล โดย จะต้องระบุเง่ือนไขของคอลัมน์ที่แสดงความสัมพันธ์ของตารางข้อมูล 2 ตาราง คือ ความสัมพันธ์ระหว่างคีย์หลักของตารางข้อมูลหนึ่ง กับคีย์นอกของอีกตารางหนึ่ง และ อาจระบเุ งื่อนไขอืน่ ๆ เพิม่ อีกก็ได้ ตัวอย่างที่ 23 คาสงั่ SELECT ที่ใชส้ าหรับ Inner Join ตารางนิสติ (Student) StudentID Name Birthday Class Advisor Club 4800111 นายดีใจ จงั เลย 11/12/2529 171 นายเปน็ ต่อ ดีเลิศ เทนนิส 4800112 น.ส.ใจรา้ ย มากเลย 5/10/2528 171 นางสวุ ดี สอนดี คอมพิวเตอร์ 4800113 นายบญุ มา ลาก่อน 23/8/2529 172 นางสวุ ดี สอนดี เทนนิส 4800114 นายไปดี มาดี 9/2/2530 172 นายเป็นต่อ ดีเลิศ คอมพิวเตอร์ 4800115 นายขยัน จึงได้ดี 7/3/2529 173 นายเป็นต่อ ดีเลิศ เทนนิส 4800116 นายเปน็ หนึง่ ใตห้ ลา้ 1/4/2527 174 นางสมใจ เป็นสขุ เทนนิส
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 199 ตารางลงทะเบียน (Register) StudentID SubjectID Grade Score Term 4800111 254251 A 85 1/2551 4800112 254311 C 60 2/2551 4800113 001141 F 38 3/2550 4800114 254251 B 75 1/2549 4800115 254251 1/2551 คาสั่ง SELECT ที่ใช้ Inner Join ตารางนสิ ิต (Student) และตารางลงทะเบียน (Register) SELECT Student.StudentID, Name, SubjectID, Score, Grade FROM Student, Register WHERE Student.StudentID = Register.StudentID AND Grade = ‘A’; คาส่ังสร้างแบบสอบถามเพื่อค้นหาข้อมูลนิสิตที่ลงทะเบียนเรียนในตาราง “ลงทะเบียน(Register)” กาหนดให้แสดงข้อมูลคอลัมน์รหัสนิสิต(StudentID), ชื่อ- นามสกุลนิสิต (Name) จากตารางนิสิต (Student), คอลัมน์รหัสวิชา (SubjectID), คะแนน (Score), คะแนนเฉลี่ย (Grade) จากตารางลงทะเบียน (Register) และแสดง เฉพาะนิสติ ทีไ่ ด้คะแนนเฉลีย่ “A” เท่านั้น ผลลัพธ์ดังตารางดา้ นล่าง StudentID Name SubjectID Score Grade 4800111 นายดีใจ จงั เลย 254251 85 A 4800112 น.ส.ใจรา้ ย มากเลย 254311 60 C 4800113 นายบุญมา ลากอ่ น 001141 38 F 4800114 นายไปดี มาดี 254251 75 B 4800115 นายขยัน จึงได้ดี 254251 4.4.2 Outer Join เป็นการนาข้อมูลทั้งหมดมาแสดงถึงแม้ว่าคีย์จะไม่ ตรงกันหรือเป็นการแสดงแถวของข้อมูลทั้งหมดท้ังที่สอดคล้องและไม่สอดคล้องกับ เงือ่ นไขทีก่ าหนด มีโครงสรา้ งคาส่ัง ดงั น้ี
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 200 SELECT <ชื่อคอลมั น์> FROM <ชือ่ ตารางที_่ 1> [LEFT JOIN / RIGHT JOIN] <ชื่อตารางท_ี่ 2> ON <เงือ่ นไขในการ Outer Join>; 1) คาสง่ั SELECT ใชแ้ บบเดียวกนั กบั Inner Join 2) คาสั่ง FROM ใน Outer Join กระทาได้ 2 แบบ คือ • Left Outer Join เป็นการกาหนดให้ตารางที่อยู่หน้าคาส่ัง “Left Join” เป็นตารางข้อมูลหลัก เช่น Subject LEFT JOIN Register หมายถึง จะแสดง แถวของข้อมลู ทีส่ อดคล้องระหว่างตารางขอ้ มูล Subject กับ Register และไม่สอดคล้อง กับตาราง Subject มาด้วยท้ังหมด • คาส่ัง Right Outer Join กาหนดให้ตารางที่อยู่หลังคาส่ัง “Right Join” เป็นตารางข้อมูลหลัก เช่น Subject RIGHT JOIN Register หมายถึง จะ แสดงแถวของข้อมูลที่สอดคล้องระหว่างตารางข้อมูล Subject กับ Register และไม่ สอดคล้องกบั ตาราง Register มาด้วยท้ังหมด 3) คาสั่ง ON เป็นการกาหนดเงือ่ นไขการ Join แบบเดียวกับ Inner Join และอาจระบเุ งอื่ นไขอื่น ๆ เพิ่มอีกก็ได้ ตัวอย่างที่ 24 คาสง่ั SELECT ที่ใช้ Left Outer Join และ Right Outer Join ตารางวชิ า(Subject) SubjectID Name Credit Teacher Textbook 3 นายสมปอง พลสุข Textbook_1 254251 Database 3 น.ส.นฤมล ทองแท้ Textbook_2 3 นางสมถวลิ แนวแน่ Textbook_3 254311 Operating System 3 นายสมปอง พลสขุ Textbook_4 4 001141 Basic Computer 254751 Network 257331 Digital
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 201 ตารางลงทะเบียน(Register) StudentID SubjectID Grade Score Term 4800111 254251 A 85 1/2551 4800112 254311 C 60 2/2551 4800113 001141 F 38 3/2550 4800114 254251 B 75 1/2549 4800115 254251 1/2551 ➢ ค า สั่ ง SELECT ที่ ใ ช้ ส า ห รั บ Left Outer Join ร ะ ห ว่ า ง ตารางวิชา (Subject) และตารางลงทะเบียน (Register) SELECT StudentID, Name, Grade FROM Subject LEFT JOIN Register ON Subject.SubjectID = Register.SubjectID; คาส่ัง Left Outer Join ในการสร้างแบบสอบถาม โดยใช้ตารางรายวิชา (Subject) เปน็ ตารางหลัก เพือ่ ค้นหาข้อมูลรายวิชาทีม่ ีอยู่ทั้งหมดจากตารางลงทะเบียน โดยจะเป็นรายวิชาที่มีหรอื ไม่มนี ิสติ ลงทะเบียนเรียนก็ได้ ผลลพั ธ์ดังตาราง StudentID Name Grade F 4800113 Database A B 4800111 Database C 4800114 Database 4800115 Database 4800112 Operating System Network Digital
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 202 ➢ คาส่ัง SELECT ที่ใช้สารับ Right Outer Join ระหว่างตารางวิชา (Subject) และตารางลงทะเบียน (Register) SELECT StudentID, Name, Grade FROM Subject RIGHT JOIN Register ON Subject.SubjectID = Register.SubjectID; คาสั่ง Right Outer Join ในการสร้างแบบสอบถาม โดยใช้ตาราง ลงทะเบียน(Register) เป็นตารางหลัก เพื่อค้นหาข้อมูลรายวิชาที่มีทั้งหมด โดยจะเป็น รายวิชาที่มีที่มีนิสิตลงทะเบียนเรียนหรือไม่ก็ได้จากตารางลงทะเบียนเรียน( Register) ผลลัพธ์ดงั ตารางดา้ นล่าง StudentID Name Grade F 4800113 Database A B 4800111 Database C 4800114 Database 4800115 Database 4800112 Operating System 4.5 คาสั่ง SQL ในการสร้างแบบสอบถามซ้อนกันหลายระดับ โดยปกติการค้นหาข้อมลู สามารถทาได้โดยใช้คาสั่ง SQL สร้าง “แบบสอบถาม หลัก (Mainquery)” เพียงแบบเดียวก็ได้ แต่ถ้าเป็นการค้นหาข้อมูลที่ซับซ้อน แ บ บ ส อ บ ถ า ม ห ลั ก เ พี ย ง แ บ บ เ ดี ย ว ไ ม่ ส า ม า ร ถ ค้ น ห า ข้ อ มู ล ไ ด้ จ า เ ป็ น ต้ อ ง ส ร้ า ง แบบสอบถามย่อย (Subquery) ขึ้นมาอีกเพื่อนามาใช้เปรียบเทียบข้อมูลที่ต้องการกับ แบบสอบถามหลัก ตัวดาเนินการที่ใช้กับคาสั่ง SELECT ในการสร้างแบบสอบถามซ้อน กันหลายระดับ ได้แก่ EXITS, ANY และ ALL เป็นต้น
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 203 คาสง่ั SELECT ทีใ่ ชร้ ่วมกับตัวดาเนินการในการสรา้ งแบบสอบถามแบบซ้อนกัน หลายระดบั ตัวดาเนนิ การ คาอธบิ าย EXISTS ตรวจสอบเฉพาะขอ้ มลู ทีเ่ ป็นผลลัพธจ์ ากแบบสอบถามที่กาหนด ANY เปรียบเทียบกลุ่มข้อมลู กับเงอื่ นไขทีก่ าหนด โดยผลลพั ธจ์ ะแสดงได้ก็ ต่อเมื่อมีขอ้ มลู ตัวใดตัวหนงึ่ ตรงกบั เงือ่ นไขที่กาหนด เช่น ALL = ANY คอื เท่ากับค่าใดคา่ หนึ่งในกลุ่มขอ้ มลู ที่กาหนด > ANY คอื มากกวา่ ค่าใดคา่ หนงึ่ ในกลุ่มข้อมลู ที่กาหนด < ANY คอื นอ้ ยกวา่ ค่าใดคา่ หนงึ่ ในกลุ่มข้อมูลที่กาหนด เปรียบเทียบกลุ่มข้อมลู กบั เงอื่ นไขทีก่ าหนด โดยผลลัพธ์จะแสดงได้ก็ ต่อเมื่อมีขอ้ มลู ทกุ ตวั ตรงกับเงือ่ นไขทีก่ าหนด เช่น <> ALL คอื ไม่เท่ากับทุกคา่ ในกลมุ่ ข้อมลู ที่กาหนด >= ALL คอื มากกวา่ หรอื เท่ากับทกุ คา่ ในกลุ่มขอ้ มูลที่กาหนด <= ALL คอื น้อยกวา่ หรอื เท่ากบั ทกุ คา่ ในกลุ่มขอ้ มลู ที่กาหนด คาสง่ั SQL ในการสร้างแบบสอบถามทีซ่ ้อนกนั หลายระดับมี 2 ประเภทดงั น้ี 1) การสร้างแบบสอบถามแบบซ้อนกันหลายระดับโดยการอ้างอิง แบบสอบถามระดับย่อย เป็นการค้นหาข้อมูลจากผลลัพธ์ของการค้นหาข้อมูลของ แบบสอบถามหลักโดยการสร้างแบบสอบถามย่อย ร่วมกับการระบุเง่ือนไขในคาส่ัง Where ได้ เง่ือนไขการสร้างแบบสอบถามย่อยมีดังนี้ • การระบุคอลัมน์ในแบบสอบถามย่อย จะต้องเป็นคอลัมน์ ทีม่ ขี ้อมูลรปู แบบเดียวกับคอลมั น์ทีร่ ะบใุ นแบบสอบถามหลกั เพือ่ ใช้สาหรบั อ้างองิ • แบบสอบถามย่อย ไม่รองรับคาสั่ง SQL ในการจัด เรียงลาดบั ข้อมูล (ORDER BY) แตแ่ บบสอบถามหลักสามารถใช้ได้ • แบบสอบถามย่อย ไม่รองรับคาส่ัง SQL ในการจัดกลุ่ม ข้อมลู (GROUP BY) แตแ่ บบสอบถามหลกั สามารถใช้ได้ • ไม่สามารถใช้ตวั ดาเนินการ BETWEEN ระหว่างแบบสอบ ถามย่อยกับแบบสอบถามหลักได้ แตส่ ามารถใช้ได้ภายในแบบสอบถามย่อย • แบบสอบถามย่อย จะอยู่ภายใต้วงเลบ็ ในคาส่ัง SQL
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 204 2) การสรา้ งแบบสอบถามแบบซ้อนกันหลายระดบั โดยการอ้างอิงแบบ สอบถามที่เกี่ยวเนื่องกัน (Correlated Subquery)บางคร้ังการสร้างแบบสอบถามย่อย อาจจะต้องอ้างอิงถึงผลลัพธ์จากแบบสอบถามในระดบั ทีอ่ ยู่นอกเหนือออกไป (Outer- Level Query) ตัวอยา่ งที่ 25 ตารางนิสติ (Student) จงแสดงชั้นเรยี นทีจ่ านวนนิสติ มากที่สุด ตารางนิสติ (Student) StudentID Name Birthday Class Advisor Club 4800111 นายดีใจ จงั เลย 11/12/2529 171 นายเป็นต่อ ดีเลิศ เทนนิส 4800112 น.ส.ใจรา้ ย มากเลย 5/10/2528 171 นางสวุ ดี สอนดี คอมพิวเตอร์ 4800113 นายบญุ มา ลาก่อน 23/8/2529 172 นางสุวดี สอนดี เทนนิส 4800114 นายไปดี มาดี 9/2/2530 172 นายเป็นต่อ ดีเลิศ คอมพิวเตอร์ 4800115 นายขยนั จึงได้ดี 7/3/2529 173 นายเปน็ ต่อ ดีเลิศ เทนนิส 4800116 นายเปน็ หนึ่ง ใตห้ ลา้ 1/4/2527 174 นางสมใจ เป็นสุข เทนนิส แบบสอบถามหลกั SELECT Class, COUNT(*) (Main query) FROM Student GROUP BY Class แบบสอบถามย่อย HAVING COUNT(*) >= ALL (Sub query) (SELECT COUNT(*) FROM Student GROUP BY Class) ; จากข้อมูลในตารางนิสิต (Student) การแสดงชั้นเรียนที่จานวนนิสิตมากที่สุด มีขั้นตอนในการแสดงผลลัพธ์ โดยสร้างแบบสอบถามหลักให้แสดงคอลัมน์ช้ันเรียน (Class) และคอลัมน์จานวนนิสิต (Count(*)) ในชั้นเรียนจากตารางนิสิต(Student) จาก การจัดกลุ่มข้อมูลนิสิต (GROUP BY) ที่เรียนช้ันเดียวกัน เทียบกับแบบสอบถามย่อยที่ นับจานวนนิสิตในชั้นเรียนจากในตารางนิสิต (Student) เดียวกัน เพื่อหาช้ันเรียนที่มี จานวนนักเรียนมากที่สดุ ผลลพั ธ์ที่ได้ดังตาราง
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 205 Class Count(*) 171 2 172 2 ตัวอย่างท่ี 26 การสร้างแบบสอบถามแบบซ้อนกันหลายระดับโดยการอ้างองิ แบบสอบถามระดับย่อยจากข้อมูลในตารางลงทะเบียน(Register) หากต้องการค้นหา ข้อมลู นสิ ิตคนใดบ้างที่ได้คะแนนวิชา “254251” มากเป็นอันดบั ที่ 2 ตารางลงทะเบียน(Register) StudentID SubjectID Grade Score Term 4800111 254251 A 85 1/2551 4800112 254311 C 60 2/2551 4800113 001141 F 38 3/2550 4800114 254251 B 75 1/2549 4800115 254251 1/2551 แบบสอบถามหลัก SELECT StudentID, Score, Term (Main query) FROM Register WHERE SubjectID = ‘254251’ AND Score = แบบสอบถามย่อย 1 (SELECT MAX(Score) (Sub query 1) FROM Register WHERE SubjectID = ‘254251’ AND Score < แบบสอบถามย่อย 2 (SELECT MAX(Score) (Sub query 2) FROM Register WHERE SubjectID = ‘254251’)); จากข้อมูลในตารางลงทะเบียน (Register) หากต้องการค้นหาข้อมูลนิสิตคน ใดบ้างที่ได้คะแนนวิชา 254251 เป็นลาดับที่ 2 มีขั้นตอนในการแสดงผลลัพธ์ สร้าง แบบสอบถามหลักให้แสดงคอลัมน์รหัสนิสิต (StudentID), คะแนน (Score) และเทอม
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 206 (Term) จากตารางลงทะเบียน (Register) ค้นหาเฉพาะข้อมูลนิสติ ทีล่ งทะเบียนเรียนวิชา รหัส “254451” และมีคะแนน ตรงกันกับผลลัพธ์ทีไ่ ด้จากแบบสอบถามย่อยที่ 1 ลาดับ ถัดไป สร้างแบบสอบถามย่อยที่ 1 เพื่อค้นหาคะแนนที่มากที่สุดที่ยังน้อยกว่าผลลัพธ์ที่ ได้จากแบบสอบถามย่อยที่ 2 ของนิสติ ในชนั้ เรียนที่ลงทะเบียนเรียนวิชารหัส “254451” ซึ่งหมายถึงคะแนนที่มากที่สดุ เปน็ ลาดบั ที่ 2 นนั่ เอง จากน้ันสรา้ งแบบสอบถามย่อยที่ 2 เพือ่ ค้นหาคะแนนที่มากทีส่ ุด ของนสิ ิตในชั้นเรียนทีล่ งทะเบียนเรียนวิชารหัส “254451” ผลลัพธ์ทีไ่ ด้ดงั ตารางดา้ นล่าง StudentID Score Term 4800114 75 1/2549 ตัวอย่างท่ี 27 การสร้างแบบสอบถามแบบซ้อนกนั หลายระดับโดยการอ้างองิ แบบสอบถามที่เกี่ยวเนื่องกัน (Correlated Subquery) จากข้อมูลในตารางลงทะเบียน (Register) หากต้องการค้นหาข้อมูลนิสิตคนใดบ้างที่ลงทะเบียนเรียนวิชาเดียวกันกับ นิสติ รหสั “4800111” ตารางลงทะเบียน(Register) StudentID SubjectID Grade Score Term 4800111 254251 A 85 1/2551 4800112 254311 C 60 2/2551 4800113 001141 F 38 3/2550 4800114 254251 B 75 1/2549 4800115 254251 1/2551 แบบสอบถามหลัก SELECT StudentID, SubjectID, Term (Main query) FROM Register WHERE SubjectID = ANY แบบสอบถามยอ่ ย (SELECT SubjectI (Sub query) FROM Register WHERE StudentID = ‘4800111’);
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 207 จากข้อมูลในตารางลงทะเบียน(Register) หากต้องการค้นหาข้อมูลนิสิตคน ใดบ้างที่ลงทะเบียนเรียนวิชาเดียวกันกับนิสิตรหัส “4800111” ขั้นตอนการแสดง ผลลพั ธ์ เป็นดังน้ี 1) สร้างแบบสอบถามหลักให้แสดงคอลมั นร์ หัสนสิ ิต(StudentID), รหัส วิชา (SubjectID) และเทอม (Term) จากตารางลงทะเบียน (Register) 2) สร้างแบบสอบถามย่อยโดยการค้นรหัสวิชา (SubjectID) ที่นิสิต รหัส “4800111” ลงทะเบียนเรียนจากในตารางลงทะเบียน (Register) เดียวกนั 3) จากน้ันแบบสอบถามย่อยจะทาการค้นหาข้อมลู ภายใต้เง่ือนไขของ แบบสอบถามหลัก คือ รหัสวิชา (SubjectID) ที่นิสิตรหัส “4800111” ลงทะเบียนเรียน ทั้งหมด ไปเทียบกับข้อมูลที่ค้นได้หาจากแบบสอบถามหลัก หากพบนิสิตรหัสอื่นๆ ลงทะเบียนเรียนในรหัสวิชาต่าง ๆ ทีเ่ หมอื นกับที่นสิ ิตรหสั “4800111” ลงทะเบียนเรียน ผลลพั ธ์ทีไ่ ด้ดังตารางดา้ นล่าง StudentID SubjectID Term 4800111 254251 1/2551 4800114 254251 1/2549 4800115 254251 1/2551 ตัวอย่างท่ี 29 การสร้างแบบสอบถามแบบซ้อนกันหลายระดับโดยการอ้างองิ แบบสอบถามที่เกี่ยวเน่ืองกัน (Correlated Subquery) จากข้อมูลในตารางลงทะเบียน (Register) หากต้องการค้นหาข้อมลู นิสิตคนใดบ้างที่ได้คะแนนวิชา “254251” มากเป็น อนั ดับที่ 2 ตารางลงทะเบียน(Register) StudentID SubjectID Grade Score Term 4800111 254251 A 85 1/2551 4800112 254311 C 60 2/2551 4800113 001141 F 38 3/2550 4800114 254251 B 75 1/2549 4800115 254251 1/2551
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 208 แบบสอบถามหลกั SELECT StudentID, Score, Grade (Main query) FROM Register AS R1 WHERE SubjectID = ‘254251’ AND 1 = แบบสอบถามย่อย (SELECT COUNT(*) (Sub query) FROM Register AS R2 WHERE SubjectID = ‘254251’ AND R1.Score R2.Score); จากข้อมูลในตารางลงทะเบียน (Register) หากต้องการค้นหาข้อมูลนิสิตคน ใดบ้างที่ได้คะแนนวิชา 254251 เป็นลาดับที่ 2 มีข้ันตอนในการแสดงผลลัพธ์ สร้าง แบบสอบถามหลักให้แสดงคอลัมน์รหัสนิสิต (StudentID), คะแนน (Score) และเกรด (Grade) จากตารางลงทะเบียน ค้นหาเฉพาะข้อมูลนิสิตที่ลงทะเบียนเรียนวิชารหัส “254451” ลาดับถัดไป สร้างแบบสอบถามย่อย โดยการนับจานวนนิสิตในชั้นเรียนที่ ลงทะเบียนเรียนวิชารหสั “254451” จากในตารางลงทะเบียนเดียวกัน การกาหนดชื่อเรียกแทน (AS) ให้กับตาราง ลงทะเบียนในกรณีที่ต้องเปรียบเทียบข้อมูลจากตารางเดียวกนั จะต้องกาหนดชื่อเรียก แทนตารางที่ต่างกัน เช่น สร้างแบบสอบถามหลักโดยกาหนดให้ R1 แทนตาราง ลงทะเบียน (Register AS R1) และสร้างแบบสอบถามย่อยโดยกาหนดให้ R2 แทน ตารางลงทะเบียน (Register AS R2) จากน้ันแบบสอบถามย่อยจะทาการค้นหาข้อมูล ภายใต้เง่ือนไขของแบบสอบถามหลัก คือ นับจานวนนิสิตที่ได้คะแนนในรายวิชารหัส “254451” น้อยกว่า 1 อันดับ นั่นหมายความว่าได้คะแนนเป็นอันดับที่ 2 นั่นเอง ผลลพั ธ์ทีไ่ ด้ดงั ดังตารางดา้ นล่าง StudentID Score Grade 4800114 75 B
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 209 ตัวอย่างท่ี 30 การสร้างแบบสอบถามแบบซ้อนกนั หลายระดับโดยการอ้างองิ แบบสอบถามที่เกีย่ วเนื่องกัน (Correlated Subquery) จากข้อมูลในตารางนิสติ (Student) หากต้องการคน้ หาข้อมูลนสิ ิตคนใดบ้างที่ไม่ได้ลงทะเบียนเรียน ตารางนิสิต(Student) StudentID Name Birthday Class Advisor Club 4800111 นายดีใจ จังเลย 11/12/2529 171 นายเปน็ ต่อ ดีเลิศ เทนนิส 4800112 น.ส.ใจรา้ ย มากเลย 5/10/2528 171 นางสุวดี สอนดี คอมพิวเตอร์ 4800113 นายบุญมา ลาก่อน 23/8/2529 172 นางสวุ ดี สอนดี เทนนิส 4800114 นายไปดี มาดี 9/2/2530 172 นายเป็นต่อ ดีเลิศ คอมพิวเตอร์ 4800115 นายขยัน จึงได้ดี 7/3/2529 173 นายเปน็ ต่อ ดีเลิศ เทนนิส 4800116 นายเปน็ หนึ่ง ใตห้ ลา้ 1/4/2527 174 นางสมใจ เป็นสขุ เทนนิส แบบสอบถามหลัก SELECT * (Main query) FROM Student WHERE NOT EXISTS แบบสอบถามย่อย (SELECT StudentID (Sub query) FROM Register WHERE Student.StudentID = Register.StudentID); จากข้อมูลในตารางลงทะเบียน (Register) หากต้องการค้นหาข้อมูลนิสิตคน ใดบ้างที่ไม่ได้ลงทะเบียนเรียน มีข้ันตอนในการแสดงผลลัพธ์ ลาดับแรกสร้าง แบบสอบถามหลักให้แสดงทกุ คอลัมน์จากตารางนิสิต ลาดบั ถดั ไปสร้างแบบสอบถาม ย่อยโดยการค้นรหัสนิสิต (StudentD) จากในตารางลงทะเบียน จากน้ันแบบสอบถาม ย่อยจะทาการค้นหาข้อมูลภายใต้เง่ือนไขของแบบสอบถามหลัก คือ จะแสดงข้อมูล เฉพาะรหัสนิสิต ในตารางนิสิต ที่ไม่ตรงกันกับรหัสนิสิต ในตารางลงทะเบียน ซึ่ง หมายถึงนิสติ คนดังกล่าวไม่ได้ลงทะเบียนเรียนน่นั เอง ผลลัพธ์ทีไ่ ด้ดงั ตารางดา้ นล่าง StudentID Name Birthday Class Advisor Club 4800116 นายเปน็ หนึง่ ใตห้ ลา้ 1/4/2527 174 นางสมใจ เปน็ สุข เทนนิส
ภ า ษ า ส อ บ ถ า ม เ ชิ ง โ ค ร ง ส ร้ า ง | 210 ปัจจุบันหนว่ ยงานต่าง ๆ ได้นาระบบคอมพิวเตอร์มาใช้งานมากขึ้น โดยเฉพาะ อย่างยิ่งการจัดเกบ็ ข้อมลู รูปแบบฐานขอ้ มูลที่ใช้จดั เก็บข้อมลู นนั้ ส่วนใหญ่จะเป็นแบบ ฐานขอ้ มลู เชิงสัมพันธ์ ซึง่ จัดเก็บข้อมลู ในรปู ของตาราง และการสร้างตารางเพือ่ เกบ็ ข้อมูลตา่ ง ๆ นั้นจะต้องผา่ นการทาบรรทดั ฐาน (Normalization) ทาให้เกิดเป็นตาราง ข้อมูลหลาย ๆ ตาราง และแตล่ ะตารางจะเกบ็ ข้อมลู ไม่ซ้าซ้อนกนั ทาให้การเพิม่ และ การลบข้อมลู ทาได้สะดวก สามารถควบคุมความถกู ต้องของข้อมลู ได้ ภาษา SQL เป็นภาษาที่คล้ายกับภาษาอังกฤษ และเป็นภาษาที่ไม่เป็น กระบวนการ ทาให้ภาษา SQL เป็นภาษาที่เข้าใจง่าย อีกทั้งเป็นภาษาที่ไม่ยาวนัก มี คาสั่งไม่มากจึงง่ายต่อการเรียนรู้ จึงเป็นภาษาที่เป็นที่นิยมใช้กันอย่างแพร่หลายใน การทางานรว่ มกับฐานขอ้ มลู เปน็ หวั ใจหลักของทางานของฐานข้อมูล สามารถใช้ได้กับ คอมพิวเตอร์ตั้งแต่ขนาดเล็กไปจนขนาดใหญ่ มีรูปแบบในการสร้างแบบสอบถามที่ หลากหลาย อาจมีคุณลักษณะพิเศษหรือรองรับฟังก์ชันการทางานฐานข้อมูลแตกต่าง กันไปขึ้นอยู่กับแต่บริษัทที่เป็นผู้ผลิตระบบจัดการฐานข้อมูล เช่น Microsoft SQL Server, Oracle และ MySQL เป็นระบบจัดการฐานข้อมูลแบบเครือข่าย รองรับการ ทางานจากผู้ใช้หลายๆ คน มีฟังก์ชันรองรับภาษาควบคุมข้อมูล (Data Control Language : DCL) เป็นต้น ซึ่งหากนาคาส่ัง SQL ไปทางานร่วมกับโปรแกรมประยุกต์จะ ช่วยใหก้ ารทางานมปี ระสิทธิภาพเพิ่มข้นึ ภาษา SQL เป็นภาษาใช้ร่วมกบั ภาษาอื่น เช่น Visual Basic, ASP, PHP ทาให้ สามารถนามาพฒั นาโปรแกรมที่ใช้จัดการงานด้านต่าง ๆ และเว็บไซต์ที่เกีย่ วข้องกบั การจดั เก็บข้อมูลลงในฐานข้อมูลได้ ********************
Search
Read the Text Version
- 1 - 38
Pages: