Structured Query Language (SQL) (2) 357337 – Web Programming and Web Database
SQL : String Operations LIKE operator Percent ( % ): ตรงกับทุก substring “Bang%” ตรงกับคำทุกคำที่ขึ้นต้นด้วย Bang (e.g., BangSue, Bangkok) %ko% คือ คำที่มี ko อยู่ข้างใน เช่น Bangkok, kingkong Underscore ( _ ): ตรงกับทุกอักขระ “Bang _ _” ตรงกับคำทุกคำที่ขึ้นต้นด้วย Bang และตามด้วยอีก 2 ตัวอักษร (e.g., Bangna) _ _ _ คือ คำที่มี 3 ตัวอักษร เช่น kok, abc, xxx _ _ _ % คือ คำที่มีอย่างน้อย 3 ตัวอักษร เช่น kok, bangk
SQL : String Operations escape (\) ใช้ในกรณีที่ต้องการรวม special character (I.e., %, \) ไว้ใน string เอง เช่น like “ab\%cd%” ตรงกับทุก string ที่ขึ้นต้นด้วย ab%cd || concatenation การต่อ strings เช่น “(662)” || “585-8541” == “(662)585-8541” extract substrings หาความยาวของคำ แปลงให้เป็นอักษรตัวพิมพ์ใหญ่, เล็ก หรือ Title soundex (การหาคำเสียงคล้าย)
ตัวอย่าง Relational Schema Student ( ID, Firstname, Lastname) จงเขียนคำสั่ง SQL เพื่อแสดง ชื่อของนักเรียนที่ขึ้นต้นด้วย Wat SELECT Firstname FROM Student WHERE Firstname LIKE “Wat%” ชื่อและนามสกุลของนักเรียนที่มีชื่อยาว 5 ตัวอักษร SELECT Firstname, Lastname FROM Student WHERE Firstname LIKE “_____” AND Lastname LIKE “_____”
LIMIT คำสั่ง LIMIT ใน mySQL ใช้ต่อท้ายคำสั่ง SELECT เพื่อจำกัดผลลัพธ์ที่แสดงออก วิธีใช้แบบที่ 1 LIMIT <จำนวนแถวที่จะให้แสดง>
LIMIT วิธีใช้แบบที่ 2 LIMIT <แถวเริ่มต้น> , <จำนวนแถวที่จะแสดง> ระวัง!! แถวเริ่มต้นจะเริ่มนับที่แถวที่ 0
Order การเรียงลำดับผลลัพธ์ SELECT a1, a2, …, an FROM r ORDER BY aj1, …, ajn [ASC, DESC] การเรียงลำดับโดย default เรียงจากน้อยไปมาก (ASC) เรียงจากมากไปน้อย (DESC) หากต้องการเรียงลำดับมากกว่า 1 attributes หรือที่แตกต่างไปจาก default ต้องระบุปะท้าย ASC หรือ DESC ของแต่ละ attribute นั้น เป็น operation ที่ใช้เวลาในการทำงานมาก จึงควรทำเฉพาะที่จำเป็น
ตัวอย่าง order by หาชื่อพนักงาน ชื่อแผนก และเงินเดือนของพนักงานคนนั้น ๆ เรียง ตามชื่อแผนก และ ตามเงินเดือนจากมากไปน้อย SELECT fname, lname, dName, salary FROM employee, department WHERE employee.dNo = department.dNumber ORDER BY dName ASC, salary DESC
Aggregation Functions Built-in aggregate functions ค่าเฉลี่ย : avg ค่าต่ำสุด: min ค่าสูงสุด: max ค่ารวม: sum นับจำนวน tuples: count มักใช้ร่วมกับ group by
ตัวอย่าง Aggregation Functions นับจำนวนพนักงานในบริษัท SELECT COUNT(*) FROM employee หาเงินเดือนเฉลี่ยของพนักงาน SELECT AVG(salary) FROM employee หาเงินเดือนรวม, เงินเดือนต่ำสุดและสูงสุดของพนักงาน SELECT SUM(salary), MIN(salary), MAX(salary) นับจำนวนพนักงานในแต่ละแผนก SELECT dNo, COUNT(*) FROM employee GROUP BY dNo; หาเงินเดือนเฉลี่ยของแผนกที่มีค่าเฉลี่ยสูงกว่า 50000 SELECT dNo,AVG(salary) FROM employee GROUP BY dNo HAVING AVG(salary)> 50000
ตัวอย่าง Aggregation Functions & Group BY AccountID BranchName Balance 023-8-0254 Bangsue 10000 158-7-7894 30000 568-8-7483 Bangkhen 5000 120-3-0478 40000 347-1-5640 20000 Bangsue 40000 Bangkhen 65000
having clause: GROUP BY … HAVING ... เพิ่มเงื่อนไขโดยการใช้ Aggregate function กับคำสั่ง GROUP BY SELECT a1, a2, …, an FROM r GROUP BY aj HAVING avg(aj) > 50000
ตัวอย่าง HAVING จงหาชื่อสาขาธนาคารที่มีเงินฝากรวมมากกว่า 60000 บาท SELECT BranchName FROM Account GROUP BY BranchName HAVING SUM(Balance) > 60000; AccountID BranchName Balance 023-8-0254 Bangsue 10000 158-7-7894 30000 568-8-7483 Bangkhen 5000 120-3-0478 40000 347-1-5640 20000 Bangsue 40000 Bangkhen 65000
สรุปรูปแบบการทำ SQL Query SELECT/FROM/WHERE SELECT <attribute list> FROM <table list> [WHERE <conditions P>] [GROUP BY <grouping attributes>] [HAVING <group condition>] [ORDER BY <attribute list>]
Rename Operation สามารถทำการ rename ได้ทั้ง attributes และ relations รูปแบบ: <old name> AS <new name> Rename Attribute: SELECT fname AS “Name”, dName, salary FROM employee, department WHERE employee.dNo = department.dNumber Rename ตาราง: SELECT fname, lname, e.dNo, dName, salary FROM employee AS e, department AS d WHERE e.dNo = d.dNumber
SQL : Set Operations Union: union และ union all Intersect: intersect และ intersect all Except : except และ except all (ในบาง DBMS ใช้ MINUS) ถ้าต้องการให้ไม่กำจัดค่าซ้ำ ใช้ <set operation> all (e.g. union all)
SQL : Union borrower depositor จงหา รหัสของลูกค้าของธนาคารที่กู้เงินกับธนาคารหรือมีเงินฝากกับธนาคาร
SQL : Union
SQL : Set Intersect ใน MySQL ไม่มีคำสั่ง intersect ให้ใช้โดยตรงแต่สามารถเขียนได้ ดังนี้ SELECT cust_id FROM borrower WHERE cust_id IN (SELECT cust_id FROM depositor)
SQL : Set Difference ใน MySQL ไม่มีคำสั่ง set difference โดยตรงแต่สามารถเขียนได้ ดูตัวอย่าง SELECT cust_id FROM borrower WHERE cust_id NOT IN (SELECT cust_id FROM depositor);
SQL : Natural Join CustName CustCity วิธีที่ใช้ Cartesian product : Cust_id Name 001-586-777 John 367-895-124 DJ Cust_id City 001-586-777 Bangkok 367-895-124 Nonthaburi CustName CustCity วิธีที่ใช้ Cartesian product : วิธีที่ใช้ Natural-Join :
SQL : Natural Join
Export A MySQL Database เมื่อผู้ดูแลระบบต้องการจะ backup ฐานข้อมูล หรือ นำฐานข้อมูลนี้ไปใช้กับเครื่องอื่น ใน MySQL สามารถใช้คำสั่ง mysqldump -u login –p database_name > FILE.sql login คือ login ของผู้มีสิทธิ์ในการทำงานกับฐานข้อมูลนั้น เช่น root password คือรหัสผ่าน database_name คือ ชื่อของฐานข้อมูลที่ต้องการจะ backup FILE.sql คือ ชื่อ file ทีจะเก็บฐานข้อมูลที่ต้องการจะ backup ตัวอย่าง mysqldump –u root –p ectstudent > ect.sql
Import A MySQL Database เมื่อผู้ดูแลระบบต้องการนำฐานข้อมูลที่ backup ไว้แล้วมาใช้ในฐานข้อมูลปัจจุบัน ใน MySQL สามารถใช้คำสั่ง mysql -u login –p database_name < FILE.sql login คือ login ของผู้มีสิทธิ์ในการทำงานกับฐานข้อมูลนั้น เช่น root password คือรหัสผ่าน database_name คือ ชื่อของฐานข้อมูลที่ต้องการจะ import FILE.sql คือ ชื่อ file ทีจะเก็บฐานข้อมูลที่ต้องการจะ import ตัวอย่าง mysql –u root –p ectstudent < ect.sql