Cú pháp
Sử dụng SUBSTRING_INDEX() lồng nhau: cắt sau @, sau đó cắt trước dấu chấm:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', 1) AS domain FROM ten_bang;
Ví dụ chi tiết
1. Tạo bảng
mysql> CREATE TABLE selectDomainNameOnly ( -> UserEmailAddress VARCHAR(200) -> ); Query OK, 0 rows affected (0.52 sec)
2. Chèn email
mysql> INSERT INTO selectDomainNameOnly VALUES('John123@yahoo.com');
Query OK, 1 row affected (0.10 sec)
mysql> INSERT INTO selectDomainNameOnly VALUES('234Bob@gmail.com');
Query OK, 1 row affected (0.24 sec)
mysql> INSERT INTO selectDomainNameOnly VALUES('Carol23595@hotmail.com');
Query OK, 1 row affected (0.16 sec)
3. Dữ liệu gốc
mysql> SELECT * FROM selectDomainNameOnly;
+------------------------+ | UserEmailAddress | +------------------------+ | John123@yahoo.com | | 234Bob@gmail.com | | Carol23595@hotmail.com | +------------------------+ 3 rows in set (0.00 sec)
4. Tách domain (yahoo, gmail, hotmail)
mysql> SELECT SUBSTRING_INDEX(SUBSTR(UserEmailAddress, INSTR(UserEmailAddress, '@') + 1), '.', 1) -> AS DomainName FROM selectDomainNameOnly;
+------------+ | DomainName | +------------+ | yahoo | | gmail | | hotmail | +------------+ 3 rows in set (0.06 sec)
Giải thích từng bước
INSTR(email, '@'): Tìm vị trí ký tự @SUBSTR(email, pos + 1): Lấy chuỗi sau @ → "yahoo.com"SUBSTRING_INDEX(..., '.', 1): Lấy phần trước dấu chấm đầu tiên → "yahoo"
Phương pháp đơn giản hơn (MySQL 8.0+)
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', 1) AS domain FROM ten_bang;
Xử lý email phức tạp (subdomain)
| Mong muốn | Công thức | |
|---|---|---|
| user@gmail.com | gmail | SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', 1) |
| user@mail.company.com | company | Cần logic phức tạp hơn (tách TLD) |
| user@sub.domain.co.uk | domain | Cần public suffix list |