Transcript SQL
SQL ถูกเริม ่ พัฒนาทีห ่ ้อง Lab ของ IBM ทีเ่ มือง ื่ เต็มคือ California ปลายปี 1970 โดยมีชอ Structured Query Language อ่านว่า sequel ซงึ่ ถูก ื่ ว่า DB2 (a พัฒนาสาหรับ ฐานข ้อมูลของ IBM ทีม ่ ช ี อ relation database management system หรือ RDBMS) SQL มีลักษณะเป็ น Nonprocedural language ซงึ่ เน ้นไปที่ อะไร (what) ไม่ใช ่ อย่างไร (how) นั่นคือ SQL จะอธิบายถึงจะดึงข ้อมูลอะไร หรือ จะลบ หรือ เพิม ่ เติมข ้อมูลอะไร ไม่ใช ่ จะลบหรือดึงข ้อมูลได ้ อย่างไร ั สนได ้ เนือ คาย่อ SQL อาจจะสร ้างความสบ ่ งจาก S ย่อมาจาก Structured และ L ย่อมาจาก Language แต่ Q ย่อมาจาก Query ซงึ่ หากแปลตามตัว จะเป็ น การจากัดให ้หมายถึงการทางานเฉพาะการสอบถาม ข ้อมูล จากฐานข ้อมูล ซงึ่ จริงๆ แล ้ว SQL ทางานได ้ ่ การสร ้างตาราง การ มากกว่าการสอบถามข ้อมูล เชน ลบข ้อมูล การเพิม ่ ข ้อมูล การรวมข ้อมูล ไปจนถึงการ สร ้าง trigger ทีเ่ ป็ นการทางานทีจ ่ ะเกิดเมือ ่ มีการ เปลีย ่ นแปลงข ้อมูล แต่โชคไม่ดท ี ป ี่ ั จจุบน ั ยังไม่มค ี า ใดเหมาะสมไปกว่าคาว่า SQL ่ DBMS ทีรองร ับการเรียกใช ้งานคาสัง่ SQL และมี ข ้อมูลตัวอย่าง (MySQL) ่ โปรแกรมทีรองร ับการเรียกใช ้งานคาสัง่ SQL เพือ่ ่ าข ้อมูลจาก DBMS มาแสดง เพือน (Access+ODBC) , HOSxP – SQL Windows ทีห ่ น ้าจอ Login เลือก Connection Setting ื่ มต่อไปที่ ตัง ้ ค่าการเชอ 192.168.1.234 User : sa, password : sa, protocol mysql-4.1 Login เข ้าโปรแกรม User Name:admin ้ รูปแบบการเรียกใชงานค าสงั่ SELECT PNAME, FNAME, FNAME FROM PATIENT WHERE FNAME = ‘โชคดี’; หรือ select pname, pname, lname from patient where name = ‘โชคดี’; คาสงั่ SQL มีลักษณะเป็ น Case insensitive ปกติจะปิ ด statement ด ้วยเครือ ่ งหมาย semicolon (;) +---------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+-------+ | pttype | char(2) | | PRI | | | | name | varchar(250) | YES | MUL | NULL | | | editmask | varchar(100) | YES | | NULL | | | isuse | char(1) | YES | | NULL | | | pcode | char(2) | YES | | NULL | | | requirecode | char(3) | YES | | NULL | | | doctor_fee | char(1) | YES | | NULL | | | fee_code | varchar(7) | YES | | NULL | | | discount | int(11) | YES | | NULL | | | contract | char(1) | YES | | NULL | | | paidst | char(2) | YES | | NULL | | | in_region | char(1) | YES | | NULL | | | uc | char(1) | YES | | NULL | | | require_hcode | char(1) | YES | | NULL | | +---------------+--------------+------+-----+---------+-------+ การแสดงโครงสร ้างของตารางสามารถทาได้โดยเรียกใช้ SELECT FROM WHERE (what column) (what table) (what condition) First Query SELECT * FROM PTTYPE ; SELECT name, pttype, pcode FROM pttype; ตาราง pttype เก็บข้อมู ลสิทธิการร ักษา SELECT name, pttype as pttype_name, pcode FROM pttype; SELECT pcode FROM pttype; SELECT DISTINCT pcode FROM pttype; ่ Keyword SELECT และ FROM ใช ้เพือ นาข ้อมูลมาแสดง หรือถ ้าต ้องการดึง ้ ข ้อมูลทังหมดมาสามารถใช ้ keyword keyword SELECT * ่ งให ่ ้ตัด Keyword DISTINCT ใช ้เพือสั ่ ากั ้ นออก ข ้อมูลทีซ ่ ้ตังชื ้ อ่ สามารถใช ้ Keyword AS เพือใช ่ ชือของ Column ใหม่ได ้ ตัวอย่าง Expression เช่น select * from clinic; การระบุ Condition เช่น select * from clinic where name=‘เบาหวาน’; Arithmetic Operators + * / % SELECT name, unitprice FROM drugitems; SELECT name, unitprice, unitprice*1.4 as retailprice FROM drugitems; ้ ตาราง drugitems เก็บข้อมู ลรายการเวชภัณฑ ์ยาทังหมด SELECT name, unitprice, unitprice + 10 FROM drugitems; SELECT name, unitprice, unitprice - 5 FROM drugitems; SELECT name, packqty,unitprice, packqty*unitprice FROM drugitems; การเปรียบเทียบข้อมู ล มีผลลัพธ ์ 3 ค่า คือ TRUE, FALSE และ Unknown ในระบบฐานข้อมู ลค่าว่างเปล่า มี 2 ้ั าให้วา รู ปแบบคือถู กตงค่ ่ งและ ยังไม่ถูก ้ั า โดยข้อมู ลของ field ทียั ่ งไม่ถูก ตงค่ ้ั า จะมีคา ตงค่ ่ เป็ น NULL การตรวจสอบค่าว่างจะใช้ operator IS NULL +-------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+-------+ | spclty | char(2) | YES | MUL | NULL | | | name | varchar(150) | YES | MUL | NULL | | | depcode | char(3) | YES | | NULL | | | ovstostlink | char(2) | YES | | NULL | | | spname | varchar(150) | YES | | NULL | | | shortname | varchar(10) | YES | | NULL | | | ill_visit | char(1) | YES | | NULL | | +-------------+--------------+------+-----+---------+-------+ SELECT * FROM spclty WHERE ill_visit = NULL; SELECT * FROM spclty WHERE ill_visit IS NULL; ้ ตาราง spclty เก็บข้อมู ลแผนกทังหมดในโรงพยาบาล SELECT * FROM spclty WHERE spclty = ’01’; SELECT * FROM spclty WHERE depcode = ‘001’; SELECT * FROM drugitems WHERE unitprice > 200; SELECT * FROM drugitems WHERE unitprice >= 100; SELECT * FROM drugitems WHERE unitprice < 2; SELECT * FROM drugitems WHERE unitprice <= 2; SELECT * FROM pttype WHERE pcode <> ‘UA’; SELECT * FROM pttype WHERE pttype != ’20’; ้ อ ใชเครื ่ งหมายเปอร์เซนต์ (%) เพือ ่ เป็ นการระบุ wildcard (หมายถึงตัว อะไรก็ได ้ ยาวกีต ่ วั อักษรก็ได ้ ถ ้าอยู่ ข ้างหน ้าหมายถึงขึน ้ ต ้นด ้วยตัวอะไรก็ ได ้ ถ ้าอยูด ่ ้านท ้าย หมายถึงตามด ้วย ตัวอะไรก็ได ้) ถ ้าต ้องการระบุความกว ้าง สามารถ ้ อ ใชเครื ่ งหมาย underscore (_) SELECT * FROM pttype WHERE pcode LIKE ’U_’; SELECT * FROM pttype WHERE name LIKE ‘%ทอง%’; ้ อ ถ ้าเป็ นฐานข ้อมูลตัวอืน ่ ใชเครื ่ งหมาย Double Pipe (||) ถ ้าเป็ น MySQL ใช ้ Function CONCAT SELECT (name || strength || unit) as name FROM drugtitems WHERE drugaccount = ’ก’; SELECT CONCAT(name ,’ ‘, strength ,’ ‘, units) as name FROM drugitems WHERE name like ‘a%’ ่ การใช ้ AND จะมีคา่ เป็ น TRUE ก็ตอ ่ เมือ ้ Expression ทังสองข ้าง มีคา่ เป็ น TRUE ่ การใช ้ OR จะมีคา่ เป็ น TRUE ก็ตอ ่ เมือ Expression ข ้างใดข ้างหนึ่ ง มีคา่ เป็ น TRUE การใช ้ NOT จะเป็ นการกาหนดค่าตรงกัน ่ ข ้ามกับ Expression ทีตามหลั ง เช่น ถ ้า Expression มีคา่ เป็ น FALSE จะกลายเป็ น TRUE +---------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------------+--------------+------+-----+---------+-------+ | hn | varchar(7) | YES | MUL | NULL | | | pname | varchar(15) | YES | MUL | NULL | | | fname | varchar(30) | YES | MUL | NULL | | | lname | varchar(30) | YES | MUL | NULL | | | occupation | char(3) | YES | | NULL | | | citizenship | char(3) | YES | | NULL | | | birthday | date | YES | | NULL | | | addrpart | varchar(50) | YES | | NULL | | | moopart | char(3) | YES | | NULL | | | tmbpart | char(2) | YES | | NULL | | | amppart | char(2) | YES | | NULL | | | chwpart | char(2) | YES | MUL | NULL | | | bloodgrp | varchar(5) | YES | | NULL | | | clinic | varchar(100) | YES | MUL | NULL | | | deathday | date | YES | | NULL | | | drugallergy | varchar(50) | YES | | NULL | | | fathername | varchar(50) | YES | | NULL | | | firstday | date | YES | | NULL | | | hometel | varchar(20) | YES | | NULL | | | informaddr | varchar(50) | YES | | NULL | | | informname | varchar(50) | YES | | NULL | | | informrelation | varchar(50) | YES | | NULL | | | informtel | varchar(20) | YES | | NULL | | | marrystatus | char(1) | YES | | NULL | | | mathername | varchar(50) | YES | | NULL | | | nationality | char(3) | YES | | NULL | | | pttype | char(2) | YES | MUL | NULL | | | religion | char(2) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | spsname | varchar(50) | YES | | NULL | | SELECT * FROM patient WHERE fname = ’ช ัยพร’ AND lname = ‘สุรเตมีย ์ กุล’; SELECT * FROM patient WHERE fname = ‘สมปอง’ OR fname = ‘ช ัยพร’ ่ ตาราง patient เก็บข้อมู ลทัวไปของผู ป ้ ่ วยทุกคน SELECT * FROM patient WHERE fname = ’ช ัยพร’ OR fname = ‘สมชาย’ OR fname = ‘สมศ ักดิ’;์ SELECT * FROM patient WHERE fname IN (‘ช ัยพร’ ์ ‘สมศ ักดิ’) , ‘สมชาย’, SELECT * FROM patient WHERE birthday >= ‘2002-01-01’ AND birthday <= ‘2002-01-31’ SELECT * FROM patient WHERE birthday BETWEEN ‘2002-01-01’ AND ‘2002-01-31’ นิยมใชรู้ ปแบบ YYYY-MM-DD หรือ ISO Date Style ่ จะต ้องอยูใ ่ นเครือ ่ งหมาย ‘’ เชน 01-01’ เหมือนข ้อมูลตัวอักษร ถ ้าเป็ นข ้อมูลทีเ่ ป็ นเวลา ใชรู้ ปแบบ ่ ’14:01:01’ HH:MM:SS เชน จงใชค้ าสงั่ DESCRIBE patient เพือ ่ แสดงโครงสร ้างตาราง patient ึ ษาโครงสร ้างตาราง patient และทา ศก query เพือ ่ ตอบคาถามเหล่านี้ เขียน query ทีแ ่ สดงข ้อมูลผู ้ป่ วยทุกคนที่ เกิด ปี พ.ศ. 2520 และ เป็ นเพศ ชาย เขียน query ทีแ ่ สดงข ้อมูลผู ้ป่ วย ทีม ่ เี ลือด group A เขียน query ทีแ ่ สดงข ้อมูลผู ้ป่ วย ที่ แพ ้ยา อะไรก็ได ้ ื่ ผู ้ป่ วยทีไ่ ม่ได ้ระบุเพศ จงหารายชอ ื่ ผู ้ป่ วยทีถ จงแสดงรายชอ ่ ก ู ลงทะเบียน วันที่ 30 มีนาคม 2548 Function ในแต่ละระบบฐานข ้อมูลอาจจะมีชอเรี ื่ ยกไม่ เหมือนกัน หรือมีรป ู แบบการเรียกใช ้งานไม่เหมือนกัน ก่อนใช ้ ก่อนใช ้ต ้องศึกษาคูม ่ อ ื ของฐานข ้อมูลให ้ละเอียดก่อน ่ ไป Function แบ่งออกเป็ น โดยทัวๆ การรวมหรือสรุป (Aggregate function) การจัดการวันที่ (Date and time function) การจัดการตัวเลข (Arithmetic function) การจัดการตัวอักษร (Character function) การแปลงค่า (Conversion function) ่ (Miscellaneous functions) อืนๆ ่ ่ ่ าหนด COUNT ใช ้นับจานวนแถวทีตรงตามเงื อนไขที ก ่ ่ ่ SUM ใช ้รวมค่าของ column ทีระบุ ตามเงือนไขที กาหนด ่ ่ ่ AVG ใช ้หาค่าเฉลียของ column ทีระบุ ตามเงือนไข ่ ่ MAX ใช ้หาค่าสูงสุดของ column ทีระบุ ตามเงือนไข ่ ่ MIN ใช ้หาค่าต่าสุดของ column ทีระบุ ตามเงือนไข ่ VARIANCE ค่าเบียงเบน ่ STDDEV ค่าเบียงเบนมาตรฐาน SELECT COUNT(*) FROM patient SELECT COUNT(hn) FROM patient WHERE birthday BETWEEN ‘2002-01-01’ AND ‘2002-01-31’ ่ ่ สามารถใช้เครืองหมาย * หรือ ชือของ column ใน SELECT SUM(income) FROM vn_stat WHERE vstdate = ‘2005-05-01’ SELECT pttype,SUM(income) FROM vn_stat WHERE vstdate between ‘2005-05-01’ and ‘200505-10’ GROUP BY pttype หาก statement มีการเรียกใช้ aggregate function SELECT MIN (hn), MAX(hn) FROM patient SELECT MIN (birthday),MAX (birthday) FROM patient WHERE sex = ‘1’ สามารถใช้ function ได้พร ้อมๆ ก ันมากกว่า 1 DATE_ADD (date, interval) TO_DAYS(date) FROM_DAYS(N) DATE_FORMAT(date,format) EXTRACT(type FROM date) NOW(), CURRENT_TIMESTAMP() ่ ข้อมู ลของ function ต่างๆ สามารถอ่านเพิมเติ มได้ ABS CEIL FLOOR EXP LOG(column,x) MOD(column,x) SQRT CONCAT LENGTH SUBSTRING(str,pos,len) TRIM REPLACE(str,from_str,to_str) LOWER, UPPER SELECT (what column) FROM (what table) WHERE (what condition) GROUP BY (column) HAVING (aggregate condition) ORDER BY (column) LIMIT (rows ) *** not standard SELECT hn, pname, fname, lname FROM patient ORDER BY fname,lname,hn LIMIT 100 SELECT hn, pname, fname, lname FROM patient ORDER BY hn desc LIMIT 100 SELECT fname, COUNT(*) AS fname_count FROM patient GROUP BY fname LIMIT 100 SELECT pdx, COUNT(*) as pdx_count FROM vn_stat WHERE vstdate between ‘2004-01-01’ and ‘2004-02-01’ GROUP BY pdx ORDER BY pdx_count desc LIMIT 100 ่ ถื ่ อว่าเป็ นความสามารถทีเยี ่ ยมยอดของ ่ สิงที SQL คือการนาข ้อมูลมาประมวลผล จาก ่ หลายๆ ตารางพร ้อมๆ กัน ซึงหากขาด ้ ้ว จะต ้องเก็บข ้อมูลทุกๆ ความสามารถนี แล ทุกๆ อย่างไว ้ในตารางเดียวกัน การดึงข ้อมูลจากหลายๆ ตาราง ใช ้ JOIN Statement SELECT o.* FROM occupation o ตาราง occupation เก็บข้อมู ลรายละเอียดของอาชีพ SELECT p.hn,p.occupation FROM patient p ORDER BY p.hn LIMIT 10 SELECT p.hn,p.occupation,o.name FROM patient p, occupation o WHERE p.occupation = o.occupation ORDER BY p.hn LIMIT 10 SELECT p.hn,p.occupation,o.name,p.religion, r.name FROM patient p, occupation o, religion r WHERE p.occupation = o.occupation and p.religion=r.religion ORDER BY p.hn LIMIT 10 ตาราง religion เก็บข้อมู ลรายละเอียดของศาสนา SELECT p.hn,p.occupation,o.name,p.religion, r.name FROM patient p LEFT OUTER JOIN occupation o ON o.occupation = p.occupation LEFT OUTER JOIN religion r ON r.religion = p.religion ORDER BY p.hn LIMIT 10 จงสร ้าง query ทีแ ่ สดงข ้อมูลดังนี้ ี ว่ามี รายการสรุปยอดผู ้ป่ วยในแต่ละอาชพ ี อะไรบ ้าง อย่างละกีค อาชพ ่ น รายการสรุปยอดผู ้ป่ วยแยกตามทีอ ่ ยู่ ว่าอยูท ่ ี่ จังหวัดอะไรบ ้าง อย่างละกีค ่ น (ข ้อมูลทีอ ่ ยู่ อยูใ่ นตาราง thaiaddress) รายการสรุปยอดผู ้ป่ วยแยกหมูเ่ ลือด เฉพาะ ั อยูใ่ นจังหวัดนครพนมว่ามีหมู่ ผู ้ป่ วยทีอ ่ าศย เลือดอะไรบ ้าง อย่างละกีค ่ น SELECT * FROM pttype WHERE pcode IN (‘A1’,’A2’,’A3’,’A4’,’A5’,’A6’,’A7’, ’A8’,’A9’,’UA’,’UB’,’UC’,’AI’,’AJ’,’AK’,’AH’,’AL’) SELECT * FROM pttype WHERE pcode IN (SELECT pcode FROM pttype) ้ MySQL รองร ับการทา subquery ได้เฉพาะรุน ่ 4.1 ขึนไป SELECT * FROM SOMETHING WHERE ( SUBQUERY(SUBQUERY(SUBQ SELECT * FROM pttype WHERE pcode IN (SELECT pcode FROM pttype WHERE pcode IN (SELECT pcode FROM pttype)) INSERT INTO Table Values What UPDATE Table Set What Where condition DELETE What FROM Table Where condition