ผู้เขียน หัวข้อ: คำสั่ง SQL ที่น่าสนใจ (สำหรับ Admin มือใหม่)  (อ่าน 46405 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

ออฟไลน์ nahos

  • Hero Member
  • *****
  • กระทู้: 2,216
  • รพ.นาแห้ว
  • Respect: +7
    • ดูรายละเอียด
    • รพ.นาแห้ว
คำสั่ง SQL ที่น่าสนใจ (สำหรับ Admin มือใหม่)
« เมื่อ: กันยายน 04, 2006, 03:21:32 AM »
0
เผื่อจะมีประโยชน์กับ 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 ของ ผู้ป่วยนอกและผู้ป่วยใน
     
     


« แก้ไขครั้งสุดท้าย: กันยายน 04, 2006, 19:29:17 PM โดย nahos »
ถ้าำคำถามท่านได้คำตอบที่ต้องการจากอาจารย์ท่านใด กรุณากด Thank เบา ๆ ^ ถูกใจกด [applaud] ไม่ชอบใจกด[smite]
>> การโพสต์ขอรายงานที่ดี <<
อ่านซักนิด ถามยังไงให้ได้คำตอบ ? :)
วิธีแสดงตัวว่าเป็นใคร โดย อ.อ๊อด (ให้ข้อมูลว่าเป็นใคร ปฏิบัติงานที่ไหน ใช้ server อะไร OS อะไร HOsxp Vไหน)
ก่อนที่จะตั้งกระทู้ถาม ลองค้นจากกระทู้เก่าดูก่อนไหม จะได้คำตอบเร็วกว่าการรอคำตอบนะ
..........................................................................
เจษ จพ.เภสัชกรรมฯ user@ NAHAEO HOSPITAL LOEI. <br>  Supervise by DANSAI HOSPITAL LOEI. <br>
Start 01/03/2550
=> Server IBM X3200 Ram 6 Gb. OS:Cent OS 6.0  
=> Client 20 client  OS: SP2  => HosXP Version <b>3.56.11.19</b>
-----------------------------
น้ำเต็มแก้ว "การเรียนรู้ไม่มีที่สิ้นสุด"

ออฟไลน์ Thegapfather

  • Newbie
  • *
  • กระทู้: 12
  • Respect: 0
    • ดูรายละเอียด
    • www.thegapfather.wordpress.com
Re: คำสั่ง SQL ที่น่าสนใจ (สำหรับ Admin มือใหม่)
« ตอบกลับ #1 เมื่อ: กุมภาพันธ์ 22, 2007, 23:42:37 PM »
0
 :D ขอบคุณมากครับ.....
Kitti Limsongtum [GAP]
โรงพยาบาลศูนย์ราชบุรี

ออฟไลน์ draran

  • Full Member
  • ***
  • กระทู้: 121
  • Respect: 0
    • ดูรายละเอียด
Re: คำสั่ง SQL ที่น่าสนใจ (สำหรับ Admin มือใหม่)
« ตอบกลับ #2 เมื่อ: กุมภาพันธ์ 22, 2007, 23:56:51 PM »
0
เพิ่มเติมเป็น pdf file ครับ
ความช่วยเหลือ จะมายังผู้ที่พยายาม
Administrator,Programmer,Thungyangdaeng Hospital,Pattani
SERVER: Intel Xeon Dual-Core 5140 2.33GHz. Cach 4NB.1333Mhz ,RAM DDR2 512MB*2,HDD SATA2 160 GB*2,
OS:CentOS 4.4 x86_64 MySQL 4.1.20 ,Replicate: Pentium4 WindowsXP RAM 512 MB, Client:Celeron,Sempron,PentiumIII WindowsXP