Transcript ภาษา SQL
คาบปฏิบตั กิ าร ครัง้ ที่ 3 รายวิชา 421-343 การออกแบบและพัฒนาฐานข้อมูล ภาควิชาบรรณารักษศาสตร์และสารนิเทศศาสตร์ LOG O 1 ความเป็ นมาของภาษาSQL ในการสอบถามข้อมูลจากฐานข้อมูลนั้น คาถามของผูใ้ ช้ เรียกว่า “Query” และภาษาที่ใช้ในการสอบถามข้อมูลเรียกว่า “Query Language” ซึ่งใน ปั จจุบนั มีอยูห่ ลายภาษาด้วยกัน โดยภาษา SQL พัฒนาโดยบริษทั IBM เป็ นที่รูจ้ กั และใช้กนั อย่างแพร่หลาย จึงถือเป็ นมาตรฐานที่ใช้ใน RDBMS หลายตัวที่ใช้อยูใ่ นปั จจุบนั 2 ประเภทของคาสั ่งในภาษา SQL DDL (Data Definition Language) เป็ นชุดคำสัง่ ที่ใช้ในกำรนิ ยำม กำหนด หรือ กำรสร้ำงข้อมูลบนฐำนข้อมูล ได้แก่ คำสัง่ CREATE TABLE, CREATE VIEW DML (Data Manipulation Language) เป็ นชุดคำสัง่ ที่ใช้ในกำรประมวลผลหรือ จัดกำรกับข้อมูลในฐำนข้อมูล ได้แก่ คำสัง่ SELECT, INSERT , UPDATE เป็ นต้น DCL (Data Control Language) เป็ นคำสัง่ ที่ใช้ในกำรควบคุมสิทธิ์ของผูใ้ ช้ในกำร ใช้ขอ้ มูล รวมทั้งส่วนที่ใช้ควบคุมกำรใช้ฐำนข้อมูลจำกผูใ้ ช้หลำยๆคนพร้อมกัน 3 รายละเอียดข้อมูล (Data Dictionary) ชื่อเทเบิล CUSTOMER PRODUCT ชื่อคอลัมน์ ประเภทข้อมูล ความหมาย IDcustomer (PK) Char (6) รหัสลูกค้ำ C_name Varchar(40) ชื่อลูกค้ำ C_address Varchar(30) ที่อยู่ C_Telephone Varchar(10) เบอร์โทรศัพท์ C_Creditlim number วงเงินกำรให้สินเชื่อ C_currbal number ยอดสินเชื่อคงเหลือ IDproduct(PK) Char (6) รหัสสินค้ำ p_name Varchar(20) ชื่อสินค้ำ p_unitprice number รำคำต่อหน่ วย(บำท) P_onhand number จำนวนสินค้ำคงเหลือ P_orderpt number จำนวนตำ่ สุดที่ตอ้ งสัง่ ้ื้ อเพิ่ม P_orderqty number จำนวนที่ตอ้ งสัง่ ้ื้ อเพิ่ม อ้างถึง 4 รายละเอียดข้อมูล (Data Dictionary) ชื่อเทเบิล EMPLOYEE ORDER ชื่อคอลัมน์ ประเภทข้อมูล ความหมาย IDemployee (PK) Char (6) รหัสพนักงำน e_name Varchar(40) ชื่อพนักงำนขำย e_salary number(8,2) เงินเดือนปั จจุบนั e_address Varchar(30) ที่อยู่ e_telephone Char(10) เบอร์โทรศัพท์ อ้างถึง IDorder(PK) Char (6) รหัสใบสัง่ ้ื้ อสินค้ำ IDproduct Char (6) รหัสสินค้ำ qty number จำนวนสินค้ำที่สงั ่ ้ื้ อ discount number ส่วนลด(%) IDcustomer Char (6) รหัสลูกค้ำ Customer IDemployee Char (6) รหัสพนักงำนขำย employee product 5 การสร้างตาราง(Create Table) ▫ กำรสร้ำงตำรำงด้วย SQL สำมำรถทำได้ดว้ ยคำสัง่ CREATE TABLE ้ึ่งกำหนดลักษณะของข้อมูลเป็ นคอลัมน์ โดยมีรปู แบบดังนี้ รูปแบบ >> CREATE TABLE <Table_name> (<column_name_1> <data_type> [NOT NULL] [UNIQUE], (<column_name_2> <data_type> [NOT NULL] [UNIQUE], … … … … … … [PRIMARY KEY (column_name,)] [FOREIGN KEY (column_name) REFERENCES table_name]); 6 การสร้างตาราง(Create Table) โจทย์ >> สร้ำงตำรำง customer ตำมที่ได้ออกแบบรำยละเอียดตำรำงไว้ CREATE TABLE Customer SQL >> ( IDcustomer char(6) NOT NULL UNIQUE, C_name varchar(40) NOT NULL, C_address varchar(30), C_telephone char(10), C_credit number, C_currbal number, PRIMARY KEY (IDcustomer)); คาอธิบาย >> กำหนดให้ IDcustomer เป็ นคียห์ ลัก ดังนั้นจะใส่ PRIMARY KEY (IDcustomer) เข้ำไปด้วย และในคอลัมน์ IDcustomer ต้องมีค่ำเสมอ (NOT NULL) และมีค่ำไม่้้ำกัน (UNIQUE) และในแต่ละแถวคอลัมน์ c_name จะต้องมีค่ำเสมอ (NOT NULL) เนื่ องจำกควำมเป็ นจริงที่ของ ข้อมูลที่ลกู ค้ำทุกคนต้องมีชื่อ 7 การเปลี่ยนโครงสร้างของตาราง (Alter Table) ในกำรทำงำนจริง อำจมีกำรเปลี่ยนแปลงโครงสร้ำงข้อมูลของตำรำงนั้นๆ เนื่ องจำกกำรออกแบบที่อำจผิดพลำด หรืออำจเปลี่ยนควำมต้องกำร ในกำร แก้ไขโครงสร้ำงของตำรำงนั้นทำได้ดว้ ยคำสัง่ ALTER TABLE โดยมีรปู แบบดังนี้ รูปแบบ >> โจทย์ >> SQL ALTER TABLE <Table_name> ADD <colum_name> <data_type> ; เพิ่มคอลัมน์ที่เป็ นรหัสแผนก(IDdepartment) ในตำรำง employee เพื่อบอกว่ำพนักงำนสังกัดอยูแ่ ผนกใด >> ALTER TABLE employee ADD IDdepartment char(6) ; 8 การเปลี่ยนโครงสร้างของตาราง (Alter Table) หำกต้องกำรลบคอลัมน์ก็สำมำรถทำได้เช่นกันด้วยคำสัง่ ต่อไปนี้ รูปแบบ >> โจทย์ >> SQL ALTER TABLE <Table_name> DROP <colum_name> ; ลบคอลัมน์ที่เป็ นรหัสแผนก(IDdepartment) ในตำรำง employee >> ALTER TABLE employee DROP Iddepartment ; 9 การแก้ไขคอลัมน์ในตาราง (MODIFY) รูปแบบ >> โจทย์ >> SQL >> ALTER TABLE <Table_name> MODIFY <colum_name> <data_type> ; เปลี่ยนขนำดของข้อมูลในคอลัมน์ Iddeparment ในตำรำง employee จำกขนำด 6 ตัวอักษร เป็ นขนำด 5 ตัวอักษร ALTER TABLE employee MODIFY (IDdepartment char(5)) ; 10 การลบตารางออกจากฐานข้อมูล (Drop Table) รูปแบบ >> โจทย์ SQL DROP TABLE <Table_name>; >> ต้องกำรลบเทเบิล ORDER ออกจำกฐำนข้อมูล >> DROP TABLE Order DROP TABLE ORDER; 11 การเพิ่มข้อมูลแต่ละแถว (INSERT) รูปแบบ >> โจทย์ >> INSERT INTO <Table_name> VALUES ([<value 1>, <value 2>,… ) ; ป้อนข้อมูลของลูกค้ำใหม่ ้ึ่งมีรหัส 101 ชื่อ Supaporn อำศัยอยู่ Pattani เบอร์โทรศัพท์ 073658758 มีวงเงิน 150,000 บ. และยอดเงินคงเหลือ 100,000 บ. SQL >> INSERT INTO customer VALUES (‘101’,‘Supaporn’, ‘Pattani’,‘073658758’, 150000 ,100000 ) ; 12 การเพิ่มข้อมูลแต่ละแถว (INSERT) (ต่อ) ในกรณีที่อาจการเพิ่มข้อมูลเฉพาะบางคอลัมน์ สามารถเขียนคาสั ่งได้ดงั นี้ รูปแบบ >> โจทย์ >> SQL >> INSERT INTO <Table_name><(list of columnname)> VALUES <( list of matching value)> ; ป้อนข้อมูลของลูกค้ำใหม่ ้ึ่งมีรหัส 150 ชื่อ Walaiporn INSERT INTO customer (IDcustomer , C_name) VALUES (‘150’,‘Walaiporn’) ; 13 การเพิ่มข้อมูลโดยใช้ขอ้ มูลจากตารางอื่น ในกรณีที่อาจการเพิ่มข้อมูลเฉพาะบางคอลัมน์ สามารถเขียนคาสั ่งได้ดงั นี้ โจทย์ >> ต้องกำรสร้ำงตำรำงใหม่ ชือ่ CustomerInBangkok ้ึ่งประกอบด้วยคอลัมน์ รหัส, ชือ่ และเบอร์โทรศัพท์ของลูกค้ำ โดยข้อมูลในตำรำงจะเลือกจำกตำรำง customer เฉพำะลูกค้ำที่อำศัยอยูใ่ น ‘Bangkok’ เท่ำนั้น 1. สร้างตาราง CustomerInBangkok SQL >> CREATE TABLE CustomerInBangkok (IDBangkok char(6) NOT NULL UNIQUE, B_name varchar(40) NOT NULL, B_telephone char(10) ); 2. เพิ่มข้อมูลลงในตาราง CustomerInBangkok INSERT INTO CustomerInBangkok SELECT IDcustomer , C_name,C_telephone FROM Customer WHERE address =‘Bangkok’ ; 14 การแก้ไขข้อมูล (Update) ในกรณีที่เพิ่มข้อมูลในตารางแล้ว และต้องการแก้ไขข้อมูลทีม่ ีอยู่ สามารถเขียนคาสั ่งได้ดงั นี้ รูปแบบ >> UPDATE <Table_name> SET <columnname> = new_value WHERE <condition>; โจทย์ >> ต้องกำรปรับเงินเดือนพนักงำนชื่อ Piyanuch จำกเดิม 14,400 บำท เป็ น 15,000 SQL >> UPDATE employee SET E_salary= 15000 WHERE E_name=‘Piyanuch’ ; 15 การแก้ไขข้อมูล (Update) หากต้องการแก้ไขข้อมูลที่มีอยู่ ครั้งละหลายแถวสามารถเขียนคาสั ่งได้ดงั นี้ โจทย์ >> ต้องกำรเพิ่มวงเงินให้แก่ลกู ค้ำที่อำศัยอยูใ่ น Bangkok อีกคนละ 50,000 บำท SQL >> UPDATE customer SET C_credit = C_credit + 50000 WHERE C_address =‘Bangkok’ ; 16 การลบข้อมูล (Delete) รูปแบบ >> โจทย์ >> SQL >> DELETE <Table_name> WHERE <condition>; ในกรณีที่พนักงานชื่อ ‘Walai’ ลาออกจากบริษัท DELETE FROM employee WHERE E_name = ‘Walai’ ; 17 การสอบถามข้อมูล (SELECT) รูปแบบ >> โจทย์ >> SQL1 >> SQL2 >> SELECT column_name, list of column_name, or * FROM table_name ,or list of table_name; ต้องการสอบถามข้อมูลทั้งหมดของลูกค้า SELECT Idcustomer ,C_name,C_address, C_telephone,C_Credit, C_currlim,C_currbal FROM Customer ; SELECT * FROM Customer ; *** ในกรณี ที่ตอ้ งกำรเรียงลำดับกำรแสดงข้อมูล สำมำรถระบุชื่ อคอลัมน์ เรียง 18 ตำมลำดับที่ตอ้ งกำรโดยไม่จำเป็ นต้องเรียงตำมลำดับที่สร้ำงในตำรำง การเปลี่ยนหัวคอลัมน์เป็ นข้อความอื่น (SELECT…AS) รูปแบบ >> โจทย์ >> SQL >> ผลลัพธ์ >> SELECT column_name AS “NEW HEADING”; แสดงชื่อและยอดคงเหลือของลูกค้ำทุกคนโดยให้หวั คอลัมน์ ชื่อ แสดงเป็ น Customer_name และ ยอดเงิน แสดงเป็ น Current Balance SELECT C_name AS “Customer_name”, C_currbal AS “Current Balance” FROM customer; Customer_name ------------------Sopha Silee … Current Balance --------------------1000000 2000000 … 19 แสดงข้อมูลที่ไม่ซ้ ากันด้วย DISTINCT รูปแบบ >> โจทย์ >> SQL >> SELECT DISTINCT Columnname FROM Table_name; ให้แสดงข้อมูลที่อยูล่ กู ค้ำของบริษัทว่ำอยูท่ ี่ใดบ้ำง SELECT DISTINCT address FROM customer ; 20 จัดเรียงข้อมูลด้วย ORDER BY รูปแบบ >> ORDER BY column_name [DESC] ; เรียงจำกมำกไปน้อย ORDER BY column_name ; เรียงจำกน้อยไปมำก โจทย์ >> ต้องกำรทรำบรหัสและชื่อของลูกค้ำทั้งหมด โดยแสดงผลแบบเรียง ตำมลำดับชื่อลูกค้ำจำกน้อยไปหำมำก และ มำกไปน้อย SQL น้อยไปหามาก SQL มากไปหาน้อย SELECT IDCustomer , C_name FROM customer ORDER BY C_name; SELECT IDCustomer , C_name FROM customer ORDER BY C_name DESC; 21 จัดเรียงข้อมูล โจทย์ >> SQL >> ผลลัพธ์ >> ต้องกำรสอบถำมชื่อ ที่อยู่ และวงเงินของลูกค้ำ โดยเริ่มแสดงข้อมูล จำกกลุ่มลูกค้ำที่มีที่อยูเ่ ดียวกันจำกน้อยไปหำมำก และในแต่ละกลุ่ม หรือจังหวัดก็เรียงตำมชื่อลูกค้ำจำกน้อยไปหำมำก SELECT C_address , C_name, C_creditlim FROM customer ORDER BY address, C_name; address --------Ayuthaya Bangkok Bangkok C_name ---------Worachat Anan Silee C_Creditlim --------------5000000 1000000 6000000 22 การจัดกลุ่มข้อมูล (SELECT… GROUP BY) รูปแบบ >> โจทย์ >> SQL >> SELECT column_name FROM <table name> GROP BY <column name> ; ต้องกำรทรำบค่ำเฉลี่ยของวงเงินของลูกค้ำแต่ละกลุ่ม โดยแบ่งกลุ่มตำมที่อยู่ SELECT address, AVG(credit_lim) FROM customer GROUP BY address; 23 เลือกกลุ่มข้อมูลด้วย HAVING และ WHERE รูปแบบ >> SQL >> ผลลัพธ์ >> SELECT column_name FROM <table name> GROP BY <column name> HAVING <condition> ; ต้ อ งกำรทรำบค่ ำ เฉลี่ ย ของ โจทย์ >> วงเงิ น ของลู ก ค้ำ แต่ ล ะกลุ่ ม โดยแบ่งกลุ่มตำมที่อยูท่ ี่มีวงเงิน เฉลี่ยตั้งแต่ 300,000 ขึ้ นไป SELECT address, AVG(credit_lim) FROM customer GROUP BY address HAVING AVG(credit_lim)>=300000 ; address Ayuthaya Bangkok Rayong AVG(credit_lim) 800000 533333.33 300000 24 เลือกกลุ่มข้อมูลด้วย HAVING และ WHERE รูปแบบ >> SQL SELECT column_name FROM <table name> WHERE <condition> GROP BY <column name> HAVING <condition> ; ต้ อ งกำรทรำบค่ ำ เฉลี่ ย ของ โจทย์ >> วงเงินของลูกค้ำที่อยูใ่ นกรุงเทพ และระยองโดยแบ่ ง กลุ่ ม ตำม ที่ อยู่ ที่ มี ว ง เ งิ น เ ฉ ลี่ ย ตั้ ง แ ต่ 300,000 ขึ้ นไป >> SELECT address, AVG(credit_lim) FROM customer WHERE address IN (‘Bangkok’ , ‘Rayong’) GROUP BY address HAVING AVG(credit_lim)>=300000 ; ผลลัพธ์ >> address Bangkok Rayong AVG(credit_lim) 533333.33 300000 25 การสอบถามข้อมูลแบบมีเงื่อนไข รูปแบบ >> SELECT FROM WHERE column_name table_name condition ; โจทย์ >> ต้องกำรข้อมูลทั้งหมดของลูกค้ำเฉพำะที่อำศัยอยูใ่ นBangkok SQL >> SELECT FROM WHERE * customer address = ‘Bangkok’ ; 26 ตัวดาเนินการเชิงเปรียบเทียบ(Comparison Operators) เครื่องหมายที่ใช้เปรียบเทียบ = != > < >= <= ความหมาย เท่ำกับ ไม่เท่ำกับ มำกกว่ำ น้อยกว่ำ มำกกว่ำหรือเท่ำกับ น้อยกว่ำหรือเท่ำกับ 27 ระบุหลายเงื่อนไขโดยใช้ OR โจทย์ >> สอบถำมข้อมูลของลูกค้ำที่อยู่ Bangkok และมีวงเงินมำกกว่ำ 500,000 บำท SELECT * SQL >> FROM customer WHERE (C_address = ‘Bangkok’) AND (C_creditlim> 500000) ; โจทย์ >> สอบถำมข้อมูลของลูกค้ำที่อยู่ Bangkok หรือมีวงเงินมำกกว่ำ 500,000 บำท SQL >> SELECT * FROM customer WHERE (C_address = ‘Bangkok’) OR (C_creditlim> 500000) ; 28 ระบุหลายเงื่อนไขโดยใช้ IN โจทย์ >> สอบถำมข้อมูลของลูกค้ำที่อยู่ Bangkok, Rayong หรือ Ayuthaya SQL 1 >> SQL 2 >> SELECT * FROM customer WHERE (C_address = ‘Bangkok’) OR (C_address = ‘Rayong’) OR (C_address = ‘Ayuthaya’) ; SELECT * FROM customer WHERE address IN (‘Bangkok’, ‘Rayong’ , ‘Ayuthaya’) 29 ระบุหลายเงื่อนไขโดยใช้ NOT โจทย์ >> สอบถำมข้อมูลของลูกค้ำที่ไม่อยูใ่ นBangkok SQL1 >> SQL2 >> SELECT FROM WHERE * customer C_address != ‘Bangkok’ ; SELECT FROM WHERE * customer NOT C_address = ‘Bangkok’; 30 เลือกข้อมูลที่อยูใ่ นช่วงที่ตอ้ งการด้วย BETWEEN…AND รูปแบบ >> SELECT FROM WHERE column_name table_name column_name BETWEEN values1 AND values2 ; *** สำหรับเลือกแสดงข้อมูลที่อยูร่ ะหว่ำงค่ำที่กำหนด(values1) และ values2*** รูปแบบ >> SELECT column_name FROM table_name WHERE column_name NOT BETWEEN values1 AND values2 ; *** สำหรับเลือกแสดงข้อมูลที่มีคำ่ ไม่อยูร่ ะหว่ำงค่ำที่กำหนด*** 31 เลือกข้อมูลที่อยูใ่ นช่วงที่ตอ้ งการด้วย BETWEEN…AND โจทย์ >> แสดงชื่อของพนักงำนที่มีเงินเดือนอยูร่ ะหว่ำง 3,500 และ 5,000 บำท SQL1 >> SQL2 >> SELECT FROM WHERE AND e_name employee (salary >= 3500) (salary <= 5000) ; SELECT FROM WHERE BETWEEN e_name employee salary 3500 AND 5000 ; 32 เลือกข้ อมูลที่ตรงกับความต้ องการด้ วย LIKE คำสัง่ SQL สำมำรถกำหนดเงื่อนไขเพื่อเลือกข้อมูลโดยใช้คำว่ำ “LIKE” และ ‘_’ โดยมีรำยละเอียดดังนี้ เครื่องหมาย/คา การแทนค่า ‘_’ ‘%’ แทนตัวอักษรใดๆ 1 ตัวอักษร แทนตัวอักษรกี่ตวั ก็ได้ หรือเป็ น 0 (ไม่มีขอ้ มูลเลยก็ ได้) 33 เลือกข้อมูลที่ตรงกับความต้องการด้วย LIKE โจทย์ >> แสดงชื่อของลูกค้ำที่ขึ้นต้นด้วย ‘So’ SQL1 >> SELECT FROM WHERE like C_name customer c_name ‘So%’ ; ผลลัพธ์ >> C_name -----------Sopha Somchai Somsak โจทย์ >> แสดงชื่อของลูกค้ำที่ขึ้นต้นด้วย ‘Si’ และตำมด้วยอักษรได้ก็ได้ 3 ตัว SQL1 >> SELECT FROM WHERE like C_name customer c_name ‘Si_ _ _’ ; ผลลัพธ์ >> C_name -----------Silee 34 ฟั งก์ชั ่นสาหรับการคานวณทางคณิตศาสตร์ ฟั งก์ชั ่น พารามิเตอร์(Argument) การคืนค้า (Returned values) ABS(m) m= เลขจำนวนเต็ม ค่ำตัวเลขบวกของ m เช่น ABS(-3) = 3 MOD(m,n) m= เลขจำนวนเต็ม(ตัวตั้ง) n = เลขจำนวนเต็ม(ตัวหำร) เศษที่ได้จำกกำรหำร m ด้วย n เช่น MOD(9,2) =1 POWER(m,n) m= เลขจำนวนเต็ม(ตัวตั้ง) n = เลขจำนวนเต็ม(ตัวยกกำลัง) ค่ำของ m ยกกำลัง n(mn) เช่น POWER(4,2)=16 ROUND(m,n) m= เลขจำนวนเต็ม(ตัวตั้ง) n = เลขจำนวนเต็ม้ึ่งแสดงจำนวนทศนิ ยมที่ ต้องกำร หลังจำกปั ดเศษขึ้ น /ลง ถ้ำไม่กำหนด n ให้พิจำรณำ n = 0 ค่ำของ m ที่ปัดเศษขึ้ น / ลง ให้มีจำนวน ทศนิ ยม n ตำแหน่ ง โดยตำแหน่ งที่ n+1 มีคำ่ มำกกว่ำหรือเท่ำกับ 5 จะปั ดขึ้ น แต่ถำ้ น้อยกว่ำ 5 จะปั ดเศษลง เช่น ROUND(4.25,1) = 4.3 ROUND (4.24,1) = 4.2 TRUNC(m,n) m= เลขจำนวนจริง ค่ำของ m ที่ปัดเศษทิ้ ง ให้มีจำนวนทศนิ ยม n n = เลขจำนวนเต็ม้ึ่งแสดงจำนวนทศนิ ยมที่ ตำแหน่ ง ต้องกำร หลังจำกปั ดเศษทิ้ ง ถ้ำไม่กำหนด n ให้ 35 พิจำรณำ n = 0 ฟั งก์ชั ่น ABS(m) โจทย์ >> ต้องกำรทรำบยอดเงินคงเหลือของลูกค้ำแต่ละคน ว่ำมีคำ่ ต่ำงจำกวงเงินเท่ำไหร่ SQL1 >> ผลลัพธ์ >> SELECT C_name, ABS(C_currbal – C_creditlim) AS “difference” FROM customer ; C_name difference ------------ ------------ Sopha Somchai Somsak Amorn 200000 200000 100000 47950 36 ฟั งก์ชั ่น MOD(m,n) โจทย์ >> เพื่อที่จะบรรจุหีบห่อของสินค้ำ กล่องละ 10 ชิ้ น ให้แสดงรำยกำรสินค้ำและ เศษที่เหลือจำกกำรบรรจุสินค้ำ SQL1 >> SELECT p_name, MOD(p_onhand,10) FROM Product ; ผลลัพธ์ >> p_name MOD(onhand,10) ------------ ------------ Television Radio Table Chair 0 5 2 0 37 ฟั งก์ชั ่น POWER(m,n) โจทย์ >> ต้องกำรทรำบว่ำถ้ำขึ้ นเงินเดือนให้พนักงำนทุกคนมีคำ่ เท่ำกับเงินเดือน ปั จจุบนั ยกกำลังสองแล้ว พนักงำนแต่ละคนจะมีเงินเดือนเท่ำไหร่ SQL1 >> ผลลัพธ์ >> SELECT e_name, POWER(e_salary,2) FROM employee; e_name POWER(e_salary,2) ------------ ------------ Piya Pinyo Wilai … 12250000 24850225 6708100 … 38 ฟั งก์ชั ่น ROUND(m,n) และ TRUNC(m,n) โจทย์ >> ต้องกำรทรำบรำคำต่อหน่ วยสินค้ำทั้งหมด โดยแสดงเป็ นทศนิ ยม1 ตำแหน่ ง SQL1 >> ผลลัพธ์ >> SELECT p_name, ROUND(P_unitprice,1), TRUNC(P_unitprice,1) FROM product ; p_name ROUND(P_unitprice,10) TRUNC(p_unitprice,1) ------------ ---------------- ---------------- Television Radio Table Chair Ruler Paper 10500 1595 650 232.5 1.8 62.3 10500 1595 650 232.5 1.7 62.2 39 ฟั งก์ชั ่นสาหรับหาค่าของกลุ่มข้อมูล ฟั งก์ชั ่น รูปแบบ >> หน้าที่ AVG ผลลัพธ์เป็ นค่ำเฉลี่ยของข้อมูลทั้งกลุ่ม SUM ผลลัพธ์เป็ นผลบวกของข้อมูลทั้งกลุ่ม MIN ผลลัพธ์เป็ นค่ำน้อยที่สุดของข้อมูลทั้งกลุ่ม MAX ผลลัพธ์เป็ นค่ำมำกที่สุดของข้อมูลทั้งกลุ่ม COUNT ผลลัพธ์เป็ นจำนวนรำยกำรของข้อมูลทั้งกลุ่ม SELECT FROM Function (column_name or *) table_name ; 40 หาค่าเฉลี่ยด้วย AVG() , MAX() โจทย์ >> ต้องกำรทรำบค่ำเฉลี่ยเงินเดือนพนักงำนทุกคน SQL1 >> SELECT AVG(salary) FROM employee ; ผลลัพธ์ >> AVG(salary) -----------4971 โจทย์ >> ต้องกำรทรำบวงเงินสูงสุดที่ให้แก่ลกู ค้ำมีค่ำเท่ำไหร่ SQL1 >> SELECT MAX(C_creditlim) FROM Customer ; ผลลัพธ์ >> MAX(C_creditlim) -----------900000 41 การนับจานวน COUNT, DISTINCT โจทย์ >> ต้องกำรทรำบจำนวนลูกค้ำของบริษัท SQL1 >> โจทย์ >> SQL1 >> SELECT COUNT(*) FROM customer ; ผลลัพธ์ >> count(*) -----------9 แสดงจำนวนรำยกำรสัง่ ซื ้อสินค้ ำทังหมด ้ พร้ อมระบุจำนวนรำยกำรสินค้ ำทังหมดที ้ ่มี กำรสัง่ ซื ้อ SELECT COUNT(*) AS “TOTAL” , COUNT(DISTINCT IDorder) AS “ORDER” FROM Order; ผลลัพธ์ >> TOTAL ORDER ------------ -----------6 5 42 การเชื่อมตาราง (JOIN) โจทย์ >> ต้องกำรทรำบว่ำใบสัง่ ้ื้ อแต่ละใบมีพนักงำนชื่ออะไรเป็ นผูข้ ำย Employee Order IDorder IDemployee IDproduct* E_name E_salary = E_address Qty Discount IDcustomer * E_telephone IDemployee * SQL >> ผลลัพธ์ >> SELECT DISTINCT IDorder, order.IDemployee, e_name FROM order,employee WHERE order.IDemployee= employee.IDemployee; IDorder ……. A-001 A-059 … IDemployee …… 10100 1855 … e_name …….. Piya Sukchai … 43 การใช้นิพนธ์คณิตศาสตร์ในการเชื่อมตาราง โจทย์ >> ต้องกำรทรำบชื่อสินค้ำและยอดเงินที่ยงั ไม่ได้หกั ลดในใบสัง่ ้ื้ อรหัส A-001 product Order IDproduct IDorder p_name IDproduct* unitprice onhand = reorder_pt SQL >> ผลลัพธ์ >> Qty Discount reorder_qty IDcustomer * total_amount= qty* uniprice IDemployee * SELECT p_name, qty * unitprice AS “total_amount” FROM product , order WHERE IDorder= ‘A-001’ AND product.IDproduct =order. IDproduct ; p_name …… television total_amount …….. 3150000 44 การเชื่อมตารางแบบ Equi join โจทย์ >> ต้องกำรทรำบชื่อสินค้ำและยอดเงินของสินค้ำในใบสัง่ ้ื้ อ ‘D-593’ โดยเรียงลำดับตำมปริมำณจำกมำกไปหำน้อย product Order IDproduct IDorder p_name IDproduct* unitprice onhand reorder_pt reorder_qty total_amount= qty* uniprice SQL >> = Qty Discount IDcustomer * IDemployee * SELECT p_name, qty FROM product , order WHERE product.IDproduct=order.Idproduct AND IDorder=‘D-593’ ORDER BY qty DESC ; ผลลัพธ์ >> p_name …… Paper Pencil qty …….. 150 50 45 การเชื่อมตารางแบบ Self join โจทย์ >> พนักงำนแต่ละคนต้องกำรทรำบว่ำมีพนักงำนคนใดบ้ำงที่ เงินเดือนมำกกว่ำตน employee E2 IDemployee IDemployee lowerpaid higherpaid lowersalary SQL >> employee E2 < highersalary address address telephone telephone = SELECT E1.e_name AS “lowerpaid”, E1.salary AS “lowersalary”, E2.e_name AS “higherpaid”, E2.salary AS “highersalary” FROM employee E1, employee E2 WHERE E1.salary < E2.salary ORDER BY 1; 46 การเชื่อมตารางแบบ Self join ผลลัพธ์ >> lowerpaid lowersalary …….. higherpaid Pinyo Pinya Pinya Pinya Sukchai Sukchai Wilai Wilai Wilai Wilai 4985 3500 3500 3980 3980 3980 2590 2590 2590 2590 Sompat Pinyo Sukchai Sombat Pinyo Sombat Piya Pinyo Sombat Sukchai …… …… highersalary …….. 9800 4985 3980 9800 4985 9800 3500 4985 9800 3980 47 การเชื่อมตารางแบบ Outer join โจทย์ >> แสดงรหัสและชื่อสินค้ำที่ไม่มีกำรสัง่ ้ื้ อจำกลูกค้ำ product Order IDproduct IDorder p_name IDproduct* unitprice onhand reorder_pt reorder_qty = Qty Discount IDcustomer * IDemployee * SQL >> SELECT p_name, P.Idproduct , IDorder FROM product P, order O WHERE P.IDproduct = O.IDproduct(+); 48 การเชื่อมตารางแบบ Self join ผลลัพธ์ >> IDproduct …… 10515 10515 20001 20002 21011 35155 36710 39001 p_name …….. Television Television Radio Table Chair Pencil Ruler Paper IDorder …….. A-001 C-523 B-191 A-059 D-593 แถวที่ไม่มีขอ้ มูลในorder D-593 49