SlideShare a Scribd company logo
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
1
แนะนำระบบจัดกำรฐำนข้อมูล
เมื่อกล่าวถึงระบบฐานข ้อมูล คาว่า “ ข ้อมูล ” คือสิ่งที่จะต ้องพิจารณาก่อนสิ่งอื่นใด
ความหมายของคาว่า ข ้อมูล (data) คือ ข ้อเท็จจริงต่างๆ
ซึ่งต่อไปก็จะถูกนามาประมวลผลนั่นเอง หรือ อาจ จะ เรียกว่าเป็นวัตถุดิบ
เมื่อข ้อมูลถูกนามาประมวล เช่น การจัด เรียง การ แยก กลุ่มจัดกลุ่ม การ เชื่อมโยง หรือการคิด
คานวณ เพื่อให้ได ้ผลลัพธ์ และ ต่อมาก็ จัดให้อยู่ในรูปแบบที่ใช ้ประโยชน์ได ้ ง่าย เรียกว่าเป็น “
สารสนเทศ ” กล่าวโดยสรุป สารสนเทศ ( information) ก็คือข ้อมูลที่ผ่านการประมวลผลแล ้ว
ตัวอย่างเช่น ข ้อมูลของคะแนนสอบของรายวิชาต่าง ๆ
ซึ่งจะถูกนามาประมวลเป็นเกรดของนิสิตแต่ละคนในแต่ละภาคการศึกษา
แล ้วนาเกรดที่ได ้มาคานวณเกรดเฉลี่ย
เพื่อนาไปตรวจสอบสถานภาพเพื่อแจ ้งสภาพของนิสิตต่อไป
ลักษณะของสารสนเทศที่ดี ควรจะมีองค์ประกอบใน 4 ลักษณะ ต่อไปนี้
1. ต้อง มีค่ำ ถูกต้อง เที่ยงตรง (Correctness and relevant) สารสนเทศ ที่
ถูกต ้องและไม่ผิดพลาด จะทาให้ ผู้ใ ช ้ได ้ข ้อมูลสมบูรณ์ และสามารถ ทางานในส่วนของตน
รับผิดชอบได ้อย่างเต็มความสามารถไม่ต ้องกังวลว่าได ้รับข ้อมูลที่ผิดพลาด ระบบสารสนเทศ
ที่มีความถูกต ้องเที่ยงตรงเหล่า นั้นก็จะถูกจัดว่าเป็นระบบที่มีประสิทธิภาพ
2. สำรสนเทศ เป็ นปัจจุบัน (current) ข ้อมูล ที่จะนามาเปลี่ยนสภาพเป็นสารสนเทศ
อาจ จะ มีการเปลี่ยน แปลง ไป อยู่เสมอ ตามกาลเวลา ตามความต ้องการ เช่น
ข ้อมูลเกี่ยวกับเกรดเฉลี่ยของ นิสิต/ นักศึกษาในแฟ้มประวัติของนักศึกษา ซึ่ง จะต ้องเปลี่ยน
แปลง ไปในแต่ละภาค การศึกษา ระบบสารสนเทศที่ดีจะต ้องยืดหยุ่น โดย ให้มีการเปลี่ยน
แปลง ค่าให้เป็นปัจจุบัน อยู่เสมอ หรือ ยัง คง เก็บ ค่าเก่าไว้เพื่อประโยชน์ ใน การใช ้งาน
ในกรณีอื่น ๆ ที่ แตกต่างกัน ไป
3. สำรสนเทศที่ ทันเวลำ (timely) สารสนเทศ มีคุณค่าทางเวลาเข ้ามาเกี่ยวข ้อง
ถ ้าไม่ได ้สารสนเทศในเวลาที่ต ้องการ อาจจะเกิดการสูญเสียโอกาสที่ไม่อาจจะได ้กลับมาใหม่
ถ ้า มหาวิทยาลัย ไม่สามารถหาข ้อมูลสารสนเทศได ้ทันเวลาประมูล มหาวิทยาลัย
ก็อาจจะเสียโอกาสนั้นไป ระบบสารสนเทศที่มีประสิทธิภาพคือ
ระบบที่จะต ้องจัดสรรให้ได ้สารสนเทศเมื่อผู้ใช ้ต ้องการ ในเวลาที่ต ้องการ
4. ไม่มีควำมขัดแย้งกัน (consistant) ใน หลาย ๆ กรณี สารสนเทศ ทาให้
เกิดความขัดแย ้ง กันของ ข ้อมูลที่จัดเก็บในหลาย ๆ ที่ หลาย ๆ แหล่งข ้อมูล
ซึ่งจะทาให้ข ้อมูลหรือสารสนเทศเหล่านั้น ไม่ตรงกัน ได ้หรือแม้แต่ วิธีการประมวลผลที่ แตก
ต่างกัน ก็ อาจทาให้เกิดความคลาดเคลื่อนขึ้น ได ้ ดังนั้น ข ้อมูล ที่ มีความคงที่มากที่สุด
จะทาให้ข ้อมูลมีคุณค่าควรแก่การใช ้งาน
นอก จากนี้แล ้วการนาเสนอข ้อมูลหรือการนาเสนอสารสนเทศในรูปแบบที่เหมาะสม
ย่อมทาให้สารสนเทศนั้นมีคุณค่ามากยิ่งขึ้นตามไปด ้วย ตัวอย่างเช่น
ถ ้าอาจารย์สอนนิสิต/นักศึกษาหลายร้อยคนและต ้องการจะดูคะแนนรวมของนาย ก.
แต่ในระบบข ้อมูลมีวิธีการจัดเรียงข ้อมูลตามรหัสนักศึกษา
ดังนั้นอาจารย์จะต ้องค ้นหาชื่อนักศึกษาตั้งแต่ต ้นจนกว่าจะพบชื่อที่ต ้องการ
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
2
โดยที่อาจารย์ไม่ทราบว่านักศึกษาผู้นั้นมีรหัสเท่าใด ดังนั้นระบบสารสนเทศที่มีประสิทธิภาพ
คือระบบที่มีความยืดหยุ่นในการนาเสนอสารสนเทศให้กับผู้ที่ต ้องการใช ้สารสนเทศนั้น ๆ
แนวควำมคิดพื้นฐำนเกี่ยวกับระบบฐำนข้อมูล
สารสนเทศ
เป็นผลลัพธ์ที่ได ้จากการประมวลข ้อมูลจากตารางข ้อมูลที่มีความสัมพันธ์กันการ
วางรูปแบบของโครงสร้างของข ้อมูลที่มีความสัมพันธ์กัน
อาจวาดเป็นภาพของบัตรรายการโดยที่แต่ละบัตรจะเรียกว่าเป็น เรคอร์ด (record หรือ row)
เนื้อหาภายในบัตรรายการก็จะเป็นรายการ ข ้อมูลแต่ละหน่วยหรือเรียกว่า ฟิ ลด์ (field หรือ
column) และบัตรรายการในเรื่องเดียวกัน เช่น ประวัตินิสิต/นักศึกษา หลาย ๆ
ใบรวมกันก็จะถูกเก็บไว้เป็นกลุ่ม เรียกว่า แฟ้ มข้อมูล (file หรือ table หรือเรียกต่อไปว่า
relational table)
ภำพ ที่ 1.1
ตัวอย่างข ้อมูลเป็นเรค
อร์ด
(ในรูปของบัตรรายกา
ร )
ฟิ ลด์ : หน่วยพื้นฐานของข ้อมูล ( เช่น ชื่อนิสิต นามสกุลนิสิต
รหัสนิสิต เพศ ที่อยู่ )
เรคอร์ด : ชุดของข ้อมูลที่สัมพันธ์กัน เรื่องราวเดียวกัน
จากตัวอย่างคือประวัตินิสิต 1 คน (1 บัตรรายการ )
ไฟล์ : จานวนบัตรรายการทั้งหมดรวมกัน
(บัตรรายการเรื่องเดียวกัน) (1 แฟ้มข ้อมูล )
ฐานข ้อมูล (
Database) หมายถึง ชุดของข ้อมูลที่รวมเอาข ้อมูลที่เกี่ยวข ้องกันเป็นเ
รื่องราวเดียวกันรวมกัน เป็นกลุ่มหรือเป็นชุดข ้อมูล เช่น ฐานข ้อมูลนิสิต
ฐานข ้อมูลค ้า และ ฐานข ้อมูลวิชาเรียน เป็นต ้น
ซึ่งข ้อมูลเหล่านี้ได ้มาจากการบันทึกข ้อมูลโดยผู้ใช ้
หรือบางข ้อมูลอาจจะได ้มาจากการประมวลผลข ้อมูลแล ้วบันทึกข ้อมูลก
ลับไปเก็บที่ ตาแหน่งที่ต ้องการ
ระบบฐานข ้อมูล ( Database System) ความ
หมายของระบบฐานข ้อมูลก็คือ ที่รวมของฐานข ้อมูลต่าง ๆ หรือที่รวมของข ้อมูลทั้งหมด
ซึ่งอาจจะได ้จากการคานวณ หรือประมวลผลต่าง ๆ
หรืออาจจจะได ้จากการบันทึกข ้อมูลโดยผู้ใช ้เช่น
ระบบฐานข ้อมูลงานทะเบียนนิสิตมหาวิทยาลัยทักษิณ ก็จะรวมเอาฐานข ้อมูลต่าง ๆ เช่น
ฐานข ้อมูลวิชาเรียน ฐานข ้อมูลนิสิต ฐานข ้อมูลอาจารย์ผู้สอน และ ฐานข ้อมูลหลักสูตร เป็นต ้น
ซึ่งรวมกันเป็นระบบฐานข ้อมูลของงานทะเบียนนิสิต หรือฐานข ้อมูลห้างร้านต่าง ๆ
ก็จะประกอบด ้วย ฐานข ้อมูลสินค ้า ฐานข ้อมูลลูกค ้า ฐานข ้อมูลระบบบัญชีฐานข ้อมูลลูกหนี้
และฐานข ้อมูลตัวแทนจาหน่าย เป็นต ้น ดังภาพประกอบต่อไปนี้
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
3
ภำพ ที่ 1.2 ตัวอย่างระบบฐานข ้อมูล และฐานข ้อมูลย่อย
จากที่กล่าวมาข ้างต ้น ระบบฐานข ้อมูลต่าง ๆ ตามตัวอย่างนั้น
ถ ้าเป็นระบบฐานข ้อมูลที่มีขนาดใหญ่มาก
ระบบฐานข ้อมูลขององค์กรก็ควรจะประกอบด ้วยระบบฐานข ้อมูลย่อย ๆ หลาย ๆ ระบบฐานข ้อมูล
เพื่อความสะดวกในการปฏิบัติงานและการจัดการ
ภำพ ที่ 1.3
ระบบฐานข ้อมูลงานลงทะเบียน
ที่ประกอบด ้วยระบบฐานข ้อมูลย่อย
ๆ
ภำพ ที่ 1.3
ระบบฐานข ้อมูลงานลงทะเบียน
ที่ประกอบด ้วยระบบฐานข ้อมูลย่อย
ๆ
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
4
ระบบฐำนข้อมูลแบบ Client/Server
ระบบ Client/Server นี้เป็นการแยกการทา งานของ Font-end กับ Back-end
ออกจากกันโดยผู้ใช ้สามารถที่จะทาการทางานกับฐานข ้อมูลได ้โดยไม่จา เป็นต ้องทา
งานอยู่ที่เครื่องที่ทา หน้าที่เก็บฐานข ้อมูลอยู่นั้นเราจะเรียกว่า Back-end ในการนา
เสนอระบบนี้อย่างไรนั้นขึ้นกับ Platform ที่ Font-end กับ Back-end ทา งานอยู่
และระดับการจัดการที่ถูกแบ่งออกเป็น 2 ส่วน
โครงสร้ำงของระบบ Client/Server Database
ข้อดี ของระบบฐำนข้อมูลแบบ Client/Server
 การแบ่งแยกการจัดการระหว่างระบบของ Client และ Database Server
ออกจากกันโดยการจัดการฐานข ้อมูลจะถูกทา ที่ส่วนของ Back-end ส่วน DBMS
จะถูกจัดการอยู่ที่ Server ทาให้สามารถทา
การขยายการใช ้งานของเครื่องคอมพิวเตอร์ที่มีขนาดเล็กหรือช ้าเกินกว่าที่จะสามารถ
ทา การ Run DBMS ที่ซับซ ้อนบนเครื่องนั้น
 ช่วยลดโหลด(Load)ให้กับระบบ Nerwork ที่เชื่อมต่อได ้ด ้วยแทนที่จะต ้องทา
การส่งข ้อมูลทั้งหมดไปและกลับผ่านทางสายแลน(LAN) ไปยังเครื่องที่ทา
การติดต่อเข ้ามาทา ให้การจราจรบนสายส่งลดน้อยลงเหลือเพียงแค่การส่ง Query
มาจาก Client มายังตัวที่เป็นฐานข ้อมูล เพื่อทา งานอย่างใดอย่างหนึ่ง เมื่อ Server
ได ้รับ Query ที่ส่งมาก็จะทา การคา นวณและส่งผลลัพธ์กลับไปยัง Client
เพียงเท่านั้น
 การทา งานของโปรแกรมไม่ขึ้นกับเครื่องที่ทา งาน ผู้ใช ้จะไม่ถูกจา
กัดบนเครื่องระบบใดระบบหนึ่งเท่านั้น สามารถนา เอาโปรแกรมไปทา
งานบนเครื่องคอมพิวเตอร์เครื่องไหนก็ได ้และสามารถทา
งานได ้กับระบบปฎิบัติการได ้หลายตัวไม่ว่าจะเป็น MS-Windows,IBM OS/2,MS/PC-
Dos เป็นต ้นนอกจากนี้ Client และ Server ก็ไม่จา เป็นต ้องใช ้ฐานข ้อมูลเดียวกัน
 การรกั ษาความถูกต ้องของข ้อมูล ในปัจจุบันระบบ Database Server สว่ นมากทา
งานบน DBMS ที่ใช ้การจัดการแบบ Relation DBMS เมอื่ ผู้ใช ้ต ้องการที่จะทา
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
5
การแก ้ไขค่าของข ้อมูลจะต ้องทา การ Log In เข ้ามาใช ้งานที่ Server กอ่ นทา
ให้ข ้อมูลไม่กระจัดกระจาย และมีความถูกต ้องอยู่เสมอ
 การปกป้องข ้อมูล ที่เครื่องที่ทา หน้าที่ในการเก็บข ้อมูล (Server)
บางครั้งอาจมีการเข ้ารหัสที่เก็บ ไฟล ดยขอ ้ มลู ถกู
เข ้ารหัสเพื่อป้องกันการดูจากภายนอก DBMS ได ้
ข้อเสียของระบบ Client/Server
 การเพิ่มค่าใช ้จ่ายในการจัดการและเตรียมบุคลากรที่จะทา หน้าที่บา รุงรักษา Database
Serverเมื่อจานวนผู้ใช ้มีมากขึ้นหรือเมื่อฐานข ้อมูลมีขนาดใหญ่มากขึ้น
นอกจากนี้การฝึกฝนผู้ควบคุมระบบยงั เปน็ ค่าใช ้จ่ายที่เพิ่มขึ้นในตอนเริ่มต ้นด ้วย
เนื่องจากคนที่เข ้ามาทา งานอาจจะไม่คุ้นเคยกับระบบที่ทาอยู่
 การเพิ่มค่าใช ้จ่ายทางด ้าน Hardware ก็จะเพิ่มขึ้น
มำทำควำมรู้จักกับ MySQL
MySQL (อ่านว่า “มาย-เอส-คิว-แอล”) จัดเป็นระบบจัดการฐานข ้อมูลเชิงสัมพันธ์ (RDBMS:
Relational Database Management System) ตัวหนึ่ง ซึ่งเป็นที่นิยมกันมากในปัจจุบัณ
โดยเฉพาะอย่างยิ่งในโลกของอินเตอร์เน็ต สาเหตุเพราะว่า MySQL
เป็นฟรีแวร์ทางด ้านฐานข ้อมูลที่มีประสิทธิภาพสูง
เป็นทางเลือกใหม่จากผลิตภัณฑ์ระบบจัดการฐานข ้อมูลในปัจจุบัน
ที่มักจะเป็นการผูกขาดของผลิตภัณฑ์เพียงไม่กี่ตัว นักพัฒนาระบบฐานข ้อมูลที่เคยใช ้MySQL
ต่างยอมรับในความสามารถความรวดเร็ว การรองรับจานวนผู ้ใช ้และขนาดของข ้อมูลจานวนมหาศาล
ทั้งยังสนับสนุนการใช ้งานบนระบบปฏิบัติการมากมาย ไม่ว่าจะเป็น Unix, OS/2, Mac OS หรือ
Windows ก็ตาม นอกจากนี้ MySQL ยังสามารถใช ้งานร่วมกับ Web Development Platform ทั้งหลาย
ไม่ว่าจะเป็น C, C++, Java, Perl, PHP, Python, Tcl หรือ ASP ก็ตามที
ดังนั้นจึงไม่เป็นที่น่าแปลกใจเลยว่า ทาไม MySQL จึงได ้รับความนิยมอย่างมากในปัจจุบัน
และมีแนวโน ้มสูงยิ่งขึ้นต่อๆ ไปในอนาคต MySQL จัดเป็นซอฟต์แวร์ประเภท Open Source Software
สามารถดาวน์โหลด Source Code ต ้นฉบับ ได ้จากอินเตอร์เน็ต โดยไม่เสียค่าใช ้จ่ายใดๆ
การแก ้ใขก็สามารถกระทาได ้ตามความต ้องการ MySQL ยึดถือสิทธิบัตรตาม GPL (GNU General Public
License) ซึ่งเป็นข ้อกาหนดของซอฟต์แวร์ประเภทนี้ส่วนใหญ่ โดยจะเป็นการชี้แจงว่า สิ่งใดทาได ้
หรือทาไม่ได ้สาหรับการใช ้งานในกรณีต่างๆ ทั้งนี้ถ ้าต ้องการข ้อมูลเพิ่มเติม หรือ รายละเอียดของ GPL
สามารถหาข ้อมูลได ้จากเว็บไซต์ http://www.gnu.org/
MySQL ได ้รับการยอมรับและทดสอบเรื่องของความรวดเร็วในการใช ้งาน
โดยจะมีการทดสอบและเปรียบเทียบกับผลิตภัณฑ์ทางด ้านฐานข ้อมูลอื่นอยู่เสมอ
มีการพัฒนาอย่างต่อเนื่อง โดยเริ่มตั้งแต่เวอร์ชันแรกๆ ที่ยังไม่ค่อยมีความสามารถมากนัก
มาจนถึงทุกวันนี้ MySQL ได ้รับการพัฒนาให ้มีความสามารถมากยิ่งขึ้น รองรับข ้อมูลจานวนมหาศาล
สามารถใช ้งานหลายผู ้ใช ้ได ้พร ้อมๆ กัน (Multi-user) มีการออกแบบให ้สามารถแตกงานออก
เพื่อช่วยการทางานให ้เร็วยิ่งขึ้น รองรับข ้อมูลจานวนมหาศาล เพื่อช่วยการทางานเร็วยิ่งขึ้น (Multi-
threaded)วิธีและการเชื่อมต่อที่ดีขึ้น
การกาหนดสิทธิและการรักษาความปลอดภัยของข ้อมูลมีความรัดกุมน่าเชื่อถือยิ่งขึ้นเครื่องมือหรือโปรแก
รมสนับสนุนทั้งของตัวเองและของผู ้พัฒนาอื่นๆ มีมากยิ่งขึ้น
นอกจากนี้สิ่งหนึ่งที่สาคัญคือ MySQL ได ้รับการพัฒนาไปในแนวทางตามข ้อกาหนดมาตรฐาน
SQL ดังนั้น เราสามารถใช ้คาสั่ง SQL ในการทางาน MySQL ได ้” นักพัฒนาที่ใช ้SQL มาตรฐานอยู่แล ้ว
ไม่ต ้องศึกษาคาสั่งเพิ่มเติม แต่อาจจะต ้องเรียนรู ้ถึงรูปแบบและข ้อจากัดบางอย่างโดยเฉพาะ ทั้งนี้ทั้งนั้น
ทางทีมงานผู ้พัฒนา MySQL มีเป้าหมายอย่างชัดเจนที่จะพัฒนาให ้MySQL
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
6
มีความสามารถสนับสนุนตามข ้อกาหนด SQL92 มากที่สุด และจะพัฒนาให ้เป็นไปตามข ้อกาหนด
SQL99 ต่อไป
(Real-world Application) ก็มักจะแยก Client และ Server ออกเป็นคนละเครื่องกัน และ
สามารถรองรับงานได ้ดีมากกว่า ดังนั้น ผู ้บริหารระบบ หรือผู ้กาหนดนโยบายสาหรับการทางานเครือข่าย
จะต ้องคานึงถึงเรื่องที่เกี่ยวข ้องเหล่านี้ให ้ดี
เพื่อที่จะทาให ้ระบบมีการทางานรับการให ้บริการแก่ผู ้ใช ้อย่ามีประสิทธิภาพและข ้อมูลมีความปลอดภัยมา
กที่สุด
MySQL กับมำตรฐำนภำษำ SQL
จุดมุ่งหมายหนึ่งของทีมผู ้พัฒนา MySQL ต ้องการทาให ้MySQL เป็น DB Server
ตามข ้อกาหนด ANSI SOL โดยในขั้นแรกนี้อ ้างอิงตาม ANSI SQL92 เป็นหลัก ความสามารถต่างๆ
โดยส่วนใหญ่ครอบคลุมการใช ้งาน อาจจะมีบางสิ่งที่ยังไม่สามารถทาได ้ในปัจจุบัน
หรือบางสิ่งก็มีแผนจะเพิ่มเติมเข ้าไป ซึ่งได ้กล่าวถึงรายละเอียดไปแล ้วข ้างต ้น
แต่ในส่วนนี้เราจะมาดูสาหรับความสามารถบางอย่างที่ MySQL เพิ่มเติมเข ้ามาสาหรับการทางาน
นอกเหนือจากข ้อกาหนด ANSI SQL ดังนี้
 ฟิลด์ประเภท MEDIUMINT, SET, ENUM และ BLOB รวมทั้ง TEXT ต่างๆ
 การกาหนดคุณลักษณะของฟิลด์ เช่น AUTO_INCREMENT, BINARY, NULL, UNSIGNED
และ ZEROFILL
 การเปรียบเทียบสตริงเป็นแบบ Case Insensitive การจัดเรียงข ้อมูลใช ้รูปแบบภาษา ISO-
8859-1 (Latin1) เป็นค่า default
 ชื่อ database และชื่อตารางข ้อมูลจะ Case Sensitive (โดยเฉพาะ Unix Platform)
 สามารถใช ้คาสั่งของระบบปฏิบัติในการสารอง เปลี่ยนชื่อ ย ้าย ลบ
หรือคัดลอกตารางข ้อมูลซึ่งเกี่ยวข ้องกับไฟล์ .MYD, .MYI และ .frm ได ้โดยตรง
 MySQL ไม่สนับสนุน Tablespaces
 โอเปอเรเตอร์ LIKE สามารถใช ้กับ Numeric Columns ได ้
 การใช ้INTO OUTFILE และ STRAIGHT_JOIN ในคาสั่ง SELECT
 สามารถใช ้SQL_SMALL_RESULT option ในคาสั่ง SELECT ได ้
 คาสั่ง EXPLAIN SELECT เพื่อให ้แสดงรายละเอียดของการเชื่อมกันของตารางข ้อมูล
 สามารถใช ้TEMPORARY หรือ IF NOT EXISTS สาหรับการ CREATE TABLE ได ้
 สามารถทาการ CHANGE ชื่อคอลัมน์, DROP ชื่อคอลัมน์ หรือ DROP INDEX, IGNORE
หรือRENAME ในการใช ้คาสั่ง ALTER TABLE ได ้
 สามารถทาการ RENAME TABLE ได ้
 สามารถ ADD, ALTER, DROP หรือ CHANGE clauses หลายครั้ง ในคาสั่ง ALTER TABLE ได ้
 สามารถทาการ DROP TABLE ด ้วยคีย์เวิร์ด IF EXISTS
 สามารถทาการดรอป (Drop) ตารางข ้อมูลหลายๆ ตารางได ้ด ้วยคาสั่ง DROP TABLE
เพียงครั้งเดียว
 การใช ้LIMIT clause ในคาสั่ง DELETE
 การใช ้DELAYED clause ในคาสั่ง INSERT และ REPLACE
 การใช ้LOW_PRIORITY clause ในคาสั่ง INSERT, REPLACE, DELETE และ UPDATE
 การใช ้งาน LOAD DATA INFILE ซึ่งไวยากรณ์ใช ้ได ้กับรูปแบบการโหลดดาต ้า (Load Data)
ของ Oracle
 คาสั่ง ANALYZE TABLE, CHECK RABLE, OPTIMIZE TABLE และ REPAIR TABLE
 คาสั่ง SHOW
 คาสั่ง SET OPTION
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
7
 ฟังก์ชันหลายฟังก์ชันที่จาเป็น เช่น ฟังก์ชันสาหรับทางานสตริง ซึ่งสามารถใช ้ได ้ทันที
เนื่องจากมี ชื่อและการทางานที่เหมือนกันของ ANSI SQL และ ODBC
 สามารถใช ้|| แทน OR และ && แทน AND ซึ่งเหมือนกับในภาษา C
แต่ไม่สามารถใช ้ในการเชื่อมสตริงได ้ซึ่ง MySQL ให ้ใช ้ฟังก์ชัน CONCAT() แทน
 คาสั่งในการ CREATE DATABASE หรือ DROP DATABASE
 การใช ้โอเปอเรเตอร์ % โดยจะให ้ผลลัพธ์เดียวกันการใช ้ฟังก์ชัน MOD()
ตัวอย่าง เช่น M % N = MOD(M,N) เป็นต ้น
 โอเปอเรเตอร์ =, < >, <=, <, >=>, <<, >>, <=>, AND, OR หรือ LIKE
สามารถใช ้ในการเปรียบเทียบคอลัมน์ในการใช ้คาสั่ง SELECT ได ้ทั้งนี้จะอยู่ทางด ้านหน ้า
FROM ดังตัวอย่างเช่น SELECT id = 12345 AND name=’somchai’ FROM person;
 ฟังก์ชัน LAST_INSERT_ID()
 ฟังก์ชัน BIT_COUNT(), CASE, ELT(), FROM_DATS(), FORMAT(), IF(),
PASSWORD(),ENCRYPT(), md5(), ENCODE(), DECODE(), PERIOD_ADD(),
PERIOD_DIFF(),TO_DAYS(), หรือ WEEKDAY()
 ฟังก์ชัน TRIM() เพื่อการตัดส่วนของสตริง ซึ่งใน ANSI SQL จะตัดได ้เพียงหนึ่งตัวอักษรเท่านั้น
 GROUP BY function STD(), BIT_OR() และ BIT_AND()
 การใช ้คาสั่ง REPLACE แทนการใช ้คาสั่ง DELETE ตามด ้วยคาสั่ง INSERT
 คาสั่ง FLUSH flush_option
 การใช ้ตัวแปร sql statement ด ้วย := ตัวอย่างเช่น SELECT @asum:=SUM (total),
@cnt:=COUNT(*), @asum/@cnt AS avg FROM person;
กำรติดตั้ง MySQL
เว็บไซต์ www.mysql.com เป็นเว็บไซต์อย่างเป็นทางการของ MySQL
ซึ่งเนื้อหาภายในเว๊บไซต์หลักๆจะเป็นการให ้ข ้อมูลและรายละเอียดเกี่ยวกับ MySQL ไม่ว่าจะเป็น
Server, Client หรือ เครื่องมืออื่นๆ ที่เกี่ยวข ้องจุดประสงค์ที่สาคัญอันหนึ่ง ก็คือไว ้สาหรับการเผยแพร่
MySQL ที่ได ้รับการพัฒนา มีให ้ดาวน์โหลดตั้งแต่เวอร์ชันที่สมบูรณ์ (Stable) หรือที่กาลังพัฒนา (Beta)
มีหลากหลายระบบปฏิบัติการ ผู ้ใช ้ที่จะนา
MySQLไปรันบนระบบปฏิบัติการตัวใดก็สามารถเลือกได ้จากที่เว๊บไซต์นี้
http://dev.mysql.com/downloads/ นอกเหนือจากนี้ก็จะเป็นลิงก์ต่างๆ ที่มีการนาMySQL
ไปพัฒนาเพิ่มเติม โดยมีทั้งแบบ Free และ Commercial ให ้เลือกตามอัธยาศัย
ติดตั้ง MySQL สำหรับ Windows Platform
สาหรับ Windows Platform เมื่อดาวน์โหลดไฟล์ติดตั้งมาเรียบร ้อยแล ้ว ให ้ทาตามขั้นตอนดังนี้
1. ดับเบิ้ลคลิกที่ ไฟล์ mysql-essential-5.1.59-win32.msi
2. เริ่มเข ้าสู่ขั้นตอนการติดตั้ง กดปุ่ ม Next
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
8
3. การยอมรับ License Agreement ให ้เลือก Accept ตามรูป (1) แล ้วกดปุ่ ม Next(2)
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
9
4. เลือกประเภทของการติดตั้ง ให ้เลือก Custom (1) แล ้วกดปุ่ ม Next(2)
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
10
5. กาหนดตาแหน่งที่ต ้องการติดตั้ง โดยปกติจะติดตั้งที่
C:ProgramDataMySQLMySQL Server 5.1 สามารถกาหนดไดรฟ์
และโฟล์เดอร์โดยการกดปุ่ ม Change หลังจากนั้นให ้กดปุ่ ม Next
6. เข ้าสู่หน ้าจอเริ่มการติดตั้งถ ้าต ้องการเปลี่ยนแปลง ให ้กดปุ่ ม Back
แต่ถ ้าต ้องการติดตั้งต่อไปให ้กดปุ่ ม Install
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
11
7. แสดงหน ้าจอสถานะการติดตั้ง
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
12
8. เข ้าสู่หน ้าจอการกาหนดค่าเริ่มต ้นของ MySQL Server แล ้วกดปุ่ ม Next
9. เลือก Detail configuration แล ้วกดปุ่ ม Next
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
13
10. กาหนด Port Number ที่ MySQL ใช ้งานโดยปกติคือ 3306 แต่สามารถกาหนดเลข
port ใหม่ได ้โดยกาหนดในช่อง Port Number คลิกเลือก Add firewall exception for
this port แล ้วกดปุ่ ม Next
11. กาหนด Character Set เป็น UTF8 แล ้วกดปุ่ ม Next
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
14
12. กาหนดการติดตั้ง MySQL เป็น Service หนึ่งของ Windows โดยกาหนดชื่อ Service
“MySQL” แล ้วกดปุ่ ม Next
13. กาหนดรหัสผ่านของ root โดยพิมพ์รหัสในช่อง New Root Password และช่อง
Confirm รหัสผ่านดังกล่าว คลิกเลือกที่ Enable root access from remote
machines ในกรณีที่ต ้องการใช ้งาน MySQL จากเครื่องภายนอก จากนั้นกดปุ่ ม Next
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
15
14. เข ้าสู่หน ้าจอการปรับแต่งคอนฟิก ถ ้าต ้องการแก ้ไขให ้กดปุ่ ม Back
ถ ้าต ้องการติดตั้งต่อไปให ้กดปุ่ ม Execute
15. เมื่อโปรแกรมทาการปรับแต่งคอนฟิกเสร็จแล ้ว ให ้กดปุ่ ม Finish เป็นอันจบการติดตั้ง
MySQL
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
16
ประภทข้อมูล MySQL
ในส่วนนี้จะกล่าวถึงรายละเอียดของประเภทข ้อมูลที่สามารถกาหนดให ้แต่ล่ะฟิลด์
ซึ่งสาหรับระบบฐานข ้อมูล MySQL จะมีส่วนที่สนับสนุนกับมาตรฐาน และส่วนที่แตกต่าง
เพิ่มเติมจากมาตรฐาน และประเภทตารางข ้อมูลที่สามารถเลือกใช ้ได ้ใน MySQL
การศึกษาเรียนรู ้ถึงประเภทข ้อมูลใน MySQL จะทาให ้เราเข ้าใจ และสามารถทาการกาหนดประเภทของ
ข ้อมูลให ้ถูกต ้องเหมาะสมตามจุดประสงค์ หรือตามนโยบายการทางานของเรา
มิฉะนั้นแล ้วอาจก่อให ้เกิดความเสียหาย หรือทาให ้เกิดข ้อจากัดในเรื่องข ้อมูลของการทางานได ้
การศึกษาในเรื่องของประเภทข ้อมูลใน MySQL ก็มีจุดประสงค์เช่นเดียวกัน
ซึ่งจะได ้ศึกษาในรายละเอียดต่อไป
หลักกำรพิจำรณำเลือกใช้ประเภทข้อมูล ดังนี้
1. ประเภทข้อมูลหลัก ได ้แก่ ตัวเลข, ตัวอักษร, วันที่และเวลา, ข ้อมูลไบนารี และอื่นๆ
2. ในแต่ละประเภทข้อมูล จะมีประเภทย่อยๆ ลงไปอีก
เพื่อให ้ผู ้ใช ้เลือกใช ้ประเภทข ้อมูลที่เหมาะสม
เพราะนอกจากจะทางานได ้ถูกต ้องแล ้ว
ยังเป็นการช่วยประหยัดเนื้อที่การเก็บข ้อมูลอีกด ้วย ซึ่งต่อไปเราจะได ้
ศึกษาเพิ่มเติมว่าในแต่ละประเภทข ้อมูลเป็นอย่างไร มีขอบเขตข ้อมูลอะไรบ ้าง
ใช ้เนื้อที่ในการเก็บข ้อมูลเท่าไร
3. กำรเลือกใช้ประเภทข้อมูล หากมีความต ้องการที่จะสนับสนุนหรือใช ้มาตรฐาน เช่น
ODBC หรือ ต ้องการ port ข ้อมูลไปใช ้ในระบบอื่น
ควรเลือกใช ้ประเภทข ้อมูลที่สนับสนุนกับมาตรฐานเท่านั้น เพื่อป้องกัน
ความผิดพลาดที่อาจจะเกิดขึ้นต่อไปในอนาคต
4. ฟิลด์ใดที่ไม่มีกำรคำนวณ หรือไม่มีแนวโน้มจะเกี่ยวข้องกับกำรคำนวณเลย
ควรเลือกใช ้ข ้อมูลประเภทตัวอักษร เพราะจะประหยัดเนื้อที่ในการจัดเก็บจริง
5. กำรเลือกใช้ประเภทของข้อมูลในแต่ละฟิลด์
นอกจากจะดูความเป็นไปได ้ในปัจจุบันแล ้ว
จะต ้องคานึงและดูแนวโน ้มความเป็นไปของข ้อมูล
หรือปริมาณของข ้อมูลต่อไปในอนาคตด ้วย
เพื่อป้องกันข ้อจากัดของข ้อมูลเมื่อมีการขยายตัวเพิ่มขึ้น
6. กำรเลือกใช้ข้อมูลประเภทวันที่และเวลำใน MySQL
จะต้องเลือกใช้อย่ำงระมัดระวัง
เนื่องจากมีข ้อจากัดและรายละเอียดที่แตกต่างไปจากมาตรฐาน เช่น
จะสามารถใช ้ข ้อมูลเริ่มต ้นได ้ที่ปี ค.ศ. 1000 เท่านั้น เป็นต ้น
ประเภทข้อมูลใน MySQL แบ่งออกเป็ นกลุ่มได้ดังนี้
1. ประเภทข้อมูลสำหรับตัวเลข ไว ้สาหรับเก็บข ้อมูลตัวเลข
ซึ่งอาจจะใช ้ในการคานวณ หรือการจัดเรียงข ้อมูลเปรียบเทียบกันในฟิลด์นั้นๆ
ประกอบด ้วยประเภทข ้อมูลย่อยๆ ได ้แก่ จานวนเต็ม, จานวนทศนิยม, จานวนจริง
i. TINYINT[(M)] [UNSIGNED] [ZEROFILL]
ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –128 ถึง 127
แต่ถ ้าแบบไม่คิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ 0 ถึง 255
ข ้อมูลชนิดที่ใช ้เนื้อที่เก็บข ้อมูลขนาด 1 ไบต์
ii. SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –32768 ถึง 32767
แต่ถ ้าแบบไม่คิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ 0 ถึง 65535
ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 2 ไบต์
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
17
iii. MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –8388608 ถึง 8388607
แต่ถ ้าแบบไม่คิด เครื่องหมาย จะใช ้ได ้ตั้งแต่ 0 ถึง 16777215
ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 3 ไบต์
iv. INT[(M)] [UNSIGNED] [ZEROFILL] หรือ INTEGER[(M)] [UNSIGNED]
[ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –2147483648
ถึง 2147483647 แต่ถ ้าแบบไม่คิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ 0 ถึง 4294967295
ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 4 ไบต์
v. BIGINT[(M)] [UNSIGNED] [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย
จะใช ้ได ้ตั้งแต่ –9223372036854775808 ถึง 9223372036854775807
แต่ถ ้าแบบไม่คิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ 0 ถึง 18446744073709551615
ข ้อมูลชนิดนี้ ใช ้เนื้อที่เก็บข ้อมูลขนาด 8 ไบต์
vi. FLOAT(precision) [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย precision
เป็นค่าความละเอียดทศนิยม ซึ่งแบ่งเป็นชนิด single (มี ค่าตั้งแต่ 0-24) และแบบ
double (ตั้งแต่ 25-53) ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 4 หรือ 8 ไบต์
โดยแบบsingle จะใช ้4 ไบต์ และแบบ double จะใช ้8 ไบต์
ชนิดข ้อมูลประเภทนี้สาหรับกรณีใช ้กับ ODBC มาตรฐาน
vii. FLOAT[(M,D)] [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่
-3.402823466E+38 ถึง -1.175494351E -38,0 และ 1.175494351E-39 ถึง
3.402823466E+38 ค่า M เป็นจานวนหลักที่ต ้องการแสดงผล และ D
เป็นจานวนจุดทศนิยม ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 4 ไบต์
viii. DOUBLE[(M,D)] [ZEROFILL] หรือ DOUBLE PRECISION[(M,D)]
[ZEROFILL] หรือ REAL[(M,D)] [ZEROFILL]
ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –1.7976931348623157E+308
ถึง -2.2250738585072014E-308, 0 และ 2.2250738585072014E-308 ถึง
1.7976931348623157E+308 ค่า M เป็นจานวนหลักที่ต ้องการแสดงผล และ D
เป็นจานวนจุดทศนิยม ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูล ขนาด 8 ไบต์
ix. DECIMAL[(M[,D])] [ZEROFILL] หรือ NUMERIC[M,D] [ZEROFILL]
ข ้อมูลชนิดตัวเลขชนิด unpacked คืออนุญาตให ้สามารถเก็บข ้อมูลตัวอักษรเข ้าไปด ้วย
โดยตัวอักษรหนึ่ง ตัวแทนแต่ละหลัก สามารถใช ้ตัวเลขได ้เท่ากับแบบ DOUBLE
ใช ้เนื้อที่เก็บข ้อมูลเท่ากับ M ไบต์ (D+2, ถ ้า M < D)
2. ประเภทข้อมูลสำหรับวันที่และเวลำ
i. DATE ข ้อมูลชนิดวันที่ ตั้งแต่วันที่ 1 มกราคม ค.ศ. 1000 ถึง 31 ธันวาคม ค.ศ. 9999
การแสดงผลวันที่อยู่ใน รูปแบบ ‘YYYY-MM-DD’ ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด
3 ไบต์
ii. DATETIME ข ้อมูลชนิดวันที่และเวลา ตั้งแต่วันที่ 1 มกราคม ค.ศ. 1000 เวลา
00:00:00 ถึง 31 ธันวาคม ค.ศ. 9999 เวลา 23:59:59
การแสดงผลวันที่และเวลาอยู่ในรูปแบบ ‘YYYY-MM-DD HH:MM:SS’
ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บ ข ้อมูลขนาด 8 ไบต์
iii. TIMESTAMP[(M)] ค่า timestamp เป็นค่าตัวเลขที่นับจานวนวินาทีตั้งแต่วันที่ 1
มกราคม ค.ศ. 1000 เวลา 00:00:00 เป็นต ้นมา โดยมีจุดสิ้นสุดประมาณ ค.ศ. 2037
การแสดงผลค่า timestamp อยู่ในรูปแบบ YYYYMMDDHHMMSS,
YYMMDDHHMMSS, YYYYMMDD หรือ YYMMDD ค่า M คือจานวนตัวเลขที่บรรจุ
ซึ่งอาจจะเป็น 14, 12, 8 หรือ 6 ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 4 ไบต์
iv. TIME ข ้อมูลประเภทเวลา สามารถเป็นได ้ตั้งแต่ ‘-838:59:59’ ถึง ‘838:59:59’
แสดงผลในรูปแบบ HH:MM:SS ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 3 ไบต์
v. YEAR[(2/4)]ข ้อมูลประเภทปี ค.ศ. โดยสามารถเลือกว่าจะใช ้แบบ 2 หรือ 4 หลัก
(ค่าโดยปริยายจะเป็น 4 หลัก) ถ ้า เลือกใช ้แบบ 4 หลัก จะใช ้ได ้ตั้งแต่ ปี ค.ศ. 1901
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
18
ถึง 2155 ถ ้าเลือกใช ้แบบ 2 หลัก จะใช ้ได ้ตั้งแต่ ปี ค.ศ. 1970 ถึง 2069
แสดงในรูปแบบ 70 ถึง 69 ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 1 ไบต์
3. ประเภทข้อมูลสำหรับตัวอักษร ข ้อมูลประเภทตัวอักษรถือว่าเป็นสิ่งที่ใช ้กันมากที่สุด
เพราะแทบจะครอบคลุมข ้อมูลที่เป็นไปได ้ทั้งหมด
การจัดเรียงข ้อมูลจะเป็นในลักษณะไม่คานึงตัวใหญ่ตัวเล็ก (case-insensitive)
ซึ่งเมื่อเปรียบเทียบกับข ้อมูล ประเภทไบนารี (BLOB) แล ้วจะพบว่าคล ้ายกันมาก
จะแตกต่างกันที่BLOB จะมีการจัดเรียงข ้อมูลเป็น caseinsensitive เท่านั้น
แต่ข ้อมูลประเภทตัวอักษรก็มีรายละเอียดเพิ่มเติมไปอีก โดยมีรายละเอียดดังนี้
i. [NATIONAL] CHAR(M) [BINARY] ข ้อมูลประเภทสตริงที่จากัดขนาดความกว ้าง
(ไม่สามารถปรับขนาดได ้) โดยขนาดความกว ้างเป็นได ้ ตั้งแต่ 1 ถึง 255 ตัวอักษร
ตามปกติเมื่อมีการเรียงข ้อมูล จะเป็นลักษณะ case-sensitive
คือคานึงถึงตัวเล็กตัวใหญ่ การระบุชนิดข ้อมูลย่อยว่าเป็น BINARY
จะเป็นลักษณะไม่คานึงตัวเล็กตัวใหญ่ ดังนั้นเมื่อมีการเรียงข ้อมูลก็จะให ้ผลต่างจาก
CHAR ธรรมดา การเก็บข ้อมูลก็ใช ้ไบต์ตามจานวนตัวอักษรที่ระบุ
ii. [NATIONAL] VARCHAR(M) [BINARY] ข ้อมูลประเภทนี้ก็คล ้ายกับแบบ CHAR
ต่างกันตรงที่ VARCHAR จะสามารถปรับขนาดตามข ้อมูลที่เก็บในฟิลด์
ขนาดความกว ้างอยู่ตั้งแต่ 1 ถึง 255 การเก็บข ้อมูลจะเท่ากับของข ้อมูลจริงในฟิลด์ๆ +
1 ไบต์
iii. TINYTEXT ข ้อมูลประเภทนี้สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 255 ตัวอักษร
และใช ้เนื้อที่เก็บข ้อมูลเท่ากับ จานวนข ้อมูลจริง + 1 ไบต์
iv. TEXT ข ้อมูลประเภทนี้สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 65,535 ตัวอักษร
และใช ้เนื้อที่เก็บข ้อมูลเท่ากับ จานวนข ้อมูลจริง + 2 ไบต์
v. MEDIUMTEXT ข ้อมูลประเภทนี้สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 16,777,215
ตัวอักษร และใช ้เนื้อที่เก็บข ้อมูล เท่ากับจานวนข ้อมูลจริง + 3 ไบต์
vi. LONGTEXT ข ้อมูลประเภทนี้สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 4,294,967,295
ตัวอักษร และใช ้เนื้อที่เก็บข ้อมูล เท่ากับจานวนข ้อมูลจริง + 4 ไบต์
vii. ENUM(‘value1’,’value2’,…) ข ้อมูลประเภทระบุเฉพาะค่าที่ต ้องการ
หรือถ ้าไม่มีจะให ้ค่า NULL สามารถกาหนดค่าได ้ถึง 65,535
ค่าและใช ้เนื้อที่เก็บข ้อมูลตามจานวนค่าที่ระบุ
viii. SET(‘value1’,’value2’,…) ข ้อมูลประเภทเซต ประกอบด ้วยข ้อมูลตั้งแต่ไม่มีค่า
หรือมีค่าตามสมาชิกที่กาหนด สามารถมีจานวนสมาชิกในเซตได ้ทั้งสิ้น 64 ตัว
และใช ้เนื้อที่เก็บข ้อมูลตามจานวนสมาชิกที่ระบุ
4. ประเภทข้อมูลสำหรับไบนำรี (BLOB:Binary Large Object)
จากที่กล่าวไปแล ้วถึงความคล ้ายกันของแต่ล่ะข ้อมูลประเภทตัวอักษรและข ้อมูลประเภทไบนารี
ดังนั้น ประเภทข ้อมูลย่อยและการเก็บข ้อมูลจึงไม่แตกต่างกัน แต่ตามปกติเรามักใช ้BLOB
สาหรับเก็บข ้อมูลที่ไม่เป็น ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สป. การใช ้งานฐานข ้อมูล
MySQL 53 ภาษามนุษย์ ข ้อมูลไบนารี ได ้แก่ รูปภาพ, ไฟล์ข ้อมูล
หรือข ้อมูลที่ประกอบด ้วยตัวอักษรพิเศษ ข ้อมูลที่กาหนด ด ้วยรหัสควบคุม เป็นต ้น
i. TINYBLOB สาหรับข ้อมูลไบนารีสามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 255 ตัวอักษร
และใช ้เนื้อที่เก็บข ้อมูลเท่ากับ จานวนข ้อมูลจริง + 1 ไบต์
ii. BLOB สาหรับข ้อมูลไบนารี สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 65,535 ตัวอักษร
และใช ้เนื้อที่เก็บข ้อมูล เท่ากับจานวนข ้อมูลจริง + 2 ไบต์
iii. MEDIUMBLOB สาหรับข ้อมูลไบนารี สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด
16,777,215 ตัวอักษร และใช ้เนื้อที่เก็บข ้อมูลเท่ากับจานวนข ้อมูลจริง + 3 ไบต์
iv. LONGBLOB สาหรับข ้อมูลไบนารีสามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด
4,294,967,295 ตัวอักษร และใช ้เนื้อที่เก็บ ข ้อมูลเท่ากับจานวนข ้อมูลจริง + 4 ไบต์
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
19
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
20
กำรใช้งำน MySQL
หลังจากติดตั้งโปรแกรมเรียบร ้อยแล ้ว สามารถเข ้าใช ้งาน MySQL ได ้ดังนี้
1. คลิกเลือก Start >> MySQL >> MySQL Server 5.0 >> MySQL Command line
Client
2. จะปรากฎหน ้าจอของ MySQL Command Line Client
แล ้วให ้พิมพ์รหัสผ่านที่ใส่ในขั้นตอนการติดตั้ง แล ้วกด Enter
3. จะเข ้าสู่หน ้าจอการใช ้งาน MySQL โดยสังเกตุที่ mysql> ดังรูป
4. ในกรณีที่ต ้องการกาหนดรหัสผ่านใหม่ ให ้ใช ้คาสั่งดังนี้
 UPDATE mysql.user SET password=password(‘1234’) WHERE user
= ‘root’; [กด Enter]
 Flush privileges; [กด Enter]
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
21
MySQL Command Line
คำสั่งเพื่อเข้ำใช้งำน MySQL
mysql [db_name] -h hostname -u root –p
-h [ชื่อ server] ชื่อหรือ IP Address ของ Database Server เช่น
localhost หรือ 127.0.0.1
-u [user name] ชื่อผู ้ใช ้งานฐานข ้อมูล
-P [Port Number] เลข Port ของ MySQL เช่น 3333
-p [password] รหัสผ่าน
[db_name] ชื่อฐานข ้อมูลที่ต ้องการใช ้งาน
เช่น mysql –h localhost –u root
เรียกใช้งำนฐำนข้อมูล
use [db name];
คำสั่ง SHOW
SHOW DATABASES เป็นคาสั่งสาหรับแสดงรายละเอียด (Information)
ของ databases, tables, columns หรือ สถานะต่างๆ
ของ Server
SHOW TABLES แสดงรายชื่อ databases
ทั้งหมดในระบบฐานข ้อมูลแสดงรายชื่อ tables
ทั้งหมดของ current database
SHOW OPEN TABLES แสดงรายชื่อ tables ที่ถูกเปิดอยู่ในปัจจุบัน
SHOW COLUMNS แสดงรายละเอียดฟิลด์ทั้งหมดใน table นั้น
SHOW FIELDS ให ้ผลลัพธ์เช่นเดียวกับ SHOW COLUMNS
(ให ้ผลลัพธ์เช่นเดียวกับคาสั่ง DESCRIBE)
SHOW INDEX แสดงรายละเอียดว่ามีดัชนีอะไรบ ้างสาหรับ table นั้นๆ
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
22
SHOW KEYS ให ้ผลลัพธ์เช่นเดียวกับ SHOW INDEX
ขอควำมช่วยเหลือ
help หรือ h
เลิกใช้งำน MySQL
exit หรือ q
Data Definition Language
คำสั่งสร้ำงฐำนข้อมูล
CREATE DATABASE db_name
เป็นคาสั่งสร ้างฐานข ้อมู(database) ชื่อ db_name ขึ้นมาใหม่ ในกรณีที่มีdatabase นั้นอยู่แล ้ว
ก็จะปรากฏข ้อความแสดงความผิดพลาด (Error Message) Can't create database ' db_name '.
Database exists
คำสั่งลบฐำนข้อมูล
DROP DATABASE db_name
เป็นคาสั่งลบ database ชื่อ db_name ออกไปจากระบบ
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
23
คำสั่งสร้ำงตำรำงข้อมูล
CREATE TABLE phonebook (
id INT (4) NOT NULL A UTO_INCREMENT,
fname VARCHAR (35) ,
lname VARCHAR (35) ,
email VARCHAR (50) ,
office VARCHAR (200) ,
province CHAR (2) ,
PRIMARY KEY(id),
UNIQUE(id),
INDEX(id))
โดยทั่วไปขนาดของตารางข ้อมูลหนึ่งๆ จะมีขนาดไม่เกิน 2G หรือ 4G ขึ้นอยู่กับระบบปฏิบัติการ
เราสามารถทาให ้ประหยัดเนื้อที่ได ้อีกโดยการบีบอัด (PACK) ข ้อมูลดัชนี
ซึ่งสามารถให ้บีบอัดโดยกาหนดค่าPACK_KEYS=1 การบีบอัดนี้จะทาให ้การทางานช ้าลง
แต่ก็ประหยัดเนื้อที่ขึ้น และตามปกติถ ้าผู ้ใช ้ไม่ได ้กาหนดให ้บีบอัด
ข ้อมูลที่เป็นสตริงหรือตัวอักษรก็จะได ้รับการบีบอัดข ้อมูลอยู่แล ้ว สาหรับข ้อมูลตัวเลข
ค่าการทางานปกติจะไม่รับการบีบอัด เว ้นแต่กาหนดการบีบอัดด ้วยการใช ้UNION
จะใช ้กรณีที่ต ้องการรวมตารางข ้อมูลหลายๆ ตารางเข ้าด ้วยกันเป็นอันเดียว
ซึ่งจะทางานกับตารางประเภท MERGE เท่านั้น
คำสั่งแก้ไขตำรำงข้อมูล
ALTER TABLE phonebook ADD tel VARCHAR(30) ;
ALTER TABLE phonebook MODIFY fname VARCHAR(50) ;
ALTER TABLE เป็นคาสั่งสาหรับการปรับเปลี่ยนแก ้ไขโครงสร ้างของตารางข ้อมูล เช่น
การเพิ่ม-ลบฟิลด์, การสร ้าง-ลบดัชนี, การเปลี่ยนประเภทข ้อมูลของฟิลด์, การเปลี่ยนชื่อฟิลด์ เป็นต ้น
เพิ่มคอลัมภ์ในตำรำงข้อมูล
ALTER TABLE phonebook ADD note text
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
24
ลบคอลัมภ์ตำรำงข้อมูล
ALTER TABLE phonebook DROP note
คำสั่งเปลี่ยนชื่อตำรำงข้อมูล
RENAME TABLE phonebook to phone
เป็นคาสั่งเพื่อเปลี่ยนชื่อตารางข ้อมูลเป็นชื่อใหม่
คำสั่งลบตำรำงข้อมูล
DROP TABLE phonebook
เป็นคาสั่งเพื่อให ้ลบตารางข ้อมูลออกจาก สาหรับการใช ้คาสั่ง DROP TABLE
จะต ้องให ้ความระมัดระวังในการใช ้งานเป็นอย่างยิ่ง โดยเฉพาะการทางานกับตารางข ้อมูลประเภท
nontransaction เพราะจะทาการ commit การทางานโดยอัตโนมัติ
คำสั่ง OPTIMIZE TABLE
OPTIMIZE TABLE phonebook
เป็นคาสั่งสาหรับจัดระเบียบข ้อมูลให ้เป็นระเบียบ หรือการทาดีแฟร๊กเมนต์นั่นเองนั่นเอง
เพราะถ ้าตารางข ้อมูลมีการใช ้งานมานาน มีการใช ้งานที่ทาให ้ข ้อมูลมีการเปลี่ยนแปลงความยาว
หรือเปลี่ยนขนาดของเนื้อที่เก็บข ้อมูล โดยเฉพาะกับข ้อมูลประเภทที่ยืดหยุ่นไปตามข ้อมูล เช่น
VARCHAR, BLOB หรือ TEXT การใช ้คาสั่ง OPTIMIZE TABLE
ก็จะช่วยให ้มีการจัดระเบียบข ้อมูลให ้ดียิ่งขึ้น หากปล่อยระยะเวลานานๆ จะเกิดช่องว่างระหว่างข ้อมูล
การอ่านข ้อมูลของสื่อจะไม่ราบรื่น ช ้า เนื่องจากเสียเวลาในการกระโดดข ้ามช่องว่างนั้นนั่นเอง
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
25
Data Manipulation Language
คำสั่งเพิ่มข้อมูล INSERT
INSERT INTO phonebook ( fname, lname, email, office, province)
VALUES ( 'sineenat', 'phradmali', 'sineenat@health.moph.go.th',
'ศทส.', '12')
เป็นคาสั่งสาหรับการเพิ่มแถวข ้อมูล หรือระเบียนใหม่เข ้าตารางข ้อมูล สาหรับฟิลที่เป็น Auto
Increment ไม่ต ้องใส่ค่า ระบบจะทาการเพิ่มค่าให ้โดยอัตโนมัติ
คำสั่ง UPDATE
UPDATE phonebook
SET office= 'ศูนย์เทคโนโลยีสำรสนเทศและกำรสื่อสำร'
WHERE fname=’sineenat’
เป็นคาสั่งเพื่อทาการเปลี่ยนแปลงข ้อมูลในตารางให ้เป็นตามที่ต ้องการ
คำสั่ง DELETE
เป็นคาสั่งสาหรับลบข ้อมูลจากตาราง โดยสามารถกาหนดเงื่อนไขสาหรับการลบได ้
ซึ่งถ ้าไม่ได ้ระบุเงื่อนไข จะเป็นการลบข ้อมูลทั้งหมดออกจากตาราง และถ ้าอยู่ใน AUTOCOMMIT mode
(กรณีปกติทั่วไป) จะไม่สามารถทาการยกเลิกการลบครั้งนี้ได ้
คำสั่ง TRUNCATE
TRUNCATE phonebook
เป็นคาสั่งที่ให ้ผลเช่นเดียวกับ DELETE FROM table_name แต่มีข ้อแตกต่างดังนี้
- จะทาการดรอปตารางข ้อมูลก่อน แล ้วทาการสร ้างใหม่ ซึ่งจะให ้ผลที่เร็วกว่าการลบ
DELETE FROM phonebook WHERE id=4
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
26
ตารางทั้งหมด
- การทางานเป็น non-transaction ไม่สามารถทาการยกเลิกได ้
คำสั่ง FLUSH
FLUSH TABLES phonebook
เป็นคาสั่งที่ใช ้สาหรับการลบหน่วยความจาภายใน (Internal Cache) ที่ใช ้งาน ทั้งนี้การใช ้คาสั่ง
FLUSH จะอนุญาตเฉพาะ user ที่มีสิทธิ์(Privilege) เท่านั้น
Flush_option สำมำรถระบุได้ดังนี้
HOSTS ทาการล ้าง hose cache table เพื่อปรับปรุงข ้อมูลของ
host หรือ client ที่
คอนเน็กต์เข ้าใช ้งาน ซึ่งอาจมีการเปลี่ยนแปลง IP address
หรืออื่นๆ
โดยเมื่อทาการ flush เรียบร ้อยแล ้ว ก็จะอนุญาตให ้host
นั้นๆ ทาการคอนเน็กต์เข ้ามาใหม่อีกครั้งหนึ่ง
LOGS ปิดและเปิด log files ใหม่
PRIVILEGES ทาการ reload สิทธิ์ต่างๆ ของ user จาก grant tables
ของ MySQL Server
TABLES ปิด tables ทั้งหมด หากตารางใดยังถูกเปิดอยู่ ก็จะถูก
force ให ้ปิดลง
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
27
Data Retrieveal Language
คำสั่งแสดงข้อมูลอย่ำงง่ำย
SELECT * FROM phonebook ;
แสดงข ้อมูลทุกคอลัมภ์จากตาราง phonebook
คำสั่งแสดงข้อมูลเฉพำะคอลัมภ์ที่ต้องกำร
SELECT fname ,lname,email FROM phonebook ;
แสดงข ้อมูลเฉพาะคอลัมภ์ที่ต ้องการแสดงจากตาราง phonebook
โดยคั่นระหว่างคอลัมภ์ด ้วยคอมมา(,)
คำสั่งแสดงข้อมูลโดยระบุจำนวนรำยกำรที่ต้องกำร
SELECT fname ,lname,email FROM phonebook limit 5 ;
SELECT fname ,lname,email FROM phonebook limit 3,5 ;
แสดงข ้อมูลโดยระบุจานวนรายการที่ต ้องการ
 Limit 5 แสดงข ้อมูลตั้งแต่รายการแรก จนถึง 5 รายการ
 Limit 3,5 แสดงข ้อมูลตั้งแต่รายการที่ 3(เริ่มรายการแรกเป็นลาดับที่ 0 ) ไปอีกจนครบ
5 รายการ
คำสั่งแสดงข้อมูลโดยเรียงลำดับตำมที่กำหนด
SELECT fname ,lname,email FROM phonebook ORDER BY fname ;
SELECT fname ,lname,email
FROM phonebook
ORDER BY fname DESC ;
ตามปกติหากไม่ได ้ระบุวิธีการจัดเรียงข ้อมูล ก็จะเป็นการเรียงจากน ้อยไปมาก (Ascending) หรือ
คีย์เวิร์ด ASC แต่ถ ้าต ้องการเรียงจากมากไปน ้อย (Descending) ให ้ใช ้คีย์เวิร์ด DESC
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
28
กำรตั้งชื่อฟิลด์(Alias)
SELECT fname AS FirstName ,
Lname AS LastName
FROM phonebook ;
ปกติหากไม่ได ้ระบุชื่อฟิลด์จะถือเอาชื่อฟิลด์ตามตารางข ้อมูลเป็นหลัก
หากต ้องการตั้งชื่อใหม่ตามที่ต ้องการ สามารถใช ้AS ตามหลังชื่อฟิลด์
แล ้วใส่ชื่อที่ต ้องการโดยชื่อที่ตั้งขึ้นใหม่นี้ห ้ามมีช่องว่าง แต่สามารถใช ้เครื่องหมาย Underscore(_) ได ้
กำรระบุเงื่อนไข
SELECT fname ,lname,email ,province
FROM phonebook
WHERE province=’12’ ;
การกาหนดเงื่อนไขใช ้ WHERE โดยหลังคาสั่ง WHERE จะเป็นเงื่อนไข เช่น province=’12’
หมายถึง แสดงเฉพาะข ้อมูลในฟิลด์ province มีค่าเท่ากับ 12 ค่าในฟิลด์ province เป็นชนิด
Character ต ้องใส่ Quote (‘) ครอบ
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
29
กำรข้อมูลที่ซ้ำซ้อน
SELECT DISTINCT province FROM phonebook ;
SELECT COUNT( province) FROM phonebook ;
SELECT COUNT( DISTINCT province ) FROM phonebook ;
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
30
กำรจัดกลุ่มข้อมูล
จัดกลุ่มข ้อมูลที่หมือนกัน ไว ้เป็นกลุ่มเดียวกันใช ้GROUP BY แล ้วระบุชื่อฟิลด์ที่ต ้องการจัดกลุ่ม
SELECT province , COUNT( id )
FROM phonebook
GROUP BY province ;
การเรียกดูข้อมูลขั้นสูง
การเรียกดูข ้อมูลจาก 2 ตารางขึ้นไป เช่น ประชากร( Person ) และข ้อมูลการรับบริการ(visit)
SELECT person.pid,prename,fname,lname,visitdate
FROM person,visit
WHERE person.pid=visit.pid
AND person.pcucodeperson=visit.pcucodeperson
Limit 10 ;
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
31
การเรียกใช ้ข ้อมูลจาก 2 ตาราง หลัง FROM จะตามด ้วยชื่อตารางคั่นระหว่างชื่อตารางด ้วย
Comma(,) เช่น FROM person,visit
ในส่วนของความสัมพันธ์ของทั้งสองตารางใส่หลัง where
โดยถ ้าทั้งสองตารางมีชื่อเหมือนกันจะต ้องจะต ้องใส่ชื่อตารางนาหน ้าตามด ้วยจุด(.)แล ้วจึงใส่ชื่อฟิลด์
โปรแกรมจะแสดงผลที่มีค่าตรงกันเท่านั้น เช่น WHERE person.pid=visit.pid AND
person.pcucodeperson=visit.pcucodeperson
หากไม่ระบุค่าความสัมพันธ์จะแสดงผลัพธ์เป็นผลคูณคาร์ทีเซียน
กำรกำหนดชื่อย่อของตำรำงในกำรเชื่อมตำรำง
SELECT p.pid,prename,fname,lname,visitdate
FROM person p ,visit v
WHERE p.pid = v.pid
AND p.pcucodeperson = v.pcucodeperson
Limit 10 ;
ประชากรแต่ละคนสามารถมารับบริการได ้มากกว่า 1 ครั้ง แต่ละครั้ง Diagได ้มากว่า 1โรค
SELECT person.pid,prename,fname,lname,visitdate ,diagcode
FROM person,visit
WHERE person.pid=visit.pid
AND person.pcucodeperson=visit.pcucodeperson
AND visit.pcucod=visitdiag.pcucode
AND visit.visitno=visitdiag.visitno
AND visitdate = ‘2010-02-01’
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
32
SELECT person.pid,prename,fname,lname,visitdate,diagcode,
diseasename
FROM person,visit,visitdiag,cdisease
WHERE person.pid=visit.pid
AND person.pcucodeperson=visit.pcucodeperson
AND visit.pcucod=visitdiag.pcucode
AND visit.visitno=visitdiag.visitno
AND visit.diagcode= cdisease.diseasecode
AND visitdate = ‘2010-02-01’
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
33
กำรเชื่อมตำรำงทำงขวำและทำงซ้ำย
SQL Left Join เป็นคาสั่งที่ใช ้สาหรับการระบุเงื่อนไขการเลือกใช ้ข ้อมูลในตาราง
โดยเงื่อนไขการทา Left join จะทาการเลือกข ้อมูลหลัก โดยใช ้ตารางที่อยู่ด ้านซ ้ายของคาสั่ง Join
เป็นตัวตั้ง และเลือกตารางด ้านขวาของคาสั่งที่มีค่าตรงกัน โดยที่ถ ้ามีข ้อมูลจากตารางด ้านซ ้าย
ไม่ตรงกับด ้านขวา ด ้านขวาจะแสดงข ้อมูลเป็น NULL
SQL Right Join เป็นคาสั่งที่ใช ้สาหรับการระบุเงื่อนไขการเลือกใช ้ข ้อมูลในตาราง
โดยเงื่อนไขการทา Right join จะทาการเลือกข ้อมูลหลัก โดยใช ้ตารางที่อยู่ด ้านขวาของคาสั่ง Join
เป็นตัวตั้ง และเลือกตารางด ้านซ ้ายของคาสั่งที่มีค่าตรงกัน โดยที่ถ ้ามีข ้อมูลจากตารางด ้านขวา
ไม่ตรงกับด ้านซ ้าย ด ้านซ ้ายจะแสดงข ้อมูลเป็น NULL
SELECT fname ,lname , occupa , occupaname
FROM person
LEFT JOIN coccupa
ON person.occupa = coccupa.occupacode ;
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
34
การเรียกใช ้ Subqueries
เป็นการเรียกดูข ้อมูลชุดหนึ่ง ภายในข ้อมูลอีกชุดหนึ่ง
แสดงรำยชื่อประชำกรที่ได้รับกำรวัด BP ในเดือนที่กำหนด ครั้งล่ำสุด
SELECT fname ,lname , occupa , occupaname
FROM person
WHERE
( SELECT pcucodeperson , pid
FROM visit
WHERE month(visitdate) = '02' and pressure is not null
GROUP BY pcucodeperson , pid
Having max(visitdate)
)
แสดงรำยชื่อประชำกรที่อยู่ในเขตรับผิดชอบที่ยังไม่เสียชีวิต
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
35
SELECT person.pid,prename,fname,lname,visitdate
FROM person
WHERE CONCAT(person.pid,person.pcucodeperson) NOT IN (
SELECT CONCA T(persondeath.pid,persondeath.pcucodeperson)
FROM persondeath
WHERE persondeath.deaddate IS NULL
OR persondeath.deaddate<= ‘2011-10-30’
)
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
36
การใช ้งาน Function
Arithmetic operator
+ บวก
- ลบ
* คูณ
/ หาร
% หารเอาเศษ
Comparison operator
= เท่ากับ
!= หรือ <> ไม่เท่ากับ
< น ้อยกว่า
<= น ้อยกว่าหรือเท่ากับ
> มากกว่า
>= มากกว่าหรือเท่ากับ
Exp BETWEEN Min AND Max มีค่าระหว่างค่าต่าสุด(Min) และค่าสูงสุด (MAX)
Exp IS NULL เป็นค่าว่าง
Exp IS NOT NULL ไม่เป็นค่าว่าง
Exp in(X1 ,X2,….,Xn) มีค่าอยู่ในชุดข ้อมูลที่เปรียบเทียบ
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
37
Logical operator
AND หรือ && และ
OR หรือ || หรือ
NOT หรือ ! ไม่
XOR Excusive OR
Mathematical Function
TRUNCATE ( expression, decimal ) ใช ้ตัดเศษทศนิยมของ expression ทิ้ง
ให ้เหลือจุดทศนิยม จานวนตาแหน่ง
decimal ที่กาหนด
ROUND(n , d) ใช ้ปัดตัวเลขทศนิยมของ n
ให ้มีจานวนจุดทศนิยมเท่ากับ d
ถ ้าไม่กาหนด d จะปัดเป็นจานวนเต็ม
FLOOR(n) ใช ้ปัดเศษของ expression ให ้มีค่าน ้อยลง
CEILING(n) ใช ้ปัดเศษของ expression ให ้มีค่าขึ้น
String Function
CONCAT ( char1, char2, ..., charN ) ใช ้นาสตริงของ char1, char2, ..., charN
นามาต่อกัน
LENGTH ( char ) ใช ้หาค่าความยาวของ char ที่กาหนด
LEFT ( sentence, length ) ใช ้คืนค่า sentence
โดยจะตัดสตริงให ้เหลือเพียงจานวนตัวอักษร
length โดยจะเริ่มนับจากทางซ ้าย
RIGHT ( sentence, length ) ใช ้คืนค่า sentence
โดยจะตัดสตริงให ้เหลือเพียงจานวนตัวอักษร
length โดยจะเริ่มนับจากทางขวา
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
38
SUBSTRING ( sentence, position, length ) ใช ้ตัดสตริงของ sentence
โดยจะเริ่มตัดจากตาแหน่ง position
และตัดไปจานวน length ตัวอักษร
SUBSTRING ( sentence FROM position FOR
length )
ใช ้ตัดสตริงของ sentence
โดยจะเริ่มตัดจากตาแหน่ง position
และตัดไปจานวน length ตัวอักษร
MID ( sentence, position, length ) ใช ้ตัดสตริงของ sentence
โดยจะเริ่มตัดจากตาแหน่ง position
และตัดไปจานวน length ตัวอักษร
SUBSTRING ( sentence, position ) ใช ้ตัดสตริงของ sentence
โดยจะเริ่มตัดจากตาแหน่ง position
และตัดจนจบประโยค
SUBSTRING ( sentence FROM position ) ใช ้ตัดสตริงของ sentence
โดยจะเริ่มตัดจากตาแหน่ง position
และตัดจนจบประโยค
SUBSTRING_INDEX ( sentence, delimeter,
count )
ใช ้ตัดสตริงของ sentence
โดยมีรูปแบบของการตัด
LTRIM ( sentence ) ใช ้ต ้ดช่องว่างทางซ ้ายของ sentence
ออกไป
RTRIM ( sentence ) ใช ้ต ้ดช่องว่างทางขวาของ sentence
ออกไป
TRIM ( sentence ) ใช ้ต ้ดช่องว่างทางซ ้ายและทางขวาของ
sentence ออกไป
LCASE ( sentence ) ใช ้แปลงค่าตัวอักษรภายใน sentence
ให ้เป็น ตัวพิมพ์เล็กทั้งหมด
LOWER ( sentence ) ใช ้แปลงค่าตัวอักษรภายใน sentence
ให ้เป็น ตัวพิมพ์เล็กทั้งหมด
UCASE ( sentence ) ใช ้แปลงค่าตัวอักษรภายใน sentence
ให ้เป็น ตัวพิมพ์ใหญ่ทั้งหมด
UPPER ( sentence ) ใช ้แปลงค่าตัวอักษรภายใน sentence
ให ้เป็น ตัวพิมพ์ใหญ่ทั้งหมด
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
39
Date and Time Function
DAYOFWEEK ( date ) ใช ้คืนค่า วันที่ในสัปดาห์ โดยค่าที่เป็นไปได ้ได ้แก่ 1 ถึง 7
คือเรียงจาก 1=อาทิตย์ จนถึง 7=เสาร์
WEEKDAY ( date ) ใช ้คืนค่า วันที่ในสัปดาห์ โดยค่าที่เป็นไปได ้ได ้แก่ 0 ถึง 6
คือเรียงจาก 0=จันทร์ จนถึง 6=อาทิตย์
DAYOFMONTH ( date ) ใช ้คืนค่าวันที่ของเดือน โดยค่าที่เป็นไปได ้ได ้แก่ 1 ถึง 31
DAYOFYEAR ( date ) ใช ้คืนค่าวันที่ของปี โดยค่าที่เป็นไปได ้ได ้แก่ 1 ถึง 366
MONTH ( date ) ใช ้คืนค่าเดือนที่ของปี โดยค่าที่เป็นไปได ้ได ้แก่ 1 ถึง 12
YEAR ( date ) ใช ้คืนค่าปีคริสต์ศักราช โดยค่าที่เป็นไปได ้ได ้แก่ 1000 ถึง
9999
YEARWEEK ( date ) ใช ้คืนค่าปีคริสต์ศักราช และลาดับที่ของสัปดาห์
ใช ้คืนค่าชั่วโมงที่ โดยค่าที่เป็นไปได ้ได ้แก่ 0 ถึง 23
ใช ้คืนค่านาทีที่ โดยค่าที่เป็นไปได ้ได ้แก่ 0 ถึง 59
ใช ้คืนค่าวินาทีที่ โดยค่าที่เป็นไปได ้ได ้แก่ 0 ถึง 59
DATE_ADD ( date, INTERVAL
num datepart )
ใช ้เพิ่มวันที่หรือเวลาตามส่วน datepart ที่กาหนด
โดยจะเพิ่มเข ้าไปจานวน num หน่วย
DATE_SUB ( date, INTERVAL
num datepart )
ใช ้หักลบวันที่หรือเวลาตามส่วน datepart ที่กาหนด
โดยจะเพิ่มเข ้าไปจานวน num หน่วย
ADDDATE ( date, INTERVAL
num datepart )
ใช ้เพิ่มวันที่หรือเวลาตามส่วน datepart ที่กาหนด
โดยจะเพิ่มเข ้าไปจานวน num หน่วย
SUBDATE ( date, INTERVAL
num datepart )
ใช ้หักลบวันที่หรือเวลาตามส่วน datepart ที่กาหนด
โดยจะเพิ่มเข ้าไปจานวน num หน่วย
DATEDIFF(date1,date2) หาจานวนวันระหว่าง date1 และ date2
DATE_FORMAT ( date, format ) ใช ้จัดรูปแบบวันที่ให ้เป็นไปตาม format ที่กาหนด
CURDATE ( ) ใช ้คืนค่าวันที่ปัจจุบัน โดยมีรูปแบบคือ YYYY-MM-DD หรือ
YYYYMMDD
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
40
CURRENT_DATE ( ) ใช ้คืนค่าวันที่ปัจจุบัน โดยมีรูปแบบคือ YYYY-MM-DD หรือ
YYYYMMDD
NOW ( ) ใช ้คืนค่าวันที่และเวลาปัจจุบัน โดยมีรูปแบบคือ YYYY-
MM-DD HH:MM:SS หรือ YYYYMMDDHHMMSS
SYSDATE ( ) ใช ้คืนค่าวันที่และเวลาปัจจุบัน โดยมีรูปแบบคือ YYYY-
MM-DD HH:MM:SS หรือ YYYYMMDDHHMMSS
CURRENT_TIMESTAMP ( ) ใช ้คืนค่าวันที่และเวลาปัจจุบัน โดยมีรูปแบบคือ YYYY-
MM-DD HH:MM:SS หรือ YYYYMMDDHHMMSS
Comparison Function
ISNULL ( expression ) ใช ้ตรวจสอบว่า expression ที่กาหนดเป็นค่า NULL
ใช่หรือไม่
COALESCE ( ) ใช ้คืนค่า ค่าข ้อมูลของ expression ตัวแรก ที่ไม่ใช่ค่า
NULL หรือคืนค่า NULL ถ ้า expression ทั้งหมดเป็นค่า
NULL
INTERVAL ( ) ใช ้คืนค่า 0 ถ ้า expression1 < expression2 คืนค่า 1 ถ ้า
expression2 < expression3
และจะเป็นอย่างนี้ไปเรื่อยๆจนกว่าจะถึงค่าสุดท ้าย
STRCMP ( exp1, exp2 ) ใช ้เปรียบเทียบสตริง
Control Flow Function
IFNULL ( expression1,
expression2 )
ใช ้ตรวจสอบว่า expression1 เป็นค่า NULL ใช่หรือไม่
NULLIF ( expression1,
expression2 )
ใช ้คืนค่า NULL ถ ้าหากว่า expression1 และ expression2
มีค่าเท่ากัน
IF (exp , true ,false ) เป็นเงื่อนไข โดยถ ้า expression boolean คืนค่า true
กลับมา
CASE WHEN THEN ELSE END ใช ้กาหนดเงื่อนไขของ expression ให ้มีหลายๆเงื่อนไข
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
41
Miscellaneous Function
SESSION_USER ( ) ใช ้คืนค่า username ที่ติดต่ออยู่
PASSWORD ( char ) ใช ้เข ้ารหัส ด ้วย function password
ENCRYPT ( char ) ใช ้เข ้ารหัสด ้วย function encrypt
ENCODE ( char, code ) ใช ้เข ้ารหัสด ้วย function encode โดยมีการกาหนด code
ด ้วย
DECODE ( char, code ) ใช ้ถอดรหัสด ้วย function decode
ซึ่งเป็นการถอดรหัสของค่าที่ได ้จากการเข ้ารหัส encode
โดยมีการกาหนด code ด ้วย
MD5 ( char ) ให ้เข ้ารหัสด ้วย function md5 โดยค่าที่จะได ้คือ
เลขฐานสิบหก ความยาว 32 ตัวอักษร
FORMAT ( num, decimal ) ใช ้จัดรูปแบบการแสดงผลตัวเลข แบบมี comma ทุกๆ 3
หลักของตัวเลข โดยมีการกาหนดจุดทศนิยมไว ้ด ้วย
VERSION ( ) ใช ้คืนค่า version ของ mysql
CONNECTION_ID( ) ใช ้คืนค่า id ของการเชื่อมต่อฐานข ้อมูล
Aggreation Function
COUNT ( column_name ) ใช ้นับจานวนแถวทั้งหมด แต่จะไม่นับค่าข ้อมูลที่เป็น
NULL โดยค่าที่คืนกลับมาจะเป็นชนิด int
SUM ( column_name ) ใช ้หาผลรวมของค่าข ้อมูลในทุกแถว
AVG ( column_name ) ใช ้หาค่าเฉลี่ยของค่าข ้อมูลในทุกแถว
MAX ( column_name ) ใช ้หาค่าสูงสุด เมื่อเทียบกับค่าข ้อมูลในทุกแถว
ถ ้าใช ้กับข ้อมูลที่เป็นตัวอักษร จะแสดงผลแถวแรกสุด
MIN ( column_name ) ใช ้หาค่าต่าสุด เมื่อเทียบกับค่าข ้อมูลในทุกแถว
ถ ้าใช ้กับข ้อมูลที่เป็นตัวอักษร จะแสดงผลแถวท ้ายสุด
concat
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
42
SELECT concat(fname ,’ ’,lname) AS name FROM person
case
SELECT concat(fname ,' ',lname) AS name ,
CASE WHEN sex='1' THEN 'ชาย'
WHEN sex='2' THEN 'หญิง'
ELSE '-' END AS sex
FROM person
อายุ(ปี)
SELECT getAgeYearNum(birth,current_date) AS age
FROM person
sum
SELECT SUM(CASE WHEN sex='1' THEN 1 ELSE null END) AS m,
SUM(CASE WHEN sex='2' THEN 1 ELSE null END) AS w ,
COUNT(sex ) AS total
FROM person
DATE_FORMAT
SELECT DATE_FORMAT( birth ,"%y-%m-%d") as birthdate
FROM person
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
43
max
SELECT DATE_FORMAT( birth ,"%y-%m-%d") as birthdate
FROM person
convert
SELECT convert(ifnull(visit.`money2`,0.0) using utf8) AS visit_money2
FROM visit
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
44
การสร้าง View
เมื่อมีการใช ้คาสั่ง SQL ที่ซับซ ้อน ผู ้ใช ้จะมีความยากลาบากในการเขียนคาสั่งที่มีการ Join
ตารางหลายๆตาราง มีการใช ้Function ในการใช ้งานมากมาย หากมีการเรียกใช ้งานคาสั้งนั้นบ่อยๆ แล ้ว
วิธีปัญหานั้นคือการสร ้าง View
View คือมุมมองของข ้อมูลที่ผู ้ใช ้สร ้างขึ้นใหม่โดย View จะถูกสร ้างมาจากตาราง 1 ตาราง
หรือหลายๆตารางก็ได ้
ประโยชน์ของ View
1. สามารถสร ้าง View สาหรับกลุ่มผู ้ใช ้ต่างๆด ้วยเงื่อนไขต่างๆกัน
2. สามารถสร ้างจาก Query ที่ซับซ ้อน ให ้งาสยต่อการใช ้งาน
3. จากัดการเข ้าถึงข ้อมูล เนื่องจากการสร ้าง View
จะเป็นการเลือกเฉพาะฟิลด์ที่ต ้องการแสดง
Create View Syntax
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
เช่น การนับจานวนประชากร จาแนกตามเพศ โดยไม่นับคนที่เสียชีวิตแล ้ว
CREATE OR REPLACE VIEW v_count_person AS (
SELECT SUM(CASE WHEN sex='1' THEN 1 ELSE null END) AS m,
SUM(CASE WHEN sex='2' THEN 1 ELSE null END) AS w ,
COUNT(sex ) AS total
FROM person
WHERE CONCAT(person.pid,person.pcucodeperson) NOT IN (
SELECT CONCAT(persondeath.pid,persondeath.pcucodeperson)
FROM persondeath
)
)
วิธีเรียกใช ้งาน View
select * from v_count_person ;
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
45
การกาหนดสิทธิการใช ้งานฐานข้อมูล
คาสั่ง GRANT และ REVOKE
GRANT ALL PRIVILEGES ON demo TO user1@localhost WITH GRANT OPTION
REVOKE ALL PRIVILEGES ON demo FROM user1@localhost
 คาสั่ง GRANT เป็นคาสั่งสาหรับการกาหนดสิทธิ์หรือความสามารถใดๆ ให ้กับ user
 คาสั่ง REVOKE หรือคาสั่งที่ตรงกันข ้ามกับ GRANT
คือเป็นการถอนหรือยกเลิกสิทธิ์ใดๆจากUser
 การใช ้คาสั่ง GRANT หรือ REVOKE จะอนุญาตเฉพาะผู ้บริหารระบบในการกาหนดสิทธิ์ต่างๆ
สาหรับผู ้ใช ้
MySQL จะแบ่งสิทธิ์ (Privilege) เป็ น 4 ระดับ คือ
1. Global level ระดับบนสุด ครอบคลุมทุก database
รายละเอียดสาหรับสิทธิ์ของระดับนี้จะถูกเก็บไว ้ในตาราง mysql.user
2. Database level ระดับ database ครอบคลุมเฉพาะใน database อันใดอันหนึ่ง เช่น
ความสามารถในการกระทาใดๆ ภายใน database นั้นๆ รายละเอียดสาหรับสิทธิ์ของระดับนี้
จะถูกเก็บไว ้ในตาราง mysql.db และ mysql.host
3. Table level ระดับ table ครอบคลุมเฉพาะภายในตารางนั้นๆ เช่น
ความสามารถในการกระทากับ table นั้นๆ สามารถทาการ select, insert, delete, update
ได ้หรือไม่ เป็นต ้น รายละเอียดสาหรับสิทธิ์ของระดับนี้ จะถูกเก็บอยู่ในตาราง
mysql.tables_priv
4. Column level ระดับ column ครอบคลุมเฉพาะฟิลด์ใดฟิลด์หนึ่งภายในตารางข ้อมูล
รายละเอียดสาหรับสิทธิ์ของระดับนี้ จะถูกเก็บอยู่ในตาราง mysql.columns_priv รายละเอียด
priv_type มีดังต่อไปนี้
ALL PRIVILEGES FILE RELOAD
ALTER INDEX SELECT
CREATE INSERT SHUTDOWN
DELETE PROCESS UPDATE
DROP USAGE
 เราสามารถใช ้ALL หรือ ALL PRIVILEGES ได ้อย่างใดอย่างหนึ่ง
 USAGE มีความหมายเท่ากับ no privileges โดยใช ้กรณีที่เราต ้องการ create user
และกาหนดให ้มีสิทธิ์เป็น no privileges
 การถอนสิทธิ์การ GRANT ของ user ใดๆ ให ้ใช ้priv_type เป็น GRANT OPTION ตัวอย่าง:
REVOKE GRANT OPTION ON … FROM …;
 การใช ้priv_type สาหรับ table: SELECT, INSERT, UPDATE, DELETE, CREATE,
DROP,GRANT, INDEX และ ALTER
 การใช ้priv_type สาหรับฟิลด์ SELECT, INSERT, UPDATE
 การกาหนดสิทธิ์ระดับ database ใช ้ON *.*
 สาหรับ user_name สามารถระบุได ้ถึงโฮสต์ที่ใช ้งาน เช่น mysql@localhost หรือ root@’%’
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
46
กำรกำหนดสิทธิของผู้ใช้งำน
หลักการที่ MySQL ใช ้เรียกว่า Access Control Lists (ACLs) จะมีการตรวจสอบสิทธิผู ้ใช ้งาน
ว่าแต่ละคนมีสิทธิจะทาอะไรได ้บ ้าง กับฐานข ้อมูลใดบ ้าง ซึ่งสิทธิเหล่านี้จะถูกบันทึกเอาไว ้ในตารางชื่อ
mysqlข ้อควรกระทาและไม่ควรกระทาในการป้องกันหรือรักษาความปลอดภัยของข ้อมูล
1. ห ้ามอนุญาตให ้ใครก็ตาม ที่ไม่ใช ้ผู ้ดูแลระบบ มีสิทธิเข ้าไปเรียกดูหรือใช ้งานตารางชื่อ
mysqlเพราะ mysql เป็นแหล่งที่เก็บข ้อมูลเกี่ยวกับสิทธิต่าง ๆ
2. อย่างกาหนดสิทธิให ้กับผู ้ใช ้งานใด ๆ
มากเกินความจาเป็นผู ้ใช ้แต่ละคนควรจะได ้รับสิทธิแตกต่างกัน และควรมีสิทธิจากัดเป็นกรณี ๆ
ไป เช่น หากเป็นผู ้ใช ้ทั่ว ๆ ไปควรจะมีสิทธิใช ้งานแค่ฐานข ้อมูลใดฐานข ้อมูลหนึ่ง หรือ
อาจจะมีสิทธิแค่ตารางใดตารางหนึ่งในแต่ละฐานข ้อมูลระดับสิทธิการเรียกใช ้ข ้อมูลมี4 ระดับคือ
2.1 ระดับโฮสต์ (host level)
2.2 ระดับฐานข ้อมูล (db level)
2.3 ระดับตารางข ้อมูล (table level)
2.4 ระดับคอลัมน์ข ้อมูล (column level)
3. ระวังผู ้ใช ้ที่ใช ้ชื่อว่า root root คือ ผู ้สร ้างฐานข ้อมูล มีสิทธิต่าง ๆ มาก
ข ้อแนะนาว่าอย่าให ้มีผู ้ใช ้ชื่อ root อยู่ในสารบบของ MySQL
โดยเราสามารถกาหนดผู ้ใช ้ขึ้นมาให ้มีสิทธิเทียบเท่า root และอีกประการคือ รายชื่อผู ้ใช ้ของ
MySQL กับของ Server ที่ใช ้งาน จะเป็นคนละชุดกัน
4. ระวังการตั้งรหัสผ่านของผู ้ใช ้
การตั้งรหัสผ่านควรหลีกเลี่ยงคาศัพท์ทั่วไปที่สามารถค ้นหาได ้จากดิกชินนารี, หลีกเลี่ยงชื่อเล่น
หรือ ชื่อ สถานที่ที่ผู ้บุกรุกอาจจะคาดเดาได ้
5. หากไม่จาเป็นต ้องใช ้Telnet ก็ปิดไปดีกว่า ในกรณีที่Server
ของเราสามารถรองรับการทางานของโปรแกรม Telnet
แต่ในทางปฏิบัติไม่มีความจาเป็นที่ต ้องอนุญาตให ้ใครมาใช ้โปรแกรมนี้ ก็ควรยกเลิกการทางาน
6. อย่าเชื่อมือผู ้ใช ้มากนัก เพราะหากผู ้ใช ้เผลอไปใช ้คาสั่ง Drop database mysql
ถ ้าเราพัฒนาโปรแกรมขึ้นมาใช ้ควรจะมีระบบตรวจสอบคาสั่งนี้ โดยห ้ามใช ้คาสั่งนี้อย่างเด็ดขาด
ระดับสิทธิของผู้ใช้
1. ระดับโฮสต์(host level) คือ ระดับนี้จะจากัดสิทธิว่า ผู ้ใช ้สามารถติดต่อเข ้ามายัง MySQL
ได ้จากที่ไหนบ ้าง หรือจาก โฮสต์อะไรทั้งนี้เพราะถ ้า MySQL
ของเราอยู่ในเครื่องคอมพิวเตอร์ที่เชื่อมโยงกับเครื่องอื่น ๆหรือเชื่อมโยงกับเครือข่าย Internet
การติดต่อสื่อสารก็ย่อมกระทาจากที่ไหนก็ได ้ในโลก ผ่านทางโพรโตคอล TCP/IP
ลักษณะการตรวจสอบสิทธิการใช ้งาน เมื่อเครื่องลูกข่ายที่ร ้องขอติดต่อเข ้ามา
จะต ้องแจ ้งให ้ทราบว่ามาจากไหน ชื่อโฮสต์อะไร หมายเลข IP Address เท่าไร เมื่อ MySQL
รับทราบการร ้องขอ ก็จะนาข ้อมูลที่ได ้รับแจ ้งไป
ตรวจสอบว่าโฮสต์นั้นมีสิทธิหรือไม่หรือมีสิทธิอะไรบ ้าง
ลักษณะชื่อโฮสต์ที่สามารถกาหนดได ้
ลักษณะชื่อโฮสต์ที่สามารถกาหนดได ้ หมายความว่าติดต่อมาจาก…
Localhost เครื่องเดียวกันกับ MySQL server
% เครื่องไหนก็ได ้
%.cc-moph เครื่องใดก็ตามที่อยู่ในโดเมน cc-moph
203.157% เครื่องใดก็ตามที่มีIP address เริ่มจาก
203.157
ตัวอย่าง กาหนดสิทธิให ้กับผู ้ใช ้ที่ชื่อว่า train ก็ระบุในลักษณะ train@host เช่น
อนุญาตให ้train สามารถติดต่อมายัง MySQL ได ้จากเครื่องหมายเลข 203.157.4.27 ก็ระบุเป็น
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
47
train@203.157.4.27 ดังนั้นถ ้าติดต่อ MySQL โดยใช ้สคริปต์ PHP
ก็ต ้องเขียนคาสั่งในรูปแบบดังนี้
mysql_connect(“MySQLHost”,”train”,”รหัสผ่าน”);
คาสั่งกาหนดสิทธิการใช ้งาน GRANT มีรูปแบบดังนี้
GRANT สิทธิต่าง ๆ ON ชื่อฐานข ้อมูล.ชื่อตาราง TO
ชื่อผู ้ใช ้งาน@โฮสต์ [IDENTIFILE BY ‘รหัสผ่าน’]
GRANT ALL ON *.* TO train@203.157.4.27 IDENTIFILE BY
‘aBcXyz’;
สิทธิต่าง คือ สิทธิ (privilege) ที่จะสามารถทาได ้เช่น การเรียกดูข ้อมูล
(SELECT), การลดข ้อมูล(DELECT) หรือจะระบุสิทธิต่าง ๆ เป็น ALL
ก็ได ้ซึ่งหมายความว่าสามารถทาได ้ทุกอย่าง
2. ระดับฐำนข้อมูล (db level) ทั้งนี้ขึ้นอยู่กับว่ามีการระบุสิทธิต่าง ๆ ตามหลังคาสั่ง GRANT
ถ ้าระบุคาว่า ALL ก็หมายความว่าให ้สิทธิในกรเรียกใช ้ทุกคาสั่ง เช่น
GRANT สิทธิต่าง ๆ ON ชื่อฐานข ้อมูล.ชื่อตาราง TO
ชื่อผู ้ใช ้งาน@โฮสต์[IDENTIFILE BY ‘รหัสผ่าน’]
GRANT ALL ON *.* TO train@203.157.4.27 IDENTIFILE BY ‘aBcXyz’;
GRANT SELECT ON *.* TO User1@localhost IDENTIFILE BY ‘Password’;
หมายความว่า อนุญาตให ้user1 สามารถใช ้คาสั่ง SELECT
สาหรับเรียกดูข ้อมูลทุกตารางทุกฐานข ้อมูล
3. ระดับตำรำงข้อมูล (table level) สิทธิระดับนี้จะสัมพันธ์กับสิทธิระดับฐานข ้อมูล คือ
ถ ้าจะให ้สิทธิในการใช ้คาสั่งกับทุก ๆ ตารางใน ฐานข ้อมูลก็ระบุด ้วยเครื่องหมาย * เช่น
GIS.*
หมายถึงอนุญาตให ้มีสิทธิใช ้คาสั่งกับทุกตารางที่มีอยู่ในฐานข ้อมูลชื่อ GIS
GRANT SELECT ON db1.table1 TO User1@localhost IDENTIFILE BY
‘aBcXyz’;
หมายความว่าอนุญาตให ้user1 เรียกใช ้เฉพาะคาสั่ง SELECT
เพื่อดึงข ้อมูลจากตางรางชื่อ table1 ซึ่งอยู่ในฐานข ้อมูล db1 เท่านั้น
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
48
4. ระดับคอลัมน์ข้อมูล (Column level) เป็นสิทธิระดับที่ลึกลงไปจากสิทธิระดับอื่น ๆ อีก
โดยมีความสัมพันธ์กับสิทธิระดบฐานข ้อมูลและระดับตาราด ้วย
เพียงแต่วิธีการกาหนดสิทธิต ้องระบุในตางรางที่ชื่อ column_priv
ซึ่งตารางนี้อยู่ในฐานข ้อมูลmysql อีกทีฉะนั้นจึงต ้องใช ้คาสั่ง QL สั่งไปตรง ๆ ที่ตาราง
column_priv มิใช่กาหนดจาการใช ้คาสั่ง GRANT เหมือนกับสิทธิระดับอื่น ๆ
สิทธิต่ำง ๆ หรือ privilege หมายความว่า เมื่อเราอนุญาตให ้ผู ้ใช ้เข ้ามายังฐานข ้อมูล,
ตารางข ้อมูล, หรือเข ้ามายังMySQL ได ้แล ้ว สามารถใช ้คาสั่ง SQL ทาอะไรได ้บ ้าง
สิทธิต่าง ๆ การทางาน ตัวอย่างการใช ้งาน
SELECT เรียกดูรายการข ้อมูล SELECT * FROM table1
INSERT เพิ่มรายการข ้อมูล INSERT INTO table1 …
UPDATE ปรับปรุงแก ้ไขรายการข ้อมูล UPDATE table1 SET …
DELETE ลบรายการข ้อมูล DELETE FROM table1
ALTER แก ้ไขโครงสร ้างตารางข ้อมูล ALTER TABLE table1 ADD INDEX
index1(name)
CREATE สร ้างตารางหรือฐานข ้อมูลขึ้นมาใหม่ CREATE DATABASE database1
CREATE TABLE table1
DROP ลบตารางหรือฐานข ้อมูล DROP DATABASE database1
DROP TABLE table1
RELOAD สั่งให ้server เซ็นค่าต่าง ๆ ใหม่ FLUSH HOST (ปลดล็อคในกรณีที่
server มีการล็อค
ป้องกันการใช ้งานบางอย่าง เช่น
ป้องกันมิให ้มีผู ้ใช ้งาน
พร ้อมกันมาเกิดกาหนด)
SHUTDOWN อนุญาตให ้สั่งปิดการทางานของ
server
Mysqladmin shutdown
PROCESS ใช ้คาสั่งพิเศษกับ server เช่น
SHOW
SHOW PROCESSLIST
(ขอให ้แสดงรายการ โพรเซสที่
กาลังทางานอยู่)
FILE อ่าน – เขียน ไฟล์ที่ server ได ้ LOAD DATA INFILE ‘data.txt’ INTO
TABLE table1 (
โหลดข ้อมูลจากไฟล์ชื่อ data.txt
ไปบันทึกลงใน
ตารางข ้อมูล tabel1)
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
49
เมื่อคุณ install MySQL เสร็จ สิ่งแรกที่คุณควรทา คือการกา หนด password สา หรับ root
user โดยวิธีการ ดังนี้
shell> mysql -u root
mysql>use mysql;
mysql> UPDATE user SET
Password=PASSWORD('new_password') WHERE user='root';
mysql> FLUSH PRIVILEGES;
วิธีกำรกำหนด password
จากตัวอย่างในหัวข ้อที่ผ่านมาจะเห็นได ้ว่าเมื่อคุณ INSERT หรือ UPDATE password
คุณต ้องใช ้function PASSWORD() เพื่อเข ้ารหัส password เนื่องจากการกระทา เช.นนี้ ทา ให ้
password ถูกเก็บลง table ในแบบที่ถูกเข ้ารหัส เพื่อความปลอดภัยของข ้อมูล หากคุณลืมใช ้function
PASSWORD() , password ก็จะถูกเก็บในรูปแบบของตัวหนังสือ (plaintext)
การนาเข้าข้อมูล
รูปแบบการใช ้LOAD DATA INFILE มีดังนี้
LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 't']
[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '' ]]
[LINES TERMINATED BY 'n']
[IGNORE number LINES]
[(col_name,...)]
LOCAL หมายถึง file ที่ถูกอ่านถูกเก็บไว ้ที่ client ซึ่งจะทา ให ้เครื่องทา งานช ้าลง เนื่องจาก
server จะต ้องไปอ่าน file จากเครื่อง client ถ ้าไม่มีคา ว่า LOCAL , file จะต ้องถูกเก็บไว ้ที่ server และ
การอ่านtext files ที่อยู่บน server file จะต ้องอยู่ใน database directory หรือเป็น file ที่ user
ทุกคนสามารถเปิดอ่านได ้นั่นคือถ ้าคุณต ้องการอ่าน file จาก server คุณจะต ้องกา หนด file privilege
บน server host.
ถ ้า LOW_PRIORITY ถูกกา หนด หมายถึงการทา คา สั่ง LOAD DATA
จะถูกเลื่อนออกไปจนกระทั่งไม่มี clients เครื่องใดอ่านข ้อมูลจากตาราง การหาตาแหน่งของ file บน
server นั้น server จะต ้องทราบ pathname ของ file เพื่อหาตา แหน่งของ file โดยใช ้กฎดังนี้ :
 ถ ้า pathname เป็นแบบ absolute path, server จะใช ้pathname ในการค ้นหา file
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
50
 ถ ้า pathname เป็นแบบ relative pathname, server จะค ้นหา file นั้นโดยอ ้างอิง จาก
directory ของ data ใน server
 ถ ้า file name ไม่ได ้กา หนด path มาด ้วย, server จะค ้นหา file จาก database directory
ของdatabase ที่ใช ้ปัจจุบัน
 IGNORE number LINES ใช ้สา หรับทา ให ้MySQL ไม่สนใจข ้อมูล number
บรรทัดของส่วนหัวข ้อ file เช่น ขอ ้มลู บรรทัดแรกเป็นชื่อ ของ column เป็นต ้น
LOAD DATA INFILE "/tmp/file_name" into table test IGNORE 1
การ Export ข้อมูล
สามารถใช ้คาสั่งเพื่อส่งออกข ้อมูลที่ต ้องการออกเป็น Text File ได ้ตามตัวอย่าง
SELECT idcard , fname ,lname
FROM person
INTO OUTFILE '/tmp/exdata.txt';
SELECT idcard , fname ,lname
INTO OUTFILE '/tmp/exdata.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY ''
LINES TERMINATED BY 'n'
FROM person
SELECT idcard , fname ,lname เลือกฟิลด์ข ้อมูลที่ต ้องการส่งออก
INTO OUTFILE '/tmp/exdata.csv' ตาแหน่งและชื่อไฟล์ที่ต ้องการส่งออก
FIELDS TERMINATED BY ',' คั้นข ้อมูลแต่ละฟิลด์ด ้วยคอมมา
ENCLOSED BY '"' ครอบข ้อมูลด ้วยเครื่องหมายคาพูด(“”)
ESCAPED BY '' ใส่ Escape Character ด ้วย Back Slash()
LINES TERMINATED BY 'n' ขึ้นบรรทัดใหม ้ของแต่ละรายการด ้วย(n)
FROM person ชื่อตารางข ้อมูลที่ต ้องการส่งออก
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
51
การสารองข้อมูล
ข ้อมูลเป็นสิ่งที่สาคัญ ควรหาวิธีการป้องกันการเสียหายของข ้อมูล
โดยการสารองข ้อมูลให ้มากเท่าที่สามารถจะทาได ้
โดยการสารองข ้อมูลเพื่อให ้ข ้อมูลมีความครบถ ้วนมากที่สุดนั้นมักจะบันทึกเป็น 3 ระดับคือ
 Full System Backup
 Full Data Backup
 Incremental Backup
สาหรับการสารองข ้อมูลสามารถแบ่งออกเป็น 2 วิธีหลัก ๆ ดังนี้
1. Offline Backup : เป็นวิธีเบื้องต ้นที่หลาย ๆ ท่านที่เคยทาการสารองข ้อมูลคงคุ ้นเคย
นั่นคือการหยุดให ้บริการต่าง ๆ บนเครื่องเซิร์ฟเวอร์ทั้งหมด หรือการ Stop Service ต่าง ๆ
ที่มีอยู่ทั้งหมดก่อนทาการสารองข ้อมูล (Backup)
ซึ่งวิธีนี้อาจจะไม่เหมาะสาหรับองค์กรที่จาเป็นต ้องทาการให ้บริการผู ้ใช ้งาน ตลอด 24 ชม. ทั้ง 7 วัน
2. Online Backup : ความไม่สะดวกเกิดขึ้นเมื่อจาเป็นต ้องทาการสารองข ้อมูล
แต่ไม่สามารถหยุดการให ้บริการได ้จึงได ้มีการพัฒนาวิธีการทาการสารองข ้อมูลขึ้นมาอีกวีธีหนึ่งคือ
สามารถทาการสารองข ้อมูลไปพร ้อม ๆ กับการให ้บริการต่าง ๆ แก่ผู ้ใช ้งานได ้ซึ่งเรียกวิธีนี้ว่า Online
Backup หลายผลิตภัณฑ์ในท ้องตลาดมีการทางานลักษณะนี้
ส่วนกระบวนการในการสารองข ้อมูล
สามารถแบ่งออกตามลักษณะของทิศทางการไหลของข ้อมูลได ้2 ประเภท
1. LAN Backup : เป็นกระบวนการแบ็คอัพที่มีทิศ
ทางการไหลของข ้อมูลที่ต ้องการแบ็คอัพไปตามเน็ตเวิร์ก เครื่องที่เป็น Backup Server คือเครื่องที่มี
Tape Drive ต่ออยู่ ข ้อมูลจาก Server อื่น ๆ จะถูกดึงออกมาผ่านทางเน็ตเวิร์กส่งไปยัง Backup Server
2. LAN Free Backup : กระบวนการแบ็คอัพสาหรับองค์กรที่ใช ้งานตู ้Storage หรือที่เรียกกันว่า
SAN ( Storage Area Network ) ที่เครื่องเซิร์ฟเวอร์ทาการเชื่อมต่อเพื่อเข ้ามาใช ้เนื้อที่ใน SAN
ซึ่งข ้อมูลสาคัญที่จาเป็นต ้องการทาการ Backup
สาหรับ database ขนาดใหญ่แล ้ว การใช ้คาสั่ง mysqldump สาหรับสารองข ้อมูล
นั้นมีประสิทธิภาพมากที่สุดแล ้ว
ในการใช ้คาสั่ง mysqldump เพื่อทาการ backup และ mysql เพื่อ restore
ให ้ใช ้คาสั่งทั้งสองโดยที่ไม่ต ้อง Login เข ้า console ของ database
mysqldump [options] db_name [tbl_name ...]
mysqldump [options] --databases db_name ...
mysqldump [options] --all-databases
-u : username
-p : password (ห ้ามกรอกในบรรทัด ให ้เว ้นไว ้เมื่อ กด enter ระบบจะให ้ใส่เอง)
-h : host หรือ ip เครื่อง server (ใส่หรือไม่ก็ได ้หากใช ้localhost)
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
52
-P : Port Number ในกรณีที่ใช ้Default Port(3306) ไม่ต ้องใส่ option นี้
สาหรับ option อื่นในคาสั่ง mysqldump สามารถดูได ้จาก
mysqldump –h
สารองข ้อมูลทั้งฐานข ้อมูล
mysqldump -uroot –p123456 jhcisdb --lock-all-table
> /tmp/jhcisBackup_$(date +%Y%m%d_%H%M%S).sql
สารองข ้อมูลเฉพาะตารางที่ต ้องการ
mysqldump -u root -p jhcisdb -tables person > jhcis_person.sql
การนาข้อมุลสารองมาใช ้งาน
เมื่อต ้องการนาข ้อมูลที่ทาการสารองไว ้มาใช ้งาน
สามารถนาข ้อมูลจากไฟล์มานาเข ้าฐานข ้อมูลด ้วยคาสั่งดังนี้
mysql -uUsername
-pPassword
DatabaseName
-PportNumber
-hServer < DatabaseName.sql
เช่น mysql -hlocalhost -uroot –p123456 –P3333 jhcisdb < jhcisdb_backup.sql
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
53
การเพิ่มประสิทธิภาพ และการซ่อมแซมตารางข้อมูล
MySQL Optimize Table สิ่งที่ควรทาสาหรับตารางที่มี ลบ แก ้ไขบ่อยๆ
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE
tbl_name [, tbl_name] ...
ตัวอย่่าง
 ก่อนทา Optimize
 คาสั่ง Optimize
 หลังจาก Optimize
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
54
คาสั่งสาหรับการตรวจสอบและซ่อมแซมฐานข ้อมูล MySQL
mysqlcheck [options] db_name [tables]
mysqlcheck [options] --databases DB1 [DB2 DB3...]
mysqlcheck [options] --all-databases
mysqlcheck –h localhost -u root –P3333 -p --auto-repair –databases jhcisdb
ในการใช ้คาสั่งนี้สามารถใช ้คาสั่ง หรือ option ต่างๆได ้ดังนี้
mysqlrepair --repair
mysqlanalyze --analyze
mysqloptimize --optimize
--auto-repair ถ ้าตรวจสอบตารางแล ้วพบความเสียหาย
จะทาการซิอมให ้โดยอัตโนมัติ
ถ ้าฐานข ้อมูลเป็นแบบ myisam สามารถใช ้คาสั่งนี้ โดยตรงกับไฟล์ฐานข ้อมูลได ้
myisamchk -r *.MYI
หรือถ ้าหากต ้องการ Repair เฉพาะ Table
mysql –h localhost –u root –P3333 -p
use jhcisdb;
ตรวจสอบว่า Table นี้มีปัญหาหรือไม่
check table table_name;
และสามารถซ่อม Table ที่เสียหาย
repair table table_name;
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
55
การใช ้งาน MySQL Administrator
โปรแกรม MySQL Administrator เป็นโปรแกรม
ที่ใช ้งานเพื่อช่วยในการบริหารจัดการฐานข ้อมูล MySQL
เริ่มใช ้งานโปรแกรม
1. คลิก Start >> MySQL-JHCIS >> เลือก MySQL Administrator
2. Connect to MySQL
กาหนดค่าเพื่อติดต่อกับฐานข ้อมูล MySQL ดังรูป แล ้วกดปุ่ ม OK
Store Connection สามารถสร ้าง Connection ไว ้ใช ้งานได ้โดย
กดปุ่ ม
Server Host ชื่อ หรือ IP Address ของ MySQL Server
ถ ้าเป็นเครื่องเดียวกับ Server ใช ้ชื่อ Localhost หรือ
127.0.0.1
Port Port Number ที่ใช ้สาหรับ JHCIS ใช ้port 3333
โดยปกติ MySQL ใช ้port 3306
Username ชื่อที่เข ้าใช ้งาน MySQL
Password รหัสผ่านของ Username ที่เข ้าใช ้งาน MySQL
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
56
3. การสร ้าง Connection
4. กาหนดค่าใน Category “General Options” แล ้วกดปุ่ ม Apply
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
57
5. กาหนดค่าใน Category “Connections” แล ้วกดปุ่ ม Apply
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
58
Connection Parameters
Store Connection สามารถสร ้าง Connection ไว ้ใช ้งานได ้โดย
Server Host ชื่อ หรือ IP Address ของ MySQL Server
ถ ้าเป็นเครื่องเดียวกับ Server ใช ้ชื่อ Localhost หรือ
127.0.0.1
Port Port Number ที่ใช ้สาหรับ JHCIS ใช ้port 3333
โดยปกติ MySQL ใช ้port 3306
Username ชื่อที่เข ้าใช ้งาน MySQL
Password รหัสผ่านของ Username ที่เข ้าใช ้งาน MySQL
หากต ้องการลบ Connection ให ้คลิกที่ชื่อ Connections ที่ต ้องการ แล ้วกดปุ่ ม
Delete Connection แล ้วกด Apply เพื่อบันทึกการลบ
6. เมื่อกาหนดค่า Connection เสร็จแล ้ว กดปุ่ ม Apply เพื่อบันทึก แล ้วกดปุ่ ม Close
เพื่อปิดหน ้าต่าง
7. เลือก Connection ที่ต ้องการ แล ้วกดปุ่ ม OK
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
59
8. หากมีข ้อความแสดงดังรูป ให ้กดปุ่ ม OK จากนั้นสามารถใช ้งานได ้ตามปกติ
หากต ้องการแก ้ไขให ้ไม่แสดงข ้อความดังรูป ให ้คลิก Start >> MySQL-JHCIS >>
MySQL Adminstrator Patch SVC
แสดงข ้อความ Register Editor >> กดปุ่ ม Yes
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
60
แสดงข ้อความการแก ้ไข Registry >> กดปุ่ ม OK
9. แสดงข ้อมูล Server Information
10. Service Control
Tab :: Start/Stop service
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
61
แสดงสถานะและชื่อ Service ที่ใช ้งาน นั้นคือ Service ชื่อ “MySQL_JHCIS”
กาลังทหงานอยู่ หากต ้องการหยุดการทางาน ใหก ้กดปุ่ ม Stop Service
11. User Administration
การเพิ่มผุ ้ใช ้ใน MySQL
 เลือก User Administrator แล ้วคลิก ปุ่ ม Add New User
 หน ้าจอ User Information จะแสดงขึ้นมาให ้บันทึกข ้อมูล
 ใส่ User และ Password แล ้วกดปุ่ ม Apply Change
 กาหนดการอนุญาตการให ้Connect จากเครื่องที่กาหนด
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
62
 คลิกที่ Tab :: Schema Privilage เพื่อกาหนดสิทธิในการใช ้งาน
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
63
12. การสารองข ้อมูล
Backup คือ การสารองข ้อมูลไว ้เพื่อกู ้ข ้อมูลคืนในกรณีที่
เซิร์ฟเวอร์เกิดความเสียหายทั้งซอฟท์แวร์และฮาร์ดแวร์ การย ้าย/เปลี่ยนเซิร์ฟเวอร์
1. กดปุ่ ม New Project
2. กาหนดชื่อ Project เช่น jhcis_backup
3. เลือกฐานข ้อมูลที่ต ้องการ Backup
4. กดปุ่ ม เพื่อเลือกฐานข ้อมูลที่ต ้องการ Backup
5. ฐานข ้อมูลที่ถูกเลือกจะแสดงใน Backup Content โดยส่วนที่ถูก Backup
จะมีเครื่องหมาย
6. กดปุ่ ม Save Project
7. Tab:: Advance options เลือก Complete Backup
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
64
หากต ้องการสารองข ้อมูลเองให ้คลิกปุ่ ม “Execute Backup Now”
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
65
การตั้งเวลาสารองข ้อมูล
 เลือก Tab::Schedule
 เลือกที่Schedule this backup project (1)
 กาหนดตาแหน่งที่ต ้องการบันทึกข ้อมูล (2)
 กาหนดชื่อไฟล์โดยปกติจะใช ้ชื่อ project เป็นชื่อไฟล์(3)
 เลือกรูปแบบการสารองข ้อมูล (4)
 กาหนดเวลาที่ต ้องการ โดยมีรูปแบบแป็น HH:MM:SS (5)
 บันทึกโดยกดปุ่ ม Save Project (6)
 ใส่รหัสผ่านของชื่อผู ้ใช ้งาน windows ที่แสดงขึ้นมาในกล่องข ้อความ (7)
 กดปุ่ ม Save (8)
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
66
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
67
13. Restore
Restore คือการนาไฟล์ข ้อมูลที่เคยสารอง(Backup)ไว ้กลับมาใช ้งาน
หมายเหตุ :: ไฟล์ SQL จากการใช ้คาสั่ง mysqldump ไม่สามารถนามา restore ด ้วย
MySQL Administrator
13.1 กดปุ่ ม Open Backup File
13.2 เลือกไฟล์ที่ต ้องการ Restoreแล ้วกดปุ่ ม Open
13.3 ชื่อไฟล์ที่เลือกจะแสดงในช่อง File to restore (2)
13.4 กดปุ่ ม Start Restore
14. Catalog
Catalog จะแสดงรายชื่อฐานข ้อมูล(Database) ถ ้าคลิกเลือกฐานข ้อมูลที่ต ้องการแล ้ว
โปรแกรมจะแสดงรายชื่อตารางข ้อมูล ประเภทตารางและจานวนข ้อมุลใน Tab :: Schema Tables
ถ ้าต ้องการลบฐานข ้อมูล ให ้คลิกเลือกฐานข ้อมูลที่ต ้องการลบ >> คลิกขวา >> Drop
Schema
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
68
กรณีที่ต ้องการสร ้างฐานข ้อมูลใหม่ ให ้คลิกเลือกฐานข ้อมูล >> คลิกขวา >> Create New
Schema
การตรวจสอบและดูแลตารางข ้อมูล คลิกตารางข ้อมูลที่ต ้องการแล ้วกดปุ่ ม Maintainance
>> Optimize
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
69
การใช ้งาน MySQL Query Browser
ในการใช ้งาน MySQL ที่ในบทผ่านมาเป็นการใช ้งานในรูปแบบ command line
ซึ่งผู ้ที่เริ่มใช ้งาน MySQL อาจรู ้สึกว่าไม่สะดวกในการใช ้งาน ปัจจุบันมีโปรแกรมที่ช่วยให่การใช ้งาน
MySQL สะดวกขึ้นหลายโปรแกรม เช่น MySQL Front , Navicat เป็นต ้น
แต่ในบทนี้จะแนะนาเครื่องมือดีๆ ที่จะทาให ้การใช ้งาน mysql
ง่ายขึ้นโดยโปรแกรมนี้จะถูกติดตั้งมาพร ้อมกับ JHCIS MySQL query Browser
โดยเป็นโปรแกรมที่สามารถใช ้ได ้ฟรี ดาวน์โหลดได ้ที่ http://dev.mysql.com/downloads/gui-
tools/5.0.html
1. เริ่มใช ้งาน MySQL query Browser
คลิกที่ Start >> MySQL-JHCIS >> MySQL query Browser
2. กาหนดการติดต่อ MySQL Server
2.1 เลือกใช ้Stored Connection (หากยังไม่ดัสร ้างไว ้สามารถดูวิธีการสร ้าง
Connection ได ้จากเรื่องการใช ้งาน MySQL Administrator )
2.2 กาหนดค่าการติดต่อ MySQL Server
Server Host ชื่อ หรือ IP Address ของ MySQL Server
ถ ้าเป็นเครื่องเดียวกับ Server ใช ้ชื่อ Localhost หรือ
127.0.0.1
Port Port Number ที่ใช ้สาหรับ JHCIS ใช ้port 3333
โดยปกติ MySQL ใช ้port 3306
Username ชื่อที่เข ้าใช ้งาน MySQL
Password รหัสผ่านของ Username ที่เข ้าใช ้งาน MySQL
Default Schema ชื่อฐานข ้อมูลที่ต ้องการใช ้งาน เช่น 3333
2.3 กดปุ่ ม OK เพื่อเข ้าใช ้งาน
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
70
3. แสดงหน ้าจอสาหรับใช ้งานโปรแกรม มีส่วนประกอบต่างๆ ดังนี้
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
71
4. วิธีการเปลี่ยนฐานข ้อมูล
5. การเขียนคาสั่ง SQL
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
72
6. แก ้ไขข ้อมูลในตาราง
แก ้ไขข ้อมูลในตาราง
บันทึกการแก ้ไข
ยกเลิกการแก ้ไข
เลื่อนรายการข ้อมูล
ค ้นหาข ้อมูลในตาราง
7. การส่งออกข ้อมูลที่ได ้จากการ Query ออกเป็นรูปแบบต่างๆโดย
7.1 คลิกขวาที่ตารางข ้อมูล
7.2 เลือก Export Resultset
7.3 เลือกชนิดข ้อมุลที่ต ้องการส่งออก
7.4 กาหนดตาแหน่งที่จะบันทึก และชื่อไฟล์ แล ้วกดปุ่ ม Save
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
73
8. การบันทึกคาสั่ง SQL
8.1 เลือกเมนู File >> Save As…
8.2 กาหนดตาแหน่งที่จะบันทึก และชื่อไฟล์ แล ้วกดปุ่ ม Save
8.3 ชนิดของไฟล์ที่บันทึกโดยปกติจะเป็น qbquery สามารถกาหนดให ้เป็นประเภทอื่น
ได ้เช่น .sql
9. การเรียกใช ้งานคาสั่งที่มีอยู่
9.1 เลือกเมนู File >> Open Query สาหรับไฟล์ที่เป็น .qbquery
หรือ เลือกเมนู File >> Open Script สาหรับไฟล์ที่เป็น .sql
9.2 เลือกไฟล์จากตาแหน่งที่ต ้องการ แล ้วกดปุ่ ม Open
9.3 สามารถแก ้ไขสั่ง แล ้วใช ้งานได ้
10. การเรียกใช ้งานคาสั่งที่เคยใช ้งาน ซึ่งโปรแกรมจะเก็บทุกคาสั่งที่เคยใช ้งานไว ้ที่ Tab History
เราสามารถเรียกใช ้งานคาสั่งที่อยู่ใน Tab History ได ้
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
74
11. การสร ้าง Resultset ใหม่เพื่อให ้ใช ้งานหลายๆหน ้าต่าง
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
75
สารบัญ
แนะนาระบบจัดการฐานข ้อมูล 1
การติดตั้งและใช ้งาน MySQL
ประเภทข ้อมูลใน MySQL
Start and Stop MySQL Service
MySQL Command Line
Data Definition Language
Data Manipulation Language
Data Retrieval Language
การเรียกดูข ้อมูลชั้นสูง
SQL Function
การสร ้าง View
การกาหนดสิทธิในการใช ้งานฐานข ้อมูล
การสารองข ้อมูล
การนาข ้อมูลสารองใช ้งาน
การเพิ่มประสิทธิภาพ และการซ่อมแซมตารางข ้อมูล
การใช ้งาน MySQL Administrator
การใช ้งาน MySQL Query Browser
โครงสร ้างฐานช ้อมูล JHCIS
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
76
ScripSQL ForJHCIS
Cr.สสอไม้แก่น
link=> http://itmaikaenhos.blogspot.com/p/scrip-sql-for-jhcis.html
รายชื่อปชช. อายุ 35 ปี ขึ้นไป ที่ยังไม่ได้รับการคัดกรองเบาหวาน-ความดัน
==========================================================================
===
SELECT
person.pidas'HN',person.fname as'ชื่อ',...person.lname as'นามสกุล',person.hnomoi as
'บ้านเลขที่',person.mumoi as'หมู่ที่',
#person.typelive#,
getAgeYearNum(birth,CURDATE())as'อายุ'
FROM
person
INNERJOIN ncdpersonscreenallON person.pcucodeperson=ncdpersonscreenall.pcucodeAND
person.pid=ncdpersonscreenall.pid
WHERE
person.typelive IN ( 1,3)
ANDperson.pidNOTIN (selectpersondeath.pidfrompersondeath)
ANDgetAgeYearNum(birth,CURDATE()) >='35'
ANDperson.pidNOTIN (selectpersonchronic.pidfrompersonchronic)
ANDncdpersonscreenall.visitnoNOTBETWEEN '20130401'AND '2014331'
GROUP BY
person.pid
code ตอบตัวชี้วัด QOFเรื่อง ร้อยละของหญิงตั้งครรภ์ได้รับการฝากครรภ์ครบ5ครั้งตามเกณฑ์
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
77
==========================================================================
======
SELECT p.pid,
concat(p.prename,'',p.fname,'',p.lname) aspersonname,
p.idcard,timestampdiff(year,p.birth,vp.lmp)ASage,...
p.hnomoi,p.villnoAS หมู่,vp.lmp,vp.edc,t.datedeliverAS วันคลอด,t.pregno,
t1.pregage ASANC1_p_age,t1.datecheckASANC1_d_check,
t2.pregage ASANC2_p_gag,t2.datecheckASANC2_d_check,
t3.pregage ASANC3_p_gag,t3.datecheckASANC3_d_check,
t4.pregage ASANC4_p_gag,t4.datecheckASANC4_d_check,
t5.pregage ASANC5_p_gag,t5.datecheckASANC5_d_check
FROM
(SELECT * FROM visitancdelivervWHERE v.datedeliverBETWEEN '2013-10-01' AND'2014-03-31'
ORDER BY v.datedeliver) t
LEFT JOIN visitancpregnancyvpON vp.pcucodeperson=t.pcucodepersonANDvp.pid=t.pidAND
vp.pregno=t.pregno
INNERJOIN (SELECT ps.*,village.villnoFROMpersonps
INNERJOIN house ON ps.pcucodeperson=house.pcucode ANDps.hcode=house.hcode
INNERJOIN village ON house.pcucode =village.pcucode ANDhouse.villcode =village.villcodewhere
right(house.villcode,2)!='00') pON p.pid=t.pidANDp.pcucodeperson=t.pcucodeperson
LEFT JOIN (SELECT* FROMvisitancWHERE pregage<=12GROUP BY pid,pregno) t1ON t1.pid=t.pid
ANDt1.pregno=t.pregno
LEFT JOIN (SELECT* FROMvisitancWHERE pregage BETWEEN 16 AND 20 GROUP BY pid,pregno) t2
ON t2.pid=t.pidANDt2.pregno=t.pregno
LEFT JOIN (SELECT* FROMvisitancWHERE pregage BETWEEN 24 AND 28 GROUP BY pid,pregno) t3
ON t3.pid=t.pidANDt3.pregno=t.pregno
LEFT JOIN (SELECT* FROMvisitancWHERE pregage BETWEEN 30 AND 34 GROUP BY pid,pregno) t4
ON t4.pid=t.pidANDt4.pregno=t.pregno
LEFT JOIN (SELECT* FROMvisitancWHERE pregage BETWEEN 36 AND 40 GROUP BY pid,pregno) t5
ON t5.pid=t.pidANDt5.pregno=t.pregno
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
78
จานวนคัดกรองและการตีค่าความเสี่ยงverbal
==========================================================================
====
SELECT CASEWHEN age_yearbetween'15'and'34' THEN 'อายุ15_34' WHEN age_yearbetween'35'
and '59' THEN 'อายุ35_59' WHEN age_year>= '60' THEN 'อายุ>60'ELSE null ENDAS 'Grage',
case whenncd_person.sex ='1' then'ชาย'whenncd_person.sex ='2' then'หญิง'else'ไม่ระบุ'endas
grsex,
sum(CASEWHEN age_year>= '15' THEN 1 ELSE 0 END) AS 'จานวนคัดกรอง',
sum(CASEWHEN age_yearbetween'15'and'34' and chronic_flag='0'and(screen_q1+screen_q2+
screen_q3+(blackarmpit='1') )>='3' THEN 1 ELSE 0 END) AS'verbal<15ปี',
sum(CASEWHEN age_year> = '35' and chronic_flag='0'and (screen_q1+screen_q2+screen_q3+
screen_q4+screen_q5+screen_q6)>='1' THEN 1 ELSE 0 END) AS'verbal>35ปี',
sum(CASEWHEN chronic_flag='0'and bsl> '0' THEN 1 ELSE 0 END) AS'ได้รับการเจาะDTX',
sum(CASEWHEN chronic_flag='0'and bsl < '100' THEN 1 ELSE 0 END) AS'bsl<100',
sum(CASEWHEN chronic_flag='0'and bsl between'100'and'125' THEN 1 ELSE 0 END) AS 'bsl100-
125',sum(CASEWHEN chronic_flag='0'andbsl >= '126' THEN 1 ELSE 0 END) AS 'bsl>126',
sum(CASEWHEN chronic_flag='0'and ((hbp_s2between'120'and'139') or (hbp_d2between'80'and
'89')) THEN 1 ELSE 0 END) AS'BP120/80-139/89',
sum(CASEWHEN chronic_flag='0'and (hbp_s2>= '140' and hbp_d2>= '90') THEN 1 ELSE 0 END) AS
'BP>140/90',
sum(CASEWHEN chronic_flag='0'and (hbp_s1< '120' andhbp_d1 < '80') THEN 1 ELSE 0 END) AS
'BP<120/80',
sum(CASEWHEN ncd_person.sex ='1' and chronic_flag='0'and ncd_person_ncd_screen.waist>='90'
THEN 1 ELSE 0 END) AS 'รอบเอวเกินชาย',
sum(CASEWHEN ncd_person.sex ='2' and chronic_flag='0'and ncd_person_ncd_screen.waist>='80'
THEN 1 ELSE 0 END) AS 'รอบเอวเกินหญิง',
sum(CASEWHEN chronic_flag='0'and ncd_person_ncd_screen.bmi >='25' THEN 1 ELSE 0 END) AS
'BMI>25'
FROM
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
79
ncd_person_ncd_screen
INNERJOIN ncd_personON ncd_person_ncd_screen.pcucode=ncd_person.pcucode AND
ncd_person_ncd_screen.pid=ncd_person.pid
INNERJOIN ncd_person_ncdON ncd_person_ncd_screen.pcucode=ncd_person_ncd.pcucode AND
ncd_person_ncd_screen.pid=ncd_person_ncd.pid
WHERE ncd_person_ncd_screen.screen_datebetween'2013-10-01'and'2014-11-30'
and SUBSTRING(ncd_person.village,7,2)<>'00'
groupby Grage,grsex
Code จานวนคัดกรองแยกverbal แยกกลุ่มสีแยกเพศแยกอายุ
Code จานวนคัดกรองแยกตามverbal 6ข้อแยกกลุ่มสีแยกเพศแยกอายุ
มีเงื่อนไขคือ ผู้ที่อายุ15 ปีขึ้นไป (อายุ ณวันที่ 1 ตุลาคม2556)ที่มีชีวิตทุกคน
(ถ้าคุณเอากลุ่มป่วยมาบันทึกก็จะนับไปด้วย)และมีTypearea1+3ที่ได้รับการคัดกรองNCDตั้งแต่วันที่1 ตุลาคม
2556 ถึงวันที่30 กันยายน2557
==========================================================================
====
SELECT CASEWHEN person.sex ='1' THEN 'ชาย'WHEN person.sex ='2' THEN 'หญิง'ELSE'ไม่ระบุ'END AS
groupsex,
CASE WHEN age_yearbetween'15'and'34' THEN '15-34'WHEN age_yearbetween'35'and'59' THEN
'35-39'WHEN age_year>='60' THEN '>60'ELSE'ไม่ระบุ'END ASgrouppop,
count(ncd_person_ncd_screen.pid) as'จานวนคัดกรอง',
sum(CASEWHEN screen_q1='1' THEN '1' ELSE null END) AS 'ญาติเบาหวาน',
sum(CASEWHEN screen_q2='1' THEN '1' ELSE null END) AS 'รอบเอว+BMIเกิน',
sum(CASEWHEN screen_q3='1' THEN '1' ELSE null END) AS 'BP>140/90',
sum(CASEWHEN screen_q4='1' THEN '1' ELSE null END) AS 'ประวัติน้าตาลสูง',
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
80
sum(CASEWHEN screen_q5='1' THEN '1' ELSE null END) AS 'Tri>250',sum(CASEWHEN screen_q6=
'1' THEN '1' ELSE null END) AS'เบาหวานขณะตั้งครรภ์',
sum(CASEWHEN blackarmpit= '1' THEN '1' ELSE null END) AS 'รอยพับดา',
sum(CASEWHEN htfamily='1' THEN '1' ELSE null END) AS 'ญาติBPสูง',
sum(CASEWHEN ((hbp_s1<'120' and hbp_d1<'80')OR (hbp_s2<'120' and hbp_d2<'80')) THEN '1'
ELSE null END) AS'HTขาว',
sum(CASEWHEN ((hbp_s2between'120'and'139') or (hbp_d2between'80'and'89')) THEN '1' ELSE
null END) AS'HTเขียว',sum(CASEWHEN bsl < '100' THEN '1' ELSE null END) AS 'DMขาว',
sum(CASEWHEN bsl between'100'and'125' THEN '1' ELSE null END) AS 'DMเขียว'
FROM
ncd_person_ncd_screenINNERJOIN ncd_personON ncd_person_ncd_screen.pcucode =
ncd_person.pcucode ANDncd_person_ncd_screen.pid=ncd_person.pid
INNERJOIN personON ncd_person_ncd_screen.pcucode =person.pcucodepersonAND
ncd_person_ncd_screen.pid=person.pid
WHERE
ncd_person_ncd_screen.screen_date between'2013-10-01'and'2014-09-30'
and SUBSTRING(ncd_person.village,7,2)!='00'and person.typelive in('1','3') and
CONCAT(person.pid,person.pcucodeperson) notin(SELECT
CONCAT(persondeath.pid,persondeath.pcucodeperson)
FROMpersondeath)
groupby grouppop,groupsex
=========================================================================
Code เป้าหมายคัดกรองแยกเพศแยกอายุ
จานวนกลุ่มเป้าหมายคัดกรองNCDแยกเพศและกลุ่มอายุมีเงื่อนไขคือประชากรที่อายุ15ปีขึ้นไป(อายุ ณ วันที่ 1
ตุลาคม2556) ทุกคนที่ยังมีชีวิตและมีTypearea
1+3=======================================================================
======
SELECT
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
81
CASE WHEN person.sex='1' THEN 'ชาย'WHEN person.sex='2' THEN 'หญิง'ELSE'ไม่ระบุ'END AS
groupsex,
SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01')
between'15'and'34' THEN 1 ELSE '' END) as '15-34',
SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01')
between'35'and'59' THEN 1 ELSE '' END) as '35-59',
SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') >=60
THEN 1 ELSE '' END) as '>60'
FROMperson
INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode
INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode
WHERE CONCAT(person.pid,person.pcucodeperson) notin(SELECT
CONCAT(persondeath.pid,persondeath.pcucodeperson)
FROMpersondeath) andSUBSTRING(house.villcode,7,2)!='00'
groupby groupsex
Code จานวนคัดกรองแยกกลุ่มสีอายุ15- 34 ปี
=========================================================================
SELECT
(SELECT
SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01')
between'15'and'34' THEN 1 ELSE '' END)
FROM
person
INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode
INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode
WHERE (person.dischargetypeisnull orperson.dischargetype=9) and
SUBSTRING(house.villcode,7,2)!='00'
and concat(person.pid,person.pcucodeperson) notin(selectconcat(personchronic.pid,
personchronic.pcucodeperson) from personchronicwhere personchronic.chroniccodebetween'I10'
and 'I15.9' and personchronic.chroniccode between'E10'and'E15')) as 'Pop 15 ปี',
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
82
count(ncd_person_ncd_screen.pid) as'จานวนคัดกรอง',
sum(CASEWHEN (hbp_s1 <'120' and hbp_d1<'80')OR (hbp_s2 <'120' and hbp_d2<'80') THEN '1'
ELSE null END) AS'HTขาว',
sum(CASEWHEN (hbp_s2between'120'and'139') or (hbp_d2between'80'and'89') THEN '1'
ELSE null END) AS'HTเขียว',
sum(CASEWHEN bsl < '100' THEN '1' ELSE null END) AS'DMขาว',
sum(CASEWHEN bsl between'100'and'125' THEN '1' ELSE null END) AS'DMเขียว'
FROM
ncd_person_ncd_screen INNERJOIN ncd_person ON ncd_person_ncd_screen.pcucode =
ncd_person.pcucode ANDncd_person_ncd_screen.pid=ncd_person.pid
INNERJOIN person ON ncd_person_ncd_screen.pcucode=person.pcucodepersonAND
ncd_person_ncd_screen.pid=person.pid
WHERE
age_yearbetween'15'and'34' and ncd_person_ncd_screen.screen_datebetween'2013-10-01'
and '2014-09-30'
andSUBSTRING(ncd_person.village,7,2)!='00'and person.typelivein('1','3') and
CONCAT(person.pid,person.pcucodeperson) notin(SELECT
CONCAT(persondeath.pid,persondeath.pcucodeperson)
FROMpersondeath);
==========================================================================
====
อายุ 35 - 59 ปี
==========================================================================
====
SELECT
(SELECT
SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01')
between'35'and'59' THEN 1 ELSE '' END)
FROM
person
INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
83
INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode
WHERE (person.dischargetypeisnull orperson.dischargetype =9) and
SUBSTRING(house.villcode,7,2)!='00'
and concat(person.pid,person.pcucodeperson) notin(selectconcat(personchronic.pid,
personchronic.pcucodeperson) from personchronic
where personchronic.chroniccode between'I10'and'I15.9' and personchronic.chroniccodebetween
'E10' and'E15')) as 'Pop 15 ปี',
count(ncd_person_ncd_screen.pid) as'จานวนคัดกรอง',
sum(CASEWHEN (hbp_s1 <'120' and hbp_d1<'80')OR (hbp_s2 <'120' and hbp_d2<'80') THEN '1'
ELSE null END) AS'HTขาว',
sum(CASEWHEN (hbp_s2between'120'and'139') or (hbp_d2between'80'and'89') THEN '1'
ELSE null END) AS'HTเขียว',
sum(CASEWHEN bsl < '100' THEN '1' ELSE null END) AS'DMขาว',
sum(CASEWHEN bsl between'100'and'125' THEN '1' ELSE null END) AS'DMเขียว'
FROM
ncd_person_ncd_screen INNERJOIN ncd_person ON ncd_person_ncd_screen.pcucode =
ncd_person.pcucode ANDncd_person_ncd_screen.pid=ncd_person.pid
INNERJOIN person ON ncd_person_ncd_screen.pcucode=person.pcucodepersonAND
ncd_person_ncd_screen.pid=person.pid
WHERE
age_yearbetween'35'and'59' and ncd_person_ncd_screen.screen_datebetween'2013-10-01'
and '2014-09-30'
andSUBSTRING(ncd_person.village,7,2)!='00'and person.typelivein('1','3') and
CONCAT(person.pid,person.pcucodeperson) notin(SELECT
CONCAT(persondeath.pid,persondeath.pcucodeperson)
FROMpersondeath);
==========================================================================
====
อายุ 60 ปีขึ้นไป
==========================================================================
====
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
84
SELECT
(SELECT
SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') >='60'
THEN 1 ELSE '' END)
FROM
person
INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode
INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode
WHERE (person.dischargetypeisnull orperson.dischargetype= 9) and
SUBSTRING(house.villcode,7,2)!='00'
and concat(person.pid,person.pcucodeperson) notin(selectconcat(personchronic.pid,
personchronic.pcucodeperson) from personchronic
where personchronic.chroniccode between'I10'and'I15.9' and personchronic.chroniccodebetween
'E10' and'E15')) as 'Pop 15 ปี',
count(ncd_person_ncd_screen.pid) as'จานวนคัดกรอง',
sum(CASEWHEN (hbp_s1 <'120' and hbp_d1<'80')OR (hbp_s2 <'120' and hbp_d2<'80') THEN '1'
ELSE null END) AS'HTขาว',
sum(CASEWHEN (hbp_s2between'120'and'139') or (hbp_d2between'80'and'89') THEN '1'
ELSE null END) AS'HTเขียว',
sum(CASEWHEN bsl < '100' THEN '1' ELSE null END) AS'DMขาว',
sum(CASEWHEN bsl between'100'and'125' THEN '1' ELSE null END) AS'DMเขียว'
FROM
ncd_person_ncd_screen INNERJOIN ncd_person ON ncd_person_ncd_screen.pcucode =
ncd_person.pcucode ANDncd_person_ncd_screen.pid=ncd_person.pid
INNERJOIN person ON ncd_person_ncd_screen.pcucode=person.pcucodepersonAND
ncd_person_ncd_screen.pid=person.pid
WHERE
age_year>= '60' and ncd_person_ncd_screen.screen_datebetween'2013-10-01'and'2014-09-30'
andSUBSTRING(ncd_person.village,7,2)!='00'and person.typelivein('1','3') and
CONCAT(person.pid,person.pcucodeperson) notin(SELECT
CONCAT(persondeath.pid,persondeath.pcucodeperson)
FROMpersondeath);
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
85
Code 7 Colourกลุ่มคัดกรอง
Code รายชื่อกลุ่มคัดกรองแยกตามกลุ่มสีเปลี่ยนวันที่ต้องการ[between'วันที่เริ่มต้น'and'วันที่สิ้นสุด']
=========================================================================
SELECT
person.pidASpid,
concat(ctitle.titlename,person.fname,' ',person.lname)aspname,
age_year,
person.idcardASpcid,
person.sexASsex,
person.hnomoi AShno,
person.mumoi ASmu,
hbp_s1,hbp_s2,hbp_d1,hbp_d2,
DATE_FORMAT(screen_date,'%Y-%m-%d') asscreen_date,
max(CASEWHEN (hbp_s1 <'120' and hbp_d1<'80')OR (hbp_s2 <'120' and hbp_d2<'80') THEN "/"
ELSE null END) AS'NBp',
max(CASEWHEN (hbp_s2between'120'and'139') or (hbp_d2between'80'and'89') THEN "/"
ELSE null END) AS'HBp', max(CASEWHEN (hbp_s2>= '140' or hbp_d2>= '90') THEN "/" ELSE null
END) AS 'RoHT',
bsl,
max(CASEWHEN bsl < '100' THEN "/" ELSE null END) AS 'NDM',
max(CASEWHEN bsl between'100'and'125' THEN "/" ELSE null END) AS'HDM',
max(CASEWHEN bsl >= '126' THEN "/" ELSE null END) AS'RoDM'
FROM
ncd_person_ncd_screenINNERJOIN personON ncd_person_ncd_screen.pid=person.pid
INNERJOIN ctitle ON person.prename =ctitle.titlecode
INNERJOIN ncd_person ON ncd_person_ncd_screen.pcucode=ncd_person.pcucode AND
ncd_person_ncd_screen.pid=ncd_person.pid
WHERE
age_year>= '15' and ncd_person_ncd_screen.screen_datebetween'2013-10-01'and'2014-09-30'
and concat(ncd_person_ncd_screen.pid,ncd_person_ncd_screen.pcucode) notin
(selectconcat(ncd_person_ncd_hist.pid,ncd_person_ncd_hist.pcucode)
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
86
from ncd_person_ncd_hist) andSUBSTRING(ncd_person.village,7,2)<>'00'
groupby person.pid
orderby ncd_person.village;
Code 7 colourกลุ่มป่วย
=========================================================================
select
concat(ctitle.titlename,ps.fname,'',ps.lname)aspname,
ps.birthasbirth,
ps.sex assex,
ps.idcardas idcard,
ps.hnomoi,
max(v.visitdate) asvdate,
v.pressure asvpressure,
substr(v.pressure,1,instr(v.pressure,"/")-1)asbps,
substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) asbpd,
max(case whenpc.chroniccode ='I10'then'HT' else ' ' end) asHT,
max(case whenpc.chroniccode between'E10'and'E15' then'DM' else '' end) as DM,
if(substr(v.pressure,1,instr(v.pressure,"/")-1)<140or
substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <90,'Green',
if(substr(v.pressure,1,instr(v.pressure,"/")-1)<160or
substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <100,'Yellow',
if(substr(v.pressure,1,instr(v.pressure,"/")-1)<180or
substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <110,'Orange
','Red'))) as'ระดับความดัน',
s.sugarnumdigitasFBS,max(case whens.sugarnumdigit< 126 then'Green'whens.sugarnumdigit
between 126and154then'Yellow'whens.sugarnumdigitbetween 155and182then'Orange'when
s.sugarnumdigit>= 183then'Red' else ' ' end) as 'ระดับเบาหวาน',
max(case whenvisitlabchcyhembmsse.labcode ='CH99' thenvisitlabchcyhembmsse.labresultdigit
else ' ' end) as 'HbA1c',
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
87
max(case whenvisitlabchcyhembmsse.labcode ='CH99' andvisitlabchcyhembmsse.labresultdigit<7
then'Yellow'whenvisitlabchcyhembmsse.labcode ='CH99' andvisitlabchcyhembmsse.labresultdigit
< 8 then'Orange'whenvisitlabchcyhembmsse.labcode ='CH99' and
visitlabchcyhembmsse.labresultdigit>=8 then'Red' else ' ' end) as 'ระดับHbA1c'
from
personpsinnerjoin visitvon ps.pcucodeperson=v.pcucodepersonandps.pid=v.pid
innerjoinctitle onps.prename =ctitle.titlecode
innerjoinhouse onps.pcucodeperson=house.pcucodeandps.hcode =house.hcode
Leftjoinvisitlabsugarbloodsonv.pcucode = s.pcucode
and v.visitno=s.visitno
innerjoinpersonchronicpcon ps.pcucodeperson=pc.pcucodeperson
and ps.`pid`= pc.pid
Leftjoinvisitlabchcyhembmsse onv.pcucode =visitlabchcyhembmsse.pcucode
and v.visitno=visitlabchcyhembmsse.visitno
where v.visitdate between '2013-10-01'and'2013-10-30'
and (pc.chroniccode between'E10'and 'E15' or pc.chroniccode = 'I10') and v.pressure isnotnull
and CONCAT(ps.pid,ps.pcucodeperson) NOTIN (select
CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath)
and pc.cup= '06139' and SUBSTRING(house.villcode,7,2)='09'
groupby ps.pid;
Non-NCD(รายชื่อคนที่ยังไม่ได้คัดกรอง)ปี2557
==========================================================================
=======
SELECT n.pid,p.pid,c.titlename,p.fname,p.lname,p.sex,p.idcard,n.age_year,p.hnomoi,
p.mumoi,GetAgeYearNum(p.birth,'2013-12-19') as'ayear',n.height,n.weight,n.waist,n.hbp_s1,
n.hbp_d1,n.screen_date,n.bmi,n.d_update
FROMpersonp
innerjoinctitle con p.prename=c.titlecode
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
88
INNERJOIN house h ON p.pcucodeperson=h.pcucode ANDp.hcode =h.hcode
INNERJOIN village vON h.pcucode = v.pcucode ANDv.villcode =h.villcode
leftjoinncd_person_ncd_screennonp.pid=n.pid
where
SUBSTRING(h.villcode,7,2)!='00' andp.typelivein('1','3') ANDGetAgeYearNum(p.birth,'2013-07-01')
>= '15' AND n.pidisnull orn.screen_date <'2013-07-01';
Code พฤติกรรมสุขภาพจากการคัดกรองncdscreen
===========================================================
selectcase whenage_yearbetween'15'and'34' then'อายุ15_34'
whenage_yearbetween'35'and '59' then'อายุ35_59'
whenage_year>= '60' then'อายุ>60'else null endas'Grpage',
sum(case whenalcohol =1 then1 else 0end) as 'ไม่ดื่ม',
sum(case whenalcohol =2 then1 else 0end) as 'ดื่มนานๆครั้ง',
sum(case whenalcohol =3 then1 else 0end) as 'ดื่มเป็นครั้งคราว',
sum(case whenalcohol =4 then1 else 0end) as 'ดื่มเป็นประจา',
sum(case whenalcohol =9 then1 else 0end) as 'ไม่ทราบ',
sum(case whensmoke =1 then1 else 0end) as 'ไม่สูบ',
sum(case whensmoke =2 then1 else 0end) as 'สูบนานๆครั้ง',
sum(case whensmoke =3 then1 else 0end) as 'สูบเป็นครั้งคราว',
sum(case whensmoke =4 then1 else 0end) as 'สูบประจา',
sum(case whensmoke =9 then1 else 0end) as 'ไม่ทราบ'
fromncd_person_ncd_screen
where age_year>= '15' andconcat(ncd_person_ncd_screen.pid,ncd_person_ncd_screen.pcucode)
not in(selectconcat(persondeath.pid,persondeath.pcucodeperson)frompersondeath
where persondeath.pcucodeperson=ncd_person_ncd_screen.pcucode and(persondeath.deaddate
isnull or persondeath.deaddate<=curdate())) andscreen_date between'2013-10-01'and'2014-09-30'
groupby Grpage
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
89
จานวนคัดกรอง2Qแยกรายเดือน
==========================================================================
=======
SELECT case whenmonth(visit.visitdate)=1then'มกราคม'
whenmonth(visit.visitdate)=2then'กุมภาพันธ์'
whenmonth(visit.visitdate)=3then'มีนาคม'
whenmonth(visit.visitdate)=4then'เมษายน'
whenmonth(visit.visitdate)=5then'พฤษภาคม'
whenmonth(visit.visitdate)=6then'มิถุนายน'
whenmonth(visit.visitdate)=7then'กรกฎาคม'
whenmonth(visit.visitdate)=8then'สิงหาคม'
whenmonth(visit.visitdate)=9then'กันยายน'
whenmonth(visit.visitdate)=10then'ตุลาคม'
whenmonth(visit.visitdate)=11then'พฤศจิกายน'
whenmonth(visit.visitdate)=12then'ธันวาคม'elsenull endas'GMonth',
year(visit.visitdate) as'ปี',
count(codescreen='c01') as 'total',
sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'15'and'29' then1 else ''end)
as '2q15-29',
sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'15'and'29'and
visitscreenspecialdisease.coderesult='2' then1 else '' end) as'ผิดปกติ15-29',
sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'30'and'49' then1 else ''end)
as '2q30-49',
sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'30'and'49'and
visitscreenspecialdisease.coderesult='2' then1 else '' end) as'ผิดปกติ30-49',
sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'50'and'59' then1 else ''end)
as '2q50-59',
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
90
sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'50'and'59'and
visitscreenspecialdisease.coderesult='2' then1 else '' end) as'ผิดปกติ50-59'
FROMvisitINNERJOIN visitscreenspecialdiseaseON visit.pcucode=
visitscreenspecialdisease.pcucode ANDvisit.visitno=visitscreenspecialdisease.visitno
INNERJOIN personON visit.pcucode =person.pcucodepersonANDvisit.pid=person.pid
where visit.visitdatebetween'2012-10-01'and'2014-09-30'
and concat(person.pid,person.pcucodeperson)notin(select
concat(persondeath.pid,persondeath.pcucodeperson)
frompersondeathwhere deaddate<=visit.visitdateordeaddate isnotnull)
and codescreen='c01' andperson.typelive in('1','3')#andperson.sex='2'
groupby GMonth
orderby 'ปี'
จานวนผู้ป่วยโรคเรื้อรังจาแนกตามเพศและกลุ่มอายุ
==========================================================================
=======
select cdiseasechronic.groupname asgrname,
case whenperson.sex ='1' then'ชาย'whenperson.sex ='2' then'หญิง'else'ไม่ระบุ'end asgrsex,
sum(case whenGetAgeYearNum(person.birth,'2013-10-01') <15andperson.typelive in('1','3') then1
else '' end) as'<15ปี',
sum(case whenGetAgeYearNum(person.birth,'2013-10-01') between 15and34 and person.typelive
in('1','3') then 1 else '' end) as'15-34ปี',
sum(case whenGetAgeYearNum(person.birth,'2013-10-01') between 35and59 and person.typelive
in('1','3') then 1 else '' end) as'35-59ปี',
sum(case whenGetAgeYearNum(person.birth,'2013-10-01') >=60 and person.typelivein('1','3') then
1 else '' end) as '>60ปี'
from
personchronicinnerjoinpersononpersonchronic.pcucodeperson=person.pcucodeperson
andpersonchronic.pid=person.pid
innerjoincdiseaseonpersonchronic.chroniccode =cdisease.diseasecode
innerjoincdiseasechroniconcdisease.codechronic=cdiseasechronic.groupcode
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
91
where concat(person.pid,person.pcucodeperson)notin(select
concat(persondeath.pid,persondeath.pcucodeperson)
frompersondeathwhere deaddate<=curdate()ordeaddate isnotnull)
groupby grname,grsex
ถ้าต้องการแค่โรคHTDM ให้เพิ่มCode and cdiseasechronic.groupcode in('01','10')
ต่อจาก or deaddate isnotnull) บรรทัดรองสุดท้าย
จานวนประชากร1+3และ กลุ่มอายุตามKPI57แยกรายหมู่
========================================================================
selecthouse.villcode asvillcode
,count(person.pid) as'total'
,sum(case whenperson.typelive='1'then1else 0end) as'1'
,sum(case whenperson.typelive='2'then1else 0end) as'2'
,sum(case whenperson.typelive='3'then1else 0end) as'3'
,sum(case whenperson.typelive='4'then1else 0end) as'4'
,sum(case whenperson.typelive in('1','3') then1else 0end) as '1+3'
,sum(case when GetAgeYearNum(person.birth,'2013-10-01') <5 andperson.typelive in('1','3') THEN 1
ELSE '' END) AS'0-5ปี'
,sum(case whenGetAgeYearNum(person.birth,'2013-10-01') between 5and14 and person.typelive in
('1','3') THEN 1 ELSE '' END) AS'5-14ปี'
,sum(case whenGetAgeYearNum(person.birth,'2013-10-01') between 15and21 andperson.typelive
in('1','3') THEN 1 ELSE '' END) AS '15-21ปี'
,sum(case whenGetAgeYearNum(person.birth,'2013-10-01') between 22and59 andperson.typelive
in('1','3') THEN 1 ELSE '' END) AS '22-59ปี'
,sum(case whenGetAgeYearNum(person.birth,'2013-10-01') >=60 and person.typelive in('1','3')
THEN 1 ELSE '' END) AS '60ปี'
frompersoninnerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =
house.hcode
where concat(person.pid,person.pcucodeperson)notin(select
concat(persondeath.pid,persondeath.pcucodeperson)
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
92
frompersondeathwhere deaddate<=curdate()ordeaddate isnotnull)
groupby villcode
จานวนผู้พิการแยกตามลักษณะความพิการ
==========================================================================
=======
SELECT cpersonincomplete.incompletename as'ลักษณะความพิการ',
count(person.pid)as'พิการ'
FROM
personINNERJOIN personunableON person.pcucodeperson=personunable.pcucodeperson
ANDperson.pid=personunable.pid
INNERJOIN personunable1type ON personunable.pcucodeperson=
personunable1type.pcucodeperson
ANDpersonunable.pid=personunable1type.pid
INNERJOIN cpersonincompleteON personunable1type.typecode =
cpersonincomplete.incompletecode
innerjoinhouse onperson.hcode=house.hcodeandperson.pcucodeperson=house.pcucode
innerjoinvillageonhouse.villcode =village.villcodeandhouse.pcucode =village.pcucode
ANDperson.pid=personunable.pid
where concat(person.pid,person.pcucodeperson)notin(select
concat(persondeath.pid,persondeath.pcucodeperson)
frompersondeathwhere deaddate<=curdate()ordeaddate isnotnull) and
SUBSTRING(house.villcode,7,2)<>'00'
and person.typelivein('1','3')
groupby incompletename
คัดกรองมะเร็งเต้านมและมะเร็งปากมดลูก
==========================================================================
=======
SELECT
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
93
case whenmonth(visitlabcancer.datecheck)=1then'มกราคม'
whenmonth(visitlabcancer.datecheck)=2then'กุมภาพันธ์'
whenmonth(visitlabcancer.datecheck)=3then'มีนาคม'
whenmonth(visitlabcancer.datecheck)=4then'เมษายน'
whenmonth(visitlabcancer.datecheck)=5then'พฤษภาคม'
whenmonth(visitlabcancer.datecheck)=6then'มิถุนายน'
whenmonth(visitlabcancer.datecheck)=7then'กรกฎาคม'
whenmonth(visitlabcancer.datecheck)=8then'สิงหาคม'
whenmonth(visitlabcancer.datecheck)=9then'กันยายน'
whenmonth(visitlabcancer.datecheck)=10then'ตุลาคม'
whenmonth(visitlabcancer.datecheck)=11then'พฤศจิกายน'
whenmonth(visitlabcancer.datecheck)=12then'ธันวาคม'elsenull endas'GroupMonth',
year(visitlabcancer.datecheck) as'ปี',
sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='1' then1 else null
end) as 'คัดกรองเต้านม',
sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='1'and
visitlabcancer.result='1' then1 else null end) as'พบผิดปกติ',
sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='1'and
visitlabcancer.result='2' then1 else null end) as'พบเซลล์มะเร็ง',
sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='2' then1 else null
end) as 'Papsmear',
sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='2'and
visitlabcancer.result='1' then1 else null end) as'ผิดปกติCAT II',
sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='2'and
visitlabcancer.result='2' then1 else null end) as'ผิดปกติCAT III,IV',
sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='2'and
visitlabcancer.result='9' then1 else null end) as'ผิดปกติไม่ใช่มะเร็ง'
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
94
FROM
visitlabcancer INNERJOIN person ON visitlabcancer.pcucodeperson=person.pcucodepersonAND
visitlabcancer.pid=person.pid
where getAgeYearNum(birth,visitlabcancer.datecheck) between'30'and'60'and sex = '2' and
visitlabcancer.datecheckbetween'2013-10-01'and'2014-09-30'
and person.typelivein('1','3') andperson.dischargetype !='1'
groupby GroupMonth
orderby 'ปี' ;
จานวนการให้หัตถการ
==========================================================================
=======selectdrugname,count(distinctvisit.pcucode,visit.pid) as'คน',count(visitdrug.unit)as'ครั้ง'
from
visitleftjoinvisitdrugonvisit.visitno=visitdrug.visitnoandvisit.pcucode=visitdrug.pcucode
leftjoincdrugon visitdrug.drugcode =cdrug.drugcode
where cdrug.drugtype='02'andcdrug.drugtypesub='3' and visit.visitdate between'2013-07-01'and
'2014-10-31'
groupby cdrug.drugcode
Code จานวนกลุ่มเป้าหมายตามกลุ่มอายุ
==========================================================================
=======
SELECT house.villcode,
SUM(CASE WHEN person.typelivein('1','3') ANDROUND(DATEDIFF('2013-10-01',person.birth)/30)<=
35.99 THEN 1 ELSE '' END) AS '0-2ปี',
SUM(CASE WHEN person.typelivein('1','3') ANDROUND(DATEDIFF('2013-10-01',person.birth)/30)<=
47.99 THEN 1 ELSE '' END) AS '0-3ปี',
SUM(CASE WHEN person.typelivein('1','3') ANDROUND(DATEDIFF('2013-10-01',person.birth)/30)
BETWEEN 36 AND 71.99 THEN 1 ELSE '' END) AS '3-5ปี',
SUM(CASE WHEN person.typelivein('1','3') ANDROUND(DATEDIFF('2013-10-01',person.birth)/30)
BETWEEN 72 AND 143.99THEN 1 ELSE '' END) AS'6-12ปี',
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
95
SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') >=15
THEN 1 ELSE '' END) AS '15ปีขึ้นไป',
SUM(CASE WHEN person.sex='2'ANDperson.typelive IN ('1','3') AND
GetAgeYearNum(person.birth,'2013-10-01') BETWEEN 30 AND59 THEN 1 ELSE '' END) AS'หญิง30-
60ปี',
SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') >=60
THEN 1 ELSE '' END) AS '60ปีขึ้นไป',
SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01')
between 15and34 THEN 1 ELSE '' END) AS '15_34',
SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01')
between 35and59 THEN 1 ELSE '' END) AS '35_59'
FROMperson
INNERJOIN house ON person.pcucodeperson=house.pcucode
ANDperson.hcode =house.hcode
INNERJOIN village ON house.pcucode =village.pcucode
ANDvillage.villcode =house.villcode
WHERE (person.dischargetypeisnull orperson.dischargetype= 9) and
SUBSTRING(house.villcode,7,2)!='00'
GROUP BY house.villcode;
Code ประชากรจาแนกตามTypearea
==========================================================================
=======
select
sum(case whenperson.typelive='1'then1else 0end) as '1=มีชื่อและอาศัยอยู่จริง'
,sum(case whenperson.typelive='2'then1else 0end) as'2=มีชื่อฯแต่ไม่อยู่จริง'
,sum(case whenperson.typelive='3'then1else 0end) as'3=ไม่มีชื่อฯแต่อยู่จริง'
,sum(case whenperson.typelive='4'then1else 0end) as'4=คนนอกเขตมารับบริการ'
fromperson
innerjoinhouse onperson.hcode=house.hcodeandperson.pcucodeperson=house.pcucode
and concat(person.pid,person.pcucodeperson)
not in(selectconcat(persondeath.pid,persondeath.pcucodeperson)
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
96
frompersondeath
where deaddate<=curdate() ordeaddate isnotnull)
จานวนผู้พิการแยกรายหมู่
==========================================================================
=======
SELECT village.villcode,villname,count(person.pid)as'พิการ'
FROM
personINNERJOIN personunable ON person.pcucodeperson=personunable.pcucodeperson
innerjoinhouse onperson.hcode=house.hcodeandperson.pcucodeperson=house.pcucode
innerjoinvillageonhouse.villcode =village.villcodeandhouse.pcucode =village.pcucode
ANDperson.pid=personunable.pid
where concat(person.pid,person.pcucodeperson)notin
(selectconcat(persondeath.pid,persondeath.pcucodeperson)
frompersondeathwhere deaddate<=curdate()ordeaddate isnotnull) and
SUBSTRING(house.villcode,7,2)<>'00'
and person.typelivein('1','3')
groupby village.villcode;
พฤติกรรมสุขภาพ
==========================================================================
=======
select
village.villcode,villname
,sum(case whenciga= 0 then1 else 0end) as 'ไม่สูบ'
,sum(case whenciga= 1 then1 else 0end) as 'สูบนานๆครั้ง'
,sum(case whenciga= 2 then1 else 0end) as 'สูบประจา'
,sum(case whenwisky=0then1 else 0 end) as'ไม่ดื่ม'
,sum(case whenwisky=1then1else 0end) as 'ดื่มนานๆครั้ง'
,sum(case whenwisky=2then1 else 0 end) as'1-2ครั้งต่อเดือน'
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
97
,sum(case whenwisky=3then1 else 0 end) as'1-2ครั้งต่อสัปดาห์'
,sum(case whenwisky=4then1 else 0 end) as'3-4ครั้งต่อสัปดาห์'
,sum(case whenwisky=5then1 else 0 end) as'ดื่มทุกวัน'
,sum(case whenexercise=0 then1 else 0end) as 'ไม่ออกกาลังกาย'
,sum(case whenexercise=1 then1 else 0end) as 'ออก<3วัน'
,sum(case whenexercise=2 then1 else 0end) as 'ออก 3-5วัน'
,sum(case whenexercise=3 then1 else 0end) as 'ออก>5วัน'
frompersonleftjoinpersonbehavioronperson.pid=personbehavior.pidand
person.pcucodeperson=personbehavior.pcucodeperson
leftjoinhouse onperson.hcode=house.hcode andperson.pcucodeperson=house.pcucode
leftjoinvillageon house.villcode =village.villcodeandhouse.pcucode =village.pcucode
where substring(house.villcode,7,2)!='00'
and GetAgeYearNum(person.birth,curdate()) between'15'and'19'
and concat(person.pid,person.pcucodeperson) notin(select
concat(persondeath.pid,persondeath.pcucodeperson) frompersondeathwhere
persondeath.pcucodeperson=person.pcucodepersonand(persondeath.deaddate isnull or
persondeath.deaddate<=curdate()))
groupby village.villcode;
ตรวจสอบการคัดกรองNCDในคนตายและTypeareaไม่ใช่ 1+3
==========================================================================
=======
select
person.pidaspid,
concat(ctitle.titlename,person.fname,' ',person.lname)aspname,
age_year,
person.idcardaspcid,
person.typeliveas'สถานะการอยู่อาศัย',
case whenperson.dischargetype ='1' then'ตาย'whenperson.dischargetype ='2'then
'ย้ายออกนอกเขต'whenperson.dischargetype='3'then'สุญหาย'
whenperson.dischargetype ='9'then'ยังไม่จาหน่าย'elsenull endas'สาเหตุจาหน่าย',
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
98
person.hnomoi ashno,
person.mumoi asmu,
DATE_FORMAT(screen_date,'%Y-%m-%d') asscreen_date
from
ncd_person_ncd_screeninnerjoinpersononncd_person_ncd_screen.pid=person.pid
innerjoinctitle onperson.prename=ctitle.titlecode
innerjoinncd_person onncd_person_ncd_screen.pcucode =ncd_person.pcucodeand
ncd_person_ncd_screen.pid=ncd_person.pid
where
age_year>= '15' and ncd_person_ncd_screen.screen_datebetween'2013-10-01'and '2014-
09-30' and (person.typelive notin('1','3') or person.dischargetype ='1')
groupby person.pid
orderby ncd_person.village;
ตรวจสอบการให้รหัสสมุนไพรที่ไม่ขึ้นต้นด้วย41และ42
==========================================================================
=======
selectdrugcode ,drugname,drugcode24,drugtype
fromcdrug
where drugtype ='10' anddrugflag= '1'
and cdrug.drugcode24notLike '41%'and cdrug.drugcode24notLike '42%';
ตรวจสอบการจาหน่ายตายในChronic
==========================================================================
=======
select
concat(ctitle.titlename,person.fname,'',person.lname,'','(',convert(person.pidusingutf8),')')as'ชื่อ-
สกุล',
person.idcardaspidcard,
person.hnomoias'บ้านเลขที่',
person.mumoi as'หมู่',
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
99
person.typelive as'สถานะการอยู่อาศัย',
case whenperson.dischargetype ='1' then'ตาย' whenperson.dischargetype='2'then
'ย้ายออกนอกเขต'whenperson.dischargetype='3'then'สุญหาย'
whenperson.dischargetype ='9'then'ยังไม่จาหน่าย'else nullendAS'สาเหตุจาหน่าย',
persondeath.deaddate as'วันที่ตาย',
personchronic.chroniccodeas'รหัสเรื้อรัง',
personchronic.typedischartas'สาเหตุจาหน่ายเรื้อรัง'
from
personinnerjoinctitle onperson.prename=ctitle.titlecode
innerjoinpersonchroniconperson.pcucodeperson =personchronic.pcucodeperson
and person.pid=personchronic.pid
innerjoinpersondeathonperson.pcucodeperson=persondeath.pcucodeperson
and person.pid=persondeath.pid
where personchronic.typedischart!='02';
====================================
รัน code ตรวจสอบว่าใครที่เราบันทึกวิธีการตรวจผิดใครที่พบว่าเป็นกลุ่มเสี่ยงแต่เราเอามาบันทึกก่อน***
SELECT n.pid,n.screen_date,n.bstest,n.bsl FROMncd_person_ncd_screenn
where n.screen_date between'2015-10-01'and'2016-09-30'and (bstest<> '3' or n.bsl between'100'
and '125')
====================================
รายชื่อกลุ่มเป้าหมายคัดกรองพัฒนาการเด็กปฐมวัยช่วงอายุ9,18,30,และ42เดือน
*** แก้ไขช่วงวันที่ในแต่ละเดือนที่รันcode โดยกาหนดเป็น'yyyy-mm-dd'*** ตัวหนังสือสีแดง
select
person.pidaspid,
concat(ctitle.titlename,person.fname,'',person.lname)aspname,
person.birthaspbirth,
GetAgeymd(person.birth,'2015-12-01')asage,
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
100
person.idcardasidcard,
person.hnomoiashno,
village.villnoasvillno,
case whenGetAgemonth(person.birth,'2015-12-01')='9'then"/"else '' endas '9เดือน',
case whenGetAgemonth(person.birth,'2015-12-01')='18'then"/"else '' endas '18เดือน',
case whenGetAgemonth(person.birth,'2015-12-01')='30'then"/"else '' endas '30เดือน',
case whenGetAgemonth(person.birth,'2015-12-01')='42'then"/"else '' endas '42เดือน'
frompersoninnerjoinctitle onperson.prename =ctitle.titlecode
innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode
innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode
where person.typelive in('1','3') andperson.pidnotin(selectpersondeath.pidfrom
persondeath)andsubstring(house.villcode,7,2)<>'00'
and GetAgemonth(person.birth,'2015-12-01') in('9','18','30','42')
orderby villno
==================================
reportผลการคัดกรองNCD59
เงื่อนไข
1. หากป่วยความดันผลการคัดกรองHTจะว่าง
2. หากป่วยเบาหวานผลการคัดกรองDMจะว่างแต่ถ้าคุณบันทึกค่าน้าตาลในผู้ป่วยเบาหวาน
ผลการคัดกรองจะออกมาเสมอ
3. ผลการคัดกรองDMจะออกก็ต่อเมื่อเลือกวิธีการตรวจเป็น3. DTX(อดอาหาร)
4. กลุ่มเป้าหมายอายุ35 ปีขึ้นไปทุกคนยกเว้นกลุ่มป่วยสองโรค
select
person.pidaspid,
concat(ctitle.titlename,person.fname,'',person.lname)aspname,
date_format(person.birth,'%d/%m/%Y') aspbirth,
GetAgeYearNum(person.birth,'2015-10-01')asage,
person.idcardasidcard,
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
101
person.hnomoiashno,
village.villnoasvillno,
case when(pcht.chroniccodeisnotnull andpcdm.chroniccode isnull )then'1'else '' endas 'ป่วยht',
case when(pcdm.chroniccode isnotnull and pcht.chroniccode isnull )then'1'else '' endas 'ป่วยdm',
n.screen_date,n.height,n.weight,n.waist,n.hbp_s1,n.hbp_d1,n.bsl,n.bmi,
case whenn.bsl <'100'and n.bstest= '3'then'ปกติ' whenn.bsl between'100'and'125' andn.bstest=
'3'then'เสี่ยง' when n.bsl >='126' andn.bstest= '3'then'สงสัยว่าป่วย'else ''endas 'ผลคัดDM',
case when(n.hbp_s1<'120' or n.hbp_d1<'80')and person.pidnotin(selectperson.pidfromperson
leftjoinpersonchronicpchtonperson.pid=pcht.pidandperson.pcucodeperson =
pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10'
leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson=
pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9'
leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson
where pcht.chroniccode isnotnull andpcdm.chroniccode isnull) then'ปกติ'
when((n.hbp_s1between'120'and'139') or (n.hbp_d1between'80'and'89')) andperson.pidnotin
(selectperson.pidfrompersonleftjoinpersonchronicpchtonperson.pid=pcht.pidand
person.pcucodeperson=pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10'
leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson=
pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9'
leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson
where pcht.chroniccode isnotnull andpcdm.chroniccode isnull)then'เสี่ยง'
when((n.hbp_s1between'140'and'179') or (n.hbp_d1between'90'and'109'))andperson.pidnotin
(selectperson.pidfrompersonleftjoinpersonchronicpchtonperson.pid=pcht.pidand
person.pcucodeperson=pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10'
leftjoinpersonchronicpcdmonperson.pid =pcdm.pidandperson.pcucodeperson=
pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9'
leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson
where pcht.chroniccode isnotnull andpcdm.chroniccode isnull) then'สงสัยว่าป่วย'
when(n.hbp_s1>= '180' or n.hbp_d1>='110')andperson.pidnotin(selectperson.pidfromperson
leftjoinpersonchronicpchtonperson.pid=pcht.pidandperson.pcucodeperson=
pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10'
leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson=
pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9'
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
102
leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson
where pcht.chroniccode isnotnull andpcdm.chroniccode isnull) then'ฉุกเฉิน'else ''endas 'ผลคัดHT'
frompersoninnerjoinctitle onperson.prename =ctitle.titlecode
leftjoinpersonchronicpchtonperson.pid=pcht.pidandperson.pcucodeperson=
pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10'
leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson=
pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9'
leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson
innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode
innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode
innerjoinncd_person_ncd_screenn onperson.pid=n.pid
where person.typelive in('1','3') andperson.pidnotin(selectpersondeath.pidfrompersondeath)
and GetAgeYearNum(person.birth,'2015-10-01')>='35'and substring(house.villcode,7,2)<>'00'
and person.pidnotin(selectperson.pidfrompersonleftjoinpersonchronicpchtonperson.pid=
pcht.pidandperson.pcucodeperson=pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10'
leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson=
pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9'
leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson
where pcdm.chroniccode isnotnull andpcht.chroniccode isnotnull)
and n.screen_date between'2015-10-01'and'2016-09-30'
groupby person.pid
orderby villno,person.pid
====================================
ตรวจสอบการให้ ICD10ที่มี dxtype =01 มากกว่า1รหัส
SELECT visit.pid,v.visitno,COUNT(v.visitno) AS'จานวนซ้า',group_concat(v.diagcode) as'icdที่ให้รหัส01'
FROMvisitdiagvinnerjoinvisitonv.visitno=visit.visitno
where v.dxtype ='01' andvisit.visitdatebetween'2015-10-01'and'2016-09-30'
GROUP BY v.visitno
HAVING(COUNT(v.visitno) >1)
====================================
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
103
มาดูว่าใส่วิธีการตรวจเลือดผิดหรือไม่และบันทึกคนที่มีค่า dtx 100-125หรือไม่
SELECT * FROMncd_person_ncd_screenn
where n.screen_date between'2015-10-01'and'2016-09-30'and (bstest<> '3' or n.bsl between'100'
and '125')
================================
รายชื่อเป้าหมายncdscreen ปีงบ2559
เงื่อนไข
1. อายุ35 ปีขึ้นไป ณวันที่ 1 ตุลาคม2558
2. เฉพาะtypearea1+3
3. ระบุโรคประจาตัวให้ จะได้เลือกคัดกรองได้ถูกประเภทตัดป่วยสองโรค
================================
select
person.pidaspid,
concat(ctitle.titlename,person.fname,'',person.lname)aspname,
date_format(person.birth,'%d/%m/%Y') aspbirth,
GetAgeYearNum(person.birth,'2015-10-01')asage,
person.idcardasidcard,
person.hnomoiashno,
village.villnoasvillno,
case when(pcht.chroniccodeisnotnull andpcdm.chroniccode isnull )then'1'else '' endas 'ป่วยht',
case when(pcdm.chroniccode isnotnull andpcht.chroniccode isnull )then'1'else '' endas 'ป่วยdm'
frompersoninnerjoinctitle onperson.prename =ctitle.titlecode
leftjoinpersonchronicpchtonperson.pid=pcht.pidandperson.pcucodeperson=
pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10'
leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson=
pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9'
leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson
innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode
innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
104
where person.typelive in('1','3') andperson.pidnotin(selectpersondeath.pidfrompersondeath)
and GetAgeYearNum(person.birth,'2015-10-01')>='35'and substring(house.villcode,7,2)<>'00'
and person.pidnotin(select person.pidfrompersonleftjoinpersonchronicpchtonperson.pid=
pcht.pidandperson.pcucodeperson=pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10'
leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson=
pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9'
leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson
where pcdm.chroniccode isnotnull andpcht.chroniccode isnotnull)
groupby person.pid
orderby villno,person.pid
ตรวจสอบให้รหัสวัคซีนMMR 2 ขวบครึ่งผิด
================================
SELECT person.pid,
concat(ctitle.titlename,person.fname,'',person.lname)aspname,
person.birthasbirth,
getageymd(person.birth,CURDATE()) asage,
person.hnomoi,person.mumoi,
max(CASEWHEN person.typelive in('1','3') ANDperson.birthbetween'2011-10-01'and'2012-07-15'
and visitepi.vaccinecode ='MMR'THEN visitepi.dateepi ELSE'' END) AS'MMR',
max(CASEWHEN person.typelive in('1','3') ANDperson.birthbetween'2011-10-01'and'2012-07-15'
and visitepi.vaccinecode ='MMR2'THEN visitepi.dateepi ELSE'' END) AS 'MMR2'
FROMpersonINNERJOIN visitepi ON person.pcucodeperson=visitepi.pcucodepersonAND
person.pid=visitepi.pid
innerjoinctitle onperson.prename =ctitle.titlecode
INNERJOIN house ON person.pcucodeperson=house.pcucode
ANDperson.hcode =house.hcode
INNERJOIN village ON house.pcucode =village.pcucode
ANDvillage.villcode =house.villcode
WHERE (person.dischargetypeisnull orperson.dischargetype= 9) and
SUBSTRING(house.villcode,7,2)!='00'
and person.typelivein('1','3') ANDperson.birthbetween'2011-10-01'and'2012-07-15'
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
105
and visitepi.dateepi between'2014-09-01'and'2015-09-30'
groupby person.pid
orderby house.villcode
ข้อมูลการใช้ยาของรพ.สต.
===========================
selectcount(distinctvisit.visitno)as'จานวนคนรับยา',
cdrug.drugname,sum(visitdrug.unit) 'total',
sum(visitdrug.unit*visitdrug.costprice)as'รวมบาท'
fromvisitdruginnerjoinvisitonvisitdrug.visitno=visit.visitno
innerjoincdrugon visitdrug.drugcode =cdrug.drugcode
where visit.visitdatebetween'2013-10-01'and'2014-09-30'and cdrug.drugtype <>'02'
groupby cdrug.drugname orderbytotal desc
รายชื่อกลุ่มเป้าหมายไม่ได้รับการคัดกรองเต้านม
======================================
selectp.pid,
concat(ctitle.titlename,p.fname,'',p.lname)aspname,
p.birthas birth,
GetAgeYearNum(p.birth,'2014-10-01') as'อายุ',
p.idcardas idcard,
p.hnomoi,
SUBSTRING(house.villcode,7,2)asmoo
from
personp
innerjoinctitle onp.prename =ctitle.titlecode
innerjoinhouse onp.pcucodeperson=house.pcucodeandp.hcode =house.hcode
where p.sex ='2' andCONCAT(p.pid,p.pcucodeperson) NOTIN (select
CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath)
and p.pidNOTIN (select visit.pidfromvisitinnerjoinvisitdiagonvisit.visitno=visitdiag.visitno
where visit.visitdatebetween'2014-10-01'and'2015-09-30'and visitdiag.diagcode ='Z12.3')
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
106
and SUBSTRING(house.villcode,7,2)<>'00' andp.typelivein('1','3') and
GetAgeYearNum(p.birth,'2014-10-01') between'30'and'70'
groupby p.pid
orderby house.villcode
code ดึงจานวนผู้สูงอายุผู้พิการผู้ป่วย NCDแยกตามสภาพปัญหารายหมู่
=================================
select*from(selectvillage.villname,
sum(case when concat(person.pcucodeperson,person.pid)in(select
concat(personunable.pcucodeperson,personunable.pid)
frompersonunable ) then'1'else ''end) as'พิการ',
sum(case whenconcat(person.pcucodeperson,person.pid)in(select
concat(personunable.pcucodeperson,personunable.pid)
frompersonunable )andperson.candobedhomesocial='1' then'1' else '' end) as 'พิการกลุ่ม1',
sum(case whenconcat(person.pcucodeperson,person.pid)in(select
concat(personunable.pcucodeperson,personunable.pid)
frompersonunable )andperson.candobedhomesocial='2' then'1' else '' end) as 'พิการกลุ่ม2',
sum(case whenconcat(person.pcucodeperson,person.pid)in(select
concat(personunable.pcucodeperson,personunable.pid)
frompersonunable )andperson.candobedhomesocial='3' then'1' else '' end) as 'พิการกลุ่ม3',
sum(case whenconcat(person.pcucodeperson,person.pid) in(select
concat(personchronic.pcucodeperson,personchronic.pid)
frompersonchronicwhere personchronic.typedischart='03') then'1' else '' end) as'NCD',
sum(case whenconcat(person.pcucodeperson,person.pid) in(select
concat(personchronic.pcucodeperson,personchronic.pid)
frompersonchronicwhere personchronic.typedischart='03')andperson.candobedhomesocial ='1'
then'1' else ''end) as 'NCDกลุ่ม1',
sum(case whenconcat(person.pcucodeperson,person.pid) in(select
concat(personchronic.pcucodeperson,personchronic.pid)
frompersonchronicwhere personchronic.typedischart='03')andperson.candobedhomesocial ='2'
then'1' else ''end) as 'NCDกลุ่ม2',
sum(case whenconcat(person.pcucodeperson,person.pid) in(select
concat(personchronic.pcucodeperson,personchronic.pid)
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
107
frompersonchronicwhere personchronic.typedischart='03')andperson.candobedhomesocial ='3'
then'1' else ''end) as 'NCDกลุ่ม3',
sum(case whengetAgeYearNum(person.birth,'2014-10-01')>=60then'1'else ''end) as 'Old',
sum(case whengetAgeYearNum(person.birth,'2014-10-01')>=60andperson.candobedhomesocial =
'1' then'1' else '' end) as 'Oldกลุ่ม1',
sum(case whengetAgeYearNum(person.birth,'2014-10-01')>=60andperson.candobedhomesocial =
'2' then'1' else '' end) as 'Oldกลุ่ม2',
sum(case whengetAgeYearNum(person.birth,'2014-10-01')>=60andperson.candobedhomesocial =
'3' then'1' else '' end) as 'Oldกลุ่ม3'
frompersoninnerjoinctitle onperson.prename =ctitle.titlecode
innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode
innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode
leftjoinuseronhouse.usernamedoc=user.username
where person.typelive IN ('1','3')andperson.pidnotin(selectpersondeath.pidfrom
persondeath)andsubstring(house.villcode,7,2)<>'00'
groupby village.villcode
)as orderp
code ดึงรายชื่อผู้สูงอายุผู้พิการผู้ป่วย NCDตามสภาพปัญหา
===========================================
select*from(selectperson.idcard,
concat(ctitle.titlename,person.fname,'',person.lname)as'ชื่อ-สกุล',
GetAgeYearNum(person.birth,current_date)as'อายุ',
house.hnoas'บ้านเลขที่',
right(house.villcode,2)as'หมู่ที่',
case whenconcat(person.pcucodeperson,person.pid)in(select
concat(personunable.pcucodeperson,personunable.pid)
frompersonunable ) then'/'else ''endas 'Disabl',
case whenconcat(person.pcucodeperson,person.pid) in(select
concat(personchronic.pcucodeperson,personchronic.pid)
frompersonchronicwhere personchronic.typedischart='03') then'/' else ''endas 'NCD',
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
108
case whengetAgeYearNum(person.birth,'2014-10-01')>=60then'/'else '' endas 'Old',
case whenperson.candobedhomesocial='1' then'/' else '' endas 'กลุ่ม1',
case whenperson.candobedhomesocial='2' then'/' else '' endas 'กลุ่ม2',
case whenperson.candobedhomesocial='3' then'/' else '' endas 'กลุ่ม3'
frompersoninnerjoinctitle onperson.prename =ctitle.titlecode
innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode
innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode
where person.typelive IN ('1','3')andperson.pidnotin(selectpersondeath.pidfrom
persondeath)andsubstring(house.villcode,7,2)<>'00'
groupby person.pid
orderby house.villcode)asorderp
where orderp.Disabl='/'or orderp.NCD='/'or orderp.old='/'
สรุปจานวนการคัดกรองแยกกลุ่มอายุให้เปลี่ยนวันเริ่มต้นและสิ้นสุดการตัดรายงานตัวหนังสือสีแดง
===================================================
SELECT
CASE WHEN hbp_s1 <'120' and hbp_d1<'80' and bsl < '100' THEN 'ปกติ'
WHEN hbp_s1 <'120' andhbp_d1 <'80' and bsl >= '100' THEN 'เสี่ยงDM'
WHEN (hbp_s1>= '120' or hbp_d1>= '80') and bsl < '100' THEN 'เสี่ยงHT'
WHEN (hbp_s1>= '120' or hbp_d1>= '80') and bsl >= '100' THEN 'เสี่ยงDM&HT' ELSE '' END AS
levelrisk,
CASE WHEN age_yearbetween'35'and'59' THEN '35-59ปี'
WHEN age_year>='60' THEN '>60ปี' ELSE '' END ASgage,
count(distinctncd_person_ncd_screen.pid) as ผลงาน
FROM
ncd_person_ncd_screenINNERJOIN personON ncd_person_ncd_screen.pid=person.pid
INNERJOIN ncd_person ON ncd_person_ncd_screen.pcucode =ncd_person.pcucodeAND
ncd_person_ncd_screen.pid=ncd_person.pid
WHERE age_year>= '35' and ncd_person_ncd_screen.screen_datebetween'2014-10-01'and'2015-
01-31' and concat(ncd_person_ncd_screen.pid,ncd_person_ncd_screen.pcucode) notin
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
109
(selectconcat(ncd_person_ncd_hist.pid,ncd_person_ncd_hist.pcucode)from ncd_person_ncd_hist)
and SUBSTRING(ncd_person.village,7,2)<>'00'
groupby levelrisk,gage
รายชื่อคัดกรองพร้อมผลการคัดกรองให้เปลี่ยนวันเริ่มต้นและสิ้นสุดการตัดรายงานตัวหนังสือสีแดง
=========================================================================
select
person.pidaspid,
concat(ctitle.titlename,person.fname,' ',person.lname)aspname,
age_year,
person.idcardaspcid,
person.sex assex,
person.hnomoiashno,
person.mumoi asmu,
hbp_s1,hbp_d1,bsl,
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
110
DATE_FORMAT(screen_date,'%Y-%m-%d') asscreen_date,
max(case whenhbp_s1 <'120' and hbp_d1<'80' andbsl < '100' then"/" else '' end) as"ปกติ",
max(case whenhbp_s1 <'120' and hbp_d1<'80' andbsl >= '100' then"/"else '' end) as "เสี่ยงDM",
max(case when(hbp_s1>='120' or hbp_d1>= '80') and bsl < '100' then"/" else '' end) as "เสี่ยงHT",
max(case when(hbp_s1>='120' or hbp_d1>= '80') and bsl >= '100' then"/" else '' end) as
"เสี่ยงDM&HT"
from ncd_person_ncd_screeninnerjoin persononncd_person_ncd_screen.pid=person.pid
innerjoinctitle onperson.prename=ctitle.titlecode
innerjoinncd_person onncd_person_ncd_screen.pcucode =ncd_person.pcucodeand
ncd_person_ncd_screen.pid=ncd_person.pid
where
age_year>= '35' and ncd_person_ncd_screen.screen_datebetween'2014-10-01'and'2015-02-02'
and concat(ncd_person_ncd_screen.pid,ncd_person_ncd_screen.pcucode) notin
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
111
(selectconcat(ncd_person_ncd_hist.pid,ncd_person_ncd_hist.pcucode)
from ncd_person_ncd_hist) andSUBSTRING(ncd_person.village,7,2)<>'00'
groupby person.pid
orderby ncd_person.village
รายชื่อเด็ก0-60เดือน ชั่งน้าหนัก
SELECT person.pid
,ctitle.titlename
,person.fname
,person.lname
,person.hnomoi
,person.mumoi
,getAgeYearNum(person.birth,CURDATE()) AS นับอายุเป็นปี
,getagemonth(person.birth,CURDATE())AS นับอายุเป็นเดือน
FROMperson
LEFT JOIN persondeathON persondeath.pcucodeperson=person.pcucodepersonAND
persondeath.pid=person.pid
INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode
INNERJOIN ctitle ON ctitle.titlecode =person.prename
WHERE persondeath.pidISNULL
ANDgetagemonth(person.birth,CURDATE()) <=60
ANDperson.typelive IN ('0','1','3')
ORDER BY house.villcode,person.hnomoi*1;
ผลงานการคัดกรองปี 58แยกรายหมู่
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
112
selectvillage.villnoas หมู่,village.villname as ชื่อหมู่บ้าน,count(distinctperson.pid) as เป้า,
count(distinctsc.pid) as ผลงาน,concat(round(count(distinctsc.pid)*100/count(distinct
person.pid),2),'%') as เปอรเซ็น ,count(distinctcase whengetAgeYearNum(birth,'20141001') between
35 and 59 thenperson.pidelse nullend) as"เป้า35-59",count(distinctcase when
getAgeYearNum(birth,'20141001') between 35and59 andsc.pidis notnull thenperson.pidelse null
end) as ผลงาน,concat(round(count(distinctcase whengetAgeYearNum(birth,'20141001') between 35
and 59 andsc.pidis notnull thenperson.pidelse nullend)*100/count(distinctcase when
getAgeYearNum(birth,'20141001') between 35and59 thenperson.pidelse nullend),2),'%') as"%35-
59",count(distinctcase whengetAgeYearNum(birth,'20141001') >=60 thenperson.pidelse null end)
as "เป้า>= 60" ,count(distinctcase whengetAgeYearNum(birth,'20141001') >=60and sc.pidisnot null
thenperson.pidelse null end) as ผลงาน,concat(round(count(distinctcase when
getAgeYearNum(birth,'20141001') >=60 and sc.pidisnotnull thenperson.pidelse nullend)*100/
count(distinctcase whengetAgeYearNum(birth,'20141001') >=60 thenperson.pidelse nullend),2),'
%') as "%>= 60"from personleftjoinncdpersonscreenall sconperson.pid=sc.pidand
person.pcucodeperson=sc.pcucode andsc.screen_date between'20141001'and'20150930'inner
joinhouse onperson.hcode =house.hcodeandperson.pcucodeperson=house.pcucode innerjoin
village onhouse.villcode=village.villcode andvillno<>'00' where
getAgeYearNum(birth,'20141001')>='35'and person.typelivein('0','1','3') andperson.dischargetype
<> 1 and person.pidnotin (selectpidfrompersonchronicwhere (personchronic.chroniccode='I10'or
personchronic.chroniccodebetween'E10'and 'E15')) group byvillno,villname unionselect'' as
หมู่,'รวม' as ชื่อหมู่บ้าน,count(distinctperson.pid) as เป้า,count(distinctsc.pid)as
ผลงาน,concat(round(count(distinctsc.pid)*100/count(distinctperson.pid),2),'%') as เปอรเซ็น
,count(distinctcase whengetAgeYearNum(birth,'20141001') between 35and59thenperson.pidelse
null end) as"เป้า35-59",count(distinctcase whengetAgeYearNum(birth,'20141001') between 35and
59 and sc.pidisnot null thenperson.pidelsenull end) as ผลงาน,concat(round(count(distinctcase
whengetAgeYearNum(birth,'20141001') between 35and59 and sc.pidisnot null thenperson.pid
else null end)*100/count(distinctcase whengetAgeYearNum(birth,'20141001') between 35and59
thenperson.pidelse null end),2),'%') as"%35-59",count(distinctcase when
getAgeYearNum(birth,'20141001') >=60 thenperson.pidelse nullend) as"เป้า>=60" ,count(distinct
case whengetAgeYearNum(birth,'20141001') >=60 and sc.pidisnot null thenperson.pidelsenull
end) as ผลงาน,concat(round(count(distinctcase whengetAgeYearNum(birth,'20141001') >=60 and
sc.pidisnot null thenperson.pidelsenull end)*100/count(distinctcase when
getAgeYearNum(birth,'20141001') >=60 thenperson.pidelse nullend),2),'%') as"%>= 60" from
personleftjoinncdpersonscreenall sconperson.pid=sc.pidandperson.pcucodeperson=
sc.pcucode andsc.screen_date between'20141001'and'20150930'innerjoinhouse onperson.hcode
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
113
= house.hcode andperson.pcucodeperson=house.pcucode innerjoinvillageonhouse.villcode=
village.villcode andvillno<>'00' where getAgeYearNum(birth,'20141001')>=35and person.typelive
in('1','3') andperson.dischargetype<>1 and person.pidnotin(selectpidfrompersonchronicwhere
(personchronic.chroniccode='I10'orpersonchronic.chroniccodebetween'E10'and'E15')) group by
หมู่, ชื่อหมู่บ้าน;
กลุ่มเป้าหมายการคัดกรองต้อกระจกมากกว่า60ปี
SELECT
person.pid ASpid,
concat(ctitle.titlename,person.fname,'',person.lname)aspname,
person.birthASpbirth,
GetAgeYearNum(person.birth,CURRENT_DATE)asage,
person.idcardASpcid,
person.sex ASsex,
person.hnomoiAShno,
village.villnoASvillage_villno,
village.villnameASvillage_villname
FROM
personINNERJOIN ctitle ON person.prename =ctitle.titlecode
INNERJOIN house ON person.pcucodeperson=house.pcucode
ANDperson.hcode =house.hcode
INNERJOIN village ON house.pcucode =village.pcucode
ANDvillage.villcode =house.villcode
WHERE
person.typelive IN ('1','3')
and person.pidnotin(SELECTpersondeath.pidFROMpersondeath)
and GetAgeYearNum(person.birth,'2014-10-01')>='60'
and SUBSTRING(house.villcode,7,2)<>'00'
orderBY village.villno,person.hnomoi*1;
โค้ดรายชื่อผู้ป่วยความดันเบาหวานที่มารับบริการพร้อมค่าความดันและน้าตาลในเลือด
select
concat(ctitle.titlename,person.fname,'',person.lname)as'ชื่อ-สกุล',
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
114
GetAgeYearNum(person.birth,CURRENT_DATE)as'อายุ',
concat(person.hnomoi,'','หมู่',person.mumoi) as'ที่อยู่',
case when(pcht.chroniccodeisnotnull andpcdm.chroniccode isnull )then'1'else '' endas ht
,case when(pcdm.chroniccode isnotnull andpcht.chroniccode isnull) then'1' else '' endas dm
,case whenpcdm.chroniccode isnotnull andpcht.chroniccode isnotnull then'1'else '' endas htdm,
max(case whenmonth(visit.visitdate)=10thenvisit.pressure else ''end) as'ต.ค.',
max(case whenmonth(visit.visitdate)=11thenvisit.pressure else ''end) as'พ.ย.',
max(case whenmonth(visit.visitdate)=12thenvisit.pressure else ''end) as'ธ.ค.',
max(case whenmonth(visit.visitdate)=1thenvisit.pressure else''end) as 'ม.ค.',
max(case whenmonth(visit.visitdate)=2thenvisit.pressure else''end) as 'ก.พ.',
max(case whenmonth(visit.visitdate)=3thenvisit.pressure else''end) as 'มี.ค.',
max(case whenmonth(visit.visitdate)=4thenvisit.pressure else''end) as 'เม.ย.',
max(case whenmonth(visit.visitdate)=5thenvisit.pressure else''end) as 'พ.ค.',
max(case whenmonth(visit.visitdate)=6thenvisit.pressure else''end) as 'มิ.ย.',
max(case whenmonth(visit.visitdate)=7thenvisit.pressure else''end) as 'ก.ค.',
max(case whenmonth(visit.visitdate)=8thenvisit.pressure else''end) as 'ส.ค.',
max(case whenmonth(visit.visitdate)=9thenvisit.pressure else''end) as 'ก.ย.'
fromperson
innerjoinctitle onperson.prename =ctitle.titlecode
innerjoinhouse onperson.hcode=house.hcode andperson.pcucodeperson=house.pcucode
leftjoinvisitON person.pcucodeperson=visit.pcucodepersonand person.pid=visit.pid
leftjoinvisitdiagonvisit.visitno=visitdiag.visitno
innerjoinvillageonhouse.villcode =village.villcodeandhouse.pcucode =village.pcucode
LEFT JOIN personchronicpchtonperson.pid=pcht.pidandperson.pcucodeperson=
pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10'
LEFT JOIN personchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson=
pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9'
LEFT JOIN personchronicpconperson.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson
WHERE visit.visitdate between'2014-10-01'and'2015-09-30'
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
115
and SUBSTRING(house.villcode,7,2)<>'00'and (visitdiag.diagcode between'E10'and'E15.9' or
(visitdiag.diagcode='I10'))
and pc.cup= pc.pcucodeperson
GROUP BY pc.pid
orderBY village.villno
โค้ด ประชากรจาแนกตามกลุ่มวัย
selectvillage.villnoasvillno,village.villname asvillname
,count(person.pid) as'total'
,sum(case whenGetAgeYearNum(person.birth,'2014-10-01') <5 then1 else '' end) as'0-5ปี'
,sum(case whenGetAgeYearNum(person.birth,'2014-10-01') between 5and14 then1 else '' end) as
'5-14ปี'
,sum(case whenGetAgeYearNum(person.birth,'2014-10-01') between 15and21 then1 else ''end) as
'15-21ปี'
,sum(case whenGetAgeYearNum(person.birth,'2014-10-01') between 15and59 then1 else ''end) as
'15-59ปี'
,sum(case whenGetAgeYearNum(person.birth,'2014-10-01') >=60 then1 else '' end) as'60ปี'
,sum(case whenconcat(person.pcucodeperson,person.pid)in(select
concat(personunable.pcucodeperson,personunable.pid)frompersonunable ) then 1else '' end) as
'พิการ'
frompersoninnerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =
house.hcode
innerjoinvillageonhouse.villcode=village.villcode
where concat(person.pid,person.pcucodeperson)notin(select
concat(persondeath.pid,persondeath.pcucodeperson)
frompersondeathwhere deaddate<=curdate()ordeaddate isnotnull)
and SUBSTRING(house.villcode,7,2)<>'00'andperson.typelivein('1','3')
groupby villno,villname
โค้ดรายชื่อประชากรอายุ20-50ปี เป้าหมายการฉีดวัคซีนdt(เกิดตั้งแต่1ม.ค.08-31 ธ.ค.38)
SELECT
person.pidASpid,
concat(ctitle.titlename,person.fname,' ',person.lname)aspname,
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
116
person.birthASpbirth,
GetAgeYearNum(person.birth,CURRENT_DATE)asage,
person.idcardASpcid,
person.sex ASsex,
person.hnomoiAShno,
person.mumoi ASmu,
village.villnoASvillage_villno,
village.villnameASvillage_villname
FROM
personINNERJOIN ctitle ON person.prename =ctitle.titlecode
INNERJOIN house ON person.pcucodeperson=house.pcucode
ANDperson.hcode =house.hcode
INNERJOIN village ON house.pcucode =village.pcucode
ANDvillage.villcode =house.villcode
WHERE
person.typelive IN ('1','3')
and person.pidnotin(SELECTpersondeath.pidFROMpersondeath)
and person.birth between'1965-01-01'and'1995-12-31'
and SUBSTRING(house.villcode,7,2)<>'00'
ANDnation='99'
orderBY village.villno,person.hnomoi*1;
โค้ดรายชื่อผู้ป่วยNCDระบุสถานที่รักษา
selectp.pid
,concat(ctitle.titlename
,' ',p.fname,'',p.lname) AS'name'
,YEAR(FROM_DAYS(DATEDIFF(CURDATE(),p.birth))) as'age'
,p.idcardas CID
,house.hnoas'address'
,village.villnoAS'moo'
,GROUP_CONCAT(pc.chroniccode) as chroniccode
,case when(pcht.chroniccode isnotnull andpcdm.chroniccode isnull)then'1'else ''endas ht
,case when(pcdm.chroniccode isnotnull andpcht.chroniccode isnull) then'1' else '' endas dm
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
117
,case whenpcdm.chroniccode isnotnull andpcht.chroniccode isnotnull then'1'else '' endas htdm
,DATE_FORMAT(pcdm.datefirstdiag,'%Y-%m-%d') as'dx_first_DM'
,DATE_FORMAT(pcht.datefirstdiag,'%Y-%m-%d') as'dx_first_HT'
,pc.cupas 'hospital'
,pc.hospfirstdiagas'first_dx_hosp'
frompersonp
INNERJOIN house ON p.hcode = house.hcode ANDp.pcucodeperson=house.pcucode
INNERJOIN village ON house.villcode =village.villcode ANDhouse.pcucode =village.pcucode
LEFT JOIN ctitle ON p.prename =ctitle.titlecode
LEFT JOIN personchronicpchtonp.pid= pcht.pidandp.pcucodeperson=pcht.pcucodepersonand
trim(pcht.chroniccode) ='I10'
LEFT JOIN personchronicpcdmonp.pid= pcdm.pidandp.pcucodeperson=pcdm.pcucodeperson
and trim(pcdm.chroniccode) between'E10'and 'E15.9'
LEFT JOIN personchronicpconp.pid= pc.pidand p.pcucodeperson=pc.pcucodeperson
WHERE (pcdm.chroniccode
between'E10'and'E15.9' or pcht.chroniccode ='I10')
and right(village.villcode,2)!='00'
and p.typelive in(1,3)andpc.typedischart='03'
ANDconcat(p.pid,p.pcucodeperson)NOT IN (select
concat(persondeath.pid,persondeath.pcucodeperson)
frompersondeathwhere deaddate <=CURDATE() or deaddate isnull)
GROUP BY p.pid,ht,dmORDERBYvillage.villcode*1
โค้ดเป้าหมายงานทันตกรรม
SELECT
SUM(CASE WHEN GetAgeYearNum(person.birth,'2014-10-01') BETWEEN 0AND 2 THEN 1 ELSE null
END) AS m02,
SUM(CASE WHEN GetAgeYearNum(person.birth,'2014-10-01') BETWEEN 3AND 5 THEN 1 ELSE null
END) AS m35,
SUM(CASE WHEN GetAgeYearNum(person.birth,'2014-10-01') BETWEEN 6AND 14THEN 1 ELSE null
END) AS m614,
SUM(CASE WHEN GetAgeYearNum(person.birth,'2014-10-01') >=60THEN 1 ELSE null END) AS m60
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
118
FROM
person
LeftOuterJoinhouse ON person.hcode =house.hcode ANDhouse.pcucode =person.pcucodeperson
LeftOuterJoinvillage ON house.villcode =village.villcode ANDvillage.pcucode =house.pcucode
LeftOuterJoincright ON person.rightcode=cright.rightcode
WHERE SUBSTRING(house.villcode,7,2)<>'00'andperson.typelivein('1','3')
and CONCAT(person.pid,person.pcucodeperson) NOTIN (select
CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath)
ตรวจสอบคนที่คัดกรองNCDซ้า
selectcount(n.pid),pid
fromncd_person_ncd_screenn
where screen_date between'2014-10-01'and'2015-09-30'
groupby n.pid
havingcount(n.pid)>1
เป้าหมายการรณรงค์ฉีดวัคซีนDt58
selectvillage.villnoasvillno,village.villname asvillname,
count(distinctp.pid) aspop,
count(distinctcase whenvisitepi.vaccinecode ='Dtc' thenvisitepi.pidelse null end) as ผลงาน,
concat(round(count(distinctcase whengetAgeYearNum(p.birth,current_date)between'20'and'50'
and visitepi.vaccinecode ='Dtc' thenp.pidelse null end)*100/count(distinctcase when
getAgeYearNum(p.birth,current_date)between'20'and '50' thenp.pidelse null end),2),'%') as
'ร้อยละ'
frompersonp
innerjoinhouse onp.hcode =house.hcode andp.pcucodeperson=house.pcucode
innerjoinvillageonhouse.villcode=village.villcode andvillno<>'00'
leftjoinvisitepi onp.pcucodeperson=visitepi.pcucodepersonandp.pid=visitepi.pid
and dateepi between'2014-10-01'and'2015-09-30'
where getAgeYearNum(p.birth,current_date)between'20'and'50' and p.typelive in('1','3')
groupby villno,villname
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
119
เป้าหมายการคัดกรองปี 58ตัดกลุ่มป่วย
select
(select
count(p.pid)
from
personp
innerjoinctitle onp.prename =ctitle.titlecode
innerjoinhouse onp.pcucodeperson=house.pcucodeandp.hcode =house.hcode
where CONCAT(p.pid,p.pcucodeperson) NOTIN (select
CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath)
and SUBSTRING(house.villcode,7,2)<>'00' andp.typelivein('1','3') and
GetAgeYearNum(p.birth,'2014-10-01')>='35'
and p.pidnotin(selectpidfrompersonchronicwhere(personchronic.chroniccode='I10'or
personchronic.chroniccodebetween'E10'and 'E15.9'))) as 'ตัดกลุ่มป่วย',
(select
count(p.pid)
from
personp
innerjoinctitle onp.prename =ctitle.titlecode
innerjoinhouse onp.pcucodeperson=house.pcucodeandp.hcode =house.hcode
where CONCAT(p.pid,p.pcucodeperson) NOTIN (select
CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath)
and SUBSTRING(house.villcode,7,2)<>'00' andp.typelivein('1','3') and
GetAgeYearNum(p.birth,'2014-10-01')>='35') as'ไม่ตัดกลุ่มป่วย'
รายชื่อกลุ่มป่วยแยกรายหมู่(ตัวหนังสือสีแดงให้เปลี่ยนเป็นวดป.ที่ต้องการเรียกรายงาน)
select
concat(ctitle.titlename,ps.fname,'',ps.lname)aspname,
ps.birthasbirth,
ps.sex assex,
ps.idcardas idcard,
ps.hnomoi,
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
120
SUBSTRING(house.villcode,7,2)asmoo,
max(v.visitdate) asvdate,
v.pressure asvpressure,
substr(v.pressure,1,instr(v.pressure,"/")-1)asbps,
substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) asbpd,
max(case whenpc.chroniccode ='I10'then'HT' else ' ' end) asHT,
max(case whenpc.chroniccode between'E10'and'E15.9' then'DM' else ' ' end) as DM,
if(substr(v.pressure,1,instr(v.pressure,"/")-1)<140or
substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <90,'Green',
if(substr(v.pressure,1,instr(v.pressure,"/")-1)<160or
substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <100,'Yellow',
if(substr(v.pressure,1,instr(v.pressure,"/")-1)<180or
substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <110,'Orange
','Red'))) as'ระดับความดัน',
s.sugarnumdigitasFBS,
max(case whens.sugarnumdigit<126 then'Green'whens.sugarnumdigitbetween 126and154 then
'Yellow'whens.sugarnumdigitbetween 155and182 then'Orange'whens.sugarnumdigit>=183 then
'Red' else '' end) as'ระดับเบาหวาน',
max(case whenvisitlabchcyhembmsse.labcode ='CH99' thenvisitlabchcyhembmsse.labresultdigit
else ' ' end) as 'HbA1c',
max(case whenvisitlabchcyhembmsse.labcode ='CH99' andvisitlabchcyhembmsse.labresultdigit<7
then'Yellow'whenvisitlabchcyhembmsse.labcode ='CH99' andvisitlabchcyhembmsse.labresultdigit
< 8 then'Orange'whenvisitlabchcyhembmsse.labcode ='CH99' and
visitlabchcyhembmsse.labresultdigit>=8 then'Red' else ' ' end) as 'ระดับHbA1c'
from
personpsinnerjoinvisitvon ps.pcucodeperson=v.pcucodepersonand ps.pid=v.pid
innerjoinctitle onps.prename =ctitle.titlecode
innerjoinhouse onps.pcucodeperson=house.pcucodeandps.hcode =house.hcode
Leftjoinvisitlabsugarbloodsonv.pcucode = s.pcucode
and v.visitno=s.visitno
innerjoinpersonchronicpcon ps.pcucodeperson=pc.pcucodeperson
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
121
and ps.`pid`= pc.pid
Leftjoinvisitlabchcyhembmsse onv.pcucode =visitlabchcyhembmsse.pcucode
and v.visitno=visitlabchcyhembmsse.visitno
where v.visitdate between'2013-10-01'and'2014-09-30'
and (pc.chroniccode between'E10'and 'E15.9' or pc.chroniccode = 'I10') andv.pressure isnotnull
and CONCAT(ps.pid,ps.pcucodeperson) NOTIN (select
CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath)
and pc.cup= pc.pcucodepersonandSUBSTRING(house.villcode,7,2)<> '00'
groupby ps.pid
รายงานการตายทั้งหมดในเขตรับผิดชอบ
select
concat(ctitle.titlename,p.fname,'',p.lname)aspname,
p.birthas birth,
GetAgeYearNum(p.birth,current_date) as'อายุ',
p.idcardas idcard,
p.hnomoi,
SUBSTRING(house.villcode,7,2)asmoo,
persondeath.deadcause,cdisease.diseasenamethai,persondeath.deaddate
from
personp
innerjoinctitle onp.prename =ctitle.titlecode
innerjoinhouse onp.pcucodeperson=house.pcucodeandp.hcode =house.hcode
innerjoinpersondeathonp.pcucodeperson=persondeath.pcucodepersonandp.pid=
persondeath.pid
innerjoincdisease onpersondeath.deadcause=cdisease.diseasecode
where SUBSTRING(house.villcode,7,2)<> '00' #and p.typelive in('1','3')
groupby p.pid
orderby house.villcode
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
122
รายงาน504แยกปี (ตัวหนังสือสีแดงให้เปลี่ยนวดป.ที่ต้องการเรียกรายงาน)
selectcdisease504.group504code,cdisease504.group504name,
count(visitdiag.diagcode) asd,
sum(case when(visit.visitdate)between'2008-10-01'and'2009-09-30'then1 else null end) as'2552',
sum(case when(visit.visitdate)between'2009-10-01'and'2010-09-30'then1 else null end) as'2553',
sum(case when(visit.visitdate)between'2010-10-01'and'2011-09-30'then1 else null end) as'2554',
sum(case when(visit.visitdate)between'2011-10-01'and'2012-09-30'then1 else null end) as'2555',
sum(case when(visit.visitdate)between'2012-10-01'and'2013-09-30'then1 else null end) as'2556',
sum(case when(visit.visitdate)between'2013-10-01'and'2014-09-30'then1 else null end) as'2557'
fromvisitdiag
innerjoincdisease onvisitdiag.diagcode =cdisease.diseasecode
innerjoincdisease504oncdisease.code504=cdisease504.group504code
innerjoinvisitonvisitdiag.visitno=visit.visitno
where visit.visitdatebetween'2008-10-01'and'2014-09-30'
groupby cdisease504.group504name
orderby cdisease504.group504code
รายชื่อคนที่ไม่ได้รับการคัดกรองNCDปี 58
selectconcat(ctitle.titlename,person.fname,'',person.lname)aspname,
person.birthaspbirth,
GetAgeYearNum(person.birth,'2014-10-01')asage,
person.idcardaspcid,
person.hnomoiashno,
person.mumoi asmu
frompersoninnerjoinctitle onperson.prename =ctitle.titlecode
innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode
innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode
where person.typelive in('1','3') andGetAgeYearNum(person.birth,'2014-10-01') >='35'
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
123
and SUBSTRING(house.villcode,7,2)<>'00'andperson.pidnotin(selectncd_person_ncd_screen.pid
FROMncd_person_ncd_screenwhere ncd_person_ncd_screen.screen_datebetween'2014-10-01'
and '2015-09-30')
and CONCAT(person.pid,person.pcucodeperson) notin(select
concat(persondeath.pid,persondeath.pcucodeperson)
frompersondeathwhere persondeath.deaddate <=CURRENT_DATE)and
concat(person.pid,person.pcucodeperson)
not in(selectconcat(personchronic.pid,personchronic.pcucodeperson)frompersonchronicwhere
personchronic.chroniccodelike'E1%'or(personchronic.chroniccodelike'I1%'))
orderby village.villno
ตรวจสอบรายชื่อเด็กอายุครบ1ปี ที่บันทึกการฉีดวัคซีนไม่ครบ
select
EPI.fname,EPI.lname,EPI.birth,EPI.age,EPI.BCG,EPI.DHB1,EPI.OPV1,EPI.DHB2,EPI.OPV2,EPI.DHB3,EPI.
OPV3,EPI.MMR
,case when(EPI.DHB3andEPI.OPV3andEPI.MMR )!="0"then'com'else'notcom'end ascover
,EPI.pcucodeperson#,COUNT(DISTINCTconcat(EPI.pcucodeperson,EPI.pid))astotal
FROM
(SELECT
person.pcucodeperson,person.pid,person.birth,person.fname,person.lname,getagemonth(person.bi
rth,CURDATE() )asage
,max(case whencdrug.files18epi='010'thenvisitepi.dateepi else " 0" end)asBCG
,max(case whencdrug.files18epiin('031','091')thenvisitepi.dateepi else " 0" end)asDHB1
,max(case whencdrug.files18epiin('032','092')thenvisitepi.dateepielse" 0 " end)asDHB2
,max(case whencdrug.files18epiin('033','093')thenvisitepi.dateepielse" 0 " end)asDHB3
,max(case whencdrug.files18epi='034'thenvisitepi.dateepi else " 0" end)asDTP4
,max(case whencdrug.files18epi='035'thenvisitepi.dateepi else " 0" end)asDTP5
,max(case whencdrug.files18epi='081'thenvisitepi.dateepi else " 0" end)asOPV1
,max(case whencdrug.files18epi='082'thenvisitepi.dateepi else " 0" end)asOPV2
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
124
,max(case whencdrug.files18epi='083'thenvisitepi.dateepi else " 0" end)asOPV3
,max(case whencdrug.files18epi='084'thenvisitepi.dateepi else " 0" end)asOPV4
,max(case whencdrug.files18epi='085'thenvisitepi.dateepi else " 0" end)asOPV5
,max(case whencdrug.files18epi='061'thenvisitepi.dateepi else " 0" end)asMMR
,max(case whencdrug.files18epi='051'thenvisitepi.dateepi else "0" end)asJE1
,max(case whencdrug.files18epi='052'thenvisitepi.dateepi else " 0" end)asJE2
,max(case whencdrug.files18epi='053'thenvisitepi.dateepi else " 0" end)asJE3
FROMperson
INNERJOIN house onperson.hcode=house.hcodeAND
person.pcucodeperson=house.pcucodeperson
LEFT JOIN visitepi onperson.pid=visitepi.pidANDperson.pcucodeperson=visitepi.pcucodeperson
LEFT JOIN cdrugon visitepi.vaccinecode=cdrug.drugcode
WHERE person.typelivein('1','3')
and getagemonth(person.birth,CURDATE() ) between 12and23
GROUP BY CONCAT(person.pcucodeperson,person.pid))asEPI
WHERE EPI.MMR = 0 or EPI.DHB3=0 or EPI.OPV3=0
GROUP BY EPI.pid
ORDER BY EPI.birth
ตรวจสอบรายชื่อเด็กอายุครบ2ปี ที่บันทึกการฉีดวัคซีนไม่ครบ
selectEPI.fname,EPI.lname,EPI.birth,EPI.age,EPI.DTP4,EPI.OPV4,EPI.JE1,EPI.JE2
,case when(EPI.DTP4andEPI.OPV4andEPI.JE2)!="0" then'com'else'notcom'endascover
#whenEPI.DHB3="-" or EPI.OPV3="-"or EPI.MMR ="-"then'notcom'else ""endas cover
,EPI.pcucodeperson#,COUNT(DISTINCTconcat(EPI.pcucodeperson,EPI.pid))astotal
FROM
(SELECT
person.pcucodeperson,person.pid,person.birth,person.fname,person.lname,getagemonth(person.bi
rth,CURDATE() )asage
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
125
,max(case whencdrug.files18epi='010'thenvisitepi.dateepi else " 0" end)asBCG
,max(case whencdrug.files18epiin('031','091')thenvisitepi.dateepi else " 0" end)asDHB1
,max(case whencdrug.files18epiin('032','092')thenvisitepi.dateepielse" 0 " end)asDHB2
,max(case when cdrug.files18epiin('033','093')thenvisitepi.dateepielse" 0 " end)asDHB3
,max(case whencdrug.files18epi='034'thenvisitepi.dateepi else " 0" end)asDTP4
,max(case whencdrug.files18epi='035'thenvisitepi.dateepi else " 0" end)asDTP5
,max(case when cdrug.files18epi='081'thenvisitepi.dateepi else " 0" end)asOPV1
,max(case whencdrug.files18epi='082'thenvisitepi.dateepi else " 0" end)asOPV2
,max(case whencdrug.files18epi='083'thenvisitepi.dateepi else " 0" end)asOPV3
,max(case when cdrug.files18epi='084'thenvisitepi.dateepi else " 0" end)asOPV4
,max(case whencdrug.files18epi='085'thenvisitepi.dateepi else " 0" end)asOPV5
,max(case whencdrug.files18epi='061'thenvisitepi.dateepi else " 0" end)asMMR
,max(case whencdrug.files18epi='051'thenvisitepi.dateepi else " 0" end)asJE1
,max(case whencdrug.files18epi='052'thenvisitepi.dateepi else " 0" end)asJE2
,max(case whencdrug.files18epi='053'thenvisitepi.dateepi else " 0" end)asJE3
FROMperson
INNERJOIN house on person.hcode=house.hcodeAND
person.pcucodeperson=house.pcucodeperson
LEFT JOIN visitepi onperson.pid=visitepi.pidANDperson.pcucodeperson=visitepi.pcucodeperson
LEFT JOIN cdrugon visitepi.vaccinecode=cdrug.drugcode
WHERE person.typelivein('1','3')
and getagemonth(person.birth,CURDATE() ) between 24and35
GROUP BY CONCAT(person.pcucodeperson,person.pid))asEPI
WHERE EPI.DTP4=0 or EPI.OPV4=0or EPI.JE2=0
GROUP BY EPI.pid
ORDER BY EPI.birth
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
126
ตรวจสอบรายชื่อเด็กอายุครบ3ปี ที่บันทึกการฉีดวัคซีนไม่ครบ
selectEPI.fname,EPI.lname,EPI.birth,EPI.age,EPI.JE3
,case whenEPI.JE3!= 0 then'com'else'notcom'endascover
,EPI.pcucodeperson
FROM
(SELECT
person.pcucodeperson,person.pid,person.birth,person.fname,person.lname,getagemonth(person.bi
rth,CURDATE() )asage
,max(case whencdrug.files18epi='010'thenvisitepi.dateepi else " 0" end)asBCG
,max(case whencdrug.files18epiin('031','091')thenvisitepi.dateepi else " 0" end)asDHB1
,max(case whencdrug.files18epiin('032','092')thenvisitepi.dateepielse" 0 " end)asDHB2
,max(case whencdrug.files18epiin('033','093')thenvisitepi.dateepielse" 0 " end)asDHB3
,max(case whencdrug.files18epi='034'thenvisitepi.dateepi else " 0" end)asDTP4
,max(case whencdrug.files18epi='035'thenvisitepi.dateepi else " 0" end)asDTP5
,max(case whencdrug.files18epi='081'thenvisitepi.dateepi else " 0" end)asOPV1
,max(case whencdrug.files18epi='082'thenvisitepi.dateepi else " 0" end)asOPV2
,max(case whencdrug.files18epi='083'thenvisitepi.dateepi else " 0" end)asOPV3
,max(case whencdrug.files18epi='084'thenvisitepi.dateepi else " 0" end)asOPV4
,max(case whencdrug.files18epi='085'thenvisitepi.dateepi else " 0" end)asOPV5
,max(case whencdrug.files18epi='061'thenvisitepi.dateepi else "0" end)asMMR
,max(case whencdrug.files18epi='051'thenvisitepi.dateepi else " 0" end)asJE1
,max(case whencdrug.files18epi='052'thenvisitepi.dateepi else " 0" end)asJE2
,max(case whencdrug.files18epi='053'thenvisitepi.dateepi else " 0" end)asJE3
FROMperson
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
127
INNERJOIN house onperson.hcode=house.hcodeAND
person.pcucodeperson=house.pcucodeperson
LEFT JOIN visitepi onperson.pid=visitepi.pidANDperson.pcucodeperson=visitepi.pcucodeperson
LEFT JOIN cdrugon visitepi.vaccinecode=cdrug.drugcode
WHERE person.typelivein('1','3')
and getagemonth(person.birth,CURDATE() ) between 36and47
GROUP BY CONCAT(person.pcucodeperson,person.pid))asEPI
WHERE EPI.JE3=0
GROUP BY EPI.pid
ORDER BY EPI.birth
ตรวจสอบรายชื่อเด็กอายุครบ4ปี ที่บันทึกการฉีดวัคซีนไม่ครบ
selectEPI.fname,EPI.lname,EPI.birth,EPI.age,EPI.DTP5,EPI.OPV5
,case when(EPI.DTP5andEPI.OPV5)!=0 then'com'else'notcom'endascover
,EPI.pcucodeperson
FROM
(SELECT
person.pcucodeperson,person.pid,person.birth,person.fname,person.lname,getagemonth(person.bi
rth,CURDATE() )asage
,max(case whencdrug.files18epi='010'thenvisitepi.dateepi else " 0" end)asBCG
,max(case whencdrug.files18epiin('031','091')thenvisitepi.dateepi else "0" end)asDHB1
,max(case whencdrug.files18epiin('032','092')thenvisitepi.dateepielse" 0 " end)asDHB2
,max(case whencdrug.files18epiin('033','093')thenvisitepi.dateepielse" 0 " end)asDHB3
,max(case whencdrug.files18epi='034'thenvisitepi.dateepi else " 0" end)asDTP4
,max(case whencdrug.files18epi='035'thenvisitepi.dateepi else " 0" end)asDTP5
,max(case whencdrug.files18epi='081'thenvisitepi.dateepi else " 0" end)asOPV1
,max(case whencdrug.files18epi='082'thenvisitepi.dateepi else "0" end)asOPV2
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
128
,max(case whencdrug.files18epi='083'thenvisitepi.dateepi else " 0" end)asOPV3
,max(case whencdrug.files18epi='084'thenvisitepi.dateepi else " 0" end)asOPV4
,max(case whencdrug.files18epi='085'thenvisitepi.dateepi else " 0" end)asOPV5
,max(case whencdrug.files18epi='061'thenvisitepi.dateepi else " 0" end)asMMR
,max(case whencdrug.files18epi='051'thenvisitepi.dateepi else " 0" end)asJE1
,max(case whencdrug.files18epi='052'thenvisitepi.dateepi else "0" end)asJE2
,max(case whencdrug.files18epi='053'thenvisitepi.dateepi else " 0" end)asJE3
FROMperson
INNERJOIN house onperson.hcode=house.hcodeAND
person.pcucodeperson=house.pcucodeperson
LEFT JOIN visitepi onperson.pid=visitepi.pidANDperson.pcucodeperson=visitepi.pcucodeperson
LEFT JOIN cdrugon visitepi.vaccinecode=cdrug.drugcode
WHERE person.typelivein('1','3')
and getagemonth(person.birth,CURDATE() ) between 48and60
GROUP BY CONCAT(person.pcucodeperson,person.pid))as EPI
WHERE EPI.DTP5=0 or EPI.OPV5=0
GROUP BY EPI.pid
ORDER BY EPI.birth;
ตรวจสอบการฝากครรภ์ครบ5ครั้งตามเกณฑ์
SELECT *
FROM(SELECT
ctitle.titlename as'คานาหน้าชื่อ'
,person.fnameas'ชื่อ'
,person.lnameas'นามสกุล'
,getAgeYearNum(person.birth,visitanc.datecheck)as'อายุ'
Basic MySQL
ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข
129
#,visitanc.ancnoas'ครรภ์ที่'
,visitancdeliver.pregnoas'G'
,house.hnoas'บ้านเลขที่',right(villcode,2)as'หมู่ที่'
,visitancdeliver.datedeliveras'วันที่คลอด'
,MAX(case whenvisitanc.ancno='1'thenvisitanc.datecheckELSE"" end)as 'ancครั้งที่1'
,MAX(case whenvisitanc.ancno='2'thenvisitanc.datecheckELSE"" end)as 'ancครั้งที่2'
,MAX(case whenvisitanc.ancno='3'thenvisitanc.datecheckELSE"" end)as 'ancครั้งที่3'
,MAX(case when visitanc.ancno='4'thenvisitanc.datecheckELSE"" end)as 'ancครั้งที่4'
,MAX(case whenvisitanc.ancno='5'thenvisitanc.datecheckELSE"" end)as 'ancครั้งที่5'
FROMvisitanc
INNERJOIN persononvisitanc.pcucodeperson=person.pcucodepersonandvisitanc.pid=person.pid
INNERJOIN house ON person.pcucodeperson=house.pcucodepersonAND
person.hcode=house.hcode
INNERJOIN ctitle ON person.prename =ctitle.titlecode
INNERJOIN visitancdeliveronvisitanc.pcucodeperson=visitancdeliver.pcucodepersonand
visitanc.pid=visitancdeliver.pid
WHERE right(villcode,2)!='00'
and person.typelivein('1','3')
ANDvisitancdeliver.datedeliverBETWEEN '2013-04-01' and'2014-03-31'
GROUP BY person.pcucodeperson,person.pid,visitancdeliver.pregno
ORDER BY visitanc.datecheck) asanc_Q;

More Related Content

PPT
สอนการใช้สมุนไพรสำหรับนักเรียน
PDF
สมุนไพรไทย
PDF
สมุนไพรไม่ใช่ยาขม
PPT
การซักประวัติการเจ็บป่วย
PDF
คู่มือการใช้งานSpss
PDF
เศรษฐกิจพอเพียง
PDF
ความรู้เบื้องต้นเกี่ยวกับระบบฐานข้อมูล
KEY
3 การจัดการสาธารณสุขในประเทศไทย
สอนการใช้สมุนไพรสำหรับนักเรียน
สมุนไพรไทย
สมุนไพรไม่ใช่ยาขม
การซักประวัติการเจ็บป่วย
คู่มือการใช้งานSpss
เศรษฐกิจพอเพียง
ความรู้เบื้องต้นเกี่ยวกับระบบฐานข้อมูล
3 การจัดการสาธารณสุขในประเทศไทย

What's hot (20)

PPTX
ความรู้เบื้องต้นเกี่ยวกับการวิจัย
PDF
วิจัยด้านโรคซึมเศร้า
PPTX
แนวคิด ทฤษฎีการเรียนรู้ร่วมสมัย
PDF
Unit5.ppt (read only)
PDF
ปัญหาเด็กติดเกม
PDF
Kingdom plantae
PPTX
การเบิกจ่ายชดเชย การแก้ไขกรณีติด C และการปฏิเสธการจ่ายชดเชยค่าบริการทันตกรรมส...
PDF
ปรัชญาการศึกษากับการเรียนรู้ของมนุษย์
PPTX
G14 เรื่อง วารสาร นิตยสาร
PPSX
การจัดเก็บข้อมูลสารสนเทศ
PDF
พืชใบเลี้ยงเดี่ยวและพืชใบเลี้ยงคู่
DOCX
ส่วนประกอบหนังสือวารสารและหนังสือพิมพ์
PDF
วันวิสาขบูชา
PDF
บทที่ 5 การเขียนแผนธุรกิจ
PDF
stem structure
PDF
พุทธนิกาย
PDF
ใบความรู้วิชาห้องสมุดเพื่อการเรียนรู้ 1
PPTX
ทฤษฎีของวัตสัน
PDF
รายงานโครงงานวิทยาศาสตร์ เรื่อง ความหลากหลายและความสัมพันธ์ของเห็ดในดอนปู่ตา2...
PPTX
6 ทฤษฎีทางพฤติกรรมศาสตร์
ความรู้เบื้องต้นเกี่ยวกับการวิจัย
วิจัยด้านโรคซึมเศร้า
แนวคิด ทฤษฎีการเรียนรู้ร่วมสมัย
Unit5.ppt (read only)
ปัญหาเด็กติดเกม
Kingdom plantae
การเบิกจ่ายชดเชย การแก้ไขกรณีติด C และการปฏิเสธการจ่ายชดเชยค่าบริการทันตกรรมส...
ปรัชญาการศึกษากับการเรียนรู้ของมนุษย์
G14 เรื่อง วารสาร นิตยสาร
การจัดเก็บข้อมูลสารสนเทศ
พืชใบเลี้ยงเดี่ยวและพืชใบเลี้ยงคู่
ส่วนประกอบหนังสือวารสารและหนังสือพิมพ์
วันวิสาขบูชา
บทที่ 5 การเขียนแผนธุรกิจ
stem structure
พุทธนิกาย
ใบความรู้วิชาห้องสมุดเพื่อการเรียนรู้ 1
ทฤษฎีของวัตสัน
รายงานโครงงานวิทยาศาสตร์ เรื่อง ความหลากหลายและความสัมพันธ์ของเห็ดในดอนปู่ตา2...
6 ทฤษฎีทางพฤติกรรมศาสตร์
Ad

Similar to Bacic MySql & script Sql for jhcis (20)

PDF
การจัดการฐานข้อมูล
PDF
การจัดการฐานข้อมูล
PDF
งานนำเสนอ..
PPT
ระบบฐานข้อมูล
PDF
PDF
งานนำเสนอ การจัดการฐานข้อมุล
PDF
ความรู้พื้นฐานเกี่ยวกับฐานข้อมูล
PPT
ระบบฐานข้อมูล
PPT
Database basic new
DOC
สรุปกลุ่มที่ 1,2,3,5,6
PPTX
บทที่ 1
PDF
Database1
PPT
ความรู้ทั่วไปเกี่ยวกับระบบฐานข้อมูล
PPT
ความรู้ทั่วไปเกี่ยวกับระบบฐานข้อมูล
PDF
2. ใบความรู้ที่ 1
PPT
การจัดเก็บข้อมูล
 
PPT
การจัดการข้อมูลด้วยระบบการจัดการฐานข้อมูล
การจัดการฐานข้อมูล
การจัดการฐานข้อมูล
งานนำเสนอ..
ระบบฐานข้อมูล
งานนำเสนอ การจัดการฐานข้อมุล
ความรู้พื้นฐานเกี่ยวกับฐานข้อมูล
ระบบฐานข้อมูล
Database basic new
สรุปกลุ่มที่ 1,2,3,5,6
บทที่ 1
Database1
ความรู้ทั่วไปเกี่ยวกับระบบฐานข้อมูล
ความรู้ทั่วไปเกี่ยวกับระบบฐานข้อมูล
2. ใบความรู้ที่ 1
การจัดเก็บข้อมูล
 
การจัดการข้อมูลด้วยระบบการจัดการฐานข้อมูล
Ad

More from Sakarin Habusaya (16)

PPTX
คู่มือการจัดทำบัญชีข้อมูลยา ของ รพ.สต. (Drug Catalogue)
PPTX
แนวทางการบริหารจัดการบริการทันตกรรม Fee schedule dental 2563
PDF
Data warehouse for icd By quickview
PPTX
การบันทึกข้อมูลการให้บริการงานสร้างเสริมภูมิคุ้มกันโรค Hdc epi 2019
PPTX
ภาพรวมเรื่องการให้รหัส icd10 ในสถานบริการ Medical Record & Coding Review
PPTX
Hdc_user_2019
PPTX
Hdc mch sakarin_62
PDF
วิธีสร้างแผนที่ใน Google Map
PDF
Fee schdule by_seamless_for_dmis
PDF
แนวทางการบริหารงบค่าใช้จ่ายบริการแพทย์แผนไทย ปี 2562 (สปสช.)
PDF
Mch hdc jhcis_full
PDF
Ncd_datacorrect
PDF
Pa+hait 2562
PDF
Hdc ncd2561 goal
PDF
Hdc cigarette alcohol harm 62
คู่มือการจัดทำบัญชีข้อมูลยา ของ รพ.สต. (Drug Catalogue)
แนวทางการบริหารจัดการบริการทันตกรรม Fee schedule dental 2563
Data warehouse for icd By quickview
การบันทึกข้อมูลการให้บริการงานสร้างเสริมภูมิคุ้มกันโรค Hdc epi 2019
ภาพรวมเรื่องการให้รหัส icd10 ในสถานบริการ Medical Record & Coding Review
Hdc_user_2019
Hdc mch sakarin_62
วิธีสร้างแผนที่ใน Google Map
Fee schdule by_seamless_for_dmis
แนวทางการบริหารงบค่าใช้จ่ายบริการแพทย์แผนไทย ปี 2562 (สปสช.)
Mch hdc jhcis_full
Ncd_datacorrect
Pa+hait 2562
Hdc ncd2561 goal
Hdc cigarette alcohol harm 62

Bacic MySql & script Sql for jhcis

  • 1. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 1 แนะนำระบบจัดกำรฐำนข้อมูล เมื่อกล่าวถึงระบบฐานข ้อมูล คาว่า “ ข ้อมูล ” คือสิ่งที่จะต ้องพิจารณาก่อนสิ่งอื่นใด ความหมายของคาว่า ข ้อมูล (data) คือ ข ้อเท็จจริงต่างๆ ซึ่งต่อไปก็จะถูกนามาประมวลผลนั่นเอง หรือ อาจ จะ เรียกว่าเป็นวัตถุดิบ เมื่อข ้อมูลถูกนามาประมวล เช่น การจัด เรียง การ แยก กลุ่มจัดกลุ่ม การ เชื่อมโยง หรือการคิด คานวณ เพื่อให้ได ้ผลลัพธ์ และ ต่อมาก็ จัดให้อยู่ในรูปแบบที่ใช ้ประโยชน์ได ้ ง่าย เรียกว่าเป็น “ สารสนเทศ ” กล่าวโดยสรุป สารสนเทศ ( information) ก็คือข ้อมูลที่ผ่านการประมวลผลแล ้ว ตัวอย่างเช่น ข ้อมูลของคะแนนสอบของรายวิชาต่าง ๆ ซึ่งจะถูกนามาประมวลเป็นเกรดของนิสิตแต่ละคนในแต่ละภาคการศึกษา แล ้วนาเกรดที่ได ้มาคานวณเกรดเฉลี่ย เพื่อนาไปตรวจสอบสถานภาพเพื่อแจ ้งสภาพของนิสิตต่อไป ลักษณะของสารสนเทศที่ดี ควรจะมีองค์ประกอบใน 4 ลักษณะ ต่อไปนี้ 1. ต้อง มีค่ำ ถูกต้อง เที่ยงตรง (Correctness and relevant) สารสนเทศ ที่ ถูกต ้องและไม่ผิดพลาด จะทาให้ ผู้ใ ช ้ได ้ข ้อมูลสมบูรณ์ และสามารถ ทางานในส่วนของตน รับผิดชอบได ้อย่างเต็มความสามารถไม่ต ้องกังวลว่าได ้รับข ้อมูลที่ผิดพลาด ระบบสารสนเทศ ที่มีความถูกต ้องเที่ยงตรงเหล่า นั้นก็จะถูกจัดว่าเป็นระบบที่มีประสิทธิภาพ 2. สำรสนเทศ เป็ นปัจจุบัน (current) ข ้อมูล ที่จะนามาเปลี่ยนสภาพเป็นสารสนเทศ อาจ จะ มีการเปลี่ยน แปลง ไป อยู่เสมอ ตามกาลเวลา ตามความต ้องการ เช่น ข ้อมูลเกี่ยวกับเกรดเฉลี่ยของ นิสิต/ นักศึกษาในแฟ้มประวัติของนักศึกษา ซึ่ง จะต ้องเปลี่ยน แปลง ไปในแต่ละภาค การศึกษา ระบบสารสนเทศที่ดีจะต ้องยืดหยุ่น โดย ให้มีการเปลี่ยน แปลง ค่าให้เป็นปัจจุบัน อยู่เสมอ หรือ ยัง คง เก็บ ค่าเก่าไว้เพื่อประโยชน์ ใน การใช ้งาน ในกรณีอื่น ๆ ที่ แตกต่างกัน ไป 3. สำรสนเทศที่ ทันเวลำ (timely) สารสนเทศ มีคุณค่าทางเวลาเข ้ามาเกี่ยวข ้อง ถ ้าไม่ได ้สารสนเทศในเวลาที่ต ้องการ อาจจะเกิดการสูญเสียโอกาสที่ไม่อาจจะได ้กลับมาใหม่ ถ ้า มหาวิทยาลัย ไม่สามารถหาข ้อมูลสารสนเทศได ้ทันเวลาประมูล มหาวิทยาลัย ก็อาจจะเสียโอกาสนั้นไป ระบบสารสนเทศที่มีประสิทธิภาพคือ ระบบที่จะต ้องจัดสรรให้ได ้สารสนเทศเมื่อผู้ใช ้ต ้องการ ในเวลาที่ต ้องการ 4. ไม่มีควำมขัดแย้งกัน (consistant) ใน หลาย ๆ กรณี สารสนเทศ ทาให้ เกิดความขัดแย ้ง กันของ ข ้อมูลที่จัดเก็บในหลาย ๆ ที่ หลาย ๆ แหล่งข ้อมูล ซึ่งจะทาให้ข ้อมูลหรือสารสนเทศเหล่านั้น ไม่ตรงกัน ได ้หรือแม้แต่ วิธีการประมวลผลที่ แตก ต่างกัน ก็ อาจทาให้เกิดความคลาดเคลื่อนขึ้น ได ้ ดังนั้น ข ้อมูล ที่ มีความคงที่มากที่สุด จะทาให้ข ้อมูลมีคุณค่าควรแก่การใช ้งาน นอก จากนี้แล ้วการนาเสนอข ้อมูลหรือการนาเสนอสารสนเทศในรูปแบบที่เหมาะสม ย่อมทาให้สารสนเทศนั้นมีคุณค่ามากยิ่งขึ้นตามไปด ้วย ตัวอย่างเช่น ถ ้าอาจารย์สอนนิสิต/นักศึกษาหลายร้อยคนและต ้องการจะดูคะแนนรวมของนาย ก. แต่ในระบบข ้อมูลมีวิธีการจัดเรียงข ้อมูลตามรหัสนักศึกษา ดังนั้นอาจารย์จะต ้องค ้นหาชื่อนักศึกษาตั้งแต่ต ้นจนกว่าจะพบชื่อที่ต ้องการ
  • 2. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 2 โดยที่อาจารย์ไม่ทราบว่านักศึกษาผู้นั้นมีรหัสเท่าใด ดังนั้นระบบสารสนเทศที่มีประสิทธิภาพ คือระบบที่มีความยืดหยุ่นในการนาเสนอสารสนเทศให้กับผู้ที่ต ้องการใช ้สารสนเทศนั้น ๆ แนวควำมคิดพื้นฐำนเกี่ยวกับระบบฐำนข้อมูล สารสนเทศ เป็นผลลัพธ์ที่ได ้จากการประมวลข ้อมูลจากตารางข ้อมูลที่มีความสัมพันธ์กันการ วางรูปแบบของโครงสร้างของข ้อมูลที่มีความสัมพันธ์กัน อาจวาดเป็นภาพของบัตรรายการโดยที่แต่ละบัตรจะเรียกว่าเป็น เรคอร์ด (record หรือ row) เนื้อหาภายในบัตรรายการก็จะเป็นรายการ ข ้อมูลแต่ละหน่วยหรือเรียกว่า ฟิ ลด์ (field หรือ column) และบัตรรายการในเรื่องเดียวกัน เช่น ประวัตินิสิต/นักศึกษา หลาย ๆ ใบรวมกันก็จะถูกเก็บไว้เป็นกลุ่ม เรียกว่า แฟ้ มข้อมูล (file หรือ table หรือเรียกต่อไปว่า relational table) ภำพ ที่ 1.1 ตัวอย่างข ้อมูลเป็นเรค อร์ด (ในรูปของบัตรรายกา ร ) ฟิ ลด์ : หน่วยพื้นฐานของข ้อมูล ( เช่น ชื่อนิสิต นามสกุลนิสิต รหัสนิสิต เพศ ที่อยู่ ) เรคอร์ด : ชุดของข ้อมูลที่สัมพันธ์กัน เรื่องราวเดียวกัน จากตัวอย่างคือประวัตินิสิต 1 คน (1 บัตรรายการ ) ไฟล์ : จานวนบัตรรายการทั้งหมดรวมกัน (บัตรรายการเรื่องเดียวกัน) (1 แฟ้มข ้อมูล ) ฐานข ้อมูล ( Database) หมายถึง ชุดของข ้อมูลที่รวมเอาข ้อมูลที่เกี่ยวข ้องกันเป็นเ รื่องราวเดียวกันรวมกัน เป็นกลุ่มหรือเป็นชุดข ้อมูล เช่น ฐานข ้อมูลนิสิต ฐานข ้อมูลค ้า และ ฐานข ้อมูลวิชาเรียน เป็นต ้น ซึ่งข ้อมูลเหล่านี้ได ้มาจากการบันทึกข ้อมูลโดยผู้ใช ้ หรือบางข ้อมูลอาจจะได ้มาจากการประมวลผลข ้อมูลแล ้วบันทึกข ้อมูลก ลับไปเก็บที่ ตาแหน่งที่ต ้องการ ระบบฐานข ้อมูล ( Database System) ความ หมายของระบบฐานข ้อมูลก็คือ ที่รวมของฐานข ้อมูลต่าง ๆ หรือที่รวมของข ้อมูลทั้งหมด ซึ่งอาจจะได ้จากการคานวณ หรือประมวลผลต่าง ๆ หรืออาจจจะได ้จากการบันทึกข ้อมูลโดยผู้ใช ้เช่น ระบบฐานข ้อมูลงานทะเบียนนิสิตมหาวิทยาลัยทักษิณ ก็จะรวมเอาฐานข ้อมูลต่าง ๆ เช่น ฐานข ้อมูลวิชาเรียน ฐานข ้อมูลนิสิต ฐานข ้อมูลอาจารย์ผู้สอน และ ฐานข ้อมูลหลักสูตร เป็นต ้น ซึ่งรวมกันเป็นระบบฐานข ้อมูลของงานทะเบียนนิสิต หรือฐานข ้อมูลห้างร้านต่าง ๆ ก็จะประกอบด ้วย ฐานข ้อมูลสินค ้า ฐานข ้อมูลลูกค ้า ฐานข ้อมูลระบบบัญชีฐานข ้อมูลลูกหนี้ และฐานข ้อมูลตัวแทนจาหน่าย เป็นต ้น ดังภาพประกอบต่อไปนี้
  • 3. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 3 ภำพ ที่ 1.2 ตัวอย่างระบบฐานข ้อมูล และฐานข ้อมูลย่อย จากที่กล่าวมาข ้างต ้น ระบบฐานข ้อมูลต่าง ๆ ตามตัวอย่างนั้น ถ ้าเป็นระบบฐานข ้อมูลที่มีขนาดใหญ่มาก ระบบฐานข ้อมูลขององค์กรก็ควรจะประกอบด ้วยระบบฐานข ้อมูลย่อย ๆ หลาย ๆ ระบบฐานข ้อมูล เพื่อความสะดวกในการปฏิบัติงานและการจัดการ ภำพ ที่ 1.3 ระบบฐานข ้อมูลงานลงทะเบียน ที่ประกอบด ้วยระบบฐานข ้อมูลย่อย ๆ ภำพ ที่ 1.3 ระบบฐานข ้อมูลงานลงทะเบียน ที่ประกอบด ้วยระบบฐานข ้อมูลย่อย ๆ
  • 4. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 4 ระบบฐำนข้อมูลแบบ Client/Server ระบบ Client/Server นี้เป็นการแยกการทา งานของ Font-end กับ Back-end ออกจากกันโดยผู้ใช ้สามารถที่จะทาการทางานกับฐานข ้อมูลได ้โดยไม่จา เป็นต ้องทา งานอยู่ที่เครื่องที่ทา หน้าที่เก็บฐานข ้อมูลอยู่นั้นเราจะเรียกว่า Back-end ในการนา เสนอระบบนี้อย่างไรนั้นขึ้นกับ Platform ที่ Font-end กับ Back-end ทา งานอยู่ และระดับการจัดการที่ถูกแบ่งออกเป็น 2 ส่วน โครงสร้ำงของระบบ Client/Server Database ข้อดี ของระบบฐำนข้อมูลแบบ Client/Server  การแบ่งแยกการจัดการระหว่างระบบของ Client และ Database Server ออกจากกันโดยการจัดการฐานข ้อมูลจะถูกทา ที่ส่วนของ Back-end ส่วน DBMS จะถูกจัดการอยู่ที่ Server ทาให้สามารถทา การขยายการใช ้งานของเครื่องคอมพิวเตอร์ที่มีขนาดเล็กหรือช ้าเกินกว่าที่จะสามารถ ทา การ Run DBMS ที่ซับซ ้อนบนเครื่องนั้น  ช่วยลดโหลด(Load)ให้กับระบบ Nerwork ที่เชื่อมต่อได ้ด ้วยแทนที่จะต ้องทา การส่งข ้อมูลทั้งหมดไปและกลับผ่านทางสายแลน(LAN) ไปยังเครื่องที่ทา การติดต่อเข ้ามาทา ให้การจราจรบนสายส่งลดน้อยลงเหลือเพียงแค่การส่ง Query มาจาก Client มายังตัวที่เป็นฐานข ้อมูล เพื่อทา งานอย่างใดอย่างหนึ่ง เมื่อ Server ได ้รับ Query ที่ส่งมาก็จะทา การคา นวณและส่งผลลัพธ์กลับไปยัง Client เพียงเท่านั้น  การทา งานของโปรแกรมไม่ขึ้นกับเครื่องที่ทา งาน ผู้ใช ้จะไม่ถูกจา กัดบนเครื่องระบบใดระบบหนึ่งเท่านั้น สามารถนา เอาโปรแกรมไปทา งานบนเครื่องคอมพิวเตอร์เครื่องไหนก็ได ้และสามารถทา งานได ้กับระบบปฎิบัติการได ้หลายตัวไม่ว่าจะเป็น MS-Windows,IBM OS/2,MS/PC- Dos เป็นต ้นนอกจากนี้ Client และ Server ก็ไม่จา เป็นต ้องใช ้ฐานข ้อมูลเดียวกัน  การรกั ษาความถูกต ้องของข ้อมูล ในปัจจุบันระบบ Database Server สว่ นมากทา งานบน DBMS ที่ใช ้การจัดการแบบ Relation DBMS เมอื่ ผู้ใช ้ต ้องการที่จะทา
  • 5. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 5 การแก ้ไขค่าของข ้อมูลจะต ้องทา การ Log In เข ้ามาใช ้งานที่ Server กอ่ นทา ให้ข ้อมูลไม่กระจัดกระจาย และมีความถูกต ้องอยู่เสมอ  การปกป้องข ้อมูล ที่เครื่องที่ทา หน้าที่ในการเก็บข ้อมูล (Server) บางครั้งอาจมีการเข ้ารหัสที่เก็บ ไฟล ดยขอ ้ มลู ถกู เข ้ารหัสเพื่อป้องกันการดูจากภายนอก DBMS ได ้ ข้อเสียของระบบ Client/Server  การเพิ่มค่าใช ้จ่ายในการจัดการและเตรียมบุคลากรที่จะทา หน้าที่บา รุงรักษา Database Serverเมื่อจานวนผู้ใช ้มีมากขึ้นหรือเมื่อฐานข ้อมูลมีขนาดใหญ่มากขึ้น นอกจากนี้การฝึกฝนผู้ควบคุมระบบยงั เปน็ ค่าใช ้จ่ายที่เพิ่มขึ้นในตอนเริ่มต ้นด ้วย เนื่องจากคนที่เข ้ามาทา งานอาจจะไม่คุ้นเคยกับระบบที่ทาอยู่  การเพิ่มค่าใช ้จ่ายทางด ้าน Hardware ก็จะเพิ่มขึ้น มำทำควำมรู้จักกับ MySQL MySQL (อ่านว่า “มาย-เอส-คิว-แอล”) จัดเป็นระบบจัดการฐานข ้อมูลเชิงสัมพันธ์ (RDBMS: Relational Database Management System) ตัวหนึ่ง ซึ่งเป็นที่นิยมกันมากในปัจจุบัณ โดยเฉพาะอย่างยิ่งในโลกของอินเตอร์เน็ต สาเหตุเพราะว่า MySQL เป็นฟรีแวร์ทางด ้านฐานข ้อมูลที่มีประสิทธิภาพสูง เป็นทางเลือกใหม่จากผลิตภัณฑ์ระบบจัดการฐานข ้อมูลในปัจจุบัน ที่มักจะเป็นการผูกขาดของผลิตภัณฑ์เพียงไม่กี่ตัว นักพัฒนาระบบฐานข ้อมูลที่เคยใช ้MySQL ต่างยอมรับในความสามารถความรวดเร็ว การรองรับจานวนผู ้ใช ้และขนาดของข ้อมูลจานวนมหาศาล ทั้งยังสนับสนุนการใช ้งานบนระบบปฏิบัติการมากมาย ไม่ว่าจะเป็น Unix, OS/2, Mac OS หรือ Windows ก็ตาม นอกจากนี้ MySQL ยังสามารถใช ้งานร่วมกับ Web Development Platform ทั้งหลาย ไม่ว่าจะเป็น C, C++, Java, Perl, PHP, Python, Tcl หรือ ASP ก็ตามที ดังนั้นจึงไม่เป็นที่น่าแปลกใจเลยว่า ทาไม MySQL จึงได ้รับความนิยมอย่างมากในปัจจุบัน และมีแนวโน ้มสูงยิ่งขึ้นต่อๆ ไปในอนาคต MySQL จัดเป็นซอฟต์แวร์ประเภท Open Source Software สามารถดาวน์โหลด Source Code ต ้นฉบับ ได ้จากอินเตอร์เน็ต โดยไม่เสียค่าใช ้จ่ายใดๆ การแก ้ใขก็สามารถกระทาได ้ตามความต ้องการ MySQL ยึดถือสิทธิบัตรตาม GPL (GNU General Public License) ซึ่งเป็นข ้อกาหนดของซอฟต์แวร์ประเภทนี้ส่วนใหญ่ โดยจะเป็นการชี้แจงว่า สิ่งใดทาได ้ หรือทาไม่ได ้สาหรับการใช ้งานในกรณีต่างๆ ทั้งนี้ถ ้าต ้องการข ้อมูลเพิ่มเติม หรือ รายละเอียดของ GPL สามารถหาข ้อมูลได ้จากเว็บไซต์ http://www.gnu.org/ MySQL ได ้รับการยอมรับและทดสอบเรื่องของความรวดเร็วในการใช ้งาน โดยจะมีการทดสอบและเปรียบเทียบกับผลิตภัณฑ์ทางด ้านฐานข ้อมูลอื่นอยู่เสมอ มีการพัฒนาอย่างต่อเนื่อง โดยเริ่มตั้งแต่เวอร์ชันแรกๆ ที่ยังไม่ค่อยมีความสามารถมากนัก มาจนถึงทุกวันนี้ MySQL ได ้รับการพัฒนาให ้มีความสามารถมากยิ่งขึ้น รองรับข ้อมูลจานวนมหาศาล สามารถใช ้งานหลายผู ้ใช ้ได ้พร ้อมๆ กัน (Multi-user) มีการออกแบบให ้สามารถแตกงานออก เพื่อช่วยการทางานให ้เร็วยิ่งขึ้น รองรับข ้อมูลจานวนมหาศาล เพื่อช่วยการทางานเร็วยิ่งขึ้น (Multi- threaded)วิธีและการเชื่อมต่อที่ดีขึ้น การกาหนดสิทธิและการรักษาความปลอดภัยของข ้อมูลมีความรัดกุมน่าเชื่อถือยิ่งขึ้นเครื่องมือหรือโปรแก รมสนับสนุนทั้งของตัวเองและของผู ้พัฒนาอื่นๆ มีมากยิ่งขึ้น นอกจากนี้สิ่งหนึ่งที่สาคัญคือ MySQL ได ้รับการพัฒนาไปในแนวทางตามข ้อกาหนดมาตรฐาน SQL ดังนั้น เราสามารถใช ้คาสั่ง SQL ในการทางาน MySQL ได ้” นักพัฒนาที่ใช ้SQL มาตรฐานอยู่แล ้ว ไม่ต ้องศึกษาคาสั่งเพิ่มเติม แต่อาจจะต ้องเรียนรู ้ถึงรูปแบบและข ้อจากัดบางอย่างโดยเฉพาะ ทั้งนี้ทั้งนั้น ทางทีมงานผู ้พัฒนา MySQL มีเป้าหมายอย่างชัดเจนที่จะพัฒนาให ้MySQL
  • 6. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 6 มีความสามารถสนับสนุนตามข ้อกาหนด SQL92 มากที่สุด และจะพัฒนาให ้เป็นไปตามข ้อกาหนด SQL99 ต่อไป (Real-world Application) ก็มักจะแยก Client และ Server ออกเป็นคนละเครื่องกัน และ สามารถรองรับงานได ้ดีมากกว่า ดังนั้น ผู ้บริหารระบบ หรือผู ้กาหนดนโยบายสาหรับการทางานเครือข่าย จะต ้องคานึงถึงเรื่องที่เกี่ยวข ้องเหล่านี้ให ้ดี เพื่อที่จะทาให ้ระบบมีการทางานรับการให ้บริการแก่ผู ้ใช ้อย่ามีประสิทธิภาพและข ้อมูลมีความปลอดภัยมา กที่สุด MySQL กับมำตรฐำนภำษำ SQL จุดมุ่งหมายหนึ่งของทีมผู ้พัฒนา MySQL ต ้องการทาให ้MySQL เป็น DB Server ตามข ้อกาหนด ANSI SOL โดยในขั้นแรกนี้อ ้างอิงตาม ANSI SQL92 เป็นหลัก ความสามารถต่างๆ โดยส่วนใหญ่ครอบคลุมการใช ้งาน อาจจะมีบางสิ่งที่ยังไม่สามารถทาได ้ในปัจจุบัน หรือบางสิ่งก็มีแผนจะเพิ่มเติมเข ้าไป ซึ่งได ้กล่าวถึงรายละเอียดไปแล ้วข ้างต ้น แต่ในส่วนนี้เราจะมาดูสาหรับความสามารถบางอย่างที่ MySQL เพิ่มเติมเข ้ามาสาหรับการทางาน นอกเหนือจากข ้อกาหนด ANSI SQL ดังนี้  ฟิลด์ประเภท MEDIUMINT, SET, ENUM และ BLOB รวมทั้ง TEXT ต่างๆ  การกาหนดคุณลักษณะของฟิลด์ เช่น AUTO_INCREMENT, BINARY, NULL, UNSIGNED และ ZEROFILL  การเปรียบเทียบสตริงเป็นแบบ Case Insensitive การจัดเรียงข ้อมูลใช ้รูปแบบภาษา ISO- 8859-1 (Latin1) เป็นค่า default  ชื่อ database และชื่อตารางข ้อมูลจะ Case Sensitive (โดยเฉพาะ Unix Platform)  สามารถใช ้คาสั่งของระบบปฏิบัติในการสารอง เปลี่ยนชื่อ ย ้าย ลบ หรือคัดลอกตารางข ้อมูลซึ่งเกี่ยวข ้องกับไฟล์ .MYD, .MYI และ .frm ได ้โดยตรง  MySQL ไม่สนับสนุน Tablespaces  โอเปอเรเตอร์ LIKE สามารถใช ้กับ Numeric Columns ได ้  การใช ้INTO OUTFILE และ STRAIGHT_JOIN ในคาสั่ง SELECT  สามารถใช ้SQL_SMALL_RESULT option ในคาสั่ง SELECT ได ้  คาสั่ง EXPLAIN SELECT เพื่อให ้แสดงรายละเอียดของการเชื่อมกันของตารางข ้อมูล  สามารถใช ้TEMPORARY หรือ IF NOT EXISTS สาหรับการ CREATE TABLE ได ้  สามารถทาการ CHANGE ชื่อคอลัมน์, DROP ชื่อคอลัมน์ หรือ DROP INDEX, IGNORE หรือRENAME ในการใช ้คาสั่ง ALTER TABLE ได ้  สามารถทาการ RENAME TABLE ได ้  สามารถ ADD, ALTER, DROP หรือ CHANGE clauses หลายครั้ง ในคาสั่ง ALTER TABLE ได ้  สามารถทาการ DROP TABLE ด ้วยคีย์เวิร์ด IF EXISTS  สามารถทาการดรอป (Drop) ตารางข ้อมูลหลายๆ ตารางได ้ด ้วยคาสั่ง DROP TABLE เพียงครั้งเดียว  การใช ้LIMIT clause ในคาสั่ง DELETE  การใช ้DELAYED clause ในคาสั่ง INSERT และ REPLACE  การใช ้LOW_PRIORITY clause ในคาสั่ง INSERT, REPLACE, DELETE และ UPDATE  การใช ้งาน LOAD DATA INFILE ซึ่งไวยากรณ์ใช ้ได ้กับรูปแบบการโหลดดาต ้า (Load Data) ของ Oracle  คาสั่ง ANALYZE TABLE, CHECK RABLE, OPTIMIZE TABLE และ REPAIR TABLE  คาสั่ง SHOW  คาสั่ง SET OPTION
  • 7. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 7  ฟังก์ชันหลายฟังก์ชันที่จาเป็น เช่น ฟังก์ชันสาหรับทางานสตริง ซึ่งสามารถใช ้ได ้ทันที เนื่องจากมี ชื่อและการทางานที่เหมือนกันของ ANSI SQL และ ODBC  สามารถใช ้|| แทน OR และ && แทน AND ซึ่งเหมือนกับในภาษา C แต่ไม่สามารถใช ้ในการเชื่อมสตริงได ้ซึ่ง MySQL ให ้ใช ้ฟังก์ชัน CONCAT() แทน  คาสั่งในการ CREATE DATABASE หรือ DROP DATABASE  การใช ้โอเปอเรเตอร์ % โดยจะให ้ผลลัพธ์เดียวกันการใช ้ฟังก์ชัน MOD() ตัวอย่าง เช่น M % N = MOD(M,N) เป็นต ้น  โอเปอเรเตอร์ =, < >, <=, <, >=>, <<, >>, <=>, AND, OR หรือ LIKE สามารถใช ้ในการเปรียบเทียบคอลัมน์ในการใช ้คาสั่ง SELECT ได ้ทั้งนี้จะอยู่ทางด ้านหน ้า FROM ดังตัวอย่างเช่น SELECT id = 12345 AND name=’somchai’ FROM person;  ฟังก์ชัน LAST_INSERT_ID()  ฟังก์ชัน BIT_COUNT(), CASE, ELT(), FROM_DATS(), FORMAT(), IF(), PASSWORD(),ENCRYPT(), md5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(),TO_DAYS(), หรือ WEEKDAY()  ฟังก์ชัน TRIM() เพื่อการตัดส่วนของสตริง ซึ่งใน ANSI SQL จะตัดได ้เพียงหนึ่งตัวอักษรเท่านั้น  GROUP BY function STD(), BIT_OR() และ BIT_AND()  การใช ้คาสั่ง REPLACE แทนการใช ้คาสั่ง DELETE ตามด ้วยคาสั่ง INSERT  คาสั่ง FLUSH flush_option  การใช ้ตัวแปร sql statement ด ้วย := ตัวอย่างเช่น SELECT @asum:=SUM (total), @cnt:=COUNT(*), @asum/@cnt AS avg FROM person; กำรติดตั้ง MySQL เว็บไซต์ www.mysql.com เป็นเว็บไซต์อย่างเป็นทางการของ MySQL ซึ่งเนื้อหาภายในเว๊บไซต์หลักๆจะเป็นการให ้ข ้อมูลและรายละเอียดเกี่ยวกับ MySQL ไม่ว่าจะเป็น Server, Client หรือ เครื่องมืออื่นๆ ที่เกี่ยวข ้องจุดประสงค์ที่สาคัญอันหนึ่ง ก็คือไว ้สาหรับการเผยแพร่ MySQL ที่ได ้รับการพัฒนา มีให ้ดาวน์โหลดตั้งแต่เวอร์ชันที่สมบูรณ์ (Stable) หรือที่กาลังพัฒนา (Beta) มีหลากหลายระบบปฏิบัติการ ผู ้ใช ้ที่จะนา MySQLไปรันบนระบบปฏิบัติการตัวใดก็สามารถเลือกได ้จากที่เว๊บไซต์นี้ http://dev.mysql.com/downloads/ นอกเหนือจากนี้ก็จะเป็นลิงก์ต่างๆ ที่มีการนาMySQL ไปพัฒนาเพิ่มเติม โดยมีทั้งแบบ Free และ Commercial ให ้เลือกตามอัธยาศัย ติดตั้ง MySQL สำหรับ Windows Platform สาหรับ Windows Platform เมื่อดาวน์โหลดไฟล์ติดตั้งมาเรียบร ้อยแล ้ว ให ้ทาตามขั้นตอนดังนี้ 1. ดับเบิ้ลคลิกที่ ไฟล์ mysql-essential-5.1.59-win32.msi 2. เริ่มเข ้าสู่ขั้นตอนการติดตั้ง กดปุ่ ม Next
  • 8. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 8 3. การยอมรับ License Agreement ให ้เลือก Accept ตามรูป (1) แล ้วกดปุ่ ม Next(2)
  • 9. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 9 4. เลือกประเภทของการติดตั้ง ให ้เลือก Custom (1) แล ้วกดปุ่ ม Next(2)
  • 10. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 10 5. กาหนดตาแหน่งที่ต ้องการติดตั้ง โดยปกติจะติดตั้งที่ C:ProgramDataMySQLMySQL Server 5.1 สามารถกาหนดไดรฟ์ และโฟล์เดอร์โดยการกดปุ่ ม Change หลังจากนั้นให ้กดปุ่ ม Next 6. เข ้าสู่หน ้าจอเริ่มการติดตั้งถ ้าต ้องการเปลี่ยนแปลง ให ้กดปุ่ ม Back แต่ถ ้าต ้องการติดตั้งต่อไปให ้กดปุ่ ม Install
  • 12. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 12 8. เข ้าสู่หน ้าจอการกาหนดค่าเริ่มต ้นของ MySQL Server แล ้วกดปุ่ ม Next 9. เลือก Detail configuration แล ้วกดปุ่ ม Next
  • 13. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 13 10. กาหนด Port Number ที่ MySQL ใช ้งานโดยปกติคือ 3306 แต่สามารถกาหนดเลข port ใหม่ได ้โดยกาหนดในช่อง Port Number คลิกเลือก Add firewall exception for this port แล ้วกดปุ่ ม Next 11. กาหนด Character Set เป็น UTF8 แล ้วกดปุ่ ม Next
  • 14. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 14 12. กาหนดการติดตั้ง MySQL เป็น Service หนึ่งของ Windows โดยกาหนดชื่อ Service “MySQL” แล ้วกดปุ่ ม Next 13. กาหนดรหัสผ่านของ root โดยพิมพ์รหัสในช่อง New Root Password และช่อง Confirm รหัสผ่านดังกล่าว คลิกเลือกที่ Enable root access from remote machines ในกรณีที่ต ้องการใช ้งาน MySQL จากเครื่องภายนอก จากนั้นกดปุ่ ม Next
  • 15. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 15 14. เข ้าสู่หน ้าจอการปรับแต่งคอนฟิก ถ ้าต ้องการแก ้ไขให ้กดปุ่ ม Back ถ ้าต ้องการติดตั้งต่อไปให ้กดปุ่ ม Execute 15. เมื่อโปรแกรมทาการปรับแต่งคอนฟิกเสร็จแล ้ว ให ้กดปุ่ ม Finish เป็นอันจบการติดตั้ง MySQL
  • 16. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 16 ประภทข้อมูล MySQL ในส่วนนี้จะกล่าวถึงรายละเอียดของประเภทข ้อมูลที่สามารถกาหนดให ้แต่ล่ะฟิลด์ ซึ่งสาหรับระบบฐานข ้อมูล MySQL จะมีส่วนที่สนับสนุนกับมาตรฐาน และส่วนที่แตกต่าง เพิ่มเติมจากมาตรฐาน และประเภทตารางข ้อมูลที่สามารถเลือกใช ้ได ้ใน MySQL การศึกษาเรียนรู ้ถึงประเภทข ้อมูลใน MySQL จะทาให ้เราเข ้าใจ และสามารถทาการกาหนดประเภทของ ข ้อมูลให ้ถูกต ้องเหมาะสมตามจุดประสงค์ หรือตามนโยบายการทางานของเรา มิฉะนั้นแล ้วอาจก่อให ้เกิดความเสียหาย หรือทาให ้เกิดข ้อจากัดในเรื่องข ้อมูลของการทางานได ้ การศึกษาในเรื่องของประเภทข ้อมูลใน MySQL ก็มีจุดประสงค์เช่นเดียวกัน ซึ่งจะได ้ศึกษาในรายละเอียดต่อไป หลักกำรพิจำรณำเลือกใช้ประเภทข้อมูล ดังนี้ 1. ประเภทข้อมูลหลัก ได ้แก่ ตัวเลข, ตัวอักษร, วันที่และเวลา, ข ้อมูลไบนารี และอื่นๆ 2. ในแต่ละประเภทข้อมูล จะมีประเภทย่อยๆ ลงไปอีก เพื่อให ้ผู ้ใช ้เลือกใช ้ประเภทข ้อมูลที่เหมาะสม เพราะนอกจากจะทางานได ้ถูกต ้องแล ้ว ยังเป็นการช่วยประหยัดเนื้อที่การเก็บข ้อมูลอีกด ้วย ซึ่งต่อไปเราจะได ้ ศึกษาเพิ่มเติมว่าในแต่ละประเภทข ้อมูลเป็นอย่างไร มีขอบเขตข ้อมูลอะไรบ ้าง ใช ้เนื้อที่ในการเก็บข ้อมูลเท่าไร 3. กำรเลือกใช้ประเภทข้อมูล หากมีความต ้องการที่จะสนับสนุนหรือใช ้มาตรฐาน เช่น ODBC หรือ ต ้องการ port ข ้อมูลไปใช ้ในระบบอื่น ควรเลือกใช ้ประเภทข ้อมูลที่สนับสนุนกับมาตรฐานเท่านั้น เพื่อป้องกัน ความผิดพลาดที่อาจจะเกิดขึ้นต่อไปในอนาคต 4. ฟิลด์ใดที่ไม่มีกำรคำนวณ หรือไม่มีแนวโน้มจะเกี่ยวข้องกับกำรคำนวณเลย ควรเลือกใช ้ข ้อมูลประเภทตัวอักษร เพราะจะประหยัดเนื้อที่ในการจัดเก็บจริง 5. กำรเลือกใช้ประเภทของข้อมูลในแต่ละฟิลด์ นอกจากจะดูความเป็นไปได ้ในปัจจุบันแล ้ว จะต ้องคานึงและดูแนวโน ้มความเป็นไปของข ้อมูล หรือปริมาณของข ้อมูลต่อไปในอนาคตด ้วย เพื่อป้องกันข ้อจากัดของข ้อมูลเมื่อมีการขยายตัวเพิ่มขึ้น 6. กำรเลือกใช้ข้อมูลประเภทวันที่และเวลำใน MySQL จะต้องเลือกใช้อย่ำงระมัดระวัง เนื่องจากมีข ้อจากัดและรายละเอียดที่แตกต่างไปจากมาตรฐาน เช่น จะสามารถใช ้ข ้อมูลเริ่มต ้นได ้ที่ปี ค.ศ. 1000 เท่านั้น เป็นต ้น ประเภทข้อมูลใน MySQL แบ่งออกเป็ นกลุ่มได้ดังนี้ 1. ประเภทข้อมูลสำหรับตัวเลข ไว ้สาหรับเก็บข ้อมูลตัวเลข ซึ่งอาจจะใช ้ในการคานวณ หรือการจัดเรียงข ้อมูลเปรียบเทียบกันในฟิลด์นั้นๆ ประกอบด ้วยประเภทข ้อมูลย่อยๆ ได ้แก่ จานวนเต็ม, จานวนทศนิยม, จานวนจริง i. TINYINT[(M)] [UNSIGNED] [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –128 ถึง 127 แต่ถ ้าแบบไม่คิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ 0 ถึง 255 ข ้อมูลชนิดที่ใช ้เนื้อที่เก็บข ้อมูลขนาด 1 ไบต์ ii. SMALLINT[(M)] [UNSIGNED] [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –32768 ถึง 32767 แต่ถ ้าแบบไม่คิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ 0 ถึง 65535 ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 2 ไบต์
  • 17. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 17 iii. MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –8388608 ถึง 8388607 แต่ถ ้าแบบไม่คิด เครื่องหมาย จะใช ้ได ้ตั้งแต่ 0 ถึง 16777215 ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 3 ไบต์ iv. INT[(M)] [UNSIGNED] [ZEROFILL] หรือ INTEGER[(M)] [UNSIGNED] [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –2147483648 ถึง 2147483647 แต่ถ ้าแบบไม่คิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ 0 ถึง 4294967295 ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 4 ไบต์ v. BIGINT[(M)] [UNSIGNED] [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –9223372036854775808 ถึง 9223372036854775807 แต่ถ ้าแบบไม่คิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ 0 ถึง 18446744073709551615 ข ้อมูลชนิดนี้ ใช ้เนื้อที่เก็บข ้อมูลขนาด 8 ไบต์ vi. FLOAT(precision) [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย precision เป็นค่าความละเอียดทศนิยม ซึ่งแบ่งเป็นชนิด single (มี ค่าตั้งแต่ 0-24) และแบบ double (ตั้งแต่ 25-53) ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 4 หรือ 8 ไบต์ โดยแบบsingle จะใช ้4 ไบต์ และแบบ double จะใช ้8 ไบต์ ชนิดข ้อมูลประเภทนี้สาหรับกรณีใช ้กับ ODBC มาตรฐาน vii. FLOAT[(M,D)] [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ -3.402823466E+38 ถึง -1.175494351E -38,0 และ 1.175494351E-39 ถึง 3.402823466E+38 ค่า M เป็นจานวนหลักที่ต ้องการแสดงผล และ D เป็นจานวนจุดทศนิยม ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 4 ไบต์ viii. DOUBLE[(M,D)] [ZEROFILL] หรือ DOUBLE PRECISION[(M,D)] [ZEROFILL] หรือ REAL[(M,D)] [ZEROFILL] ข ้อมูลชนิดตัวเลขแบบคิดเครื่องหมาย จะใช ้ได ้ตั้งแต่ –1.7976931348623157E+308 ถึง -2.2250738585072014E-308, 0 และ 2.2250738585072014E-308 ถึง 1.7976931348623157E+308 ค่า M เป็นจานวนหลักที่ต ้องการแสดงผล และ D เป็นจานวนจุดทศนิยม ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูล ขนาด 8 ไบต์ ix. DECIMAL[(M[,D])] [ZEROFILL] หรือ NUMERIC[M,D] [ZEROFILL] ข ้อมูลชนิดตัวเลขชนิด unpacked คืออนุญาตให ้สามารถเก็บข ้อมูลตัวอักษรเข ้าไปด ้วย โดยตัวอักษรหนึ่ง ตัวแทนแต่ละหลัก สามารถใช ้ตัวเลขได ้เท่ากับแบบ DOUBLE ใช ้เนื้อที่เก็บข ้อมูลเท่ากับ M ไบต์ (D+2, ถ ้า M < D) 2. ประเภทข้อมูลสำหรับวันที่และเวลำ i. DATE ข ้อมูลชนิดวันที่ ตั้งแต่วันที่ 1 มกราคม ค.ศ. 1000 ถึง 31 ธันวาคม ค.ศ. 9999 การแสดงผลวันที่อยู่ใน รูปแบบ ‘YYYY-MM-DD’ ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 3 ไบต์ ii. DATETIME ข ้อมูลชนิดวันที่และเวลา ตั้งแต่วันที่ 1 มกราคม ค.ศ. 1000 เวลา 00:00:00 ถึง 31 ธันวาคม ค.ศ. 9999 เวลา 23:59:59 การแสดงผลวันที่และเวลาอยู่ในรูปแบบ ‘YYYY-MM-DD HH:MM:SS’ ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บ ข ้อมูลขนาด 8 ไบต์ iii. TIMESTAMP[(M)] ค่า timestamp เป็นค่าตัวเลขที่นับจานวนวินาทีตั้งแต่วันที่ 1 มกราคม ค.ศ. 1000 เวลา 00:00:00 เป็นต ้นมา โดยมีจุดสิ้นสุดประมาณ ค.ศ. 2037 การแสดงผลค่า timestamp อยู่ในรูปแบบ YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD หรือ YYMMDD ค่า M คือจานวนตัวเลขที่บรรจุ ซึ่งอาจจะเป็น 14, 12, 8 หรือ 6 ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 4 ไบต์ iv. TIME ข ้อมูลประเภทเวลา สามารถเป็นได ้ตั้งแต่ ‘-838:59:59’ ถึง ‘838:59:59’ แสดงผลในรูปแบบ HH:MM:SS ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 3 ไบต์ v. YEAR[(2/4)]ข ้อมูลประเภทปี ค.ศ. โดยสามารถเลือกว่าจะใช ้แบบ 2 หรือ 4 หลัก (ค่าโดยปริยายจะเป็น 4 หลัก) ถ ้า เลือกใช ้แบบ 4 หลัก จะใช ้ได ้ตั้งแต่ ปี ค.ศ. 1901
  • 18. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 18 ถึง 2155 ถ ้าเลือกใช ้แบบ 2 หลัก จะใช ้ได ้ตั้งแต่ ปี ค.ศ. 1970 ถึง 2069 แสดงในรูปแบบ 70 ถึง 69 ข ้อมูลชนิดนี้ใช ้เนื้อที่เก็บข ้อมูลขนาด 1 ไบต์ 3. ประเภทข้อมูลสำหรับตัวอักษร ข ้อมูลประเภทตัวอักษรถือว่าเป็นสิ่งที่ใช ้กันมากที่สุด เพราะแทบจะครอบคลุมข ้อมูลที่เป็นไปได ้ทั้งหมด การจัดเรียงข ้อมูลจะเป็นในลักษณะไม่คานึงตัวใหญ่ตัวเล็ก (case-insensitive) ซึ่งเมื่อเปรียบเทียบกับข ้อมูล ประเภทไบนารี (BLOB) แล ้วจะพบว่าคล ้ายกันมาก จะแตกต่างกันที่BLOB จะมีการจัดเรียงข ้อมูลเป็น caseinsensitive เท่านั้น แต่ข ้อมูลประเภทตัวอักษรก็มีรายละเอียดเพิ่มเติมไปอีก โดยมีรายละเอียดดังนี้ i. [NATIONAL] CHAR(M) [BINARY] ข ้อมูลประเภทสตริงที่จากัดขนาดความกว ้าง (ไม่สามารถปรับขนาดได ้) โดยขนาดความกว ้างเป็นได ้ ตั้งแต่ 1 ถึง 255 ตัวอักษร ตามปกติเมื่อมีการเรียงข ้อมูล จะเป็นลักษณะ case-sensitive คือคานึงถึงตัวเล็กตัวใหญ่ การระบุชนิดข ้อมูลย่อยว่าเป็น BINARY จะเป็นลักษณะไม่คานึงตัวเล็กตัวใหญ่ ดังนั้นเมื่อมีการเรียงข ้อมูลก็จะให ้ผลต่างจาก CHAR ธรรมดา การเก็บข ้อมูลก็ใช ้ไบต์ตามจานวนตัวอักษรที่ระบุ ii. [NATIONAL] VARCHAR(M) [BINARY] ข ้อมูลประเภทนี้ก็คล ้ายกับแบบ CHAR ต่างกันตรงที่ VARCHAR จะสามารถปรับขนาดตามข ้อมูลที่เก็บในฟิลด์ ขนาดความกว ้างอยู่ตั้งแต่ 1 ถึง 255 การเก็บข ้อมูลจะเท่ากับของข ้อมูลจริงในฟิลด์ๆ + 1 ไบต์ iii. TINYTEXT ข ้อมูลประเภทนี้สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 255 ตัวอักษร และใช ้เนื้อที่เก็บข ้อมูลเท่ากับ จานวนข ้อมูลจริง + 1 ไบต์ iv. TEXT ข ้อมูลประเภทนี้สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 65,535 ตัวอักษร และใช ้เนื้อที่เก็บข ้อมูลเท่ากับ จานวนข ้อมูลจริง + 2 ไบต์ v. MEDIUMTEXT ข ้อมูลประเภทนี้สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 16,777,215 ตัวอักษร และใช ้เนื้อที่เก็บข ้อมูล เท่ากับจานวนข ้อมูลจริง + 3 ไบต์ vi. LONGTEXT ข ้อมูลประเภทนี้สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 4,294,967,295 ตัวอักษร และใช ้เนื้อที่เก็บข ้อมูล เท่ากับจานวนข ้อมูลจริง + 4 ไบต์ vii. ENUM(‘value1’,’value2’,…) ข ้อมูลประเภทระบุเฉพาะค่าที่ต ้องการ หรือถ ้าไม่มีจะให ้ค่า NULL สามารถกาหนดค่าได ้ถึง 65,535 ค่าและใช ้เนื้อที่เก็บข ้อมูลตามจานวนค่าที่ระบุ viii. SET(‘value1’,’value2’,…) ข ้อมูลประเภทเซต ประกอบด ้วยข ้อมูลตั้งแต่ไม่มีค่า หรือมีค่าตามสมาชิกที่กาหนด สามารถมีจานวนสมาชิกในเซตได ้ทั้งสิ้น 64 ตัว และใช ้เนื้อที่เก็บข ้อมูลตามจานวนสมาชิกที่ระบุ 4. ประเภทข้อมูลสำหรับไบนำรี (BLOB:Binary Large Object) จากที่กล่าวไปแล ้วถึงความคล ้ายกันของแต่ล่ะข ้อมูลประเภทตัวอักษรและข ้อมูลประเภทไบนารี ดังนั้น ประเภทข ้อมูลย่อยและการเก็บข ้อมูลจึงไม่แตกต่างกัน แต่ตามปกติเรามักใช ้BLOB สาหรับเก็บข ้อมูลที่ไม่เป็น ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สป. การใช ้งานฐานข ้อมูล MySQL 53 ภาษามนุษย์ ข ้อมูลไบนารี ได ้แก่ รูปภาพ, ไฟล์ข ้อมูล หรือข ้อมูลที่ประกอบด ้วยตัวอักษรพิเศษ ข ้อมูลที่กาหนด ด ้วยรหัสควบคุม เป็นต ้น i. TINYBLOB สาหรับข ้อมูลไบนารีสามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 255 ตัวอักษร และใช ้เนื้อที่เก็บข ้อมูลเท่ากับ จานวนข ้อมูลจริง + 1 ไบต์ ii. BLOB สาหรับข ้อมูลไบนารี สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 65,535 ตัวอักษร และใช ้เนื้อที่เก็บข ้อมูล เท่ากับจานวนข ้อมูลจริง + 2 ไบต์ iii. MEDIUMBLOB สาหรับข ้อมูลไบนารี สามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 16,777,215 ตัวอักษร และใช ้เนื้อที่เก็บข ้อมูลเท่ากับจานวนข ้อมูลจริง + 3 ไบต์ iv. LONGBLOB สาหรับข ้อมูลไบนารีสามารถใช ้ความกว ้างข ้อมูลได ้สูงสุด 4,294,967,295 ตัวอักษร และใช ้เนื้อที่เก็บ ข ้อมูลเท่ากับจานวนข ้อมูลจริง + 4 ไบต์
  • 20. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 20 กำรใช้งำน MySQL หลังจากติดตั้งโปรแกรมเรียบร ้อยแล ้ว สามารถเข ้าใช ้งาน MySQL ได ้ดังนี้ 1. คลิกเลือก Start >> MySQL >> MySQL Server 5.0 >> MySQL Command line Client 2. จะปรากฎหน ้าจอของ MySQL Command Line Client แล ้วให ้พิมพ์รหัสผ่านที่ใส่ในขั้นตอนการติดตั้ง แล ้วกด Enter 3. จะเข ้าสู่หน ้าจอการใช ้งาน MySQL โดยสังเกตุที่ mysql> ดังรูป 4. ในกรณีที่ต ้องการกาหนดรหัสผ่านใหม่ ให ้ใช ้คาสั่งดังนี้  UPDATE mysql.user SET password=password(‘1234’) WHERE user = ‘root’; [กด Enter]  Flush privileges; [กด Enter]
  • 21. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 21 MySQL Command Line คำสั่งเพื่อเข้ำใช้งำน MySQL mysql [db_name] -h hostname -u root –p -h [ชื่อ server] ชื่อหรือ IP Address ของ Database Server เช่น localhost หรือ 127.0.0.1 -u [user name] ชื่อผู ้ใช ้งานฐานข ้อมูล -P [Port Number] เลข Port ของ MySQL เช่น 3333 -p [password] รหัสผ่าน [db_name] ชื่อฐานข ้อมูลที่ต ้องการใช ้งาน เช่น mysql –h localhost –u root เรียกใช้งำนฐำนข้อมูล use [db name]; คำสั่ง SHOW SHOW DATABASES เป็นคาสั่งสาหรับแสดงรายละเอียด (Information) ของ databases, tables, columns หรือ สถานะต่างๆ ของ Server SHOW TABLES แสดงรายชื่อ databases ทั้งหมดในระบบฐานข ้อมูลแสดงรายชื่อ tables ทั้งหมดของ current database SHOW OPEN TABLES แสดงรายชื่อ tables ที่ถูกเปิดอยู่ในปัจจุบัน SHOW COLUMNS แสดงรายละเอียดฟิลด์ทั้งหมดใน table นั้น SHOW FIELDS ให ้ผลลัพธ์เช่นเดียวกับ SHOW COLUMNS (ให ้ผลลัพธ์เช่นเดียวกับคาสั่ง DESCRIBE) SHOW INDEX แสดงรายละเอียดว่ามีดัชนีอะไรบ ้างสาหรับ table นั้นๆ
  • 22. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 22 SHOW KEYS ให ้ผลลัพธ์เช่นเดียวกับ SHOW INDEX ขอควำมช่วยเหลือ help หรือ h เลิกใช้งำน MySQL exit หรือ q Data Definition Language คำสั่งสร้ำงฐำนข้อมูล CREATE DATABASE db_name เป็นคาสั่งสร ้างฐานข ้อมู(database) ชื่อ db_name ขึ้นมาใหม่ ในกรณีที่มีdatabase นั้นอยู่แล ้ว ก็จะปรากฏข ้อความแสดงความผิดพลาด (Error Message) Can't create database ' db_name '. Database exists คำสั่งลบฐำนข้อมูล DROP DATABASE db_name เป็นคาสั่งลบ database ชื่อ db_name ออกไปจากระบบ
  • 23. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 23 คำสั่งสร้ำงตำรำงข้อมูล CREATE TABLE phonebook ( id INT (4) NOT NULL A UTO_INCREMENT, fname VARCHAR (35) , lname VARCHAR (35) , email VARCHAR (50) , office VARCHAR (200) , province CHAR (2) , PRIMARY KEY(id), UNIQUE(id), INDEX(id)) โดยทั่วไปขนาดของตารางข ้อมูลหนึ่งๆ จะมีขนาดไม่เกิน 2G หรือ 4G ขึ้นอยู่กับระบบปฏิบัติการ เราสามารถทาให ้ประหยัดเนื้อที่ได ้อีกโดยการบีบอัด (PACK) ข ้อมูลดัชนี ซึ่งสามารถให ้บีบอัดโดยกาหนดค่าPACK_KEYS=1 การบีบอัดนี้จะทาให ้การทางานช ้าลง แต่ก็ประหยัดเนื้อที่ขึ้น และตามปกติถ ้าผู ้ใช ้ไม่ได ้กาหนดให ้บีบอัด ข ้อมูลที่เป็นสตริงหรือตัวอักษรก็จะได ้รับการบีบอัดข ้อมูลอยู่แล ้ว สาหรับข ้อมูลตัวเลข ค่าการทางานปกติจะไม่รับการบีบอัด เว ้นแต่กาหนดการบีบอัดด ้วยการใช ้UNION จะใช ้กรณีที่ต ้องการรวมตารางข ้อมูลหลายๆ ตารางเข ้าด ้วยกันเป็นอันเดียว ซึ่งจะทางานกับตารางประเภท MERGE เท่านั้น คำสั่งแก้ไขตำรำงข้อมูล ALTER TABLE phonebook ADD tel VARCHAR(30) ; ALTER TABLE phonebook MODIFY fname VARCHAR(50) ; ALTER TABLE เป็นคาสั่งสาหรับการปรับเปลี่ยนแก ้ไขโครงสร ้างของตารางข ้อมูล เช่น การเพิ่ม-ลบฟิลด์, การสร ้าง-ลบดัชนี, การเปลี่ยนประเภทข ้อมูลของฟิลด์, การเปลี่ยนชื่อฟิลด์ เป็นต ้น เพิ่มคอลัมภ์ในตำรำงข้อมูล ALTER TABLE phonebook ADD note text
  • 24. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 24 ลบคอลัมภ์ตำรำงข้อมูล ALTER TABLE phonebook DROP note คำสั่งเปลี่ยนชื่อตำรำงข้อมูล RENAME TABLE phonebook to phone เป็นคาสั่งเพื่อเปลี่ยนชื่อตารางข ้อมูลเป็นชื่อใหม่ คำสั่งลบตำรำงข้อมูล DROP TABLE phonebook เป็นคาสั่งเพื่อให ้ลบตารางข ้อมูลออกจาก สาหรับการใช ้คาสั่ง DROP TABLE จะต ้องให ้ความระมัดระวังในการใช ้งานเป็นอย่างยิ่ง โดยเฉพาะการทางานกับตารางข ้อมูลประเภท nontransaction เพราะจะทาการ commit การทางานโดยอัตโนมัติ คำสั่ง OPTIMIZE TABLE OPTIMIZE TABLE phonebook เป็นคาสั่งสาหรับจัดระเบียบข ้อมูลให ้เป็นระเบียบ หรือการทาดีแฟร๊กเมนต์นั่นเองนั่นเอง เพราะถ ้าตารางข ้อมูลมีการใช ้งานมานาน มีการใช ้งานที่ทาให ้ข ้อมูลมีการเปลี่ยนแปลงความยาว หรือเปลี่ยนขนาดของเนื้อที่เก็บข ้อมูล โดยเฉพาะกับข ้อมูลประเภทที่ยืดหยุ่นไปตามข ้อมูล เช่น VARCHAR, BLOB หรือ TEXT การใช ้คาสั่ง OPTIMIZE TABLE ก็จะช่วยให ้มีการจัดระเบียบข ้อมูลให ้ดียิ่งขึ้น หากปล่อยระยะเวลานานๆ จะเกิดช่องว่างระหว่างข ้อมูล การอ่านข ้อมูลของสื่อจะไม่ราบรื่น ช ้า เนื่องจากเสียเวลาในการกระโดดข ้ามช่องว่างนั้นนั่นเอง
  • 25. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 25 Data Manipulation Language คำสั่งเพิ่มข้อมูล INSERT INSERT INTO phonebook ( fname, lname, email, office, province) VALUES ( 'sineenat', 'phradmali', 'sineenat@health.moph.go.th', 'ศทส.', '12') เป็นคาสั่งสาหรับการเพิ่มแถวข ้อมูล หรือระเบียนใหม่เข ้าตารางข ้อมูล สาหรับฟิลที่เป็น Auto Increment ไม่ต ้องใส่ค่า ระบบจะทาการเพิ่มค่าให ้โดยอัตโนมัติ คำสั่ง UPDATE UPDATE phonebook SET office= 'ศูนย์เทคโนโลยีสำรสนเทศและกำรสื่อสำร' WHERE fname=’sineenat’ เป็นคาสั่งเพื่อทาการเปลี่ยนแปลงข ้อมูลในตารางให ้เป็นตามที่ต ้องการ คำสั่ง DELETE เป็นคาสั่งสาหรับลบข ้อมูลจากตาราง โดยสามารถกาหนดเงื่อนไขสาหรับการลบได ้ ซึ่งถ ้าไม่ได ้ระบุเงื่อนไข จะเป็นการลบข ้อมูลทั้งหมดออกจากตาราง และถ ้าอยู่ใน AUTOCOMMIT mode (กรณีปกติทั่วไป) จะไม่สามารถทาการยกเลิกการลบครั้งนี้ได ้ คำสั่ง TRUNCATE TRUNCATE phonebook เป็นคาสั่งที่ให ้ผลเช่นเดียวกับ DELETE FROM table_name แต่มีข ้อแตกต่างดังนี้ - จะทาการดรอปตารางข ้อมูลก่อน แล ้วทาการสร ้างใหม่ ซึ่งจะให ้ผลที่เร็วกว่าการลบ DELETE FROM phonebook WHERE id=4
  • 26. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 26 ตารางทั้งหมด - การทางานเป็น non-transaction ไม่สามารถทาการยกเลิกได ้ คำสั่ง FLUSH FLUSH TABLES phonebook เป็นคาสั่งที่ใช ้สาหรับการลบหน่วยความจาภายใน (Internal Cache) ที่ใช ้งาน ทั้งนี้การใช ้คาสั่ง FLUSH จะอนุญาตเฉพาะ user ที่มีสิทธิ์(Privilege) เท่านั้น Flush_option สำมำรถระบุได้ดังนี้ HOSTS ทาการล ้าง hose cache table เพื่อปรับปรุงข ้อมูลของ host หรือ client ที่ คอนเน็กต์เข ้าใช ้งาน ซึ่งอาจมีการเปลี่ยนแปลง IP address หรืออื่นๆ โดยเมื่อทาการ flush เรียบร ้อยแล ้ว ก็จะอนุญาตให ้host นั้นๆ ทาการคอนเน็กต์เข ้ามาใหม่อีกครั้งหนึ่ง LOGS ปิดและเปิด log files ใหม่ PRIVILEGES ทาการ reload สิทธิ์ต่างๆ ของ user จาก grant tables ของ MySQL Server TABLES ปิด tables ทั้งหมด หากตารางใดยังถูกเปิดอยู่ ก็จะถูก force ให ้ปิดลง
  • 27. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 27 Data Retrieveal Language คำสั่งแสดงข้อมูลอย่ำงง่ำย SELECT * FROM phonebook ; แสดงข ้อมูลทุกคอลัมภ์จากตาราง phonebook คำสั่งแสดงข้อมูลเฉพำะคอลัมภ์ที่ต้องกำร SELECT fname ,lname,email FROM phonebook ; แสดงข ้อมูลเฉพาะคอลัมภ์ที่ต ้องการแสดงจากตาราง phonebook โดยคั่นระหว่างคอลัมภ์ด ้วยคอมมา(,) คำสั่งแสดงข้อมูลโดยระบุจำนวนรำยกำรที่ต้องกำร SELECT fname ,lname,email FROM phonebook limit 5 ; SELECT fname ,lname,email FROM phonebook limit 3,5 ; แสดงข ้อมูลโดยระบุจานวนรายการที่ต ้องการ  Limit 5 แสดงข ้อมูลตั้งแต่รายการแรก จนถึง 5 รายการ  Limit 3,5 แสดงข ้อมูลตั้งแต่รายการที่ 3(เริ่มรายการแรกเป็นลาดับที่ 0 ) ไปอีกจนครบ 5 รายการ คำสั่งแสดงข้อมูลโดยเรียงลำดับตำมที่กำหนด SELECT fname ,lname,email FROM phonebook ORDER BY fname ; SELECT fname ,lname,email FROM phonebook ORDER BY fname DESC ; ตามปกติหากไม่ได ้ระบุวิธีการจัดเรียงข ้อมูล ก็จะเป็นการเรียงจากน ้อยไปมาก (Ascending) หรือ คีย์เวิร์ด ASC แต่ถ ้าต ้องการเรียงจากมากไปน ้อย (Descending) ให ้ใช ้คีย์เวิร์ด DESC
  • 28. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 28 กำรตั้งชื่อฟิลด์(Alias) SELECT fname AS FirstName , Lname AS LastName FROM phonebook ; ปกติหากไม่ได ้ระบุชื่อฟิลด์จะถือเอาชื่อฟิลด์ตามตารางข ้อมูลเป็นหลัก หากต ้องการตั้งชื่อใหม่ตามที่ต ้องการ สามารถใช ้AS ตามหลังชื่อฟิลด์ แล ้วใส่ชื่อที่ต ้องการโดยชื่อที่ตั้งขึ้นใหม่นี้ห ้ามมีช่องว่าง แต่สามารถใช ้เครื่องหมาย Underscore(_) ได ้ กำรระบุเงื่อนไข SELECT fname ,lname,email ,province FROM phonebook WHERE province=’12’ ; การกาหนดเงื่อนไขใช ้ WHERE โดยหลังคาสั่ง WHERE จะเป็นเงื่อนไข เช่น province=’12’ หมายถึง แสดงเฉพาะข ้อมูลในฟิลด์ province มีค่าเท่ากับ 12 ค่าในฟิลด์ province เป็นชนิด Character ต ้องใส่ Quote (‘) ครอบ
  • 30. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 30 กำรจัดกลุ่มข้อมูล จัดกลุ่มข ้อมูลที่หมือนกัน ไว ้เป็นกลุ่มเดียวกันใช ้GROUP BY แล ้วระบุชื่อฟิลด์ที่ต ้องการจัดกลุ่ม SELECT province , COUNT( id ) FROM phonebook GROUP BY province ; การเรียกดูข้อมูลขั้นสูง การเรียกดูข ้อมูลจาก 2 ตารางขึ้นไป เช่น ประชากร( Person ) และข ้อมูลการรับบริการ(visit) SELECT person.pid,prename,fname,lname,visitdate FROM person,visit WHERE person.pid=visit.pid AND person.pcucodeperson=visit.pcucodeperson Limit 10 ;
  • 31. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 31 การเรียกใช ้ข ้อมูลจาก 2 ตาราง หลัง FROM จะตามด ้วยชื่อตารางคั่นระหว่างชื่อตารางด ้วย Comma(,) เช่น FROM person,visit ในส่วนของความสัมพันธ์ของทั้งสองตารางใส่หลัง where โดยถ ้าทั้งสองตารางมีชื่อเหมือนกันจะต ้องจะต ้องใส่ชื่อตารางนาหน ้าตามด ้วยจุด(.)แล ้วจึงใส่ชื่อฟิลด์ โปรแกรมจะแสดงผลที่มีค่าตรงกันเท่านั้น เช่น WHERE person.pid=visit.pid AND person.pcucodeperson=visit.pcucodeperson หากไม่ระบุค่าความสัมพันธ์จะแสดงผลัพธ์เป็นผลคูณคาร์ทีเซียน กำรกำหนดชื่อย่อของตำรำงในกำรเชื่อมตำรำง SELECT p.pid,prename,fname,lname,visitdate FROM person p ,visit v WHERE p.pid = v.pid AND p.pcucodeperson = v.pcucodeperson Limit 10 ; ประชากรแต่ละคนสามารถมารับบริการได ้มากกว่า 1 ครั้ง แต่ละครั้ง Diagได ้มากว่า 1โรค SELECT person.pid,prename,fname,lname,visitdate ,diagcode FROM person,visit WHERE person.pid=visit.pid AND person.pcucodeperson=visit.pcucodeperson AND visit.pcucod=visitdiag.pcucode AND visit.visitno=visitdiag.visitno AND visitdate = ‘2010-02-01’
  • 32. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 32 SELECT person.pid,prename,fname,lname,visitdate,diagcode, diseasename FROM person,visit,visitdiag,cdisease WHERE person.pid=visit.pid AND person.pcucodeperson=visit.pcucodeperson AND visit.pcucod=visitdiag.pcucode AND visit.visitno=visitdiag.visitno AND visit.diagcode= cdisease.diseasecode AND visitdate = ‘2010-02-01’
  • 33. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 33 กำรเชื่อมตำรำงทำงขวำและทำงซ้ำย SQL Left Join เป็นคาสั่งที่ใช ้สาหรับการระบุเงื่อนไขการเลือกใช ้ข ้อมูลในตาราง โดยเงื่อนไขการทา Left join จะทาการเลือกข ้อมูลหลัก โดยใช ้ตารางที่อยู่ด ้านซ ้ายของคาสั่ง Join เป็นตัวตั้ง และเลือกตารางด ้านขวาของคาสั่งที่มีค่าตรงกัน โดยที่ถ ้ามีข ้อมูลจากตารางด ้านซ ้าย ไม่ตรงกับด ้านขวา ด ้านขวาจะแสดงข ้อมูลเป็น NULL SQL Right Join เป็นคาสั่งที่ใช ้สาหรับการระบุเงื่อนไขการเลือกใช ้ข ้อมูลในตาราง โดยเงื่อนไขการทา Right join จะทาการเลือกข ้อมูลหลัก โดยใช ้ตารางที่อยู่ด ้านขวาของคาสั่ง Join เป็นตัวตั้ง และเลือกตารางด ้านซ ้ายของคาสั่งที่มีค่าตรงกัน โดยที่ถ ้ามีข ้อมูลจากตารางด ้านขวา ไม่ตรงกับด ้านซ ้าย ด ้านซ ้ายจะแสดงข ้อมูลเป็น NULL SELECT fname ,lname , occupa , occupaname FROM person LEFT JOIN coccupa ON person.occupa = coccupa.occupacode ;
  • 34. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 34 การเรียกใช ้ Subqueries เป็นการเรียกดูข ้อมูลชุดหนึ่ง ภายในข ้อมูลอีกชุดหนึ่ง แสดงรำยชื่อประชำกรที่ได้รับกำรวัด BP ในเดือนที่กำหนด ครั้งล่ำสุด SELECT fname ,lname , occupa , occupaname FROM person WHERE ( SELECT pcucodeperson , pid FROM visit WHERE month(visitdate) = '02' and pressure is not null GROUP BY pcucodeperson , pid Having max(visitdate) ) แสดงรำยชื่อประชำกรที่อยู่ในเขตรับผิดชอบที่ยังไม่เสียชีวิต
  • 35. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 35 SELECT person.pid,prename,fname,lname,visitdate FROM person WHERE CONCAT(person.pid,person.pcucodeperson) NOT IN ( SELECT CONCA T(persondeath.pid,persondeath.pcucodeperson) FROM persondeath WHERE persondeath.deaddate IS NULL OR persondeath.deaddate<= ‘2011-10-30’ )
  • 36. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 36 การใช ้งาน Function Arithmetic operator + บวก - ลบ * คูณ / หาร % หารเอาเศษ Comparison operator = เท่ากับ != หรือ <> ไม่เท่ากับ < น ้อยกว่า <= น ้อยกว่าหรือเท่ากับ > มากกว่า >= มากกว่าหรือเท่ากับ Exp BETWEEN Min AND Max มีค่าระหว่างค่าต่าสุด(Min) และค่าสูงสุด (MAX) Exp IS NULL เป็นค่าว่าง Exp IS NOT NULL ไม่เป็นค่าว่าง Exp in(X1 ,X2,….,Xn) มีค่าอยู่ในชุดข ้อมูลที่เปรียบเทียบ
  • 37. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 37 Logical operator AND หรือ && และ OR หรือ || หรือ NOT หรือ ! ไม่ XOR Excusive OR Mathematical Function TRUNCATE ( expression, decimal ) ใช ้ตัดเศษทศนิยมของ expression ทิ้ง ให ้เหลือจุดทศนิยม จานวนตาแหน่ง decimal ที่กาหนด ROUND(n , d) ใช ้ปัดตัวเลขทศนิยมของ n ให ้มีจานวนจุดทศนิยมเท่ากับ d ถ ้าไม่กาหนด d จะปัดเป็นจานวนเต็ม FLOOR(n) ใช ้ปัดเศษของ expression ให ้มีค่าน ้อยลง CEILING(n) ใช ้ปัดเศษของ expression ให ้มีค่าขึ้น String Function CONCAT ( char1, char2, ..., charN ) ใช ้นาสตริงของ char1, char2, ..., charN นามาต่อกัน LENGTH ( char ) ใช ้หาค่าความยาวของ char ที่กาหนด LEFT ( sentence, length ) ใช ้คืนค่า sentence โดยจะตัดสตริงให ้เหลือเพียงจานวนตัวอักษร length โดยจะเริ่มนับจากทางซ ้าย RIGHT ( sentence, length ) ใช ้คืนค่า sentence โดยจะตัดสตริงให ้เหลือเพียงจานวนตัวอักษร length โดยจะเริ่มนับจากทางขวา
  • 38. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 38 SUBSTRING ( sentence, position, length ) ใช ้ตัดสตริงของ sentence โดยจะเริ่มตัดจากตาแหน่ง position และตัดไปจานวน length ตัวอักษร SUBSTRING ( sentence FROM position FOR length ) ใช ้ตัดสตริงของ sentence โดยจะเริ่มตัดจากตาแหน่ง position และตัดไปจานวน length ตัวอักษร MID ( sentence, position, length ) ใช ้ตัดสตริงของ sentence โดยจะเริ่มตัดจากตาแหน่ง position และตัดไปจานวน length ตัวอักษร SUBSTRING ( sentence, position ) ใช ้ตัดสตริงของ sentence โดยจะเริ่มตัดจากตาแหน่ง position และตัดจนจบประโยค SUBSTRING ( sentence FROM position ) ใช ้ตัดสตริงของ sentence โดยจะเริ่มตัดจากตาแหน่ง position และตัดจนจบประโยค SUBSTRING_INDEX ( sentence, delimeter, count ) ใช ้ตัดสตริงของ sentence โดยมีรูปแบบของการตัด LTRIM ( sentence ) ใช ้ต ้ดช่องว่างทางซ ้ายของ sentence ออกไป RTRIM ( sentence ) ใช ้ต ้ดช่องว่างทางขวาของ sentence ออกไป TRIM ( sentence ) ใช ้ต ้ดช่องว่างทางซ ้ายและทางขวาของ sentence ออกไป LCASE ( sentence ) ใช ้แปลงค่าตัวอักษรภายใน sentence ให ้เป็น ตัวพิมพ์เล็กทั้งหมด LOWER ( sentence ) ใช ้แปลงค่าตัวอักษรภายใน sentence ให ้เป็น ตัวพิมพ์เล็กทั้งหมด UCASE ( sentence ) ใช ้แปลงค่าตัวอักษรภายใน sentence ให ้เป็น ตัวพิมพ์ใหญ่ทั้งหมด UPPER ( sentence ) ใช ้แปลงค่าตัวอักษรภายใน sentence ให ้เป็น ตัวพิมพ์ใหญ่ทั้งหมด
  • 39. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 39 Date and Time Function DAYOFWEEK ( date ) ใช ้คืนค่า วันที่ในสัปดาห์ โดยค่าที่เป็นไปได ้ได ้แก่ 1 ถึง 7 คือเรียงจาก 1=อาทิตย์ จนถึง 7=เสาร์ WEEKDAY ( date ) ใช ้คืนค่า วันที่ในสัปดาห์ โดยค่าที่เป็นไปได ้ได ้แก่ 0 ถึง 6 คือเรียงจาก 0=จันทร์ จนถึง 6=อาทิตย์ DAYOFMONTH ( date ) ใช ้คืนค่าวันที่ของเดือน โดยค่าที่เป็นไปได ้ได ้แก่ 1 ถึง 31 DAYOFYEAR ( date ) ใช ้คืนค่าวันที่ของปี โดยค่าที่เป็นไปได ้ได ้แก่ 1 ถึง 366 MONTH ( date ) ใช ้คืนค่าเดือนที่ของปี โดยค่าที่เป็นไปได ้ได ้แก่ 1 ถึง 12 YEAR ( date ) ใช ้คืนค่าปีคริสต์ศักราช โดยค่าที่เป็นไปได ้ได ้แก่ 1000 ถึง 9999 YEARWEEK ( date ) ใช ้คืนค่าปีคริสต์ศักราช และลาดับที่ของสัปดาห์ ใช ้คืนค่าชั่วโมงที่ โดยค่าที่เป็นไปได ้ได ้แก่ 0 ถึง 23 ใช ้คืนค่านาทีที่ โดยค่าที่เป็นไปได ้ได ้แก่ 0 ถึง 59 ใช ้คืนค่าวินาทีที่ โดยค่าที่เป็นไปได ้ได ้แก่ 0 ถึง 59 DATE_ADD ( date, INTERVAL num datepart ) ใช ้เพิ่มวันที่หรือเวลาตามส่วน datepart ที่กาหนด โดยจะเพิ่มเข ้าไปจานวน num หน่วย DATE_SUB ( date, INTERVAL num datepart ) ใช ้หักลบวันที่หรือเวลาตามส่วน datepart ที่กาหนด โดยจะเพิ่มเข ้าไปจานวน num หน่วย ADDDATE ( date, INTERVAL num datepart ) ใช ้เพิ่มวันที่หรือเวลาตามส่วน datepart ที่กาหนด โดยจะเพิ่มเข ้าไปจานวน num หน่วย SUBDATE ( date, INTERVAL num datepart ) ใช ้หักลบวันที่หรือเวลาตามส่วน datepart ที่กาหนด โดยจะเพิ่มเข ้าไปจานวน num หน่วย DATEDIFF(date1,date2) หาจานวนวันระหว่าง date1 และ date2 DATE_FORMAT ( date, format ) ใช ้จัดรูปแบบวันที่ให ้เป็นไปตาม format ที่กาหนด CURDATE ( ) ใช ้คืนค่าวันที่ปัจจุบัน โดยมีรูปแบบคือ YYYY-MM-DD หรือ YYYYMMDD
  • 40. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 40 CURRENT_DATE ( ) ใช ้คืนค่าวันที่ปัจจุบัน โดยมีรูปแบบคือ YYYY-MM-DD หรือ YYYYMMDD NOW ( ) ใช ้คืนค่าวันที่และเวลาปัจจุบัน โดยมีรูปแบบคือ YYYY- MM-DD HH:MM:SS หรือ YYYYMMDDHHMMSS SYSDATE ( ) ใช ้คืนค่าวันที่และเวลาปัจจุบัน โดยมีรูปแบบคือ YYYY- MM-DD HH:MM:SS หรือ YYYYMMDDHHMMSS CURRENT_TIMESTAMP ( ) ใช ้คืนค่าวันที่และเวลาปัจจุบัน โดยมีรูปแบบคือ YYYY- MM-DD HH:MM:SS หรือ YYYYMMDDHHMMSS Comparison Function ISNULL ( expression ) ใช ้ตรวจสอบว่า expression ที่กาหนดเป็นค่า NULL ใช่หรือไม่ COALESCE ( ) ใช ้คืนค่า ค่าข ้อมูลของ expression ตัวแรก ที่ไม่ใช่ค่า NULL หรือคืนค่า NULL ถ ้า expression ทั้งหมดเป็นค่า NULL INTERVAL ( ) ใช ้คืนค่า 0 ถ ้า expression1 < expression2 คืนค่า 1 ถ ้า expression2 < expression3 และจะเป็นอย่างนี้ไปเรื่อยๆจนกว่าจะถึงค่าสุดท ้าย STRCMP ( exp1, exp2 ) ใช ้เปรียบเทียบสตริง Control Flow Function IFNULL ( expression1, expression2 ) ใช ้ตรวจสอบว่า expression1 เป็นค่า NULL ใช่หรือไม่ NULLIF ( expression1, expression2 ) ใช ้คืนค่า NULL ถ ้าหากว่า expression1 และ expression2 มีค่าเท่ากัน IF (exp , true ,false ) เป็นเงื่อนไข โดยถ ้า expression boolean คืนค่า true กลับมา CASE WHEN THEN ELSE END ใช ้กาหนดเงื่อนไขของ expression ให ้มีหลายๆเงื่อนไข
  • 41. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 41 Miscellaneous Function SESSION_USER ( ) ใช ้คืนค่า username ที่ติดต่ออยู่ PASSWORD ( char ) ใช ้เข ้ารหัส ด ้วย function password ENCRYPT ( char ) ใช ้เข ้ารหัสด ้วย function encrypt ENCODE ( char, code ) ใช ้เข ้ารหัสด ้วย function encode โดยมีการกาหนด code ด ้วย DECODE ( char, code ) ใช ้ถอดรหัสด ้วย function decode ซึ่งเป็นการถอดรหัสของค่าที่ได ้จากการเข ้ารหัส encode โดยมีการกาหนด code ด ้วย MD5 ( char ) ให ้เข ้ารหัสด ้วย function md5 โดยค่าที่จะได ้คือ เลขฐานสิบหก ความยาว 32 ตัวอักษร FORMAT ( num, decimal ) ใช ้จัดรูปแบบการแสดงผลตัวเลข แบบมี comma ทุกๆ 3 หลักของตัวเลข โดยมีการกาหนดจุดทศนิยมไว ้ด ้วย VERSION ( ) ใช ้คืนค่า version ของ mysql CONNECTION_ID( ) ใช ้คืนค่า id ของการเชื่อมต่อฐานข ้อมูล Aggreation Function COUNT ( column_name ) ใช ้นับจานวนแถวทั้งหมด แต่จะไม่นับค่าข ้อมูลที่เป็น NULL โดยค่าที่คืนกลับมาจะเป็นชนิด int SUM ( column_name ) ใช ้หาผลรวมของค่าข ้อมูลในทุกแถว AVG ( column_name ) ใช ้หาค่าเฉลี่ยของค่าข ้อมูลในทุกแถว MAX ( column_name ) ใช ้หาค่าสูงสุด เมื่อเทียบกับค่าข ้อมูลในทุกแถว ถ ้าใช ้กับข ้อมูลที่เป็นตัวอักษร จะแสดงผลแถวแรกสุด MIN ( column_name ) ใช ้หาค่าต่าสุด เมื่อเทียบกับค่าข ้อมูลในทุกแถว ถ ้าใช ้กับข ้อมูลที่เป็นตัวอักษร จะแสดงผลแถวท ้ายสุด concat
  • 42. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 42 SELECT concat(fname ,’ ’,lname) AS name FROM person case SELECT concat(fname ,' ',lname) AS name , CASE WHEN sex='1' THEN 'ชาย' WHEN sex='2' THEN 'หญิง' ELSE '-' END AS sex FROM person อายุ(ปี) SELECT getAgeYearNum(birth,current_date) AS age FROM person sum SELECT SUM(CASE WHEN sex='1' THEN 1 ELSE null END) AS m, SUM(CASE WHEN sex='2' THEN 1 ELSE null END) AS w , COUNT(sex ) AS total FROM person DATE_FORMAT SELECT DATE_FORMAT( birth ,"%y-%m-%d") as birthdate FROM person
  • 43. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 43 max SELECT DATE_FORMAT( birth ,"%y-%m-%d") as birthdate FROM person convert SELECT convert(ifnull(visit.`money2`,0.0) using utf8) AS visit_money2 FROM visit
  • 44. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 44 การสร้าง View เมื่อมีการใช ้คาสั่ง SQL ที่ซับซ ้อน ผู ้ใช ้จะมีความยากลาบากในการเขียนคาสั่งที่มีการ Join ตารางหลายๆตาราง มีการใช ้Function ในการใช ้งานมากมาย หากมีการเรียกใช ้งานคาสั้งนั้นบ่อยๆ แล ้ว วิธีปัญหานั้นคือการสร ้าง View View คือมุมมองของข ้อมูลที่ผู ้ใช ้สร ้างขึ้นใหม่โดย View จะถูกสร ้างมาจากตาราง 1 ตาราง หรือหลายๆตารางก็ได ้ ประโยชน์ของ View 1. สามารถสร ้าง View สาหรับกลุ่มผู ้ใช ้ต่างๆด ้วยเงื่อนไขต่างๆกัน 2. สามารถสร ้างจาก Query ที่ซับซ ้อน ให ้งาสยต่อการใช ้งาน 3. จากัดการเข ้าถึงข ้อมูล เนื่องจากการสร ้าง View จะเป็นการเลือกเฉพาะฟิลด์ที่ต ้องการแสดง Create View Syntax CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] เช่น การนับจานวนประชากร จาแนกตามเพศ โดยไม่นับคนที่เสียชีวิตแล ้ว CREATE OR REPLACE VIEW v_count_person AS ( SELECT SUM(CASE WHEN sex='1' THEN 1 ELSE null END) AS m, SUM(CASE WHEN sex='2' THEN 1 ELSE null END) AS w , COUNT(sex ) AS total FROM person WHERE CONCAT(person.pid,person.pcucodeperson) NOT IN ( SELECT CONCAT(persondeath.pid,persondeath.pcucodeperson) FROM persondeath ) ) วิธีเรียกใช ้งาน View select * from v_count_person ;
  • 45. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 45 การกาหนดสิทธิการใช ้งานฐานข้อมูล คาสั่ง GRANT และ REVOKE GRANT ALL PRIVILEGES ON demo TO user1@localhost WITH GRANT OPTION REVOKE ALL PRIVILEGES ON demo FROM user1@localhost  คาสั่ง GRANT เป็นคาสั่งสาหรับการกาหนดสิทธิ์หรือความสามารถใดๆ ให ้กับ user  คาสั่ง REVOKE หรือคาสั่งที่ตรงกันข ้ามกับ GRANT คือเป็นการถอนหรือยกเลิกสิทธิ์ใดๆจากUser  การใช ้คาสั่ง GRANT หรือ REVOKE จะอนุญาตเฉพาะผู ้บริหารระบบในการกาหนดสิทธิ์ต่างๆ สาหรับผู ้ใช ้ MySQL จะแบ่งสิทธิ์ (Privilege) เป็ น 4 ระดับ คือ 1. Global level ระดับบนสุด ครอบคลุมทุก database รายละเอียดสาหรับสิทธิ์ของระดับนี้จะถูกเก็บไว ้ในตาราง mysql.user 2. Database level ระดับ database ครอบคลุมเฉพาะใน database อันใดอันหนึ่ง เช่น ความสามารถในการกระทาใดๆ ภายใน database นั้นๆ รายละเอียดสาหรับสิทธิ์ของระดับนี้ จะถูกเก็บไว ้ในตาราง mysql.db และ mysql.host 3. Table level ระดับ table ครอบคลุมเฉพาะภายในตารางนั้นๆ เช่น ความสามารถในการกระทากับ table นั้นๆ สามารถทาการ select, insert, delete, update ได ้หรือไม่ เป็นต ้น รายละเอียดสาหรับสิทธิ์ของระดับนี้ จะถูกเก็บอยู่ในตาราง mysql.tables_priv 4. Column level ระดับ column ครอบคลุมเฉพาะฟิลด์ใดฟิลด์หนึ่งภายในตารางข ้อมูล รายละเอียดสาหรับสิทธิ์ของระดับนี้ จะถูกเก็บอยู่ในตาราง mysql.columns_priv รายละเอียด priv_type มีดังต่อไปนี้ ALL PRIVILEGES FILE RELOAD ALTER INDEX SELECT CREATE INSERT SHUTDOWN DELETE PROCESS UPDATE DROP USAGE  เราสามารถใช ้ALL หรือ ALL PRIVILEGES ได ้อย่างใดอย่างหนึ่ง  USAGE มีความหมายเท่ากับ no privileges โดยใช ้กรณีที่เราต ้องการ create user และกาหนดให ้มีสิทธิ์เป็น no privileges  การถอนสิทธิ์การ GRANT ของ user ใดๆ ให ้ใช ้priv_type เป็น GRANT OPTION ตัวอย่าง: REVOKE GRANT OPTION ON … FROM …;  การใช ้priv_type สาหรับ table: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP,GRANT, INDEX และ ALTER  การใช ้priv_type สาหรับฟิลด์ SELECT, INSERT, UPDATE  การกาหนดสิทธิ์ระดับ database ใช ้ON *.*  สาหรับ user_name สามารถระบุได ้ถึงโฮสต์ที่ใช ้งาน เช่น mysql@localhost หรือ root@’%’
  • 46. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 46 กำรกำหนดสิทธิของผู้ใช้งำน หลักการที่ MySQL ใช ้เรียกว่า Access Control Lists (ACLs) จะมีการตรวจสอบสิทธิผู ้ใช ้งาน ว่าแต่ละคนมีสิทธิจะทาอะไรได ้บ ้าง กับฐานข ้อมูลใดบ ้าง ซึ่งสิทธิเหล่านี้จะถูกบันทึกเอาไว ้ในตารางชื่อ mysqlข ้อควรกระทาและไม่ควรกระทาในการป้องกันหรือรักษาความปลอดภัยของข ้อมูล 1. ห ้ามอนุญาตให ้ใครก็ตาม ที่ไม่ใช ้ผู ้ดูแลระบบ มีสิทธิเข ้าไปเรียกดูหรือใช ้งานตารางชื่อ mysqlเพราะ mysql เป็นแหล่งที่เก็บข ้อมูลเกี่ยวกับสิทธิต่าง ๆ 2. อย่างกาหนดสิทธิให ้กับผู ้ใช ้งานใด ๆ มากเกินความจาเป็นผู ้ใช ้แต่ละคนควรจะได ้รับสิทธิแตกต่างกัน และควรมีสิทธิจากัดเป็นกรณี ๆ ไป เช่น หากเป็นผู ้ใช ้ทั่ว ๆ ไปควรจะมีสิทธิใช ้งานแค่ฐานข ้อมูลใดฐานข ้อมูลหนึ่ง หรือ อาจจะมีสิทธิแค่ตารางใดตารางหนึ่งในแต่ละฐานข ้อมูลระดับสิทธิการเรียกใช ้ข ้อมูลมี4 ระดับคือ 2.1 ระดับโฮสต์ (host level) 2.2 ระดับฐานข ้อมูล (db level) 2.3 ระดับตารางข ้อมูล (table level) 2.4 ระดับคอลัมน์ข ้อมูล (column level) 3. ระวังผู ้ใช ้ที่ใช ้ชื่อว่า root root คือ ผู ้สร ้างฐานข ้อมูล มีสิทธิต่าง ๆ มาก ข ้อแนะนาว่าอย่าให ้มีผู ้ใช ้ชื่อ root อยู่ในสารบบของ MySQL โดยเราสามารถกาหนดผู ้ใช ้ขึ้นมาให ้มีสิทธิเทียบเท่า root และอีกประการคือ รายชื่อผู ้ใช ้ของ MySQL กับของ Server ที่ใช ้งาน จะเป็นคนละชุดกัน 4. ระวังการตั้งรหัสผ่านของผู ้ใช ้ การตั้งรหัสผ่านควรหลีกเลี่ยงคาศัพท์ทั่วไปที่สามารถค ้นหาได ้จากดิกชินนารี, หลีกเลี่ยงชื่อเล่น หรือ ชื่อ สถานที่ที่ผู ้บุกรุกอาจจะคาดเดาได ้ 5. หากไม่จาเป็นต ้องใช ้Telnet ก็ปิดไปดีกว่า ในกรณีที่Server ของเราสามารถรองรับการทางานของโปรแกรม Telnet แต่ในทางปฏิบัติไม่มีความจาเป็นที่ต ้องอนุญาตให ้ใครมาใช ้โปรแกรมนี้ ก็ควรยกเลิกการทางาน 6. อย่าเชื่อมือผู ้ใช ้มากนัก เพราะหากผู ้ใช ้เผลอไปใช ้คาสั่ง Drop database mysql ถ ้าเราพัฒนาโปรแกรมขึ้นมาใช ้ควรจะมีระบบตรวจสอบคาสั่งนี้ โดยห ้ามใช ้คาสั่งนี้อย่างเด็ดขาด ระดับสิทธิของผู้ใช้ 1. ระดับโฮสต์(host level) คือ ระดับนี้จะจากัดสิทธิว่า ผู ้ใช ้สามารถติดต่อเข ้ามายัง MySQL ได ้จากที่ไหนบ ้าง หรือจาก โฮสต์อะไรทั้งนี้เพราะถ ้า MySQL ของเราอยู่ในเครื่องคอมพิวเตอร์ที่เชื่อมโยงกับเครื่องอื่น ๆหรือเชื่อมโยงกับเครือข่าย Internet การติดต่อสื่อสารก็ย่อมกระทาจากที่ไหนก็ได ้ในโลก ผ่านทางโพรโตคอล TCP/IP ลักษณะการตรวจสอบสิทธิการใช ้งาน เมื่อเครื่องลูกข่ายที่ร ้องขอติดต่อเข ้ามา จะต ้องแจ ้งให ้ทราบว่ามาจากไหน ชื่อโฮสต์อะไร หมายเลข IP Address เท่าไร เมื่อ MySQL รับทราบการร ้องขอ ก็จะนาข ้อมูลที่ได ้รับแจ ้งไป ตรวจสอบว่าโฮสต์นั้นมีสิทธิหรือไม่หรือมีสิทธิอะไรบ ้าง ลักษณะชื่อโฮสต์ที่สามารถกาหนดได ้ ลักษณะชื่อโฮสต์ที่สามารถกาหนดได ้ หมายความว่าติดต่อมาจาก… Localhost เครื่องเดียวกันกับ MySQL server % เครื่องไหนก็ได ้ %.cc-moph เครื่องใดก็ตามที่อยู่ในโดเมน cc-moph 203.157% เครื่องใดก็ตามที่มีIP address เริ่มจาก 203.157 ตัวอย่าง กาหนดสิทธิให ้กับผู ้ใช ้ที่ชื่อว่า train ก็ระบุในลักษณะ train@host เช่น อนุญาตให ้train สามารถติดต่อมายัง MySQL ได ้จากเครื่องหมายเลข 203.157.4.27 ก็ระบุเป็น
  • 47. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 47 train@203.157.4.27 ดังนั้นถ ้าติดต่อ MySQL โดยใช ้สคริปต์ PHP ก็ต ้องเขียนคาสั่งในรูปแบบดังนี้ mysql_connect(“MySQLHost”,”train”,”รหัสผ่าน”); คาสั่งกาหนดสิทธิการใช ้งาน GRANT มีรูปแบบดังนี้ GRANT สิทธิต่าง ๆ ON ชื่อฐานข ้อมูล.ชื่อตาราง TO ชื่อผู ้ใช ้งาน@โฮสต์ [IDENTIFILE BY ‘รหัสผ่าน’] GRANT ALL ON *.* TO train@203.157.4.27 IDENTIFILE BY ‘aBcXyz’; สิทธิต่าง คือ สิทธิ (privilege) ที่จะสามารถทาได ้เช่น การเรียกดูข ้อมูล (SELECT), การลดข ้อมูล(DELECT) หรือจะระบุสิทธิต่าง ๆ เป็น ALL ก็ได ้ซึ่งหมายความว่าสามารถทาได ้ทุกอย่าง 2. ระดับฐำนข้อมูล (db level) ทั้งนี้ขึ้นอยู่กับว่ามีการระบุสิทธิต่าง ๆ ตามหลังคาสั่ง GRANT ถ ้าระบุคาว่า ALL ก็หมายความว่าให ้สิทธิในกรเรียกใช ้ทุกคาสั่ง เช่น GRANT สิทธิต่าง ๆ ON ชื่อฐานข ้อมูล.ชื่อตาราง TO ชื่อผู ้ใช ้งาน@โฮสต์[IDENTIFILE BY ‘รหัสผ่าน’] GRANT ALL ON *.* TO train@203.157.4.27 IDENTIFILE BY ‘aBcXyz’; GRANT SELECT ON *.* TO User1@localhost IDENTIFILE BY ‘Password’; หมายความว่า อนุญาตให ้user1 สามารถใช ้คาสั่ง SELECT สาหรับเรียกดูข ้อมูลทุกตารางทุกฐานข ้อมูล 3. ระดับตำรำงข้อมูล (table level) สิทธิระดับนี้จะสัมพันธ์กับสิทธิระดับฐานข ้อมูล คือ ถ ้าจะให ้สิทธิในการใช ้คาสั่งกับทุก ๆ ตารางใน ฐานข ้อมูลก็ระบุด ้วยเครื่องหมาย * เช่น GIS.* หมายถึงอนุญาตให ้มีสิทธิใช ้คาสั่งกับทุกตารางที่มีอยู่ในฐานข ้อมูลชื่อ GIS GRANT SELECT ON db1.table1 TO User1@localhost IDENTIFILE BY ‘aBcXyz’; หมายความว่าอนุญาตให ้user1 เรียกใช ้เฉพาะคาสั่ง SELECT เพื่อดึงข ้อมูลจากตางรางชื่อ table1 ซึ่งอยู่ในฐานข ้อมูล db1 เท่านั้น
  • 48. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 48 4. ระดับคอลัมน์ข้อมูล (Column level) เป็นสิทธิระดับที่ลึกลงไปจากสิทธิระดับอื่น ๆ อีก โดยมีความสัมพันธ์กับสิทธิระดบฐานข ้อมูลและระดับตาราด ้วย เพียงแต่วิธีการกาหนดสิทธิต ้องระบุในตางรางที่ชื่อ column_priv ซึ่งตารางนี้อยู่ในฐานข ้อมูลmysql อีกทีฉะนั้นจึงต ้องใช ้คาสั่ง QL สั่งไปตรง ๆ ที่ตาราง column_priv มิใช่กาหนดจาการใช ้คาสั่ง GRANT เหมือนกับสิทธิระดับอื่น ๆ สิทธิต่ำง ๆ หรือ privilege หมายความว่า เมื่อเราอนุญาตให ้ผู ้ใช ้เข ้ามายังฐานข ้อมูล, ตารางข ้อมูล, หรือเข ้ามายังMySQL ได ้แล ้ว สามารถใช ้คาสั่ง SQL ทาอะไรได ้บ ้าง สิทธิต่าง ๆ การทางาน ตัวอย่างการใช ้งาน SELECT เรียกดูรายการข ้อมูล SELECT * FROM table1 INSERT เพิ่มรายการข ้อมูล INSERT INTO table1 … UPDATE ปรับปรุงแก ้ไขรายการข ้อมูล UPDATE table1 SET … DELETE ลบรายการข ้อมูล DELETE FROM table1 ALTER แก ้ไขโครงสร ้างตารางข ้อมูล ALTER TABLE table1 ADD INDEX index1(name) CREATE สร ้างตารางหรือฐานข ้อมูลขึ้นมาใหม่ CREATE DATABASE database1 CREATE TABLE table1 DROP ลบตารางหรือฐานข ้อมูล DROP DATABASE database1 DROP TABLE table1 RELOAD สั่งให ้server เซ็นค่าต่าง ๆ ใหม่ FLUSH HOST (ปลดล็อคในกรณีที่ server มีการล็อค ป้องกันการใช ้งานบางอย่าง เช่น ป้องกันมิให ้มีผู ้ใช ้งาน พร ้อมกันมาเกิดกาหนด) SHUTDOWN อนุญาตให ้สั่งปิดการทางานของ server Mysqladmin shutdown PROCESS ใช ้คาสั่งพิเศษกับ server เช่น SHOW SHOW PROCESSLIST (ขอให ้แสดงรายการ โพรเซสที่ กาลังทางานอยู่) FILE อ่าน – เขียน ไฟล์ที่ server ได ้ LOAD DATA INFILE ‘data.txt’ INTO TABLE table1 ( โหลดข ้อมูลจากไฟล์ชื่อ data.txt ไปบันทึกลงใน ตารางข ้อมูล tabel1)
  • 49. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 49 เมื่อคุณ install MySQL เสร็จ สิ่งแรกที่คุณควรทา คือการกา หนด password สา หรับ root user โดยวิธีการ ดังนี้ shell> mysql -u root mysql>use mysql; mysql> UPDATE user SET Password=PASSWORD('new_password') WHERE user='root'; mysql> FLUSH PRIVILEGES; วิธีกำรกำหนด password จากตัวอย่างในหัวข ้อที่ผ่านมาจะเห็นได ้ว่าเมื่อคุณ INSERT หรือ UPDATE password คุณต ้องใช ้function PASSWORD() เพื่อเข ้ารหัส password เนื่องจากการกระทา เช.นนี้ ทา ให ้ password ถูกเก็บลง table ในแบบที่ถูกเข ้ารหัส เพื่อความปลอดภัยของข ้อมูล หากคุณลืมใช ้function PASSWORD() , password ก็จะถูกเก็บในรูปแบบของตัวหนังสือ (plaintext) การนาเข้าข้อมูล รูปแบบการใช ้LOAD DATA INFILE มีดังนี้ LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY 't'] [OPTIONALLY] ENCLOSED BY ''] [ESCAPED BY '' ]] [LINES TERMINATED BY 'n'] [IGNORE number LINES] [(col_name,...)] LOCAL หมายถึง file ที่ถูกอ่านถูกเก็บไว ้ที่ client ซึ่งจะทา ให ้เครื่องทา งานช ้าลง เนื่องจาก server จะต ้องไปอ่าน file จากเครื่อง client ถ ้าไม่มีคา ว่า LOCAL , file จะต ้องถูกเก็บไว ้ที่ server และ การอ่านtext files ที่อยู่บน server file จะต ้องอยู่ใน database directory หรือเป็น file ที่ user ทุกคนสามารถเปิดอ่านได ้นั่นคือถ ้าคุณต ้องการอ่าน file จาก server คุณจะต ้องกา หนด file privilege บน server host. ถ ้า LOW_PRIORITY ถูกกา หนด หมายถึงการทา คา สั่ง LOAD DATA จะถูกเลื่อนออกไปจนกระทั่งไม่มี clients เครื่องใดอ่านข ้อมูลจากตาราง การหาตาแหน่งของ file บน server นั้น server จะต ้องทราบ pathname ของ file เพื่อหาตา แหน่งของ file โดยใช ้กฎดังนี้ :  ถ ้า pathname เป็นแบบ absolute path, server จะใช ้pathname ในการค ้นหา file
  • 50. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 50  ถ ้า pathname เป็นแบบ relative pathname, server จะค ้นหา file นั้นโดยอ ้างอิง จาก directory ของ data ใน server  ถ ้า file name ไม่ได ้กา หนด path มาด ้วย, server จะค ้นหา file จาก database directory ของdatabase ที่ใช ้ปัจจุบัน  IGNORE number LINES ใช ้สา หรับทา ให ้MySQL ไม่สนใจข ้อมูล number บรรทัดของส่วนหัวข ้อ file เช่น ขอ ้มลู บรรทัดแรกเป็นชื่อ ของ column เป็นต ้น LOAD DATA INFILE "/tmp/file_name" into table test IGNORE 1 การ Export ข้อมูล สามารถใช ้คาสั่งเพื่อส่งออกข ้อมูลที่ต ้องการออกเป็น Text File ได ้ตามตัวอย่าง SELECT idcard , fname ,lname FROM person INTO OUTFILE '/tmp/exdata.txt'; SELECT idcard , fname ,lname INTO OUTFILE '/tmp/exdata.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '' LINES TERMINATED BY 'n' FROM person SELECT idcard , fname ,lname เลือกฟิลด์ข ้อมูลที่ต ้องการส่งออก INTO OUTFILE '/tmp/exdata.csv' ตาแหน่งและชื่อไฟล์ที่ต ้องการส่งออก FIELDS TERMINATED BY ',' คั้นข ้อมูลแต่ละฟิลด์ด ้วยคอมมา ENCLOSED BY '"' ครอบข ้อมูลด ้วยเครื่องหมายคาพูด(“”) ESCAPED BY '' ใส่ Escape Character ด ้วย Back Slash() LINES TERMINATED BY 'n' ขึ้นบรรทัดใหม ้ของแต่ละรายการด ้วย(n) FROM person ชื่อตารางข ้อมูลที่ต ้องการส่งออก
  • 51. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 51 การสารองข้อมูล ข ้อมูลเป็นสิ่งที่สาคัญ ควรหาวิธีการป้องกันการเสียหายของข ้อมูล โดยการสารองข ้อมูลให ้มากเท่าที่สามารถจะทาได ้ โดยการสารองข ้อมูลเพื่อให ้ข ้อมูลมีความครบถ ้วนมากที่สุดนั้นมักจะบันทึกเป็น 3 ระดับคือ  Full System Backup  Full Data Backup  Incremental Backup สาหรับการสารองข ้อมูลสามารถแบ่งออกเป็น 2 วิธีหลัก ๆ ดังนี้ 1. Offline Backup : เป็นวิธีเบื้องต ้นที่หลาย ๆ ท่านที่เคยทาการสารองข ้อมูลคงคุ ้นเคย นั่นคือการหยุดให ้บริการต่าง ๆ บนเครื่องเซิร์ฟเวอร์ทั้งหมด หรือการ Stop Service ต่าง ๆ ที่มีอยู่ทั้งหมดก่อนทาการสารองข ้อมูล (Backup) ซึ่งวิธีนี้อาจจะไม่เหมาะสาหรับองค์กรที่จาเป็นต ้องทาการให ้บริการผู ้ใช ้งาน ตลอด 24 ชม. ทั้ง 7 วัน 2. Online Backup : ความไม่สะดวกเกิดขึ้นเมื่อจาเป็นต ้องทาการสารองข ้อมูล แต่ไม่สามารถหยุดการให ้บริการได ้จึงได ้มีการพัฒนาวิธีการทาการสารองข ้อมูลขึ้นมาอีกวีธีหนึ่งคือ สามารถทาการสารองข ้อมูลไปพร ้อม ๆ กับการให ้บริการต่าง ๆ แก่ผู ้ใช ้งานได ้ซึ่งเรียกวิธีนี้ว่า Online Backup หลายผลิตภัณฑ์ในท ้องตลาดมีการทางานลักษณะนี้ ส่วนกระบวนการในการสารองข ้อมูล สามารถแบ่งออกตามลักษณะของทิศทางการไหลของข ้อมูลได ้2 ประเภท 1. LAN Backup : เป็นกระบวนการแบ็คอัพที่มีทิศ ทางการไหลของข ้อมูลที่ต ้องการแบ็คอัพไปตามเน็ตเวิร์ก เครื่องที่เป็น Backup Server คือเครื่องที่มี Tape Drive ต่ออยู่ ข ้อมูลจาก Server อื่น ๆ จะถูกดึงออกมาผ่านทางเน็ตเวิร์กส่งไปยัง Backup Server 2. LAN Free Backup : กระบวนการแบ็คอัพสาหรับองค์กรที่ใช ้งานตู ้Storage หรือที่เรียกกันว่า SAN ( Storage Area Network ) ที่เครื่องเซิร์ฟเวอร์ทาการเชื่อมต่อเพื่อเข ้ามาใช ้เนื้อที่ใน SAN ซึ่งข ้อมูลสาคัญที่จาเป็นต ้องการทาการ Backup สาหรับ database ขนาดใหญ่แล ้ว การใช ้คาสั่ง mysqldump สาหรับสารองข ้อมูล นั้นมีประสิทธิภาพมากที่สุดแล ้ว ในการใช ้คาสั่ง mysqldump เพื่อทาการ backup และ mysql เพื่อ restore ให ้ใช ้คาสั่งทั้งสองโดยที่ไม่ต ้อง Login เข ้า console ของ database mysqldump [options] db_name [tbl_name ...] mysqldump [options] --databases db_name ... mysqldump [options] --all-databases -u : username -p : password (ห ้ามกรอกในบรรทัด ให ้เว ้นไว ้เมื่อ กด enter ระบบจะให ้ใส่เอง) -h : host หรือ ip เครื่อง server (ใส่หรือไม่ก็ได ้หากใช ้localhost)
  • 52. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 52 -P : Port Number ในกรณีที่ใช ้Default Port(3306) ไม่ต ้องใส่ option นี้ สาหรับ option อื่นในคาสั่ง mysqldump สามารถดูได ้จาก mysqldump –h สารองข ้อมูลทั้งฐานข ้อมูล mysqldump -uroot –p123456 jhcisdb --lock-all-table > /tmp/jhcisBackup_$(date +%Y%m%d_%H%M%S).sql สารองข ้อมูลเฉพาะตารางที่ต ้องการ mysqldump -u root -p jhcisdb -tables person > jhcis_person.sql การนาข้อมุลสารองมาใช ้งาน เมื่อต ้องการนาข ้อมูลที่ทาการสารองไว ้มาใช ้งาน สามารถนาข ้อมูลจากไฟล์มานาเข ้าฐานข ้อมูลด ้วยคาสั่งดังนี้ mysql -uUsername -pPassword DatabaseName -PportNumber -hServer < DatabaseName.sql เช่น mysql -hlocalhost -uroot –p123456 –P3333 jhcisdb < jhcisdb_backup.sql
  • 53. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 53 การเพิ่มประสิทธิภาพ และการซ่อมแซมตารางข้อมูล MySQL Optimize Table สิ่งที่ควรทาสาหรับตารางที่มี ลบ แก ้ไขบ่อยๆ OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ... ตัวอย่่าง  ก่อนทา Optimize  คาสั่ง Optimize  หลังจาก Optimize
  • 54. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 54 คาสั่งสาหรับการตรวจสอบและซ่อมแซมฐานข ้อมูล MySQL mysqlcheck [options] db_name [tables] mysqlcheck [options] --databases DB1 [DB2 DB3...] mysqlcheck [options] --all-databases mysqlcheck –h localhost -u root –P3333 -p --auto-repair –databases jhcisdb ในการใช ้คาสั่งนี้สามารถใช ้คาสั่ง หรือ option ต่างๆได ้ดังนี้ mysqlrepair --repair mysqlanalyze --analyze mysqloptimize --optimize --auto-repair ถ ้าตรวจสอบตารางแล ้วพบความเสียหาย จะทาการซิอมให ้โดยอัตโนมัติ ถ ้าฐานข ้อมูลเป็นแบบ myisam สามารถใช ้คาสั่งนี้ โดยตรงกับไฟล์ฐานข ้อมูลได ้ myisamchk -r *.MYI หรือถ ้าหากต ้องการ Repair เฉพาะ Table mysql –h localhost –u root –P3333 -p use jhcisdb; ตรวจสอบว่า Table นี้มีปัญหาหรือไม่ check table table_name; และสามารถซ่อม Table ที่เสียหาย repair table table_name;
  • 55. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 55 การใช ้งาน MySQL Administrator โปรแกรม MySQL Administrator เป็นโปรแกรม ที่ใช ้งานเพื่อช่วยในการบริหารจัดการฐานข ้อมูล MySQL เริ่มใช ้งานโปรแกรม 1. คลิก Start >> MySQL-JHCIS >> เลือก MySQL Administrator 2. Connect to MySQL กาหนดค่าเพื่อติดต่อกับฐานข ้อมูล MySQL ดังรูป แล ้วกดปุ่ ม OK Store Connection สามารถสร ้าง Connection ไว ้ใช ้งานได ้โดย กดปุ่ ม Server Host ชื่อ หรือ IP Address ของ MySQL Server ถ ้าเป็นเครื่องเดียวกับ Server ใช ้ชื่อ Localhost หรือ 127.0.0.1 Port Port Number ที่ใช ้สาหรับ JHCIS ใช ้port 3333 โดยปกติ MySQL ใช ้port 3306 Username ชื่อที่เข ้าใช ้งาน MySQL Password รหัสผ่านของ Username ที่เข ้าใช ้งาน MySQL
  • 56. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 56 3. การสร ้าง Connection 4. กาหนดค่าใน Category “General Options” แล ้วกดปุ่ ม Apply
  • 58. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 58 Connection Parameters Store Connection สามารถสร ้าง Connection ไว ้ใช ้งานได ้โดย Server Host ชื่อ หรือ IP Address ของ MySQL Server ถ ้าเป็นเครื่องเดียวกับ Server ใช ้ชื่อ Localhost หรือ 127.0.0.1 Port Port Number ที่ใช ้สาหรับ JHCIS ใช ้port 3333 โดยปกติ MySQL ใช ้port 3306 Username ชื่อที่เข ้าใช ้งาน MySQL Password รหัสผ่านของ Username ที่เข ้าใช ้งาน MySQL หากต ้องการลบ Connection ให ้คลิกที่ชื่อ Connections ที่ต ้องการ แล ้วกดปุ่ ม Delete Connection แล ้วกด Apply เพื่อบันทึกการลบ 6. เมื่อกาหนดค่า Connection เสร็จแล ้ว กดปุ่ ม Apply เพื่อบันทึก แล ้วกดปุ่ ม Close เพื่อปิดหน ้าต่าง 7. เลือก Connection ที่ต ้องการ แล ้วกดปุ่ ม OK
  • 59. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 59 8. หากมีข ้อความแสดงดังรูป ให ้กดปุ่ ม OK จากนั้นสามารถใช ้งานได ้ตามปกติ หากต ้องการแก ้ไขให ้ไม่แสดงข ้อความดังรูป ให ้คลิก Start >> MySQL-JHCIS >> MySQL Adminstrator Patch SVC แสดงข ้อความ Register Editor >> กดปุ่ ม Yes
  • 60. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 60 แสดงข ้อความการแก ้ไข Registry >> กดปุ่ ม OK 9. แสดงข ้อมูล Server Information 10. Service Control Tab :: Start/Stop service
  • 61. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 61 แสดงสถานะและชื่อ Service ที่ใช ้งาน นั้นคือ Service ชื่อ “MySQL_JHCIS” กาลังทหงานอยู่ หากต ้องการหยุดการทางาน ใหก ้กดปุ่ ม Stop Service 11. User Administration การเพิ่มผุ ้ใช ้ใน MySQL  เลือก User Administrator แล ้วคลิก ปุ่ ม Add New User  หน ้าจอ User Information จะแสดงขึ้นมาให ้บันทึกข ้อมูล  ใส่ User และ Password แล ้วกดปุ่ ม Apply Change  กาหนดการอนุญาตการให ้Connect จากเครื่องที่กาหนด
  • 63. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 63 12. การสารองข ้อมูล Backup คือ การสารองข ้อมูลไว ้เพื่อกู ้ข ้อมูลคืนในกรณีที่ เซิร์ฟเวอร์เกิดความเสียหายทั้งซอฟท์แวร์และฮาร์ดแวร์ การย ้าย/เปลี่ยนเซิร์ฟเวอร์ 1. กดปุ่ ม New Project 2. กาหนดชื่อ Project เช่น jhcis_backup 3. เลือกฐานข ้อมูลที่ต ้องการ Backup 4. กดปุ่ ม เพื่อเลือกฐานข ้อมูลที่ต ้องการ Backup 5. ฐานข ้อมูลที่ถูกเลือกจะแสดงใน Backup Content โดยส่วนที่ถูก Backup จะมีเครื่องหมาย 6. กดปุ่ ม Save Project 7. Tab:: Advance options เลือก Complete Backup
  • 65. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 65 การตั้งเวลาสารองข ้อมูล  เลือก Tab::Schedule  เลือกที่Schedule this backup project (1)  กาหนดตาแหน่งที่ต ้องการบันทึกข ้อมูล (2)  กาหนดชื่อไฟล์โดยปกติจะใช ้ชื่อ project เป็นชื่อไฟล์(3)  เลือกรูปแบบการสารองข ้อมูล (4)  กาหนดเวลาที่ต ้องการ โดยมีรูปแบบแป็น HH:MM:SS (5)  บันทึกโดยกดปุ่ ม Save Project (6)  ใส่รหัสผ่านของชื่อผู ้ใช ้งาน windows ที่แสดงขึ้นมาในกล่องข ้อความ (7)  กดปุ่ ม Save (8)
  • 67. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 67 13. Restore Restore คือการนาไฟล์ข ้อมูลที่เคยสารอง(Backup)ไว ้กลับมาใช ้งาน หมายเหตุ :: ไฟล์ SQL จากการใช ้คาสั่ง mysqldump ไม่สามารถนามา restore ด ้วย MySQL Administrator 13.1 กดปุ่ ม Open Backup File 13.2 เลือกไฟล์ที่ต ้องการ Restoreแล ้วกดปุ่ ม Open 13.3 ชื่อไฟล์ที่เลือกจะแสดงในช่อง File to restore (2) 13.4 กดปุ่ ม Start Restore 14. Catalog Catalog จะแสดงรายชื่อฐานข ้อมูล(Database) ถ ้าคลิกเลือกฐานข ้อมูลที่ต ้องการแล ้ว โปรแกรมจะแสดงรายชื่อตารางข ้อมูล ประเภทตารางและจานวนข ้อมุลใน Tab :: Schema Tables ถ ้าต ้องการลบฐานข ้อมูล ให ้คลิกเลือกฐานข ้อมูลที่ต ้องการลบ >> คลิกขวา >> Drop Schema
  • 68. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 68 กรณีที่ต ้องการสร ้างฐานข ้อมูลใหม่ ให ้คลิกเลือกฐานข ้อมูล >> คลิกขวา >> Create New Schema การตรวจสอบและดูแลตารางข ้อมูล คลิกตารางข ้อมูลที่ต ้องการแล ้วกดปุ่ ม Maintainance >> Optimize
  • 69. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 69 การใช ้งาน MySQL Query Browser ในการใช ้งาน MySQL ที่ในบทผ่านมาเป็นการใช ้งานในรูปแบบ command line ซึ่งผู ้ที่เริ่มใช ้งาน MySQL อาจรู ้สึกว่าไม่สะดวกในการใช ้งาน ปัจจุบันมีโปรแกรมที่ช่วยให่การใช ้งาน MySQL สะดวกขึ้นหลายโปรแกรม เช่น MySQL Front , Navicat เป็นต ้น แต่ในบทนี้จะแนะนาเครื่องมือดีๆ ที่จะทาให ้การใช ้งาน mysql ง่ายขึ้นโดยโปรแกรมนี้จะถูกติดตั้งมาพร ้อมกับ JHCIS MySQL query Browser โดยเป็นโปรแกรมที่สามารถใช ้ได ้ฟรี ดาวน์โหลดได ้ที่ http://dev.mysql.com/downloads/gui- tools/5.0.html 1. เริ่มใช ้งาน MySQL query Browser คลิกที่ Start >> MySQL-JHCIS >> MySQL query Browser 2. กาหนดการติดต่อ MySQL Server 2.1 เลือกใช ้Stored Connection (หากยังไม่ดัสร ้างไว ้สามารถดูวิธีการสร ้าง Connection ได ้จากเรื่องการใช ้งาน MySQL Administrator ) 2.2 กาหนดค่าการติดต่อ MySQL Server Server Host ชื่อ หรือ IP Address ของ MySQL Server ถ ้าเป็นเครื่องเดียวกับ Server ใช ้ชื่อ Localhost หรือ 127.0.0.1 Port Port Number ที่ใช ้สาหรับ JHCIS ใช ้port 3333 โดยปกติ MySQL ใช ้port 3306 Username ชื่อที่เข ้าใช ้งาน MySQL Password รหัสผ่านของ Username ที่เข ้าใช ้งาน MySQL Default Schema ชื่อฐานข ้อมูลที่ต ้องการใช ้งาน เช่น 3333 2.3 กดปุ่ ม OK เพื่อเข ้าใช ้งาน
  • 70. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 70 3. แสดงหน ้าจอสาหรับใช ้งานโปรแกรม มีส่วนประกอบต่างๆ ดังนี้
  • 72. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 72 6. แก ้ไขข ้อมูลในตาราง แก ้ไขข ้อมูลในตาราง บันทึกการแก ้ไข ยกเลิกการแก ้ไข เลื่อนรายการข ้อมูล ค ้นหาข ้อมูลในตาราง 7. การส่งออกข ้อมูลที่ได ้จากการ Query ออกเป็นรูปแบบต่างๆโดย 7.1 คลิกขวาที่ตารางข ้อมูล 7.2 เลือก Export Resultset 7.3 เลือกชนิดข ้อมุลที่ต ้องการส่งออก 7.4 กาหนดตาแหน่งที่จะบันทึก และชื่อไฟล์ แล ้วกดปุ่ ม Save
  • 73. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 73 8. การบันทึกคาสั่ง SQL 8.1 เลือกเมนู File >> Save As… 8.2 กาหนดตาแหน่งที่จะบันทึก และชื่อไฟล์ แล ้วกดปุ่ ม Save 8.3 ชนิดของไฟล์ที่บันทึกโดยปกติจะเป็น qbquery สามารถกาหนดให ้เป็นประเภทอื่น ได ้เช่น .sql 9. การเรียกใช ้งานคาสั่งที่มีอยู่ 9.1 เลือกเมนู File >> Open Query สาหรับไฟล์ที่เป็น .qbquery หรือ เลือกเมนู File >> Open Script สาหรับไฟล์ที่เป็น .sql 9.2 เลือกไฟล์จากตาแหน่งที่ต ้องการ แล ้วกดปุ่ ม Open 9.3 สามารถแก ้ไขสั่ง แล ้วใช ้งานได ้ 10. การเรียกใช ้งานคาสั่งที่เคยใช ้งาน ซึ่งโปรแกรมจะเก็บทุกคาสั่งที่เคยใช ้งานไว ้ที่ Tab History เราสามารถเรียกใช ้งานคาสั่งที่อยู่ใน Tab History ได ้
  • 75. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 75 สารบัญ แนะนาระบบจัดการฐานข ้อมูล 1 การติดตั้งและใช ้งาน MySQL ประเภทข ้อมูลใน MySQL Start and Stop MySQL Service MySQL Command Line Data Definition Language Data Manipulation Language Data Retrieval Language การเรียกดูข ้อมูลชั้นสูง SQL Function การสร ้าง View การกาหนดสิทธิในการใช ้งานฐานข ้อมูล การสารองข ้อมูล การนาข ้อมูลสารองใช ้งาน การเพิ่มประสิทธิภาพ และการซ่อมแซมตารางข ้อมูล การใช ้งาน MySQL Administrator การใช ้งาน MySQL Query Browser โครงสร ้างฐานช ้อมูล JHCIS
  • 76. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 76 ScripSQL ForJHCIS Cr.สสอไม้แก่น link=> http://itmaikaenhos.blogspot.com/p/scrip-sql-for-jhcis.html รายชื่อปชช. อายุ 35 ปี ขึ้นไป ที่ยังไม่ได้รับการคัดกรองเบาหวาน-ความดัน ========================================================================== === SELECT person.pidas'HN',person.fname as'ชื่อ',...person.lname as'นามสกุล',person.hnomoi as 'บ้านเลขที่',person.mumoi as'หมู่ที่', #person.typelive#, getAgeYearNum(birth,CURDATE())as'อายุ' FROM person INNERJOIN ncdpersonscreenallON person.pcucodeperson=ncdpersonscreenall.pcucodeAND person.pid=ncdpersonscreenall.pid WHERE person.typelive IN ( 1,3) ANDperson.pidNOTIN (selectpersondeath.pidfrompersondeath) ANDgetAgeYearNum(birth,CURDATE()) >='35' ANDperson.pidNOTIN (selectpersonchronic.pidfrompersonchronic) ANDncdpersonscreenall.visitnoNOTBETWEEN '20130401'AND '2014331' GROUP BY person.pid code ตอบตัวชี้วัด QOFเรื่อง ร้อยละของหญิงตั้งครรภ์ได้รับการฝากครรภ์ครบ5ครั้งตามเกณฑ์
  • 77. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 77 ========================================================================== ====== SELECT p.pid, concat(p.prename,'',p.fname,'',p.lname) aspersonname, p.idcard,timestampdiff(year,p.birth,vp.lmp)ASage,... p.hnomoi,p.villnoAS หมู่,vp.lmp,vp.edc,t.datedeliverAS วันคลอด,t.pregno, t1.pregage ASANC1_p_age,t1.datecheckASANC1_d_check, t2.pregage ASANC2_p_gag,t2.datecheckASANC2_d_check, t3.pregage ASANC3_p_gag,t3.datecheckASANC3_d_check, t4.pregage ASANC4_p_gag,t4.datecheckASANC4_d_check, t5.pregage ASANC5_p_gag,t5.datecheckASANC5_d_check FROM (SELECT * FROM visitancdelivervWHERE v.datedeliverBETWEEN '2013-10-01' AND'2014-03-31' ORDER BY v.datedeliver) t LEFT JOIN visitancpregnancyvpON vp.pcucodeperson=t.pcucodepersonANDvp.pid=t.pidAND vp.pregno=t.pregno INNERJOIN (SELECT ps.*,village.villnoFROMpersonps INNERJOIN house ON ps.pcucodeperson=house.pcucode ANDps.hcode=house.hcode INNERJOIN village ON house.pcucode =village.pcucode ANDhouse.villcode =village.villcodewhere right(house.villcode,2)!='00') pON p.pid=t.pidANDp.pcucodeperson=t.pcucodeperson LEFT JOIN (SELECT* FROMvisitancWHERE pregage<=12GROUP BY pid,pregno) t1ON t1.pid=t.pid ANDt1.pregno=t.pregno LEFT JOIN (SELECT* FROMvisitancWHERE pregage BETWEEN 16 AND 20 GROUP BY pid,pregno) t2 ON t2.pid=t.pidANDt2.pregno=t.pregno LEFT JOIN (SELECT* FROMvisitancWHERE pregage BETWEEN 24 AND 28 GROUP BY pid,pregno) t3 ON t3.pid=t.pidANDt3.pregno=t.pregno LEFT JOIN (SELECT* FROMvisitancWHERE pregage BETWEEN 30 AND 34 GROUP BY pid,pregno) t4 ON t4.pid=t.pidANDt4.pregno=t.pregno LEFT JOIN (SELECT* FROMvisitancWHERE pregage BETWEEN 36 AND 40 GROUP BY pid,pregno) t5 ON t5.pid=t.pidANDt5.pregno=t.pregno
  • 78. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 78 จานวนคัดกรองและการตีค่าความเสี่ยงverbal ========================================================================== ==== SELECT CASEWHEN age_yearbetween'15'and'34' THEN 'อายุ15_34' WHEN age_yearbetween'35' and '59' THEN 'อายุ35_59' WHEN age_year>= '60' THEN 'อายุ>60'ELSE null ENDAS 'Grage', case whenncd_person.sex ='1' then'ชาย'whenncd_person.sex ='2' then'หญิง'else'ไม่ระบุ'endas grsex, sum(CASEWHEN age_year>= '15' THEN 1 ELSE 0 END) AS 'จานวนคัดกรอง', sum(CASEWHEN age_yearbetween'15'and'34' and chronic_flag='0'and(screen_q1+screen_q2+ screen_q3+(blackarmpit='1') )>='3' THEN 1 ELSE 0 END) AS'verbal<15ปี', sum(CASEWHEN age_year> = '35' and chronic_flag='0'and (screen_q1+screen_q2+screen_q3+ screen_q4+screen_q5+screen_q6)>='1' THEN 1 ELSE 0 END) AS'verbal>35ปี', sum(CASEWHEN chronic_flag='0'and bsl> '0' THEN 1 ELSE 0 END) AS'ได้รับการเจาะDTX', sum(CASEWHEN chronic_flag='0'and bsl < '100' THEN 1 ELSE 0 END) AS'bsl<100', sum(CASEWHEN chronic_flag='0'and bsl between'100'and'125' THEN 1 ELSE 0 END) AS 'bsl100- 125',sum(CASEWHEN chronic_flag='0'andbsl >= '126' THEN 1 ELSE 0 END) AS 'bsl>126', sum(CASEWHEN chronic_flag='0'and ((hbp_s2between'120'and'139') or (hbp_d2between'80'and '89')) THEN 1 ELSE 0 END) AS'BP120/80-139/89', sum(CASEWHEN chronic_flag='0'and (hbp_s2>= '140' and hbp_d2>= '90') THEN 1 ELSE 0 END) AS 'BP>140/90', sum(CASEWHEN chronic_flag='0'and (hbp_s1< '120' andhbp_d1 < '80') THEN 1 ELSE 0 END) AS 'BP<120/80', sum(CASEWHEN ncd_person.sex ='1' and chronic_flag='0'and ncd_person_ncd_screen.waist>='90' THEN 1 ELSE 0 END) AS 'รอบเอวเกินชาย', sum(CASEWHEN ncd_person.sex ='2' and chronic_flag='0'and ncd_person_ncd_screen.waist>='80' THEN 1 ELSE 0 END) AS 'รอบเอวเกินหญิง', sum(CASEWHEN chronic_flag='0'and ncd_person_ncd_screen.bmi >='25' THEN 1 ELSE 0 END) AS 'BMI>25' FROM
  • 79. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 79 ncd_person_ncd_screen INNERJOIN ncd_personON ncd_person_ncd_screen.pcucode=ncd_person.pcucode AND ncd_person_ncd_screen.pid=ncd_person.pid INNERJOIN ncd_person_ncdON ncd_person_ncd_screen.pcucode=ncd_person_ncd.pcucode AND ncd_person_ncd_screen.pid=ncd_person_ncd.pid WHERE ncd_person_ncd_screen.screen_datebetween'2013-10-01'and'2014-11-30' and SUBSTRING(ncd_person.village,7,2)<>'00' groupby Grage,grsex Code จานวนคัดกรองแยกverbal แยกกลุ่มสีแยกเพศแยกอายุ Code จานวนคัดกรองแยกตามverbal 6ข้อแยกกลุ่มสีแยกเพศแยกอายุ มีเงื่อนไขคือ ผู้ที่อายุ15 ปีขึ้นไป (อายุ ณวันที่ 1 ตุลาคม2556)ที่มีชีวิตทุกคน (ถ้าคุณเอากลุ่มป่วยมาบันทึกก็จะนับไปด้วย)และมีTypearea1+3ที่ได้รับการคัดกรองNCDตั้งแต่วันที่1 ตุลาคม 2556 ถึงวันที่30 กันยายน2557 ========================================================================== ==== SELECT CASEWHEN person.sex ='1' THEN 'ชาย'WHEN person.sex ='2' THEN 'หญิง'ELSE'ไม่ระบุ'END AS groupsex, CASE WHEN age_yearbetween'15'and'34' THEN '15-34'WHEN age_yearbetween'35'and'59' THEN '35-39'WHEN age_year>='60' THEN '>60'ELSE'ไม่ระบุ'END ASgrouppop, count(ncd_person_ncd_screen.pid) as'จานวนคัดกรอง', sum(CASEWHEN screen_q1='1' THEN '1' ELSE null END) AS 'ญาติเบาหวาน', sum(CASEWHEN screen_q2='1' THEN '1' ELSE null END) AS 'รอบเอว+BMIเกิน', sum(CASEWHEN screen_q3='1' THEN '1' ELSE null END) AS 'BP>140/90', sum(CASEWHEN screen_q4='1' THEN '1' ELSE null END) AS 'ประวัติน้าตาลสูง',
  • 80. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 80 sum(CASEWHEN screen_q5='1' THEN '1' ELSE null END) AS 'Tri>250',sum(CASEWHEN screen_q6= '1' THEN '1' ELSE null END) AS'เบาหวานขณะตั้งครรภ์', sum(CASEWHEN blackarmpit= '1' THEN '1' ELSE null END) AS 'รอยพับดา', sum(CASEWHEN htfamily='1' THEN '1' ELSE null END) AS 'ญาติBPสูง', sum(CASEWHEN ((hbp_s1<'120' and hbp_d1<'80')OR (hbp_s2<'120' and hbp_d2<'80')) THEN '1' ELSE null END) AS'HTขาว', sum(CASEWHEN ((hbp_s2between'120'and'139') or (hbp_d2between'80'and'89')) THEN '1' ELSE null END) AS'HTเขียว',sum(CASEWHEN bsl < '100' THEN '1' ELSE null END) AS 'DMขาว', sum(CASEWHEN bsl between'100'and'125' THEN '1' ELSE null END) AS 'DMเขียว' FROM ncd_person_ncd_screenINNERJOIN ncd_personON ncd_person_ncd_screen.pcucode = ncd_person.pcucode ANDncd_person_ncd_screen.pid=ncd_person.pid INNERJOIN personON ncd_person_ncd_screen.pcucode =person.pcucodepersonAND ncd_person_ncd_screen.pid=person.pid WHERE ncd_person_ncd_screen.screen_date between'2013-10-01'and'2014-09-30' and SUBSTRING(ncd_person.village,7,2)!='00'and person.typelive in('1','3') and CONCAT(person.pid,person.pcucodeperson) notin(SELECT CONCAT(persondeath.pid,persondeath.pcucodeperson) FROMpersondeath) groupby grouppop,groupsex ========================================================================= Code เป้าหมายคัดกรองแยกเพศแยกอายุ จานวนกลุ่มเป้าหมายคัดกรองNCDแยกเพศและกลุ่มอายุมีเงื่อนไขคือประชากรที่อายุ15ปีขึ้นไป(อายุ ณ วันที่ 1 ตุลาคม2556) ทุกคนที่ยังมีชีวิตและมีTypearea 1+3======================================================================= ====== SELECT
  • 81. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 81 CASE WHEN person.sex='1' THEN 'ชาย'WHEN person.sex='2' THEN 'หญิง'ELSE'ไม่ระบุ'END AS groupsex, SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') between'15'and'34' THEN 1 ELSE '' END) as '15-34', SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') between'35'and'59' THEN 1 ELSE '' END) as '35-59', SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') >=60 THEN 1 ELSE '' END) as '>60' FROMperson INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode WHERE CONCAT(person.pid,person.pcucodeperson) notin(SELECT CONCAT(persondeath.pid,persondeath.pcucodeperson) FROMpersondeath) andSUBSTRING(house.villcode,7,2)!='00' groupby groupsex Code จานวนคัดกรองแยกกลุ่มสีอายุ15- 34 ปี ========================================================================= SELECT (SELECT SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') between'15'and'34' THEN 1 ELSE '' END) FROM person INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode WHERE (person.dischargetypeisnull orperson.dischargetype=9) and SUBSTRING(house.villcode,7,2)!='00' and concat(person.pid,person.pcucodeperson) notin(selectconcat(personchronic.pid, personchronic.pcucodeperson) from personchronicwhere personchronic.chroniccodebetween'I10' and 'I15.9' and personchronic.chroniccode between'E10'and'E15')) as 'Pop 15 ปี',
  • 82. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 82 count(ncd_person_ncd_screen.pid) as'จานวนคัดกรอง', sum(CASEWHEN (hbp_s1 <'120' and hbp_d1<'80')OR (hbp_s2 <'120' and hbp_d2<'80') THEN '1' ELSE null END) AS'HTขาว', sum(CASEWHEN (hbp_s2between'120'and'139') or (hbp_d2between'80'and'89') THEN '1' ELSE null END) AS'HTเขียว', sum(CASEWHEN bsl < '100' THEN '1' ELSE null END) AS'DMขาว', sum(CASEWHEN bsl between'100'and'125' THEN '1' ELSE null END) AS'DMเขียว' FROM ncd_person_ncd_screen INNERJOIN ncd_person ON ncd_person_ncd_screen.pcucode = ncd_person.pcucode ANDncd_person_ncd_screen.pid=ncd_person.pid INNERJOIN person ON ncd_person_ncd_screen.pcucode=person.pcucodepersonAND ncd_person_ncd_screen.pid=person.pid WHERE age_yearbetween'15'and'34' and ncd_person_ncd_screen.screen_datebetween'2013-10-01' and '2014-09-30' andSUBSTRING(ncd_person.village,7,2)!='00'and person.typelivein('1','3') and CONCAT(person.pid,person.pcucodeperson) notin(SELECT CONCAT(persondeath.pid,persondeath.pcucodeperson) FROMpersondeath); ========================================================================== ==== อายุ 35 - 59 ปี ========================================================================== ==== SELECT (SELECT SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') between'35'and'59' THEN 1 ELSE '' END) FROM person INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode
  • 83. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 83 INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode WHERE (person.dischargetypeisnull orperson.dischargetype =9) and SUBSTRING(house.villcode,7,2)!='00' and concat(person.pid,person.pcucodeperson) notin(selectconcat(personchronic.pid, personchronic.pcucodeperson) from personchronic where personchronic.chroniccode between'I10'and'I15.9' and personchronic.chroniccodebetween 'E10' and'E15')) as 'Pop 15 ปี', count(ncd_person_ncd_screen.pid) as'จานวนคัดกรอง', sum(CASEWHEN (hbp_s1 <'120' and hbp_d1<'80')OR (hbp_s2 <'120' and hbp_d2<'80') THEN '1' ELSE null END) AS'HTขาว', sum(CASEWHEN (hbp_s2between'120'and'139') or (hbp_d2between'80'and'89') THEN '1' ELSE null END) AS'HTเขียว', sum(CASEWHEN bsl < '100' THEN '1' ELSE null END) AS'DMขาว', sum(CASEWHEN bsl between'100'and'125' THEN '1' ELSE null END) AS'DMเขียว' FROM ncd_person_ncd_screen INNERJOIN ncd_person ON ncd_person_ncd_screen.pcucode = ncd_person.pcucode ANDncd_person_ncd_screen.pid=ncd_person.pid INNERJOIN person ON ncd_person_ncd_screen.pcucode=person.pcucodepersonAND ncd_person_ncd_screen.pid=person.pid WHERE age_yearbetween'35'and'59' and ncd_person_ncd_screen.screen_datebetween'2013-10-01' and '2014-09-30' andSUBSTRING(ncd_person.village,7,2)!='00'and person.typelivein('1','3') and CONCAT(person.pid,person.pcucodeperson) notin(SELECT CONCAT(persondeath.pid,persondeath.pcucodeperson) FROMpersondeath); ========================================================================== ==== อายุ 60 ปีขึ้นไป ========================================================================== ====
  • 84. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 84 SELECT (SELECT SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') >='60' THEN 1 ELSE '' END) FROM person INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode WHERE (person.dischargetypeisnull orperson.dischargetype= 9) and SUBSTRING(house.villcode,7,2)!='00' and concat(person.pid,person.pcucodeperson) notin(selectconcat(personchronic.pid, personchronic.pcucodeperson) from personchronic where personchronic.chroniccode between'I10'and'I15.9' and personchronic.chroniccodebetween 'E10' and'E15')) as 'Pop 15 ปี', count(ncd_person_ncd_screen.pid) as'จานวนคัดกรอง', sum(CASEWHEN (hbp_s1 <'120' and hbp_d1<'80')OR (hbp_s2 <'120' and hbp_d2<'80') THEN '1' ELSE null END) AS'HTขาว', sum(CASEWHEN (hbp_s2between'120'and'139') or (hbp_d2between'80'and'89') THEN '1' ELSE null END) AS'HTเขียว', sum(CASEWHEN bsl < '100' THEN '1' ELSE null END) AS'DMขาว', sum(CASEWHEN bsl between'100'and'125' THEN '1' ELSE null END) AS'DMเขียว' FROM ncd_person_ncd_screen INNERJOIN ncd_person ON ncd_person_ncd_screen.pcucode = ncd_person.pcucode ANDncd_person_ncd_screen.pid=ncd_person.pid INNERJOIN person ON ncd_person_ncd_screen.pcucode=person.pcucodepersonAND ncd_person_ncd_screen.pid=person.pid WHERE age_year>= '60' and ncd_person_ncd_screen.screen_datebetween'2013-10-01'and'2014-09-30' andSUBSTRING(ncd_person.village,7,2)!='00'and person.typelivein('1','3') and CONCAT(person.pid,person.pcucodeperson) notin(SELECT CONCAT(persondeath.pid,persondeath.pcucodeperson) FROMpersondeath);
  • 85. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 85 Code 7 Colourกลุ่มคัดกรอง Code รายชื่อกลุ่มคัดกรองแยกตามกลุ่มสีเปลี่ยนวันที่ต้องการ[between'วันที่เริ่มต้น'and'วันที่สิ้นสุด'] ========================================================================= SELECT person.pidASpid, concat(ctitle.titlename,person.fname,' ',person.lname)aspname, age_year, person.idcardASpcid, person.sexASsex, person.hnomoi AShno, person.mumoi ASmu, hbp_s1,hbp_s2,hbp_d1,hbp_d2, DATE_FORMAT(screen_date,'%Y-%m-%d') asscreen_date, max(CASEWHEN (hbp_s1 <'120' and hbp_d1<'80')OR (hbp_s2 <'120' and hbp_d2<'80') THEN "/" ELSE null END) AS'NBp', max(CASEWHEN (hbp_s2between'120'and'139') or (hbp_d2between'80'and'89') THEN "/" ELSE null END) AS'HBp', max(CASEWHEN (hbp_s2>= '140' or hbp_d2>= '90') THEN "/" ELSE null END) AS 'RoHT', bsl, max(CASEWHEN bsl < '100' THEN "/" ELSE null END) AS 'NDM', max(CASEWHEN bsl between'100'and'125' THEN "/" ELSE null END) AS'HDM', max(CASEWHEN bsl >= '126' THEN "/" ELSE null END) AS'RoDM' FROM ncd_person_ncd_screenINNERJOIN personON ncd_person_ncd_screen.pid=person.pid INNERJOIN ctitle ON person.prename =ctitle.titlecode INNERJOIN ncd_person ON ncd_person_ncd_screen.pcucode=ncd_person.pcucode AND ncd_person_ncd_screen.pid=ncd_person.pid WHERE age_year>= '15' and ncd_person_ncd_screen.screen_datebetween'2013-10-01'and'2014-09-30' and concat(ncd_person_ncd_screen.pid,ncd_person_ncd_screen.pcucode) notin (selectconcat(ncd_person_ncd_hist.pid,ncd_person_ncd_hist.pcucode)
  • 86. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 86 from ncd_person_ncd_hist) andSUBSTRING(ncd_person.village,7,2)<>'00' groupby person.pid orderby ncd_person.village; Code 7 colourกลุ่มป่วย ========================================================================= select concat(ctitle.titlename,ps.fname,'',ps.lname)aspname, ps.birthasbirth, ps.sex assex, ps.idcardas idcard, ps.hnomoi, max(v.visitdate) asvdate, v.pressure asvpressure, substr(v.pressure,1,instr(v.pressure,"/")-1)asbps, substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) asbpd, max(case whenpc.chroniccode ='I10'then'HT' else ' ' end) asHT, max(case whenpc.chroniccode between'E10'and'E15' then'DM' else '' end) as DM, if(substr(v.pressure,1,instr(v.pressure,"/")-1)<140or substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <90,'Green', if(substr(v.pressure,1,instr(v.pressure,"/")-1)<160or substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <100,'Yellow', if(substr(v.pressure,1,instr(v.pressure,"/")-1)<180or substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <110,'Orange ','Red'))) as'ระดับความดัน', s.sugarnumdigitasFBS,max(case whens.sugarnumdigit< 126 then'Green'whens.sugarnumdigit between 126and154then'Yellow'whens.sugarnumdigitbetween 155and182then'Orange'when s.sugarnumdigit>= 183then'Red' else ' ' end) as 'ระดับเบาหวาน', max(case whenvisitlabchcyhembmsse.labcode ='CH99' thenvisitlabchcyhembmsse.labresultdigit else ' ' end) as 'HbA1c',
  • 87. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 87 max(case whenvisitlabchcyhembmsse.labcode ='CH99' andvisitlabchcyhembmsse.labresultdigit<7 then'Yellow'whenvisitlabchcyhembmsse.labcode ='CH99' andvisitlabchcyhembmsse.labresultdigit < 8 then'Orange'whenvisitlabchcyhembmsse.labcode ='CH99' and visitlabchcyhembmsse.labresultdigit>=8 then'Red' else ' ' end) as 'ระดับHbA1c' from personpsinnerjoin visitvon ps.pcucodeperson=v.pcucodepersonandps.pid=v.pid innerjoinctitle onps.prename =ctitle.titlecode innerjoinhouse onps.pcucodeperson=house.pcucodeandps.hcode =house.hcode Leftjoinvisitlabsugarbloodsonv.pcucode = s.pcucode and v.visitno=s.visitno innerjoinpersonchronicpcon ps.pcucodeperson=pc.pcucodeperson and ps.`pid`= pc.pid Leftjoinvisitlabchcyhembmsse onv.pcucode =visitlabchcyhembmsse.pcucode and v.visitno=visitlabchcyhembmsse.visitno where v.visitdate between '2013-10-01'and'2013-10-30' and (pc.chroniccode between'E10'and 'E15' or pc.chroniccode = 'I10') and v.pressure isnotnull and CONCAT(ps.pid,ps.pcucodeperson) NOTIN (select CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath) and pc.cup= '06139' and SUBSTRING(house.villcode,7,2)='09' groupby ps.pid; Non-NCD(รายชื่อคนที่ยังไม่ได้คัดกรอง)ปี2557 ========================================================================== ======= SELECT n.pid,p.pid,c.titlename,p.fname,p.lname,p.sex,p.idcard,n.age_year,p.hnomoi, p.mumoi,GetAgeYearNum(p.birth,'2013-12-19') as'ayear',n.height,n.weight,n.waist,n.hbp_s1, n.hbp_d1,n.screen_date,n.bmi,n.d_update FROMpersonp innerjoinctitle con p.prename=c.titlecode
  • 88. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 88 INNERJOIN house h ON p.pcucodeperson=h.pcucode ANDp.hcode =h.hcode INNERJOIN village vON h.pcucode = v.pcucode ANDv.villcode =h.villcode leftjoinncd_person_ncd_screennonp.pid=n.pid where SUBSTRING(h.villcode,7,2)!='00' andp.typelivein('1','3') ANDGetAgeYearNum(p.birth,'2013-07-01') >= '15' AND n.pidisnull orn.screen_date <'2013-07-01'; Code พฤติกรรมสุขภาพจากการคัดกรองncdscreen =========================================================== selectcase whenage_yearbetween'15'and'34' then'อายุ15_34' whenage_yearbetween'35'and '59' then'อายุ35_59' whenage_year>= '60' then'อายุ>60'else null endas'Grpage', sum(case whenalcohol =1 then1 else 0end) as 'ไม่ดื่ม', sum(case whenalcohol =2 then1 else 0end) as 'ดื่มนานๆครั้ง', sum(case whenalcohol =3 then1 else 0end) as 'ดื่มเป็นครั้งคราว', sum(case whenalcohol =4 then1 else 0end) as 'ดื่มเป็นประจา', sum(case whenalcohol =9 then1 else 0end) as 'ไม่ทราบ', sum(case whensmoke =1 then1 else 0end) as 'ไม่สูบ', sum(case whensmoke =2 then1 else 0end) as 'สูบนานๆครั้ง', sum(case whensmoke =3 then1 else 0end) as 'สูบเป็นครั้งคราว', sum(case whensmoke =4 then1 else 0end) as 'สูบประจา', sum(case whensmoke =9 then1 else 0end) as 'ไม่ทราบ' fromncd_person_ncd_screen where age_year>= '15' andconcat(ncd_person_ncd_screen.pid,ncd_person_ncd_screen.pcucode) not in(selectconcat(persondeath.pid,persondeath.pcucodeperson)frompersondeath where persondeath.pcucodeperson=ncd_person_ncd_screen.pcucode and(persondeath.deaddate isnull or persondeath.deaddate<=curdate())) andscreen_date between'2013-10-01'and'2014-09-30' groupby Grpage
  • 89. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 89 จานวนคัดกรอง2Qแยกรายเดือน ========================================================================== ======= SELECT case whenmonth(visit.visitdate)=1then'มกราคม' whenmonth(visit.visitdate)=2then'กุมภาพันธ์' whenmonth(visit.visitdate)=3then'มีนาคม' whenmonth(visit.visitdate)=4then'เมษายน' whenmonth(visit.visitdate)=5then'พฤษภาคม' whenmonth(visit.visitdate)=6then'มิถุนายน' whenmonth(visit.visitdate)=7then'กรกฎาคม' whenmonth(visit.visitdate)=8then'สิงหาคม' whenmonth(visit.visitdate)=9then'กันยายน' whenmonth(visit.visitdate)=10then'ตุลาคม' whenmonth(visit.visitdate)=11then'พฤศจิกายน' whenmonth(visit.visitdate)=12then'ธันวาคม'elsenull endas'GMonth', year(visit.visitdate) as'ปี', count(codescreen='c01') as 'total', sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'15'and'29' then1 else ''end) as '2q15-29', sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'15'and'29'and visitscreenspecialdisease.coderesult='2' then1 else '' end) as'ผิดปกติ15-29', sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'30'and'49' then1 else ''end) as '2q30-49', sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'30'and'49'and visitscreenspecialdisease.coderesult='2' then1 else '' end) as'ผิดปกติ30-49', sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'50'and'59' then1 else ''end) as '2q50-59',
  • 90. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 90 sum(case whenGetAgeYearNum(person.birth,visit.visitdate) between'50'and'59'and visitscreenspecialdisease.coderesult='2' then1 else '' end) as'ผิดปกติ50-59' FROMvisitINNERJOIN visitscreenspecialdiseaseON visit.pcucode= visitscreenspecialdisease.pcucode ANDvisit.visitno=visitscreenspecialdisease.visitno INNERJOIN personON visit.pcucode =person.pcucodepersonANDvisit.pid=person.pid where visit.visitdatebetween'2012-10-01'and'2014-09-30' and concat(person.pid,person.pcucodeperson)notin(select concat(persondeath.pid,persondeath.pcucodeperson) frompersondeathwhere deaddate<=visit.visitdateordeaddate isnotnull) and codescreen='c01' andperson.typelive in('1','3')#andperson.sex='2' groupby GMonth orderby 'ปี' จานวนผู้ป่วยโรคเรื้อรังจาแนกตามเพศและกลุ่มอายุ ========================================================================== ======= select cdiseasechronic.groupname asgrname, case whenperson.sex ='1' then'ชาย'whenperson.sex ='2' then'หญิง'else'ไม่ระบุ'end asgrsex, sum(case whenGetAgeYearNum(person.birth,'2013-10-01') <15andperson.typelive in('1','3') then1 else '' end) as'<15ปี', sum(case whenGetAgeYearNum(person.birth,'2013-10-01') between 15and34 and person.typelive in('1','3') then 1 else '' end) as'15-34ปี', sum(case whenGetAgeYearNum(person.birth,'2013-10-01') between 35and59 and person.typelive in('1','3') then 1 else '' end) as'35-59ปี', sum(case whenGetAgeYearNum(person.birth,'2013-10-01') >=60 and person.typelivein('1','3') then 1 else '' end) as '>60ปี' from personchronicinnerjoinpersononpersonchronic.pcucodeperson=person.pcucodeperson andpersonchronic.pid=person.pid innerjoincdiseaseonpersonchronic.chroniccode =cdisease.diseasecode innerjoincdiseasechroniconcdisease.codechronic=cdiseasechronic.groupcode
  • 91. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 91 where concat(person.pid,person.pcucodeperson)notin(select concat(persondeath.pid,persondeath.pcucodeperson) frompersondeathwhere deaddate<=curdate()ordeaddate isnotnull) groupby grname,grsex ถ้าต้องการแค่โรคHTDM ให้เพิ่มCode and cdiseasechronic.groupcode in('01','10') ต่อจาก or deaddate isnotnull) บรรทัดรองสุดท้าย จานวนประชากร1+3และ กลุ่มอายุตามKPI57แยกรายหมู่ ======================================================================== selecthouse.villcode asvillcode ,count(person.pid) as'total' ,sum(case whenperson.typelive='1'then1else 0end) as'1' ,sum(case whenperson.typelive='2'then1else 0end) as'2' ,sum(case whenperson.typelive='3'then1else 0end) as'3' ,sum(case whenperson.typelive='4'then1else 0end) as'4' ,sum(case whenperson.typelive in('1','3') then1else 0end) as '1+3' ,sum(case when GetAgeYearNum(person.birth,'2013-10-01') <5 andperson.typelive in('1','3') THEN 1 ELSE '' END) AS'0-5ปี' ,sum(case whenGetAgeYearNum(person.birth,'2013-10-01') between 5and14 and person.typelive in ('1','3') THEN 1 ELSE '' END) AS'5-14ปี' ,sum(case whenGetAgeYearNum(person.birth,'2013-10-01') between 15and21 andperson.typelive in('1','3') THEN 1 ELSE '' END) AS '15-21ปี' ,sum(case whenGetAgeYearNum(person.birth,'2013-10-01') between 22and59 andperson.typelive in('1','3') THEN 1 ELSE '' END) AS '22-59ปี' ,sum(case whenGetAgeYearNum(person.birth,'2013-10-01') >=60 and person.typelive in('1','3') THEN 1 ELSE '' END) AS '60ปี' frompersoninnerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode = house.hcode where concat(person.pid,person.pcucodeperson)notin(select concat(persondeath.pid,persondeath.pcucodeperson)
  • 92. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 92 frompersondeathwhere deaddate<=curdate()ordeaddate isnotnull) groupby villcode จานวนผู้พิการแยกตามลักษณะความพิการ ========================================================================== ======= SELECT cpersonincomplete.incompletename as'ลักษณะความพิการ', count(person.pid)as'พิการ' FROM personINNERJOIN personunableON person.pcucodeperson=personunable.pcucodeperson ANDperson.pid=personunable.pid INNERJOIN personunable1type ON personunable.pcucodeperson= personunable1type.pcucodeperson ANDpersonunable.pid=personunable1type.pid INNERJOIN cpersonincompleteON personunable1type.typecode = cpersonincomplete.incompletecode innerjoinhouse onperson.hcode=house.hcodeandperson.pcucodeperson=house.pcucode innerjoinvillageonhouse.villcode =village.villcodeandhouse.pcucode =village.pcucode ANDperson.pid=personunable.pid where concat(person.pid,person.pcucodeperson)notin(select concat(persondeath.pid,persondeath.pcucodeperson) frompersondeathwhere deaddate<=curdate()ordeaddate isnotnull) and SUBSTRING(house.villcode,7,2)<>'00' and person.typelivein('1','3') groupby incompletename คัดกรองมะเร็งเต้านมและมะเร็งปากมดลูก ========================================================================== ======= SELECT
  • 93. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 93 case whenmonth(visitlabcancer.datecheck)=1then'มกราคม' whenmonth(visitlabcancer.datecheck)=2then'กุมภาพันธ์' whenmonth(visitlabcancer.datecheck)=3then'มีนาคม' whenmonth(visitlabcancer.datecheck)=4then'เมษายน' whenmonth(visitlabcancer.datecheck)=5then'พฤษภาคม' whenmonth(visitlabcancer.datecheck)=6then'มิถุนายน' whenmonth(visitlabcancer.datecheck)=7then'กรกฎาคม' whenmonth(visitlabcancer.datecheck)=8then'สิงหาคม' whenmonth(visitlabcancer.datecheck)=9then'กันยายน' whenmonth(visitlabcancer.datecheck)=10then'ตุลาคม' whenmonth(visitlabcancer.datecheck)=11then'พฤศจิกายน' whenmonth(visitlabcancer.datecheck)=12then'ธันวาคม'elsenull endas'GroupMonth', year(visitlabcancer.datecheck) as'ปี', sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='1' then1 else null end) as 'คัดกรองเต้านม', sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='1'and visitlabcancer.result='1' then1 else null end) as'พบผิดปกติ', sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='1'and visitlabcancer.result='2' then1 else null end) as'พบเซลล์มะเร็ง', sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='2' then1 else null end) as 'Papsmear', sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='2'and visitlabcancer.result='1' then1 else null end) as'ผิดปกติCAT II', sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='2'and visitlabcancer.result='2' then1 else null end) as'ผิดปกติCAT III,IV', sum(case whenmonth(visitlabcancer.datecheck) andvisitlabcancer.typecancer='2'and visitlabcancer.result='9' then1 else null end) as'ผิดปกติไม่ใช่มะเร็ง'
  • 94. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 94 FROM visitlabcancer INNERJOIN person ON visitlabcancer.pcucodeperson=person.pcucodepersonAND visitlabcancer.pid=person.pid where getAgeYearNum(birth,visitlabcancer.datecheck) between'30'and'60'and sex = '2' and visitlabcancer.datecheckbetween'2013-10-01'and'2014-09-30' and person.typelivein('1','3') andperson.dischargetype !='1' groupby GroupMonth orderby 'ปี' ; จานวนการให้หัตถการ ========================================================================== =======selectdrugname,count(distinctvisit.pcucode,visit.pid) as'คน',count(visitdrug.unit)as'ครั้ง' from visitleftjoinvisitdrugonvisit.visitno=visitdrug.visitnoandvisit.pcucode=visitdrug.pcucode leftjoincdrugon visitdrug.drugcode =cdrug.drugcode where cdrug.drugtype='02'andcdrug.drugtypesub='3' and visit.visitdate between'2013-07-01'and '2014-10-31' groupby cdrug.drugcode Code จานวนกลุ่มเป้าหมายตามกลุ่มอายุ ========================================================================== ======= SELECT house.villcode, SUM(CASE WHEN person.typelivein('1','3') ANDROUND(DATEDIFF('2013-10-01',person.birth)/30)<= 35.99 THEN 1 ELSE '' END) AS '0-2ปี', SUM(CASE WHEN person.typelivein('1','3') ANDROUND(DATEDIFF('2013-10-01',person.birth)/30)<= 47.99 THEN 1 ELSE '' END) AS '0-3ปี', SUM(CASE WHEN person.typelivein('1','3') ANDROUND(DATEDIFF('2013-10-01',person.birth)/30) BETWEEN 36 AND 71.99 THEN 1 ELSE '' END) AS '3-5ปี', SUM(CASE WHEN person.typelivein('1','3') ANDROUND(DATEDIFF('2013-10-01',person.birth)/30) BETWEEN 72 AND 143.99THEN 1 ELSE '' END) AS'6-12ปี',
  • 95. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 95 SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') >=15 THEN 1 ELSE '' END) AS '15ปีขึ้นไป', SUM(CASE WHEN person.sex='2'ANDperson.typelive IN ('1','3') AND GetAgeYearNum(person.birth,'2013-10-01') BETWEEN 30 AND59 THEN 1 ELSE '' END) AS'หญิง30- 60ปี', SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') >=60 THEN 1 ELSE '' END) AS '60ปีขึ้นไป', SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') between 15and34 THEN 1 ELSE '' END) AS '15_34', SUM(CASE WHEN person.typelivein('1','3') ANDGetAgeYearNum(person.birth,'2013-10-01') between 35and59 THEN 1 ELSE '' END) AS '35_59' FROMperson INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode WHERE (person.dischargetypeisnull orperson.dischargetype= 9) and SUBSTRING(house.villcode,7,2)!='00' GROUP BY house.villcode; Code ประชากรจาแนกตามTypearea ========================================================================== ======= select sum(case whenperson.typelive='1'then1else 0end) as '1=มีชื่อและอาศัยอยู่จริง' ,sum(case whenperson.typelive='2'then1else 0end) as'2=มีชื่อฯแต่ไม่อยู่จริง' ,sum(case whenperson.typelive='3'then1else 0end) as'3=ไม่มีชื่อฯแต่อยู่จริง' ,sum(case whenperson.typelive='4'then1else 0end) as'4=คนนอกเขตมารับบริการ' fromperson innerjoinhouse onperson.hcode=house.hcodeandperson.pcucodeperson=house.pcucode and concat(person.pid,person.pcucodeperson) not in(selectconcat(persondeath.pid,persondeath.pcucodeperson)
  • 96. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 96 frompersondeath where deaddate<=curdate() ordeaddate isnotnull) จานวนผู้พิการแยกรายหมู่ ========================================================================== ======= SELECT village.villcode,villname,count(person.pid)as'พิการ' FROM personINNERJOIN personunable ON person.pcucodeperson=personunable.pcucodeperson innerjoinhouse onperson.hcode=house.hcodeandperson.pcucodeperson=house.pcucode innerjoinvillageonhouse.villcode =village.villcodeandhouse.pcucode =village.pcucode ANDperson.pid=personunable.pid where concat(person.pid,person.pcucodeperson)notin (selectconcat(persondeath.pid,persondeath.pcucodeperson) frompersondeathwhere deaddate<=curdate()ordeaddate isnotnull) and SUBSTRING(house.villcode,7,2)<>'00' and person.typelivein('1','3') groupby village.villcode; พฤติกรรมสุขภาพ ========================================================================== ======= select village.villcode,villname ,sum(case whenciga= 0 then1 else 0end) as 'ไม่สูบ' ,sum(case whenciga= 1 then1 else 0end) as 'สูบนานๆครั้ง' ,sum(case whenciga= 2 then1 else 0end) as 'สูบประจา' ,sum(case whenwisky=0then1 else 0 end) as'ไม่ดื่ม' ,sum(case whenwisky=1then1else 0end) as 'ดื่มนานๆครั้ง' ,sum(case whenwisky=2then1 else 0 end) as'1-2ครั้งต่อเดือน'
  • 97. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 97 ,sum(case whenwisky=3then1 else 0 end) as'1-2ครั้งต่อสัปดาห์' ,sum(case whenwisky=4then1 else 0 end) as'3-4ครั้งต่อสัปดาห์' ,sum(case whenwisky=5then1 else 0 end) as'ดื่มทุกวัน' ,sum(case whenexercise=0 then1 else 0end) as 'ไม่ออกกาลังกาย' ,sum(case whenexercise=1 then1 else 0end) as 'ออก<3วัน' ,sum(case whenexercise=2 then1 else 0end) as 'ออก 3-5วัน' ,sum(case whenexercise=3 then1 else 0end) as 'ออก>5วัน' frompersonleftjoinpersonbehavioronperson.pid=personbehavior.pidand person.pcucodeperson=personbehavior.pcucodeperson leftjoinhouse onperson.hcode=house.hcode andperson.pcucodeperson=house.pcucode leftjoinvillageon house.villcode =village.villcodeandhouse.pcucode =village.pcucode where substring(house.villcode,7,2)!='00' and GetAgeYearNum(person.birth,curdate()) between'15'and'19' and concat(person.pid,person.pcucodeperson) notin(select concat(persondeath.pid,persondeath.pcucodeperson) frompersondeathwhere persondeath.pcucodeperson=person.pcucodepersonand(persondeath.deaddate isnull or persondeath.deaddate<=curdate())) groupby village.villcode; ตรวจสอบการคัดกรองNCDในคนตายและTypeareaไม่ใช่ 1+3 ========================================================================== ======= select person.pidaspid, concat(ctitle.titlename,person.fname,' ',person.lname)aspname, age_year, person.idcardaspcid, person.typeliveas'สถานะการอยู่อาศัย', case whenperson.dischargetype ='1' then'ตาย'whenperson.dischargetype ='2'then 'ย้ายออกนอกเขต'whenperson.dischargetype='3'then'สุญหาย' whenperson.dischargetype ='9'then'ยังไม่จาหน่าย'elsenull endas'สาเหตุจาหน่าย',
  • 98. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 98 person.hnomoi ashno, person.mumoi asmu, DATE_FORMAT(screen_date,'%Y-%m-%d') asscreen_date from ncd_person_ncd_screeninnerjoinpersononncd_person_ncd_screen.pid=person.pid innerjoinctitle onperson.prename=ctitle.titlecode innerjoinncd_person onncd_person_ncd_screen.pcucode =ncd_person.pcucodeand ncd_person_ncd_screen.pid=ncd_person.pid where age_year>= '15' and ncd_person_ncd_screen.screen_datebetween'2013-10-01'and '2014- 09-30' and (person.typelive notin('1','3') or person.dischargetype ='1') groupby person.pid orderby ncd_person.village; ตรวจสอบการให้รหัสสมุนไพรที่ไม่ขึ้นต้นด้วย41และ42 ========================================================================== ======= selectdrugcode ,drugname,drugcode24,drugtype fromcdrug where drugtype ='10' anddrugflag= '1' and cdrug.drugcode24notLike '41%'and cdrug.drugcode24notLike '42%'; ตรวจสอบการจาหน่ายตายในChronic ========================================================================== ======= select concat(ctitle.titlename,person.fname,'',person.lname,'','(',convert(person.pidusingutf8),')')as'ชื่อ- สกุล', person.idcardaspidcard, person.hnomoias'บ้านเลขที่', person.mumoi as'หมู่',
  • 99. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 99 person.typelive as'สถานะการอยู่อาศัย', case whenperson.dischargetype ='1' then'ตาย' whenperson.dischargetype='2'then 'ย้ายออกนอกเขต'whenperson.dischargetype='3'then'สุญหาย' whenperson.dischargetype ='9'then'ยังไม่จาหน่าย'else nullendAS'สาเหตุจาหน่าย', persondeath.deaddate as'วันที่ตาย', personchronic.chroniccodeas'รหัสเรื้อรัง', personchronic.typedischartas'สาเหตุจาหน่ายเรื้อรัง' from personinnerjoinctitle onperson.prename=ctitle.titlecode innerjoinpersonchroniconperson.pcucodeperson =personchronic.pcucodeperson and person.pid=personchronic.pid innerjoinpersondeathonperson.pcucodeperson=persondeath.pcucodeperson and person.pid=persondeath.pid where personchronic.typedischart!='02'; ==================================== รัน code ตรวจสอบว่าใครที่เราบันทึกวิธีการตรวจผิดใครที่พบว่าเป็นกลุ่มเสี่ยงแต่เราเอามาบันทึกก่อน*** SELECT n.pid,n.screen_date,n.bstest,n.bsl FROMncd_person_ncd_screenn where n.screen_date between'2015-10-01'and'2016-09-30'and (bstest<> '3' or n.bsl between'100' and '125') ==================================== รายชื่อกลุ่มเป้าหมายคัดกรองพัฒนาการเด็กปฐมวัยช่วงอายุ9,18,30,และ42เดือน *** แก้ไขช่วงวันที่ในแต่ละเดือนที่รันcode โดยกาหนดเป็น'yyyy-mm-dd'*** ตัวหนังสือสีแดง select person.pidaspid, concat(ctitle.titlename,person.fname,'',person.lname)aspname, person.birthaspbirth, GetAgeymd(person.birth,'2015-12-01')asage,
  • 100. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 100 person.idcardasidcard, person.hnomoiashno, village.villnoasvillno, case whenGetAgemonth(person.birth,'2015-12-01')='9'then"/"else '' endas '9เดือน', case whenGetAgemonth(person.birth,'2015-12-01')='18'then"/"else '' endas '18เดือน', case whenGetAgemonth(person.birth,'2015-12-01')='30'then"/"else '' endas '30เดือน', case whenGetAgemonth(person.birth,'2015-12-01')='42'then"/"else '' endas '42เดือน' frompersoninnerjoinctitle onperson.prename =ctitle.titlecode innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode where person.typelive in('1','3') andperson.pidnotin(selectpersondeath.pidfrom persondeath)andsubstring(house.villcode,7,2)<>'00' and GetAgemonth(person.birth,'2015-12-01') in('9','18','30','42') orderby villno ================================== reportผลการคัดกรองNCD59 เงื่อนไข 1. หากป่วยความดันผลการคัดกรองHTจะว่าง 2. หากป่วยเบาหวานผลการคัดกรองDMจะว่างแต่ถ้าคุณบันทึกค่าน้าตาลในผู้ป่วยเบาหวาน ผลการคัดกรองจะออกมาเสมอ 3. ผลการคัดกรองDMจะออกก็ต่อเมื่อเลือกวิธีการตรวจเป็น3. DTX(อดอาหาร) 4. กลุ่มเป้าหมายอายุ35 ปีขึ้นไปทุกคนยกเว้นกลุ่มป่วยสองโรค select person.pidaspid, concat(ctitle.titlename,person.fname,'',person.lname)aspname, date_format(person.birth,'%d/%m/%Y') aspbirth, GetAgeYearNum(person.birth,'2015-10-01')asage, person.idcardasidcard,
  • 101. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 101 person.hnomoiashno, village.villnoasvillno, case when(pcht.chroniccodeisnotnull andpcdm.chroniccode isnull )then'1'else '' endas 'ป่วยht', case when(pcdm.chroniccode isnotnull and pcht.chroniccode isnull )then'1'else '' endas 'ป่วยdm', n.screen_date,n.height,n.weight,n.waist,n.hbp_s1,n.hbp_d1,n.bsl,n.bmi, case whenn.bsl <'100'and n.bstest= '3'then'ปกติ' whenn.bsl between'100'and'125' andn.bstest= '3'then'เสี่ยง' when n.bsl >='126' andn.bstest= '3'then'สงสัยว่าป่วย'else ''endas 'ผลคัดDM', case when(n.hbp_s1<'120' or n.hbp_d1<'80')and person.pidnotin(selectperson.pidfromperson leftjoinpersonchronicpchtonperson.pid=pcht.pidandperson.pcucodeperson = pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10' leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson= pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9' leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson where pcht.chroniccode isnotnull andpcdm.chroniccode isnull) then'ปกติ' when((n.hbp_s1between'120'and'139') or (n.hbp_d1between'80'and'89')) andperson.pidnotin (selectperson.pidfrompersonleftjoinpersonchronicpchtonperson.pid=pcht.pidand person.pcucodeperson=pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10' leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson= pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9' leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson where pcht.chroniccode isnotnull andpcdm.chroniccode isnull)then'เสี่ยง' when((n.hbp_s1between'140'and'179') or (n.hbp_d1between'90'and'109'))andperson.pidnotin (selectperson.pidfrompersonleftjoinpersonchronicpchtonperson.pid=pcht.pidand person.pcucodeperson=pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10' leftjoinpersonchronicpcdmonperson.pid =pcdm.pidandperson.pcucodeperson= pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9' leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson where pcht.chroniccode isnotnull andpcdm.chroniccode isnull) then'สงสัยว่าป่วย' when(n.hbp_s1>= '180' or n.hbp_d1>='110')andperson.pidnotin(selectperson.pidfromperson leftjoinpersonchronicpchtonperson.pid=pcht.pidandperson.pcucodeperson= pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10' leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson= pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9'
  • 102. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 102 leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson where pcht.chroniccode isnotnull andpcdm.chroniccode isnull) then'ฉุกเฉิน'else ''endas 'ผลคัดHT' frompersoninnerjoinctitle onperson.prename =ctitle.titlecode leftjoinpersonchronicpchtonperson.pid=pcht.pidandperson.pcucodeperson= pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10' leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson= pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9' leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode innerjoinncd_person_ncd_screenn onperson.pid=n.pid where person.typelive in('1','3') andperson.pidnotin(selectpersondeath.pidfrompersondeath) and GetAgeYearNum(person.birth,'2015-10-01')>='35'and substring(house.villcode,7,2)<>'00' and person.pidnotin(selectperson.pidfrompersonleftjoinpersonchronicpchtonperson.pid= pcht.pidandperson.pcucodeperson=pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10' leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson= pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9' leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson where pcdm.chroniccode isnotnull andpcht.chroniccode isnotnull) and n.screen_date between'2015-10-01'and'2016-09-30' groupby person.pid orderby villno,person.pid ==================================== ตรวจสอบการให้ ICD10ที่มี dxtype =01 มากกว่า1รหัส SELECT visit.pid,v.visitno,COUNT(v.visitno) AS'จานวนซ้า',group_concat(v.diagcode) as'icdที่ให้รหัส01' FROMvisitdiagvinnerjoinvisitonv.visitno=visit.visitno where v.dxtype ='01' andvisit.visitdatebetween'2015-10-01'and'2016-09-30' GROUP BY v.visitno HAVING(COUNT(v.visitno) >1) ====================================
  • 103. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 103 มาดูว่าใส่วิธีการตรวจเลือดผิดหรือไม่และบันทึกคนที่มีค่า dtx 100-125หรือไม่ SELECT * FROMncd_person_ncd_screenn where n.screen_date between'2015-10-01'and'2016-09-30'and (bstest<> '3' or n.bsl between'100' and '125') ================================ รายชื่อเป้าหมายncdscreen ปีงบ2559 เงื่อนไข 1. อายุ35 ปีขึ้นไป ณวันที่ 1 ตุลาคม2558 2. เฉพาะtypearea1+3 3. ระบุโรคประจาตัวให้ จะได้เลือกคัดกรองได้ถูกประเภทตัดป่วยสองโรค ================================ select person.pidaspid, concat(ctitle.titlename,person.fname,'',person.lname)aspname, date_format(person.birth,'%d/%m/%Y') aspbirth, GetAgeYearNum(person.birth,'2015-10-01')asage, person.idcardasidcard, person.hnomoiashno, village.villnoasvillno, case when(pcht.chroniccodeisnotnull andpcdm.chroniccode isnull )then'1'else '' endas 'ป่วยht', case when(pcdm.chroniccode isnotnull andpcht.chroniccode isnull )then'1'else '' endas 'ป่วยdm' frompersoninnerjoinctitle onperson.prename =ctitle.titlecode leftjoinpersonchronicpchtonperson.pid=pcht.pidandperson.pcucodeperson= pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10' leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson= pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9' leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode
  • 104. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 104 where person.typelive in('1','3') andperson.pidnotin(selectpersondeath.pidfrompersondeath) and GetAgeYearNum(person.birth,'2015-10-01')>='35'and substring(house.villcode,7,2)<>'00' and person.pidnotin(select person.pidfrompersonleftjoinpersonchronicpchtonperson.pid= pcht.pidandperson.pcucodeperson=pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10' leftjoinpersonchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson= pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9' leftjoinpersonchronicpcon person.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson where pcdm.chroniccode isnotnull andpcht.chroniccode isnotnull) groupby person.pid orderby villno,person.pid ตรวจสอบให้รหัสวัคซีนMMR 2 ขวบครึ่งผิด ================================ SELECT person.pid, concat(ctitle.titlename,person.fname,'',person.lname)aspname, person.birthasbirth, getageymd(person.birth,CURDATE()) asage, person.hnomoi,person.mumoi, max(CASEWHEN person.typelive in('1','3') ANDperson.birthbetween'2011-10-01'and'2012-07-15' and visitepi.vaccinecode ='MMR'THEN visitepi.dateepi ELSE'' END) AS'MMR', max(CASEWHEN person.typelive in('1','3') ANDperson.birthbetween'2011-10-01'and'2012-07-15' and visitepi.vaccinecode ='MMR2'THEN visitepi.dateepi ELSE'' END) AS 'MMR2' FROMpersonINNERJOIN visitepi ON person.pcucodeperson=visitepi.pcucodepersonAND person.pid=visitepi.pid innerjoinctitle onperson.prename =ctitle.titlecode INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode WHERE (person.dischargetypeisnull orperson.dischargetype= 9) and SUBSTRING(house.villcode,7,2)!='00' and person.typelivein('1','3') ANDperson.birthbetween'2011-10-01'and'2012-07-15'
  • 105. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 105 and visitepi.dateepi between'2014-09-01'and'2015-09-30' groupby person.pid orderby house.villcode ข้อมูลการใช้ยาของรพ.สต. =========================== selectcount(distinctvisit.visitno)as'จานวนคนรับยา', cdrug.drugname,sum(visitdrug.unit) 'total', sum(visitdrug.unit*visitdrug.costprice)as'รวมบาท' fromvisitdruginnerjoinvisitonvisitdrug.visitno=visit.visitno innerjoincdrugon visitdrug.drugcode =cdrug.drugcode where visit.visitdatebetween'2013-10-01'and'2014-09-30'and cdrug.drugtype <>'02' groupby cdrug.drugname orderbytotal desc รายชื่อกลุ่มเป้าหมายไม่ได้รับการคัดกรองเต้านม ====================================== selectp.pid, concat(ctitle.titlename,p.fname,'',p.lname)aspname, p.birthas birth, GetAgeYearNum(p.birth,'2014-10-01') as'อายุ', p.idcardas idcard, p.hnomoi, SUBSTRING(house.villcode,7,2)asmoo from personp innerjoinctitle onp.prename =ctitle.titlecode innerjoinhouse onp.pcucodeperson=house.pcucodeandp.hcode =house.hcode where p.sex ='2' andCONCAT(p.pid,p.pcucodeperson) NOTIN (select CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath) and p.pidNOTIN (select visit.pidfromvisitinnerjoinvisitdiagonvisit.visitno=visitdiag.visitno where visit.visitdatebetween'2014-10-01'and'2015-09-30'and visitdiag.diagcode ='Z12.3')
  • 106. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 106 and SUBSTRING(house.villcode,7,2)<>'00' andp.typelivein('1','3') and GetAgeYearNum(p.birth,'2014-10-01') between'30'and'70' groupby p.pid orderby house.villcode code ดึงจานวนผู้สูงอายุผู้พิการผู้ป่วย NCDแยกตามสภาพปัญหารายหมู่ ================================= select*from(selectvillage.villname, sum(case when concat(person.pcucodeperson,person.pid)in(select concat(personunable.pcucodeperson,personunable.pid) frompersonunable ) then'1'else ''end) as'พิการ', sum(case whenconcat(person.pcucodeperson,person.pid)in(select concat(personunable.pcucodeperson,personunable.pid) frompersonunable )andperson.candobedhomesocial='1' then'1' else '' end) as 'พิการกลุ่ม1', sum(case whenconcat(person.pcucodeperson,person.pid)in(select concat(personunable.pcucodeperson,personunable.pid) frompersonunable )andperson.candobedhomesocial='2' then'1' else '' end) as 'พิการกลุ่ม2', sum(case whenconcat(person.pcucodeperson,person.pid)in(select concat(personunable.pcucodeperson,personunable.pid) frompersonunable )andperson.candobedhomesocial='3' then'1' else '' end) as 'พิการกลุ่ม3', sum(case whenconcat(person.pcucodeperson,person.pid) in(select concat(personchronic.pcucodeperson,personchronic.pid) frompersonchronicwhere personchronic.typedischart='03') then'1' else '' end) as'NCD', sum(case whenconcat(person.pcucodeperson,person.pid) in(select concat(personchronic.pcucodeperson,personchronic.pid) frompersonchronicwhere personchronic.typedischart='03')andperson.candobedhomesocial ='1' then'1' else ''end) as 'NCDกลุ่ม1', sum(case whenconcat(person.pcucodeperson,person.pid) in(select concat(personchronic.pcucodeperson,personchronic.pid) frompersonchronicwhere personchronic.typedischart='03')andperson.candobedhomesocial ='2' then'1' else ''end) as 'NCDกลุ่ม2', sum(case whenconcat(person.pcucodeperson,person.pid) in(select concat(personchronic.pcucodeperson,personchronic.pid)
  • 107. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 107 frompersonchronicwhere personchronic.typedischart='03')andperson.candobedhomesocial ='3' then'1' else ''end) as 'NCDกลุ่ม3', sum(case whengetAgeYearNum(person.birth,'2014-10-01')>=60then'1'else ''end) as 'Old', sum(case whengetAgeYearNum(person.birth,'2014-10-01')>=60andperson.candobedhomesocial = '1' then'1' else '' end) as 'Oldกลุ่ม1', sum(case whengetAgeYearNum(person.birth,'2014-10-01')>=60andperson.candobedhomesocial = '2' then'1' else '' end) as 'Oldกลุ่ม2', sum(case whengetAgeYearNum(person.birth,'2014-10-01')>=60andperson.candobedhomesocial = '3' then'1' else '' end) as 'Oldกลุ่ม3' frompersoninnerjoinctitle onperson.prename =ctitle.titlecode innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode leftjoinuseronhouse.usernamedoc=user.username where person.typelive IN ('1','3')andperson.pidnotin(selectpersondeath.pidfrom persondeath)andsubstring(house.villcode,7,2)<>'00' groupby village.villcode )as orderp code ดึงรายชื่อผู้สูงอายุผู้พิการผู้ป่วย NCDตามสภาพปัญหา =========================================== select*from(selectperson.idcard, concat(ctitle.titlename,person.fname,'',person.lname)as'ชื่อ-สกุล', GetAgeYearNum(person.birth,current_date)as'อายุ', house.hnoas'บ้านเลขที่', right(house.villcode,2)as'หมู่ที่', case whenconcat(person.pcucodeperson,person.pid)in(select concat(personunable.pcucodeperson,personunable.pid) frompersonunable ) then'/'else ''endas 'Disabl', case whenconcat(person.pcucodeperson,person.pid) in(select concat(personchronic.pcucodeperson,personchronic.pid) frompersonchronicwhere personchronic.typedischart='03') then'/' else ''endas 'NCD',
  • 108. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 108 case whengetAgeYearNum(person.birth,'2014-10-01')>=60then'/'else '' endas 'Old', case whenperson.candobedhomesocial='1' then'/' else '' endas 'กลุ่ม1', case whenperson.candobedhomesocial='2' then'/' else '' endas 'กลุ่ม2', case whenperson.candobedhomesocial='3' then'/' else '' endas 'กลุ่ม3' frompersoninnerjoinctitle onperson.prename =ctitle.titlecode innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode where person.typelive IN ('1','3')andperson.pidnotin(selectpersondeath.pidfrom persondeath)andsubstring(house.villcode,7,2)<>'00' groupby person.pid orderby house.villcode)asorderp where orderp.Disabl='/'or orderp.NCD='/'or orderp.old='/' สรุปจานวนการคัดกรองแยกกลุ่มอายุให้เปลี่ยนวันเริ่มต้นและสิ้นสุดการตัดรายงานตัวหนังสือสีแดง =================================================== SELECT CASE WHEN hbp_s1 <'120' and hbp_d1<'80' and bsl < '100' THEN 'ปกติ' WHEN hbp_s1 <'120' andhbp_d1 <'80' and bsl >= '100' THEN 'เสี่ยงDM' WHEN (hbp_s1>= '120' or hbp_d1>= '80') and bsl < '100' THEN 'เสี่ยงHT' WHEN (hbp_s1>= '120' or hbp_d1>= '80') and bsl >= '100' THEN 'เสี่ยงDM&HT' ELSE '' END AS levelrisk, CASE WHEN age_yearbetween'35'and'59' THEN '35-59ปี' WHEN age_year>='60' THEN '>60ปี' ELSE '' END ASgage, count(distinctncd_person_ncd_screen.pid) as ผลงาน FROM ncd_person_ncd_screenINNERJOIN personON ncd_person_ncd_screen.pid=person.pid INNERJOIN ncd_person ON ncd_person_ncd_screen.pcucode =ncd_person.pcucodeAND ncd_person_ncd_screen.pid=ncd_person.pid WHERE age_year>= '35' and ncd_person_ncd_screen.screen_datebetween'2014-10-01'and'2015- 01-31' and concat(ncd_person_ncd_screen.pid,ncd_person_ncd_screen.pcucode) notin
  • 109. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 109 (selectconcat(ncd_person_ncd_hist.pid,ncd_person_ncd_hist.pcucode)from ncd_person_ncd_hist) and SUBSTRING(ncd_person.village,7,2)<>'00' groupby levelrisk,gage รายชื่อคัดกรองพร้อมผลการคัดกรองให้เปลี่ยนวันเริ่มต้นและสิ้นสุดการตัดรายงานตัวหนังสือสีแดง ========================================================================= select person.pidaspid, concat(ctitle.titlename,person.fname,' ',person.lname)aspname, age_year, person.idcardaspcid, person.sex assex, person.hnomoiashno, person.mumoi asmu, hbp_s1,hbp_d1,bsl,
  • 110. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 110 DATE_FORMAT(screen_date,'%Y-%m-%d') asscreen_date, max(case whenhbp_s1 <'120' and hbp_d1<'80' andbsl < '100' then"/" else '' end) as"ปกติ", max(case whenhbp_s1 <'120' and hbp_d1<'80' andbsl >= '100' then"/"else '' end) as "เสี่ยงDM", max(case when(hbp_s1>='120' or hbp_d1>= '80') and bsl < '100' then"/" else '' end) as "เสี่ยงHT", max(case when(hbp_s1>='120' or hbp_d1>= '80') and bsl >= '100' then"/" else '' end) as "เสี่ยงDM&HT" from ncd_person_ncd_screeninnerjoin persononncd_person_ncd_screen.pid=person.pid innerjoinctitle onperson.prename=ctitle.titlecode innerjoinncd_person onncd_person_ncd_screen.pcucode =ncd_person.pcucodeand ncd_person_ncd_screen.pid=ncd_person.pid where age_year>= '35' and ncd_person_ncd_screen.screen_datebetween'2014-10-01'and'2015-02-02' and concat(ncd_person_ncd_screen.pid,ncd_person_ncd_screen.pcucode) notin
  • 111. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 111 (selectconcat(ncd_person_ncd_hist.pid,ncd_person_ncd_hist.pcucode) from ncd_person_ncd_hist) andSUBSTRING(ncd_person.village,7,2)<>'00' groupby person.pid orderby ncd_person.village รายชื่อเด็ก0-60เดือน ชั่งน้าหนัก SELECT person.pid ,ctitle.titlename ,person.fname ,person.lname ,person.hnomoi ,person.mumoi ,getAgeYearNum(person.birth,CURDATE()) AS นับอายุเป็นปี ,getagemonth(person.birth,CURDATE())AS นับอายุเป็นเดือน FROMperson LEFT JOIN persondeathON persondeath.pcucodeperson=person.pcucodepersonAND persondeath.pid=person.pid INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode INNERJOIN ctitle ON ctitle.titlecode =person.prename WHERE persondeath.pidISNULL ANDgetagemonth(person.birth,CURDATE()) <=60 ANDperson.typelive IN ('0','1','3') ORDER BY house.villcode,person.hnomoi*1; ผลงานการคัดกรองปี 58แยกรายหมู่
  • 112. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 112 selectvillage.villnoas หมู่,village.villname as ชื่อหมู่บ้าน,count(distinctperson.pid) as เป้า, count(distinctsc.pid) as ผลงาน,concat(round(count(distinctsc.pid)*100/count(distinct person.pid),2),'%') as เปอรเซ็น ,count(distinctcase whengetAgeYearNum(birth,'20141001') between 35 and 59 thenperson.pidelse nullend) as"เป้า35-59",count(distinctcase when getAgeYearNum(birth,'20141001') between 35and59 andsc.pidis notnull thenperson.pidelse null end) as ผลงาน,concat(round(count(distinctcase whengetAgeYearNum(birth,'20141001') between 35 and 59 andsc.pidis notnull thenperson.pidelse nullend)*100/count(distinctcase when getAgeYearNum(birth,'20141001') between 35and59 thenperson.pidelse nullend),2),'%') as"%35- 59",count(distinctcase whengetAgeYearNum(birth,'20141001') >=60 thenperson.pidelse null end) as "เป้า>= 60" ,count(distinctcase whengetAgeYearNum(birth,'20141001') >=60and sc.pidisnot null thenperson.pidelse null end) as ผลงาน,concat(round(count(distinctcase when getAgeYearNum(birth,'20141001') >=60 and sc.pidisnotnull thenperson.pidelse nullend)*100/ count(distinctcase whengetAgeYearNum(birth,'20141001') >=60 thenperson.pidelse nullend),2),' %') as "%>= 60"from personleftjoinncdpersonscreenall sconperson.pid=sc.pidand person.pcucodeperson=sc.pcucode andsc.screen_date between'20141001'and'20150930'inner joinhouse onperson.hcode =house.hcodeandperson.pcucodeperson=house.pcucode innerjoin village onhouse.villcode=village.villcode andvillno<>'00' where getAgeYearNum(birth,'20141001')>='35'and person.typelivein('0','1','3') andperson.dischargetype <> 1 and person.pidnotin (selectpidfrompersonchronicwhere (personchronic.chroniccode='I10'or personchronic.chroniccodebetween'E10'and 'E15')) group byvillno,villname unionselect'' as หมู่,'รวม' as ชื่อหมู่บ้าน,count(distinctperson.pid) as เป้า,count(distinctsc.pid)as ผลงาน,concat(round(count(distinctsc.pid)*100/count(distinctperson.pid),2),'%') as เปอรเซ็น ,count(distinctcase whengetAgeYearNum(birth,'20141001') between 35and59thenperson.pidelse null end) as"เป้า35-59",count(distinctcase whengetAgeYearNum(birth,'20141001') between 35and 59 and sc.pidisnot null thenperson.pidelsenull end) as ผลงาน,concat(round(count(distinctcase whengetAgeYearNum(birth,'20141001') between 35and59 and sc.pidisnot null thenperson.pid else null end)*100/count(distinctcase whengetAgeYearNum(birth,'20141001') between 35and59 thenperson.pidelse null end),2),'%') as"%35-59",count(distinctcase when getAgeYearNum(birth,'20141001') >=60 thenperson.pidelse nullend) as"เป้า>=60" ,count(distinct case whengetAgeYearNum(birth,'20141001') >=60 and sc.pidisnot null thenperson.pidelsenull end) as ผลงาน,concat(round(count(distinctcase whengetAgeYearNum(birth,'20141001') >=60 and sc.pidisnot null thenperson.pidelsenull end)*100/count(distinctcase when getAgeYearNum(birth,'20141001') >=60 thenperson.pidelse nullend),2),'%') as"%>= 60" from personleftjoinncdpersonscreenall sconperson.pid=sc.pidandperson.pcucodeperson= sc.pcucode andsc.screen_date between'20141001'and'20150930'innerjoinhouse onperson.hcode
  • 113. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 113 = house.hcode andperson.pcucodeperson=house.pcucode innerjoinvillageonhouse.villcode= village.villcode andvillno<>'00' where getAgeYearNum(birth,'20141001')>=35and person.typelive in('1','3') andperson.dischargetype<>1 and person.pidnotin(selectpidfrompersonchronicwhere (personchronic.chroniccode='I10'orpersonchronic.chroniccodebetween'E10'and'E15')) group by หมู่, ชื่อหมู่บ้าน; กลุ่มเป้าหมายการคัดกรองต้อกระจกมากกว่า60ปี SELECT person.pid ASpid, concat(ctitle.titlename,person.fname,'',person.lname)aspname, person.birthASpbirth, GetAgeYearNum(person.birth,CURRENT_DATE)asage, person.idcardASpcid, person.sex ASsex, person.hnomoiAShno, village.villnoASvillage_villno, village.villnameASvillage_villname FROM personINNERJOIN ctitle ON person.prename =ctitle.titlecode INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode WHERE person.typelive IN ('1','3') and person.pidnotin(SELECTpersondeath.pidFROMpersondeath) and GetAgeYearNum(person.birth,'2014-10-01')>='60' and SUBSTRING(house.villcode,7,2)<>'00' orderBY village.villno,person.hnomoi*1; โค้ดรายชื่อผู้ป่วยความดันเบาหวานที่มารับบริการพร้อมค่าความดันและน้าตาลในเลือด select concat(ctitle.titlename,person.fname,'',person.lname)as'ชื่อ-สกุล',
  • 114. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 114 GetAgeYearNum(person.birth,CURRENT_DATE)as'อายุ', concat(person.hnomoi,'','หมู่',person.mumoi) as'ที่อยู่', case when(pcht.chroniccodeisnotnull andpcdm.chroniccode isnull )then'1'else '' endas ht ,case when(pcdm.chroniccode isnotnull andpcht.chroniccode isnull) then'1' else '' endas dm ,case whenpcdm.chroniccode isnotnull andpcht.chroniccode isnotnull then'1'else '' endas htdm, max(case whenmonth(visit.visitdate)=10thenvisit.pressure else ''end) as'ต.ค.', max(case whenmonth(visit.visitdate)=11thenvisit.pressure else ''end) as'พ.ย.', max(case whenmonth(visit.visitdate)=12thenvisit.pressure else ''end) as'ธ.ค.', max(case whenmonth(visit.visitdate)=1thenvisit.pressure else''end) as 'ม.ค.', max(case whenmonth(visit.visitdate)=2thenvisit.pressure else''end) as 'ก.พ.', max(case whenmonth(visit.visitdate)=3thenvisit.pressure else''end) as 'มี.ค.', max(case whenmonth(visit.visitdate)=4thenvisit.pressure else''end) as 'เม.ย.', max(case whenmonth(visit.visitdate)=5thenvisit.pressure else''end) as 'พ.ค.', max(case whenmonth(visit.visitdate)=6thenvisit.pressure else''end) as 'มิ.ย.', max(case whenmonth(visit.visitdate)=7thenvisit.pressure else''end) as 'ก.ค.', max(case whenmonth(visit.visitdate)=8thenvisit.pressure else''end) as 'ส.ค.', max(case whenmonth(visit.visitdate)=9thenvisit.pressure else''end) as 'ก.ย.' fromperson innerjoinctitle onperson.prename =ctitle.titlecode innerjoinhouse onperson.hcode=house.hcode andperson.pcucodeperson=house.pcucode leftjoinvisitON person.pcucodeperson=visit.pcucodepersonand person.pid=visit.pid leftjoinvisitdiagonvisit.visitno=visitdiag.visitno innerjoinvillageonhouse.villcode =village.villcodeandhouse.pcucode =village.pcucode LEFT JOIN personchronicpchtonperson.pid=pcht.pidandperson.pcucodeperson= pcht.pcucodepersonandtrim(pcht.chroniccode) ='I10' LEFT JOIN personchronicpcdmonperson.pid=pcdm.pidandperson.pcucodeperson= pcdm.pcucodepersonandtrim(pcdm.chroniccode)between'E10'and 'E15.9' LEFT JOIN personchronicpconperson.pid=pc.pidandperson.pcucodeperson=pc.pcucodeperson WHERE visit.visitdate between'2014-10-01'and'2015-09-30'
  • 115. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 115 and SUBSTRING(house.villcode,7,2)<>'00'and (visitdiag.diagcode between'E10'and'E15.9' or (visitdiag.diagcode='I10')) and pc.cup= pc.pcucodeperson GROUP BY pc.pid orderBY village.villno โค้ด ประชากรจาแนกตามกลุ่มวัย selectvillage.villnoasvillno,village.villname asvillname ,count(person.pid) as'total' ,sum(case whenGetAgeYearNum(person.birth,'2014-10-01') <5 then1 else '' end) as'0-5ปี' ,sum(case whenGetAgeYearNum(person.birth,'2014-10-01') between 5and14 then1 else '' end) as '5-14ปี' ,sum(case whenGetAgeYearNum(person.birth,'2014-10-01') between 15and21 then1 else ''end) as '15-21ปี' ,sum(case whenGetAgeYearNum(person.birth,'2014-10-01') between 15and59 then1 else ''end) as '15-59ปี' ,sum(case whenGetAgeYearNum(person.birth,'2014-10-01') >=60 then1 else '' end) as'60ปี' ,sum(case whenconcat(person.pcucodeperson,person.pid)in(select concat(personunable.pcucodeperson,personunable.pid)frompersonunable ) then 1else '' end) as 'พิการ' frompersoninnerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode = house.hcode innerjoinvillageonhouse.villcode=village.villcode where concat(person.pid,person.pcucodeperson)notin(select concat(persondeath.pid,persondeath.pcucodeperson) frompersondeathwhere deaddate<=curdate()ordeaddate isnotnull) and SUBSTRING(house.villcode,7,2)<>'00'andperson.typelivein('1','3') groupby villno,villname โค้ดรายชื่อประชากรอายุ20-50ปี เป้าหมายการฉีดวัคซีนdt(เกิดตั้งแต่1ม.ค.08-31 ธ.ค.38) SELECT person.pidASpid, concat(ctitle.titlename,person.fname,' ',person.lname)aspname,
  • 116. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 116 person.birthASpbirth, GetAgeYearNum(person.birth,CURRENT_DATE)asage, person.idcardASpcid, person.sex ASsex, person.hnomoiAShno, person.mumoi ASmu, village.villnoASvillage_villno, village.villnameASvillage_villname FROM personINNERJOIN ctitle ON person.prename =ctitle.titlecode INNERJOIN house ON person.pcucodeperson=house.pcucode ANDperson.hcode =house.hcode INNERJOIN village ON house.pcucode =village.pcucode ANDvillage.villcode =house.villcode WHERE person.typelive IN ('1','3') and person.pidnotin(SELECTpersondeath.pidFROMpersondeath) and person.birth between'1965-01-01'and'1995-12-31' and SUBSTRING(house.villcode,7,2)<>'00' ANDnation='99' orderBY village.villno,person.hnomoi*1; โค้ดรายชื่อผู้ป่วยNCDระบุสถานที่รักษา selectp.pid ,concat(ctitle.titlename ,' ',p.fname,'',p.lname) AS'name' ,YEAR(FROM_DAYS(DATEDIFF(CURDATE(),p.birth))) as'age' ,p.idcardas CID ,house.hnoas'address' ,village.villnoAS'moo' ,GROUP_CONCAT(pc.chroniccode) as chroniccode ,case when(pcht.chroniccode isnotnull andpcdm.chroniccode isnull)then'1'else ''endas ht ,case when(pcdm.chroniccode isnotnull andpcht.chroniccode isnull) then'1' else '' endas dm
  • 117. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 117 ,case whenpcdm.chroniccode isnotnull andpcht.chroniccode isnotnull then'1'else '' endas htdm ,DATE_FORMAT(pcdm.datefirstdiag,'%Y-%m-%d') as'dx_first_DM' ,DATE_FORMAT(pcht.datefirstdiag,'%Y-%m-%d') as'dx_first_HT' ,pc.cupas 'hospital' ,pc.hospfirstdiagas'first_dx_hosp' frompersonp INNERJOIN house ON p.hcode = house.hcode ANDp.pcucodeperson=house.pcucode INNERJOIN village ON house.villcode =village.villcode ANDhouse.pcucode =village.pcucode LEFT JOIN ctitle ON p.prename =ctitle.titlecode LEFT JOIN personchronicpchtonp.pid= pcht.pidandp.pcucodeperson=pcht.pcucodepersonand trim(pcht.chroniccode) ='I10' LEFT JOIN personchronicpcdmonp.pid= pcdm.pidandp.pcucodeperson=pcdm.pcucodeperson and trim(pcdm.chroniccode) between'E10'and 'E15.9' LEFT JOIN personchronicpconp.pid= pc.pidand p.pcucodeperson=pc.pcucodeperson WHERE (pcdm.chroniccode between'E10'and'E15.9' or pcht.chroniccode ='I10') and right(village.villcode,2)!='00' and p.typelive in(1,3)andpc.typedischart='03' ANDconcat(p.pid,p.pcucodeperson)NOT IN (select concat(persondeath.pid,persondeath.pcucodeperson) frompersondeathwhere deaddate <=CURDATE() or deaddate isnull) GROUP BY p.pid,ht,dmORDERBYvillage.villcode*1 โค้ดเป้าหมายงานทันตกรรม SELECT SUM(CASE WHEN GetAgeYearNum(person.birth,'2014-10-01') BETWEEN 0AND 2 THEN 1 ELSE null END) AS m02, SUM(CASE WHEN GetAgeYearNum(person.birth,'2014-10-01') BETWEEN 3AND 5 THEN 1 ELSE null END) AS m35, SUM(CASE WHEN GetAgeYearNum(person.birth,'2014-10-01') BETWEEN 6AND 14THEN 1 ELSE null END) AS m614, SUM(CASE WHEN GetAgeYearNum(person.birth,'2014-10-01') >=60THEN 1 ELSE null END) AS m60
  • 118. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 118 FROM person LeftOuterJoinhouse ON person.hcode =house.hcode ANDhouse.pcucode =person.pcucodeperson LeftOuterJoinvillage ON house.villcode =village.villcode ANDvillage.pcucode =house.pcucode LeftOuterJoincright ON person.rightcode=cright.rightcode WHERE SUBSTRING(house.villcode,7,2)<>'00'andperson.typelivein('1','3') and CONCAT(person.pid,person.pcucodeperson) NOTIN (select CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath) ตรวจสอบคนที่คัดกรองNCDซ้า selectcount(n.pid),pid fromncd_person_ncd_screenn where screen_date between'2014-10-01'and'2015-09-30' groupby n.pid havingcount(n.pid)>1 เป้าหมายการรณรงค์ฉีดวัคซีนDt58 selectvillage.villnoasvillno,village.villname asvillname, count(distinctp.pid) aspop, count(distinctcase whenvisitepi.vaccinecode ='Dtc' thenvisitepi.pidelse null end) as ผลงาน, concat(round(count(distinctcase whengetAgeYearNum(p.birth,current_date)between'20'and'50' and visitepi.vaccinecode ='Dtc' thenp.pidelse null end)*100/count(distinctcase when getAgeYearNum(p.birth,current_date)between'20'and '50' thenp.pidelse null end),2),'%') as 'ร้อยละ' frompersonp innerjoinhouse onp.hcode =house.hcode andp.pcucodeperson=house.pcucode innerjoinvillageonhouse.villcode=village.villcode andvillno<>'00' leftjoinvisitepi onp.pcucodeperson=visitepi.pcucodepersonandp.pid=visitepi.pid and dateepi between'2014-10-01'and'2015-09-30' where getAgeYearNum(p.birth,current_date)between'20'and'50' and p.typelive in('1','3') groupby villno,villname
  • 119. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 119 เป้าหมายการคัดกรองปี 58ตัดกลุ่มป่วย select (select count(p.pid) from personp innerjoinctitle onp.prename =ctitle.titlecode innerjoinhouse onp.pcucodeperson=house.pcucodeandp.hcode =house.hcode where CONCAT(p.pid,p.pcucodeperson) NOTIN (select CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath) and SUBSTRING(house.villcode,7,2)<>'00' andp.typelivein('1','3') and GetAgeYearNum(p.birth,'2014-10-01')>='35' and p.pidnotin(selectpidfrompersonchronicwhere(personchronic.chroniccode='I10'or personchronic.chroniccodebetween'E10'and 'E15.9'))) as 'ตัดกลุ่มป่วย', (select count(p.pid) from personp innerjoinctitle onp.prename =ctitle.titlecode innerjoinhouse onp.pcucodeperson=house.pcucodeandp.hcode =house.hcode where CONCAT(p.pid,p.pcucodeperson) NOTIN (select CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath) and SUBSTRING(house.villcode,7,2)<>'00' andp.typelivein('1','3') and GetAgeYearNum(p.birth,'2014-10-01')>='35') as'ไม่ตัดกลุ่มป่วย' รายชื่อกลุ่มป่วยแยกรายหมู่(ตัวหนังสือสีแดงให้เปลี่ยนเป็นวดป.ที่ต้องการเรียกรายงาน) select concat(ctitle.titlename,ps.fname,'',ps.lname)aspname, ps.birthasbirth, ps.sex assex, ps.idcardas idcard, ps.hnomoi,
  • 120. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 120 SUBSTRING(house.villcode,7,2)asmoo, max(v.visitdate) asvdate, v.pressure asvpressure, substr(v.pressure,1,instr(v.pressure,"/")-1)asbps, substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) asbpd, max(case whenpc.chroniccode ='I10'then'HT' else ' ' end) asHT, max(case whenpc.chroniccode between'E10'and'E15.9' then'DM' else ' ' end) as DM, if(substr(v.pressure,1,instr(v.pressure,"/")-1)<140or substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <90,'Green', if(substr(v.pressure,1,instr(v.pressure,"/")-1)<160or substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <100,'Yellow', if(substr(v.pressure,1,instr(v.pressure,"/")-1)<180or substr(v.pressure,instr(v.pressure,"/")+1,length(v.pressure)-instr(v.pressure,"/")) <110,'Orange ','Red'))) as'ระดับความดัน', s.sugarnumdigitasFBS, max(case whens.sugarnumdigit<126 then'Green'whens.sugarnumdigitbetween 126and154 then 'Yellow'whens.sugarnumdigitbetween 155and182 then'Orange'whens.sugarnumdigit>=183 then 'Red' else '' end) as'ระดับเบาหวาน', max(case whenvisitlabchcyhembmsse.labcode ='CH99' thenvisitlabchcyhembmsse.labresultdigit else ' ' end) as 'HbA1c', max(case whenvisitlabchcyhembmsse.labcode ='CH99' andvisitlabchcyhembmsse.labresultdigit<7 then'Yellow'whenvisitlabchcyhembmsse.labcode ='CH99' andvisitlabchcyhembmsse.labresultdigit < 8 then'Orange'whenvisitlabchcyhembmsse.labcode ='CH99' and visitlabchcyhembmsse.labresultdigit>=8 then'Red' else ' ' end) as 'ระดับHbA1c' from personpsinnerjoinvisitvon ps.pcucodeperson=v.pcucodepersonand ps.pid=v.pid innerjoinctitle onps.prename =ctitle.titlecode innerjoinhouse onps.pcucodeperson=house.pcucodeandps.hcode =house.hcode Leftjoinvisitlabsugarbloodsonv.pcucode = s.pcucode and v.visitno=s.visitno innerjoinpersonchronicpcon ps.pcucodeperson=pc.pcucodeperson
  • 121. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 121 and ps.`pid`= pc.pid Leftjoinvisitlabchcyhembmsse onv.pcucode =visitlabchcyhembmsse.pcucode and v.visitno=visitlabchcyhembmsse.visitno where v.visitdate between'2013-10-01'and'2014-09-30' and (pc.chroniccode between'E10'and 'E15.9' or pc.chroniccode = 'I10') andv.pressure isnotnull and CONCAT(ps.pid,ps.pcucodeperson) NOTIN (select CONCAT(persondeath.pid,persondeath.pcucodeperson)frompersondeath) and pc.cup= pc.pcucodepersonandSUBSTRING(house.villcode,7,2)<> '00' groupby ps.pid รายงานการตายทั้งหมดในเขตรับผิดชอบ select concat(ctitle.titlename,p.fname,'',p.lname)aspname, p.birthas birth, GetAgeYearNum(p.birth,current_date) as'อายุ', p.idcardas idcard, p.hnomoi, SUBSTRING(house.villcode,7,2)asmoo, persondeath.deadcause,cdisease.diseasenamethai,persondeath.deaddate from personp innerjoinctitle onp.prename =ctitle.titlecode innerjoinhouse onp.pcucodeperson=house.pcucodeandp.hcode =house.hcode innerjoinpersondeathonp.pcucodeperson=persondeath.pcucodepersonandp.pid= persondeath.pid innerjoincdisease onpersondeath.deadcause=cdisease.diseasecode where SUBSTRING(house.villcode,7,2)<> '00' #and p.typelive in('1','3') groupby p.pid orderby house.villcode
  • 122. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 122 รายงาน504แยกปี (ตัวหนังสือสีแดงให้เปลี่ยนวดป.ที่ต้องการเรียกรายงาน) selectcdisease504.group504code,cdisease504.group504name, count(visitdiag.diagcode) asd, sum(case when(visit.visitdate)between'2008-10-01'and'2009-09-30'then1 else null end) as'2552', sum(case when(visit.visitdate)between'2009-10-01'and'2010-09-30'then1 else null end) as'2553', sum(case when(visit.visitdate)between'2010-10-01'and'2011-09-30'then1 else null end) as'2554', sum(case when(visit.visitdate)between'2011-10-01'and'2012-09-30'then1 else null end) as'2555', sum(case when(visit.visitdate)between'2012-10-01'and'2013-09-30'then1 else null end) as'2556', sum(case when(visit.visitdate)between'2013-10-01'and'2014-09-30'then1 else null end) as'2557' fromvisitdiag innerjoincdisease onvisitdiag.diagcode =cdisease.diseasecode innerjoincdisease504oncdisease.code504=cdisease504.group504code innerjoinvisitonvisitdiag.visitno=visit.visitno where visit.visitdatebetween'2008-10-01'and'2014-09-30' groupby cdisease504.group504name orderby cdisease504.group504code รายชื่อคนที่ไม่ได้รับการคัดกรองNCDปี 58 selectconcat(ctitle.titlename,person.fname,'',person.lname)aspname, person.birthaspbirth, GetAgeYearNum(person.birth,'2014-10-01')asage, person.idcardaspcid, person.hnomoiashno, person.mumoi asmu frompersoninnerjoinctitle onperson.prename =ctitle.titlecode innerjoinhouse onperson.pcucodeperson=house.pcucode andperson.hcode =house.hcode innerjoinvillageonhouse.pcucode =village.pcucodeandvillage.villcode =house.villcode where person.typelive in('1','3') andGetAgeYearNum(person.birth,'2014-10-01') >='35'
  • 123. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 123 and SUBSTRING(house.villcode,7,2)<>'00'andperson.pidnotin(selectncd_person_ncd_screen.pid FROMncd_person_ncd_screenwhere ncd_person_ncd_screen.screen_datebetween'2014-10-01' and '2015-09-30') and CONCAT(person.pid,person.pcucodeperson) notin(select concat(persondeath.pid,persondeath.pcucodeperson) frompersondeathwhere persondeath.deaddate <=CURRENT_DATE)and concat(person.pid,person.pcucodeperson) not in(selectconcat(personchronic.pid,personchronic.pcucodeperson)frompersonchronicwhere personchronic.chroniccodelike'E1%'or(personchronic.chroniccodelike'I1%')) orderby village.villno ตรวจสอบรายชื่อเด็กอายุครบ1ปี ที่บันทึกการฉีดวัคซีนไม่ครบ select EPI.fname,EPI.lname,EPI.birth,EPI.age,EPI.BCG,EPI.DHB1,EPI.OPV1,EPI.DHB2,EPI.OPV2,EPI.DHB3,EPI. OPV3,EPI.MMR ,case when(EPI.DHB3andEPI.OPV3andEPI.MMR )!="0"then'com'else'notcom'end ascover ,EPI.pcucodeperson#,COUNT(DISTINCTconcat(EPI.pcucodeperson,EPI.pid))astotal FROM (SELECT person.pcucodeperson,person.pid,person.birth,person.fname,person.lname,getagemonth(person.bi rth,CURDATE() )asage ,max(case whencdrug.files18epi='010'thenvisitepi.dateepi else " 0" end)asBCG ,max(case whencdrug.files18epiin('031','091')thenvisitepi.dateepi else " 0" end)asDHB1 ,max(case whencdrug.files18epiin('032','092')thenvisitepi.dateepielse" 0 " end)asDHB2 ,max(case whencdrug.files18epiin('033','093')thenvisitepi.dateepielse" 0 " end)asDHB3 ,max(case whencdrug.files18epi='034'thenvisitepi.dateepi else " 0" end)asDTP4 ,max(case whencdrug.files18epi='035'thenvisitepi.dateepi else " 0" end)asDTP5 ,max(case whencdrug.files18epi='081'thenvisitepi.dateepi else " 0" end)asOPV1 ,max(case whencdrug.files18epi='082'thenvisitepi.dateepi else " 0" end)asOPV2
  • 124. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 124 ,max(case whencdrug.files18epi='083'thenvisitepi.dateepi else " 0" end)asOPV3 ,max(case whencdrug.files18epi='084'thenvisitepi.dateepi else " 0" end)asOPV4 ,max(case whencdrug.files18epi='085'thenvisitepi.dateepi else " 0" end)asOPV5 ,max(case whencdrug.files18epi='061'thenvisitepi.dateepi else " 0" end)asMMR ,max(case whencdrug.files18epi='051'thenvisitepi.dateepi else "0" end)asJE1 ,max(case whencdrug.files18epi='052'thenvisitepi.dateepi else " 0" end)asJE2 ,max(case whencdrug.files18epi='053'thenvisitepi.dateepi else " 0" end)asJE3 FROMperson INNERJOIN house onperson.hcode=house.hcodeAND person.pcucodeperson=house.pcucodeperson LEFT JOIN visitepi onperson.pid=visitepi.pidANDperson.pcucodeperson=visitepi.pcucodeperson LEFT JOIN cdrugon visitepi.vaccinecode=cdrug.drugcode WHERE person.typelivein('1','3') and getagemonth(person.birth,CURDATE() ) between 12and23 GROUP BY CONCAT(person.pcucodeperson,person.pid))asEPI WHERE EPI.MMR = 0 or EPI.DHB3=0 or EPI.OPV3=0 GROUP BY EPI.pid ORDER BY EPI.birth ตรวจสอบรายชื่อเด็กอายุครบ2ปี ที่บันทึกการฉีดวัคซีนไม่ครบ selectEPI.fname,EPI.lname,EPI.birth,EPI.age,EPI.DTP4,EPI.OPV4,EPI.JE1,EPI.JE2 ,case when(EPI.DTP4andEPI.OPV4andEPI.JE2)!="0" then'com'else'notcom'endascover #whenEPI.DHB3="-" or EPI.OPV3="-"or EPI.MMR ="-"then'notcom'else ""endas cover ,EPI.pcucodeperson#,COUNT(DISTINCTconcat(EPI.pcucodeperson,EPI.pid))astotal FROM (SELECT person.pcucodeperson,person.pid,person.birth,person.fname,person.lname,getagemonth(person.bi rth,CURDATE() )asage
  • 125. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 125 ,max(case whencdrug.files18epi='010'thenvisitepi.dateepi else " 0" end)asBCG ,max(case whencdrug.files18epiin('031','091')thenvisitepi.dateepi else " 0" end)asDHB1 ,max(case whencdrug.files18epiin('032','092')thenvisitepi.dateepielse" 0 " end)asDHB2 ,max(case when cdrug.files18epiin('033','093')thenvisitepi.dateepielse" 0 " end)asDHB3 ,max(case whencdrug.files18epi='034'thenvisitepi.dateepi else " 0" end)asDTP4 ,max(case whencdrug.files18epi='035'thenvisitepi.dateepi else " 0" end)asDTP5 ,max(case when cdrug.files18epi='081'thenvisitepi.dateepi else " 0" end)asOPV1 ,max(case whencdrug.files18epi='082'thenvisitepi.dateepi else " 0" end)asOPV2 ,max(case whencdrug.files18epi='083'thenvisitepi.dateepi else " 0" end)asOPV3 ,max(case when cdrug.files18epi='084'thenvisitepi.dateepi else " 0" end)asOPV4 ,max(case whencdrug.files18epi='085'thenvisitepi.dateepi else " 0" end)asOPV5 ,max(case whencdrug.files18epi='061'thenvisitepi.dateepi else " 0" end)asMMR ,max(case whencdrug.files18epi='051'thenvisitepi.dateepi else " 0" end)asJE1 ,max(case whencdrug.files18epi='052'thenvisitepi.dateepi else " 0" end)asJE2 ,max(case whencdrug.files18epi='053'thenvisitepi.dateepi else " 0" end)asJE3 FROMperson INNERJOIN house on person.hcode=house.hcodeAND person.pcucodeperson=house.pcucodeperson LEFT JOIN visitepi onperson.pid=visitepi.pidANDperson.pcucodeperson=visitepi.pcucodeperson LEFT JOIN cdrugon visitepi.vaccinecode=cdrug.drugcode WHERE person.typelivein('1','3') and getagemonth(person.birth,CURDATE() ) between 24and35 GROUP BY CONCAT(person.pcucodeperson,person.pid))asEPI WHERE EPI.DTP4=0 or EPI.OPV4=0or EPI.JE2=0 GROUP BY EPI.pid ORDER BY EPI.birth
  • 126. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 126 ตรวจสอบรายชื่อเด็กอายุครบ3ปี ที่บันทึกการฉีดวัคซีนไม่ครบ selectEPI.fname,EPI.lname,EPI.birth,EPI.age,EPI.JE3 ,case whenEPI.JE3!= 0 then'com'else'notcom'endascover ,EPI.pcucodeperson FROM (SELECT person.pcucodeperson,person.pid,person.birth,person.fname,person.lname,getagemonth(person.bi rth,CURDATE() )asage ,max(case whencdrug.files18epi='010'thenvisitepi.dateepi else " 0" end)asBCG ,max(case whencdrug.files18epiin('031','091')thenvisitepi.dateepi else " 0" end)asDHB1 ,max(case whencdrug.files18epiin('032','092')thenvisitepi.dateepielse" 0 " end)asDHB2 ,max(case whencdrug.files18epiin('033','093')thenvisitepi.dateepielse" 0 " end)asDHB3 ,max(case whencdrug.files18epi='034'thenvisitepi.dateepi else " 0" end)asDTP4 ,max(case whencdrug.files18epi='035'thenvisitepi.dateepi else " 0" end)asDTP5 ,max(case whencdrug.files18epi='081'thenvisitepi.dateepi else " 0" end)asOPV1 ,max(case whencdrug.files18epi='082'thenvisitepi.dateepi else " 0" end)asOPV2 ,max(case whencdrug.files18epi='083'thenvisitepi.dateepi else " 0" end)asOPV3 ,max(case whencdrug.files18epi='084'thenvisitepi.dateepi else " 0" end)asOPV4 ,max(case whencdrug.files18epi='085'thenvisitepi.dateepi else " 0" end)asOPV5 ,max(case whencdrug.files18epi='061'thenvisitepi.dateepi else "0" end)asMMR ,max(case whencdrug.files18epi='051'thenvisitepi.dateepi else " 0" end)asJE1 ,max(case whencdrug.files18epi='052'thenvisitepi.dateepi else " 0" end)asJE2 ,max(case whencdrug.files18epi='053'thenvisitepi.dateepi else " 0" end)asJE3 FROMperson
  • 127. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 127 INNERJOIN house onperson.hcode=house.hcodeAND person.pcucodeperson=house.pcucodeperson LEFT JOIN visitepi onperson.pid=visitepi.pidANDperson.pcucodeperson=visitepi.pcucodeperson LEFT JOIN cdrugon visitepi.vaccinecode=cdrug.drugcode WHERE person.typelivein('1','3') and getagemonth(person.birth,CURDATE() ) between 36and47 GROUP BY CONCAT(person.pcucodeperson,person.pid))asEPI WHERE EPI.JE3=0 GROUP BY EPI.pid ORDER BY EPI.birth ตรวจสอบรายชื่อเด็กอายุครบ4ปี ที่บันทึกการฉีดวัคซีนไม่ครบ selectEPI.fname,EPI.lname,EPI.birth,EPI.age,EPI.DTP5,EPI.OPV5 ,case when(EPI.DTP5andEPI.OPV5)!=0 then'com'else'notcom'endascover ,EPI.pcucodeperson FROM (SELECT person.pcucodeperson,person.pid,person.birth,person.fname,person.lname,getagemonth(person.bi rth,CURDATE() )asage ,max(case whencdrug.files18epi='010'thenvisitepi.dateepi else " 0" end)asBCG ,max(case whencdrug.files18epiin('031','091')thenvisitepi.dateepi else "0" end)asDHB1 ,max(case whencdrug.files18epiin('032','092')thenvisitepi.dateepielse" 0 " end)asDHB2 ,max(case whencdrug.files18epiin('033','093')thenvisitepi.dateepielse" 0 " end)asDHB3 ,max(case whencdrug.files18epi='034'thenvisitepi.dateepi else " 0" end)asDTP4 ,max(case whencdrug.files18epi='035'thenvisitepi.dateepi else " 0" end)asDTP5 ,max(case whencdrug.files18epi='081'thenvisitepi.dateepi else " 0" end)asOPV1 ,max(case whencdrug.files18epi='082'thenvisitepi.dateepi else "0" end)asOPV2
  • 128. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 128 ,max(case whencdrug.files18epi='083'thenvisitepi.dateepi else " 0" end)asOPV3 ,max(case whencdrug.files18epi='084'thenvisitepi.dateepi else " 0" end)asOPV4 ,max(case whencdrug.files18epi='085'thenvisitepi.dateepi else " 0" end)asOPV5 ,max(case whencdrug.files18epi='061'thenvisitepi.dateepi else " 0" end)asMMR ,max(case whencdrug.files18epi='051'thenvisitepi.dateepi else " 0" end)asJE1 ,max(case whencdrug.files18epi='052'thenvisitepi.dateepi else "0" end)asJE2 ,max(case whencdrug.files18epi='053'thenvisitepi.dateepi else " 0" end)asJE3 FROMperson INNERJOIN house onperson.hcode=house.hcodeAND person.pcucodeperson=house.pcucodeperson LEFT JOIN visitepi onperson.pid=visitepi.pidANDperson.pcucodeperson=visitepi.pcucodeperson LEFT JOIN cdrugon visitepi.vaccinecode=cdrug.drugcode WHERE person.typelivein('1','3') and getagemonth(person.birth,CURDATE() ) between 48and60 GROUP BY CONCAT(person.pcucodeperson,person.pid))as EPI WHERE EPI.DTP5=0 or EPI.OPV5=0 GROUP BY EPI.pid ORDER BY EPI.birth; ตรวจสอบการฝากครรภ์ครบ5ครั้งตามเกณฑ์ SELECT * FROM(SELECT ctitle.titlename as'คานาหน้าชื่อ' ,person.fnameas'ชื่อ' ,person.lnameas'นามสกุล' ,getAgeYearNum(person.birth,visitanc.datecheck)as'อายุ'
  • 129. Basic MySQL ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร สานักงานปลัดกระทรวงสาธารณสุข 129 #,visitanc.ancnoas'ครรภ์ที่' ,visitancdeliver.pregnoas'G' ,house.hnoas'บ้านเลขที่',right(villcode,2)as'หมู่ที่' ,visitancdeliver.datedeliveras'วันที่คลอด' ,MAX(case whenvisitanc.ancno='1'thenvisitanc.datecheckELSE"" end)as 'ancครั้งที่1' ,MAX(case whenvisitanc.ancno='2'thenvisitanc.datecheckELSE"" end)as 'ancครั้งที่2' ,MAX(case whenvisitanc.ancno='3'thenvisitanc.datecheckELSE"" end)as 'ancครั้งที่3' ,MAX(case when visitanc.ancno='4'thenvisitanc.datecheckELSE"" end)as 'ancครั้งที่4' ,MAX(case whenvisitanc.ancno='5'thenvisitanc.datecheckELSE"" end)as 'ancครั้งที่5' FROMvisitanc INNERJOIN persononvisitanc.pcucodeperson=person.pcucodepersonandvisitanc.pid=person.pid INNERJOIN house ON person.pcucodeperson=house.pcucodepersonAND person.hcode=house.hcode INNERJOIN ctitle ON person.prename =ctitle.titlecode INNERJOIN visitancdeliveronvisitanc.pcucodeperson=visitancdeliver.pcucodepersonand visitanc.pid=visitancdeliver.pid WHERE right(villcode,2)!='00' and person.typelivein('1','3') ANDvisitancdeliver.datedeliverBETWEEN '2013-04-01' and'2014-03-31' GROUP BY person.pcucodeperson,person.pid,visitancdeliver.pregno ORDER BY visitanc.datecheck) asanc_Q;