บทความนี้เหมาะกับใคร
รวมคำสั่ง MySQL ที่ใช้บ่อยสำหรับผู้ดูแลระบบ HOSxP และคนที่ต้องเขียนรายงานเอง ตั้งแต่คำสั่งพื้นฐาน SELECT / INSERT / UPDATE ไปจนถึงการ JOIN ตาราง และโค้ดฝั่ง Report Designer พร้อมตัวอย่างใช้งานจริง กดปุ่มคัดลอกมุมขวาบนของกล่องโค้ดไปใช้ได้ทันที
สารบัญ
1. คำสั่งตรวจสอบระบบ (Monitoring)
ชุดคำสั่งสำหรับเช็กสถานะเซิร์ฟเวอร์และโครงสร้างตาราง ใช้บ่อยตอนระบบช้าหรือต้องหาสาเหตุปัญหา
| คำสั่ง | ใช้ทำอะไร |
|---|---|
SHOW MASTER STATUS; | ตรวจสอบการทำงานของเครื่อง Master |
SHOW SLAVE STATUS; | ตรวจสอบการทำงานของเครื่อง Slave |
SHOW FULL PROCESSLIST; | ดูว่าตอนนี้ใครใช้งาน MySQL อยู่บ้าง และคำสั่งไหนค้าง |
SHOW CREATE TABLE ชื่อตาราง; | ดูคำสั่งที่ใช้สร้างตารางนั้นขึ้นมา |
DESCRIBE ชื่อตาราง; | ดูโครงสร้างและรายละเอียดฟิลด์ทั้งหมด |
2. จัดการฐานข้อมูล (Database)
-- สร้างฐานข้อมูลใหม่
CREATE DATABASE `test`;
-- ลบฐานข้อมูลทิ้ง
DROP DATABASE `test`;
กลับขึ้นสารบัญ
3. จัดการตาราง (Table)
3.1 สร้างตารางใหม่จากผลลัพธ์ของ SELECT
ใช้บ่อยมากเวลาต้องการสำรองข้อมูลก่อนแก้ไข หรือพักข้อมูลไว้ทำรายงาน
CREATE TABLE pttype_group2 AS
SELECT * FROM patient
WHERE pttype = '20';
3.2 เพิ่มและแก้ไขฟิลด์
-- เพิ่มฟิลด์ใหม่
ALTER TABLE test ADD COLUMN age INT;
-- แก้ไขชนิดข้อมูลของฟิลด์เดิม
ALTER TABLE test MODIFY COLUMN name VARCHAR(100);
3.3 ลบตาราง
DROP TABLE `pttype_group2`;
กลับขึ้นสารบัญ
4. ดึงข้อมูลด้วย SELECT
-- เลือกข้อมูลทั้งหมด
SELECT * FROM test;
-- เลือกเฉพาะบางฟิลด์
SELECT id, name FROM test;
-- เงื่อนไขแบบเท่ากับ
SELECT * FROM test WHERE id = 1;
-- ค้นหาแบบขึ้นต้นด้วย
SELECT * FROM test WHERE name LIKE 'สม%';
-- ช่วงวันที่
SELECT * FROM ovst
WHERE vstdate BETWEEN '2020-01-01' AND '2020-01-31';
-- หลายค่าในฟิลด์เดียว
SELECT * FROM patient WHERE pttype IN ('10', '20', '30');
-- ค่าว่าง
SELECT * FROM patient WHERE hos_guid IS NULL;
เงื่อนไขที่ใช้บ่อยใน WHERE:
กลับขึ้นสารบัญ
= > < BETWEEN AND OR LIKE IN IS NULL
5. เพิ่ม / แก้ไข / ลบข้อมูล
-- เพิ่มข้อมูล
INSERT INTO test (id, name)
VALUES ('1', 'ทดสอบ');
-- แก้ไขข้อมูล: ปรับ type_area ของผู้ป่วยในพื้นที่ที่กำหนด
UPDATE patient
SET type_area = '4'
WHERE chwpart = '31'
AND amppart = '11'
AND tmbpart = '02';
-- ลบข้อมูล
DELETE FROM test WHERE id = '1';
ข้อควรระวังก่อนรัน UPDATE และ DELETE
กลับขึ้นสารบัญ
- สำรองฐานข้อมูล (Backup) ทุกครั้งก่อนแก้ไขข้อมูลจริง
- ลองเปลี่ยนเป็น
SELECT * FROM ...ด้วยเงื่อนไข WHERE เดียวกันก่อน เพื่อดูว่าจะกระทบกี่แถว - อย่ารัน UPDATE หรือ DELETE โดยไม่มี WHERE เด็ดขาด เพราะจะกระทบทั้งตาราง
6. การ JOIN ตาราง
ตัวอย่างจริง: นับจำนวนการบันทึก bps, bpd, bw, pulse, temperature โดยไม่นับค่าว่างและค่าศูนย์ เฉพาะผู้ป่วยที่ถูกส่งไปจุดซักประวัติ
SELECT ov.vstdate,
COUNT(o1.vn) AS bps_count,
COUNT(o2.vn) AS bpd_count,
COUNT(o3.vn) AS bw_count,
COUNT(o4.vn) AS pulse_count,
COUNT(o5.vn) AS temp_count
FROM ovst ov
LEFT OUTER JOIN opdscreen o1 ON o1.vn = ov.vn AND o1.bps > 0
LEFT OUTER JOIN opdscreen o2 ON o2.vn = ov.vn AND o2.bpd > 0
LEFT OUTER JOIN opdscreen o3 ON o3.vn = ov.vn AND o3.bw > 0
LEFT OUTER JOIN opdscreen o4 ON o4.vn = ov.vn AND o4.pulse > 0
LEFT OUTER JOIN opdscreen o5 ON o5.vn = ov.vn AND o5.temperature > 0
GROUP BY ov.vstdate;
จำง่าย ๆ:
กลับขึ้นสารบัญ
INNER JOIN เอาเฉพาะแถวที่มีคู่กันทั้งสองตาราง ส่วน LEFT JOIN เอาแถวจากตารางซ้ายมาให้ครบ ถ้าตารางขวาไม่มีคู่จะได้ NULL
7. ตัวอย่างใช้งานจริงใน HOSxP
7.1 เชื่อมที่อยู่ให้เป็นข้อความเต็ม
SELECT p.hn, p.pname, p.fname, p.lname,
CONCAT(p.addrpart, ' หมู่ที่ ', p.moopart,
' ต.', t3.name,
' อ.', t2.name,
' จ.', t1.name) AS fulladdressname
FROM patient p
LEFT OUTER JOIN thaiaddress t1
ON t1.chwpart = p.chwpart AND t1.amppart = '00' AND t1.tmbpart = '00'
LEFT OUTER JOIN thaiaddress t2
ON t2.chwpart = p.chwpart AND t2.amppart = p.amppart AND t2.tmbpart = '00'
LEFT OUTER JOIN thaiaddress t3
ON t3.chwpart = p.chwpart AND t3.amppart = p.amppart AND t3.tmbpart = p.tmbpart;
7.2 คำนวณอายุจากวันเกิด
SELECT p.hn, p.fname, p.lname,
YEAR(CURRENT_DATE) - YEAR(p.birthday) AS age
FROM patient p;
7.3 เติมค่า hos_guid ที่ยังว่างอยู่
UPDATE ชื่อตาราง
SET hos_guid = UPPER(CONCAT('{', UUID(), '}'))
WHERE hos_guid IS NULL;
กลับขึ้นสารบัญ
8. โค้ดฝั่ง Report Designer
8.1 แปลงตัวเลขเป็นตัวหนังสือภาษาไทย (ThaiMoney)
// แสดงผลเป็น: เก้าสิบหกบาท
Value := ThaiMoney(variable1.value);
// แสดงผลเป็น: (เก้าสิบหกบาท)
Value := '(' + ThaiMoney(variable1.value) + ')';
// ใช้กับผลรวม เช่น sum(mon11) ที่ตั้งชื่อว่า DBCalc1
Value := ThaiMoney(DBCalc1.value);
8.2 ดึงค่า Parameter มาแสดงในรายงาน
Value := 'ระหว่างวันที่ ' + GetUserParameter(0) +
' ถึง ' + GetUserParameter(1);
กลับขึ้นสารบัญ
เขียนโดย : วันสว่าง กาญจนการี (อาท)
Wansawang Kanchanakaree
Wansawang Kanchanakaree