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