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

Cách tách tên miền (domain) từ email trong MySQL


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

  1. INSTR(email, '@'): Tìm vị trí ký tự @
  2. SUBSTR(email, pos + 1): Lấy chuỗi sau @ → "yahoo.com"
  3. 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)

Giải pháp cho subdomain: Lấy phần giữa @ và dấu chấm cuối cùng

SELECT 
    SUBSTRING_INDEX(
        SUBSTRING_INDEX(email, '@', -1), 
        '.', 
        LENGTH(SUBSTRING_INDEX(email, '@', -1)) - LENGTH(REPLACE(SUBSTRING_INDEX(email, '@', -1), '.', ''))
    ) AS domain
FROM ten_bang;

Ứng dụng thực tế

  • Phân tích nhà cung cấp email (Gmail, Yahoo, Corporate...)
  • Phát hiện email giả mạo (spoofing)
  • Thống kê đăng ký theo domain
  • Routing email marketing

Lưu ý

  • Email có thể chứa nhiều @ (hiếm) → INSTR lấy @ đầu tiên
  • Domain có thể có nhiều dấu chấm → Cần logic phức tạp cho TLD chính xác
  • Cân nhắc dùng REGEXP (MySQL 8.0) cho pattern matching mạnh hơn
EmailMong muốnCông thức
user@gmail.comgmailSUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', 1)
user@mail.company.comcompanyCần logic phức tạp hơn (tách TLD)
user@sub.domain.co.ukdomainCần public suffix list