Ở bài tìm hiểu lệnh SELECT mình đã liệt kê danh sách các toán tử và trong đó có hai toán tử là INvà LIKE thì trong bài này chúng ta sẽ tìm hiểu nó. Về cách sử dụng thì IN và LIKE rất hữu dụng nhưng về thực tế thì chúng ta cần phải xem lại nó. Chi tiết thến ào thì chúng ta sẽ tìm hiểu nó nhé.
CREATE DATABASE IF NOT EXISTS qlsv;
USE qlsv;
CREATE TABLE IF NOT EXISTS sinhvien(
sv_id INT(11) NOT NULL AUTO_INCREMENT,
sv_name VARCHAR(255) NOT NULL,
sv_description VARCHAR(500),
CONSTRAINT pk_sinhvien PRIMARY KEY(sv_id)
) ENGINE = INNODB;
INSERT INTO sinhvien(sv_name, sv_description)
VALUES('Mr Cuong', 'Nguyen Van Cuong');
INSERT INTO sinhvien(sv_name, sv_description)
VALUES('Mr Kinh', 'Nguyen Van Kinh');
INSERT INTO sinhvien(sv_name, sv_description)
VALUES('Mr Chinh', 'Nguyen Van Chinh');
INSERT INTO sinhvien(sv_name, sv_description)
VALUES('Mr Quyen', 'Nguyen Van Quyen');
WHERE IN trong MySQL
WHERE IN có tác dụng tương tự như hàm in_array() trong PHP vậy, nghĩa là sẽ kiểm tra giá trị của field đó có nằm trong một tập hợp nào đó hay không. Chẳng hạn bạn cần kiểm tra trong bảng sinh viên có sinh viên nào có tên là Mr Cường, Mr Kính hoặc Mr Chính hay không? thì ta sẽ tạo điều kiện IN như sau:
SELECT sv_id, sv_name, sv_description
FROM SINHVIEN
WHERE sv_name IN ('Mr Cuong', 'Mr Kinh', 'Mr Chinh')
Kết quả sẽ là:
Như vậy những record nào có tên là Mr Cuong hoặc Mr Kinh hoặc Mr Chinh thì đều được chọn.
Nếu không sử dụng IN thì ta sẽ dùng toán tử OR để tạo điều kiện. Như ví dụ trên tôi sẽ chuyển sang sử dụng OR như sau:
SELECT sv_id, sv_name, sv_description
FROM SINHVIEN
WHERE
sv_name = 'Mr Cuong' OR
sv_name = 'Mr Kinh' OR
sv_name = 'Mr Chinh'
WHERE LIKE trong MySQL
LIKE với ký hiệu %
Ký hiệu % sẽ đại diện cho 0 hoặc nhiều ký tự.
Ví dụ: cần tìm những sinh viên nào có tên và trong tên chỉ cần có chữ Cuong là được chọn.
SELECT sv_id, sv_name, sv_description
FROM SINHVIEN
WHERE sv_name LIKE '%Cuong%'
Kết quả nó sẽ trả về một record duy nhất. Riêng với chuỗi %Cuong% thì tôi sẽ giải thích cho các trường hợp sau là đúng:
Chuỗi 'some thing Cuong some thing' đúng
Chuỗi 'some thing Cuong' đúng
Chuỗi 'Cuong some thing' đúng
Ví dụ: Tìm những sinh viên nào có lastname là Kinh
SELECT sv_id, sv_name, sv_description
FROM SINHVIEN
WHERE sv_name LIKE '%Kinh'
Like với kí hiệu _
Ký hiệu _ đại diện cho một ký tự bất kì, nghĩa là khi bạn sử dụng ký hiệu này thì nó sẽ là một ký tự thay vì 0 hoặc nhiều ký tự như ký hiệu %.
Ví dụ: Tìm sinh viên có tên bắt đầu chữ M, ký tự thứ 2 bất kì và tiếp theo là khoảng trắng, tiếp theo nữa là các ký tự bất kì
SELECT sv_id, sv_name, sv_description
FROM SINHVIEN
WHERE sv_name LIKE 'M_ %'
Cú pháp 'M_ %' có ý nghĩa là bắt đầu chữ M, tiếp theo là dấu _ nên nó là ký tự bất kì, tiếp theo là khoảng trắng và tiếp nữa dấu % là 0 hoặc nhiều ký tự bất kì.
Pattern Matching
To find names beginning with b:
mysql> SELECT * FROM pet WHERE name LIKE 'b%';
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
To find names ending with fy:
mysql> SELECT * FROM pet WHERE name LIKE '%fy';
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
To find names containing a w:
mysql> SELECT * FROM pet WHERE name LIKE '%w%';
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
To find names containing exactly five characters, use five instances of the _ pattern character:
mysql> SELECT * FROM pet WHERE name LIKE '_____';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
To find names beginning with b, use ^ to match the beginning of the name:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
To find names ending with fy, use $ to match the end of the name:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
To find names containing a w, use this query:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'w');
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
To find names containing exactly five characters, use ^ and $ to match the beginning and end of the name, and five instances of . in between:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$');
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
You could also write the previous query using the {n} (“repeat-n-times”) operator:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$');
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+