Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ค้นหาชื่อเมืองที่ไม่ขึ้นต้นด้วยสระ (Vowel) ใน MySQL

การค้นหาข้อมูลที่ไม่ขึ้นต้นด้วยสระด้วย RLIKE (REGEXP)

ใช้ RLIKE (หรือ REGEXP) พร้อม Regular Expression เพื่อกรองชื่อเมืองที่ไม่ขึ้นต้นด้วย A, E, I, O, U (พิมพ์เล็ก/ใหญ่)

ไวยากรณ์

SELECT DISTINCT yourCityColumn 
FROM yourTableName 
WHERE yourCityColumn NOT RLIKE '^[AEIOUaeiou].*$';

คำอธิบาย Regular Expression

ส่วนความหมาย
^จุดเริ่มต้นของสตริง
[AEIOUaeiou]ชุดตัวอักษร: A,E,I,O,U,a,e,i,o,u
.*ตัวอักษรใดๆ จำนวน 0 หรือมาก
$จุดสิ้นสุดของสตริง

ตัวอย่างการใช้งาน

สร้างตารางพนักงานและเมือง:

CREATE TABLE Employee_Information (
    Id INT NOT NULL AUTO_INCREMENT,
    EmployeeName VARCHAR(20),
    CityName VARCHAR(20),
    PRIMARY KEY(Id)
);

เพิ่มข้อมูลทดสอบ:

INSERT INTO Employee_Information(EmployeeName, CityName) VALUES('Larry', 'New York');
INSERT INTO Employee_Information(EmployeeName, CityName) VALUES('Sam', 'Indianapolis');
INSERT INTO Employee_Information(EmployeeName, CityName) VALUES('Carol', 'El Paso');
INSERT INTO Employee_Information(EmployeeName, CityName) VALUES('John', 'Austin');
INSERT INTO Employee_Information(EmployeeName, CityName) VALUES('Mike', 'Denver');
INSERT INTO Employee_Information(EmployeeName, CityName) VALUES('David', 'Las Vegas');
INSERT INTO Employee_Information(EmployeeName, CityName) VALUES('James', 'Albuquerque');
INSERT INTO Employee_Information(EmployeeName, CityName) VALUES('Robert', 'Portland');
INSERT INTO Employee_Information(EmployeeName, CityName) VALUES('Richard', 'Irvine');
INSERT INTO Employee_Information(EmployeeName, CityName) VALUES('Michael', 'Garland');

ค้นหาเมืองที่ไม่ขึ้นต้นด้วยสระ:

SELECT DISTINCT CityName 
FROM Employee_Information 
WHERE CityName NOT RLIKE '^[AEIOUaeiou].*$';

ผลลัพธ์:

+-----------+
| CityName  |
+-----------+
| New York  |
| Denver    |
| Las Vegas |
| Portland  |
| Garland   |
+-----------+

วิธีอื่น: ใช้ LEFT() และ NOT IN

SELECT DISTINCT CityName 
FROM Employee_Information 
WHERE UPPER(LEFT(CityName, 1)) NOT IN ('A','E','I','O','U');

ประสิทธิภาพ

  • RLIKE/REGEXP - อ่านง่าย แต่ช้ากว่า (ไม่ใช้ index ได้เต็มที่)
  • LEFT() + NOT IN - เร็วกว่า อาจใช้ index ได้หากมี functional index (MySQL 8.0+)
  • สำหรับข้อมูลเยอะ แนะนำเพิ่มคอลัมน์ first_letter CHAR(1) และ index คอลัมน์นั้น