Mệnh đề WHERE trong SQLite



Mệnh đề WHERE trong SQLite được sử dụng để xác định một điều kiện trong khi lấy dữ liệu từ bảng đơn hoặc nhiều bảng kết hợp.

Nếu điều kiện đã cho được thỏa mãn, thì nó chỉ trả về các giá trị cụ thể từ bảng đó. Bạn sẽ sử dụng mệnh đề WHERE để lọc các bản ghi và chỉ lấy các bản ghi cần thiết.

Mệnh đề WHERE không chỉ được sử dụng trong lệnh SELECT, mà nó còn được sử dụng trong các lệnh UPDATE, DELETE, …, sẽ được trình bày trong các chương tiếp theo.

Cú pháp

Cú pháp cơ bản của lệnh SELECT với mệnh đề WHERE trong SQLite như sau:

SELECT column1, column2, columnN 
FROM table_name
WHERE [condition]

Ví dụ

Bạn có thể xác định một điều kiện bởi sử dụng các Toán tử so sánh và toán tử logic như >, <, =, LIKE, NOT, ... Các ví dụ dưới đây sẽ giúp bạn hiểu rõ khái niệm này. Bạn theo dõi bảng COMPANY có các bản ghi sau:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Các ví dụ đơn giản này minh họa cách sử dụng của toán tử logic trong SQLite. Lệnh SELECT sau liệt kê tất cả bản ghi có AGE lớn hơn hoặc bằng 25 salary lớn hơn hoặc bằng 65000.

sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

Lệnh SELECT sau liệt kê tất cả bản ghi có AGE lớn hoặc hoặc bằng 25 HOẶC salary lớn hơn hoặc bằng 65000.

sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

Lệnh SELECT sau liệt kê tất cả bản ghi có AGE là NOT NULL.

sqlite>  SELECT * FROM COMPANY WHERE AGE IS NOT NULL;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Lệnh SELECT sau liệt kê tất cả bản ghi có NAME bắt đầu với 'Ki', và không quan tâm đến đằng sau nó là gì.

sqlite> SELECT * FROM COMPANY WHERE NAME LIKE 'Ki%';
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
6           Kim         22          South-Hall  45000.0

Lệnh SELECT sau liệt kê tất cả bản ghi có NAME bắt đầu với 'Ki', và không quan tâm đến đằng sau nó là gì. (Có thể với ví dụ này bạn không nhận thấy sự khác nhau giữa LIKE và GLOB, nhưng thực chất với LIKE là không phân biệt kiểu chữ còn với GLOB là phân biệt kiểu chữ.)

sqlite> SELECT * FROM COMPANY WHERE NAME GLOB 'Ki*';
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
6           Kim         22          South-Hall  45000.0

Lệnh SELECT sau liệt kê tất cả bản ghi có giá trị AGE hoặc là 25 hoặc là 27:

sqlite> SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 );
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

Lệnh SELECT sau liệt kê tất cả bản ghi có giá trị AGE không là 25 và không là 27:

sqlite> SELECT * FROM COMPANY WHERE AGE NOT IN ( 25, 27 );
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
3           Teddy       23          Norway      20000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Lệnh SELECT sau liệt kê tất cả bản ghi có giá trị AGE trong khoảng 25 và 27:

sqlite> SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

Lệnh SELECT sau sử dụng truy vấn con trong SQL, trong đó truy vấn con này tìm tất cả bản ghi với trường AGE có SALARY > 65000 và sau đó mệnh đề WHERE được sử dụng cùng với toán tử EXISTS để liệt kê tất cả các bản ghi có AGE từ truy vấn bên ngoài tồn tại trong kết quả được trả về bởi truy vấn con:

sqlite> SELECT AGE FROM COMPANY 
        WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
AGE
----------
32
25
23
25
27
22
24

Lệnh SELECT sau sử dụng truy vấn con trong SQL, trong đó truy vấn con này tìm tất cả bản ghi với trường AGE có SALARY > 65000 và sau đó mệnh đề WHERE được sử dụng cùng với toán tử > để liệt kê tất cả bản ghi có AGE từ truy vấn bên ngoài mà lớn hơn AGE trong kết quả được trả về bởi truy vấn con:

sqlite> SELECT * FROM COMPANY 
        WHERE AGE > (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0

Các bài học SQLite phổ biến khác tại VietJack: