คำสั่ง SQL Commands (MySQL)
Sirichai Teerapattarasakul / September 22, 2021
4 min read
รวมคำสั่ง SQL (Structured Query Language) สำหรับจัดการฐานข้อมูลเชิงสัมพันธ์ Relational Database Management System (RDBMS) เน้นไปเฉพาะฐานข้อมูล MySQL ตามรายการดังนี้
ค้นหาแบบระบุตำแหน่งข้อมูล
จะการใช้ Like และใส่เครื่องหมาย _ เพื่อขั้ามไประบุเจาะจงตำแหน่งข้อมูลในฟิลด์ ตัวอย่าง
หาค่า B ในตำแหน่งที่ 2
SELECT * FROM <table_name> WHERE <field_name> like '_B%'
หาค่า B ในตำแหน่งที่ 3
SELECT * FROM <table_name> WHERE <field_name> like '__B%'
หาค่า A ตำแหน่งที่หนึ่งและ B ในตำแหน่งที่ 5
SELECT * FROM <table_name> WHERE <field_name> like 'A___B%'
ค้นหาตำแหน่งในฟิลด์
ค้นหาข้อมูลแบบกำหนดตำแหน่งในฟิลด์และระบุจำนวนตัวอักษรที่ต้องการ โดยใช้ MID(string, start, length)
MID นั้นจะดึงข้อมูลตามหลักที่เรากำหนด ตัวอย่าง
ให้แสดงข้อมูลตั้งแต่หลักที่ 8 จากทางซ้าย มา 5 ตัวอักษร
SELECT MID("Useful MySQL Commands",8, 5) # จะแสดง MySQL
ให้แสดงข้อมูลตั้งแต่หลักที่ 8 จากทางขวา มา 3 ตัวอักษร
SELECT MID("Useful MySQL Commands",-8, 3) # จะแสดง Com
ให้ตรวจสอบว่ามี MySQL หรือไม่ โดยเลือกข้อมูลตั้งแต่หลักที่ 8 จากทางซ้าย มา 5 ตัวอักษ
SELECT MID("Useful MySQL Commands",8, 5) = 'MySQL'
# ถ้ามีจะแสดง 1, ไม่มีจะแสดงเป็น 0
กำหนดเงื่อนไขเลือกจากช่วงเวลา คำนวณวันสิ้นสุดอัตโนมัติ
ยกตัวอย่าง ต้องการดึงข่าว โดยมีเงื่อนไขให้เลือกจากช่วงเวลา และคำนวณวันสิ้นสุดอัตโนมัติ เช่น มีอายุการแสดงได้แค่ 3 เดือน โดยคำนวณวันสิ้นสุดจากฟิลด์ add_date
SELECT * FROM news WHERE (NOW( ) >= add_date AND NOW( ) < DATE_ADD(add_date, INTERVAL 3 MONTH ))
อธิบายเพิ่มเติม : วันปัจจุบัน NOW()
ต้องมากกว่าหรือเท่ากับ add_date
และวันปัจจุบัน NOW()
ต้องน้อยกว่า add_date
บวกเพิ่มอีก 3 เดือน”
คัดลอกข้อมูลระหว่างตาราง
บางครั้งเราจะมีการคัดลอกข้อมูลจากตารางนึงไปใช้กับอีกตารางนึง เช่น ดึงตาราง customers
ไปเก็บในตาราง customer_tmp
และเลือกเฉพาะฟิลด์ที่ต้องการพร้อมกับเก็บวันที่บันทึกลงไปด้วย โดยให้เงื่อนไขว่าเงินเดือนต้องมากกว่า 20,000 บาท ก็จะได้คำสั่งตามด้านล่างนี้
INSERT INTO customer_tmp (full_name,salary,add_date) SELECT full_name,salary,NOW() FROM customer WHERE salary > 20000
แทนที่ข้อมูลด้วยคำสั่ง Replace
แสดงข้อมูล
SELECT REPLACE( <field_name> ,'คำที่ค้นหา','คำที่เอามาแทน' ) AS show_data FROM <table_name>
อัพเดทข้อมูล
UPDATE <table_name> SET <field_name> = REPLACE( <field_name> ,'คำที่ค้นหา','คำที่เอามาแทน' )
คัดลอกข้อมูลระหว่างฟิลด์ในตารางเดียวกัน
UPDATE <table_name> SET <field_name1> = <field_name2>
แสดงข้อมูล 30 วันย้อนหลัง
SELECT * FROM <table_name> WHERE <field_name> < DATE_ADD(NOW(), INTERVAL +1 MONTH)
แยกหรือตัดข้อมูลในฟิลด์
มีข้อมูลชื่อและนามสกุลอยู่ในฟิลด์เดียว แต่ต้องการดึงชื่อและนามสกุลแยกออกมาเป็นคนล่ะฟิลด์ หรือดึงมาเฉพาะชื่อเท่านั้น ซึ่งสิ่งที่จะแยกคือช่องว่างระหว่างชื่อและนามสกุลนั่นเอง โดยใช้ SUBSTRING_INDEX(ชื่อฟิลด์,ตัวแบ่งเขตข้อมูล,จำนวน)
แสดงเฉพาะชื่อ
SELECT SUBSTRING_INDEX(full_name,' ',1) AS fname FROM members
แยกชื่อและนามสกุล
SELECT SUBSTRING_INDEX(full_name,' ',1) AS fname , SUBSTRING_INDEX(full_name,' ',-1) AS lname FROM members
เรียงข้อมูลตามค่าที่กำหนด
เช่น แสดงค่าของตาราง members
โดยให้เรียกตามรหัส group_id 1,2,3,4,5 เป็นต้น
SELECT * FROM members ORDER BY FIELD(group_id,1,2,3,4,5)
จัดการแก้ไขตาราง
แก้ไขข้อมูลเริ่มต้นของฟิลด์
ALTER TABLE <table_name> ALTER COLUMN <field_name> SET DEFAULT <value>
แก้ไข Data Type ของฟิลด์ หากต้องการเปลี่ยนประเภทข้อมูลในตารางที่มีข้อมูลแล้ว ควรทำการสำรองข้อมูลก่อนเสมอ
ALTER TABLE <field_name> MODIFY COLUMN <field_name> INT(11) NOT NULL DEFAULT 0
ALTER TABLE <field_name> MODIFY COLUMN <field_name> BIGINT NOT NULL
ALTER TABLE <field_name> MODIFY COLUMN <field_name> LONGTEXT NULL
ALTER TABLE <field_name> MODIFY COLUMN <field_name> DATETIME NULL
ALTER TABLE <field_name> MODIFY COLUMN <field_name> VARCHAR(20) NOT NULL DEFAULT <value3> AFTER <field_name>
ALTER TABLE <field_name> MODIFY COLUMN <field_name> ENUM(<value1>,<value2>,<value3>,) NOT NULL DEFAULT <value3>
เพิ่มฟิลด์
ALTER TABLE <field_name> ADD COLUMN <field_name> <data_type> DEFAULT <value>
ALTER TABLE <field_name> ADD COLUMN <field_name> <data_type> NULL DEFAULT <value>
ALTER TABLE <field_name> ADD COLUMN <field_name> <data_type> NULL DEFAULT <value> COMMENT <comment>
ลบฟิลด์
ALTER TABLE <table_name> DROP COLUMN <field_name>
ประเภทข้อมูล (Data Types)
1. ประเภทข้อมูลตัวเลข (Numeric Types)
จำนวนเต็ม (Integer)
- TINYINT: จำนวนเต็มขนาดเล็ก (-128 ถึง 127) หรือ (0 ถึง 255) ถ้าเป็น UNSIGNED
- SMALLINT: จำนวนเต็มขนาดเล็ก (-32,768 ถึง 32,767)
- MEDIUMINT: จำนวนเต็มขนาดกลาง (-8,388,608 ถึง 8,388,607)
- INT/INTEGER: จำนวนเต็มมาตรฐาน (-2,147,483,648 ถึง 2,147,483,647)
- BIGINT: จำนวนเต็มขนาดใหญ่ (-9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807)
จำนวนทศนิยม (Floating-Point)
- FLOAT: จำนวนทศนิยมความแม่นยำเดี่ยว (32-bit)
- DOUBLE: จำนวนทศนิยมความแม่นยำคู่ (64-bit)
- DECIMAL(p,s): จำนวนทศนิยมแบบกำหนดความแม่นยำได้ (p=จำนวนหลักทั้งหมด, s=จำนวนทศนิยม)
2. ประเภทข้อมูลวันที่และเวลา (Date and Time)
- DATE: เก็บค่าวันที่ (YYYY-MM-DD)
- TIME: เก็บค่าเวลา (HH:MM:SS)
- DATETIME: เก็บทั้งวันที่และเวลา (YYYY-MM-DD HH:MM:SS)
- TIMESTAMP: เหมือน DATETIME แต่แปลงเวลาเป็น UTC
- YEAR: เก็บค่าปี (2 หรือ 4 หลัก)
3. ประเภทข้อมูลข้อความ (String Types)
ข้อความความยาวคงที่
- CHAR(n): ข้อความความยาวคงที่ (สูงสุด 255 ตัวอักษร)
ข้อความความยาวแปรผัน
- VARCHAR(n): ข้อความความยาวแปรผัน (สูงสุด 65,535 ตัวอักษร)
- TINYTEXT: ข้อความขนาดเล็ก (สูงสุด 255 ตัวอักษร)
- TEXT: ข้อความขนาดกลาง (สูงสุด 65,535 ตัวอักษร)
- MEDIUMTEXT: ข้อความขนาดใหญ่ (สูงสุด 16,777,215 ตัวอักษร)
- LONGTEXT: ข้อความขนาดใหญ่มาก (สูงสุด 4,294,967,295 ตัวอักษร)
ข้อมูลไบนารี
- BINARY(n): ข้อมูลไบนารีความยาวคงที่
- VARBINARY(n): ข้อมูลไบนารีความยาวแปรผัน
- BLOB: ข้อมูลไบนารีขนาดใหญ่
4. ประเภทข้อมูลพิเศษ (Special Types)
- ENUM: เลือกได้จากค่าที่กำหนดไว้ล่วงหน้า
ENUM('small', 'medium', 'large')
- SET: เลือกได้หลายค่าจากค่าที่กำหนดไว้
SET('red', 'green', 'blue')
- JSON: เก็บข้อมูลรูปแบบ JSON (MariaDB 10.2.7 ขึ้นไป)