Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tìm tên thành phố không bắt đầu bằng nguyên âm trong MySQL

Để lọc các tên thành phố không bắt đầu bằng nguyên âm (a, e, i, o, u - cả hoa và thường), bạn dùng toán tử RLIKE (hoặc REGEXP) với biểu thức chính quy phủ định.

Cú pháp

SELECT DISTINCT ten_cot_thanh_pho 
FROM ten_bang 
WHERE ten_cot_thanh_pho NOT RLIKE '^[AEIOUaeiou].*$';

Giải thích Regex

  • ^: Bắt đầu chuỗi
  • [AEIOUaeiou]: Một trong các ký tự nguyên âm (hoa hoặc thường)
  • .*: Bất kỳ ký tự nào, số lượng bất kỳ
  • $: Kết thúc chuỗi
  • NOT RLIKE: Phủ định - không khớp với pattern trên

Ví dụ minh họa

1. Tạo bảng nhân viên

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

2. Chèn dữ liệu

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

3. Xem toàn bộ dữ liệu

SELECT * FROM Employee_Information;

Kết quả:

+----+--------------+--------------+
| Id | EmployeeName | CityName     |
+----+--------------+--------------+
| 1  | Larry        | New York     |
| 2  | Sam          | Indianapolis |
| 3  | Carol        | El Paso      |
| 4  | John         | Austin       |
| 5  | Mike         | Denver       |
| 6  | David        | Las Vegas    |
| 7  | James        | Albuquerque  |
| 8  | Robert       | Portland     |
| 9  | Richard      | Irvine       |
| 10 | Michael      | Garland      |
+----+--------------+--------------+

4. Truy vấn: Thành phố KHÔNG bắt đầu bằng nguyên âm

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

Kết quả:

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

Các thành phố bị loại (bắt đầu bằng nguyên âm): Indianapolis (I), El Paso (E), Austin (A), Albuquerque (A), Irvine (I).

Cách viết khác

Dùng REGEXP (tương đương RLIKE)

WHERE CityName NOT REGEXP '^[AEIOUaeiou]'

Dùng NOT LIKE (đơn giản hơn, không cần regex)

WHERE CityName NOT LIKE 'A%' 
  AND CityName NOT LIKE 'E%' 
  AND CityName NOT LIKE 'I%' 
  AND CityName NOT LIKE 'O%' 
  AND CityName NOT LIKE 'U%'
  AND CityName NOT LIKE 'a%' 
  AND CityName NOT LIKE 'e%' 
  AND CityName NOT LIKE 'i%' 
  AND CityName NOT LIKE 'o%' 
  AND CityName NOT LIKE 'u%'

Dùng SUBSTRING + NOT IN

WHERE UPPER(SUBSTRING(CityName, 1, 1)) NOT IN ('A','E','I','O','U')

Lưu ý hiệu năng

  • RLIKE/REGEXP không sử dụng index → quét toàn bảng
  • Với bảng lớn, cân nhắc cột computed/index chức năng hoặc xử lý ở application layer
  • DISTINCT loại bỏ trùng lặp nếu nhiều nhân viên cùng thành phố