คำสั่ง SQL Commands (MySQL)

Sirichai Teerapattarasakul

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 ขึ้นไป)