เผื่อจะมีประโยชน์กับ admin มือใหม่ บ้างครับ ไม่ได้เก่งอะไร แค่อยากเผื่อแผ่ให้ท่านที่ยังไม่รู้ได้ทำเป็นบ้าง
เพราะที่ผมทำ รายงานเองได้(บางส่วน) ก็มาจากนั่งดู แกะๆ แล้วก็แก้เอา บางอย่างก็ไม่รู้ว่าทำไมต้องเขียนแบบนี้
บางอย่างอาจจะไม่ถูกต้องนัก ถ้าผิดพลาดส่วนไหนก็ช่วยแก้ไข หรือมีเพิ่มเติมก็ช่วยเพิ่มเติมให้หน่อยนะครับ
สามารถดูเพิ่มเติมได้ที่
กระทู้ที่อาจารย์ MN เขียนไว้ที่นี่ครับคำสั่ง MySQL
คำสั่งตรวจสอบ
show full processlist : แสดงผู้ที่เข้ามาทำงาน mysql
show create table ชื่อตาราง : แสดงคำสั่งใช้สร้างตารางนั้น
describe ชื่อtable : แสดงรายละเอียดของตาราง
1.การสร้างฐานข้อมูล
CREATE DATABASE `test` DEFAULT CHARACTER SET tis620 COLLATE tis620_thai_ci;
อธิบาย สร้างฐานข้อมูล test โดยตั้งค่า(การเรียงลำดับ) หลักเป็น is620 COLLATE tis620_thai_ci;
1.1 การตั้งค่าสิทธิการใช้งานให้ตาราง
grant all on test.* to test@'%' identified by '12345'
อธิบาย ให้สิทธิทุกอย่าง ในการแก้ไขฐานข้อมูล test แก่ test@'%' โดยใช้รหัสผ่าน 12345 ในการเข้าใช้
2.การสร้างตารางในฐานข้อมูล
CREATE TABLE `test`
(`id` int(11) NOT NULL default '0',`name` varchar(250) default NULL,PRIMARY KEY (`id`),UNIQUE KEY `id`(`id`))
อธิบาย สร้างตารางชื่อ refer_cause โดยมี field `id` เก็บข้อมูลชนิด integer ขนาด 11 ไม่มีค่าว่าง และมีค่า default=0
field 'name' เก็บข้อมูลชนิด varchar ขนาด 250 default = NULL โดยมี id เป็น PRIMARY KEY และ UNIQUE KEY
3. การปรับเปลี่ยนตาราง alter
เพิ่ม alter table test add confirm char(10)
อธิบาย แทรก(คอลัม)filed ชื่อ confirm ชนิดข้อมูล char ขนาด 10 ที่ตาราง test
เปลี่ยนชื่อ ALTER TABLE `test` CHANGE `confirm` `rename` INT( 15 ) NULL DEFAULT NULL
อธิบาย เปลี่ยน ชื่อคอลัม confirm ที่ตาราง test เป็น rename และชนิดข้อมูล INT ขนาด 15 ที่ตาราง test
4. การลบข้อมูลในตาราง (แถว) delete
delete from pttype_group2 where pname=1
อธิบาย ลบข้อมูลในตาราง pttype_group2 เมื่อ pname มีค่า =1
delete from hipdata where cid in (select cid from patient where pttype = '20')
อธิบาย ลบข้อมูลในตาราง hipdata เมื่อ cid มีค่า = cid ที่ patient และ patient.pttype = '20'
5. การลบตาราง(โยนทิ้ง) DROP
DROP TABLE `pttype_group2`
อธิบาย ลบตาราง(โยนทิ้ง) pttype_group2 จากฐานข้อมูลปัจจุบัน
6. การเลือกข้อมูล(นำข้อมูลมาแสดง) select
6.1 เลือกทั้งหมด select * from test
6.2 เลือกบางข้อมูล select id,name from test
6.3 เลือกโดยเงื่อนไข where // between,and,or,like,in,not in,distinct (ไม่ซ้ำ) , <, > ,=>,<=,=,<> (ไม่เท่ากับ) !=,
%(อะไรก็ได้ยาวไม่จำกัด),_ (อะไรก็ได้แต่ยาวไม่เกินจำนวน _)
6.3.1 select * from vn_stat where pcode is null or pcode='' and pttype in ("75","80") and pdx like "K02%"
and vstdate between "2006-03-01" and "2006-06-30"
อธิบาย เลือกข้อมูลทุกตัว* จากตาราง vn_stat เมื่อ pcode เป็นค่าว่าง และ pttype มีค่าเป็น 75,80 และ pdx ขึ้นต้นด้วย k02
และ vstdate อยู่ในช่วง "2006-03-01" ถึง "2006-06-30"
6.3.2 select distinct hn,pttype from opitemrece
where pttype in (select pttype from pttype where pcode in (select pcode from pcode))
อธิบาย แสดง hn ที่ไม่ซ้ำกัน ,pttype จาก opitemrece เมื่อ pttype มีค่าอยู่ใน ตาราง pttype.pttype และ
pttype.pcode มีค่าอยู่ใน pcode.pcode
6.3.3 select v.pdx,i.name,count(v.pdx) as pdx_count from vn_stat v
left outer join icd101 i on i.code=v.pdx
where v.vstdate between '2006-08-01' and '2006-08-31' group by v.pdx,i.name order by pdx_count desc limit 10
อธิบาย แสดง pdx ,นับจำนวน pdx แสดงที่ pdx_count (การ count จำเป้นต้องใช้ as ร่วมด้วยไม่งั้นอาจมี error) ,ชื่อ pdx ( เชื่อม
v.pdxกับicd101.code เพื่อดึงชื่อ) จาก vn_stat และอยู่ในช่วง vstdate โดยให้จัดกลุ่มตาม pdx (group by ใช่ร่วมกับคำสั่ง count,
min ,max) และเรียงลำดับตาม pdx_count จากมากไปน้อย ( DESC มากไปน้อย ASC น้อยไปมาก) แสดงที่ 10 รายการ
6.4 การ join เป็นการนำตารางหลาย ๆ ตารางมาคิวรีพร้อมกัน เพื่อหาข้อมูลที่ต้องการ
Inner Join เป็นการนำตาราง 2 ตารางมา join กัน ตามเงื่อนไขที่กำหนด (เป็นการ join ทั้งสองฝั่งต้องมี field ที่นำมา join กันเหมือนกัน)
>> Equi JOIN จะมีการแสดงข้อมูลซ้ำกันในคอลัมน์ที่นำมาเปรียบเทียบกัน
>> Natural JOIN จะไม่นำข้อมูลคอมลัมน์ที่เปรียบเทียบมาแสดง
Cross Join (Unrestricted JOIN) เป็นการ JOIN ที่แสดงถึงความเป็นไปได้ของผลลัพธ์ที่สามารถเกิดขึ้นได้ (Cartesian Product)
Outer Join การ JOIN ที่อยู่นอกเหนือเงื่อนไขที่กำหนด ประกอบไปด้วย
>> LEFT OUTER JOIN (* =) นำเอาฝั่งซ้ายมาทุกrecord ส่วนทางขวาจะนำเอา record ที่เหมือนทางซ้ายมาเท่านั้น
>> RIGHT OUTER JOIN (= *) นำเอาฝั่งขวามาทุกrecord ส่วนทางซ้ายจะนำเอา record ที่เหมือนทางขวามาเท่านั้น
Outer Join เป็นการ JOIN ตารางเดียวกัน แต่ตั้งชื่อ alias ต่างกัน
Full Join : เป็นการ join กันที่จะนำเอาฝั่งซ้ายและฝั่งขวามาทุกrecord โดยรายการไหนที่ไม่ match กันก็จะแสดง null value ออกมาให้
EXAMPLE 1 select d.name as doctor_name,o.icode,concat(s.name," ",s.strength," ",s.units) as item_name
,sum(o.qty) as sum_qty from opitemrece o
left outer join doctor d on d.code=o.doctor
left outer join s_drugitems s on s.icode=o.icode and o.icode like "1%"
where o.rxdate between "2006-09-01" and "2009-09-10" group by d.name,o.icode
อธิบาย เลือกข้อมูลหลักจากตาราง opitemrece o (ใช้ o แทน opitemrece) โดย เชื่อม ตาราง doctor d โดย d.code=o.doctor
และ เชื่อม s_drugitems s on s.icode=o.icode o.icode ขึ้นต้นด้วย
แล้วแสดงข้อมูล doctor.name ที่ doctor_name ,opitemrece.icode ,
รวมข้อมูล s_drugitems.name s_drugitems.strength s_drugitems.unit ที่ item_name และ ผลรวมของ opitemrece.qty
EXAMPLE 2
SELECT p.hn,p.fname,p.lname,t1.name as chw_name, t2.name as amp_name,t3.name as tmb_name
FROM patient p
LEFT OUTER JOIN thaiaddress t1 on t1.chwpart=p.chwpart and t1.codetype='1'
LEFT OUTER JOIN thaiaddress t2 on t2.chwpart=p.chwpart and t2.amppart=p.amppart and t2.codetype='2'
LEFT OUTER JOIN thaiaddress t3 on t3.chwpart=p.chwpart and t3.amppart=p.amppart
and t3.tmbpart= p.tmbpart and t3.codetype='3'
WHERE p.fname LIKE 'สม%'
EXAMPLE 3
select g.income_group,g.name,sum(o.rcptamt) as rcptamt
from income_group g,income i,incoth o,vn_stat v
where v.vstdate between "2006-09-01" and "2006-09-31"
and v.vn=o.vn and i.income=o.income and g.income_group=i.income_group
group by g.income_group,g.name
7. การแก้ไข/เปลี่ยนแปลงข้อมุลในตาราง update data set
UPDATE nondrugitems SET istatus = 'Y' WHERE (istatus = '' OR istatus IS NULL)
อธิบาย แก้ไขค่า istatus เป็น Y เมื่อ istatus มีค่าว่าง
UPDATE nondrugitems SET price = price2 WHERE price2 >0 AND price2 IS NOT NULL
อธิบาย แก้ไขค่า price ให้มีค่า= price2 เมื่อ price2 มีค่ามากกว่า 0และไม่ใช่ค่าว่าง
8. การ Union
select h.lab_order_number,h.lab_receive_number,h.hn,h.order_date,
h.order_time,h.receive_time as service13,h.report_time as service14,d.code,
d.name as doctor_name,concat(pt.pname,pt.fname,' ',pt.lname) as ptname,h.form_name,
v.age_y as age_y,h.department
,v.dx_doctor , d2.name as dx_doctor_name
from lab_head h
left outer join patient pt on pt.hn=h.hn
left outer join doctor d on d.code=h.doctor_code
left outer join vn_stat v on v.vn=h.vn
left outer join doctor d2 on d2.code = v.dx_doctor
where h.order_date between '2006-01-01' and '2006-08-30' and h.department = 'OPD'
group by h.lab_receive_number
union
select h.lab_order_number,h.lab_receive_number,h.hn,h.order_date,
h.order_time,h.receive_time as service13,h.report_time as service14,d.code,
d.name as doctor_name,concat(pt.pname,pt.fname,' ',pt.lname) as ptname,h.form_name,
a.age_y as age_y,h.department
,a.dx_doctor , d2.name as dx_doctor_name
from lab_head h
left outer join patient pt on pt.hn=h.hn
left outer join doctor d on d.code=h.doctor_code
left outer join an_stat a on a.an=h.vn
left outer join doctor d2 on d2.code = a.dx_doctor
where h.order_date between '2006-01-01' and '2006-08-30' and h.department = 'IPD'
group by h.lab_receive_number
จาก sql ข้างบนเป็นการเลือกดูข้อมูลการส่ง lab ของ ผู้ป่วยนอกและผู้ป่วยใน