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