Mệnh đề WHERE trong SQL đượ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 SQL như sau:
SELECT cot1, cot2, cotN FROM ten_bang WHERE [dieu_kien]
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 hoặc toán tử logicnhư >, <, =, LIKE, NOT, .... Ví dụ sau sẽ giúp bạn hiểu rõ khái niệm này.
Ví dụ
Bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+ | ID | TEN | TUOI| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4 | | 2 | Viet | 19 | DTVT | 3 | | 3 | Thanh | 18 | KTDN | 4 | | 4 | Nhan | 19 | CK | 4.5 | | 5 | Huong | 20 | TCNH | 5 | +----+---------+-----+-----------+---------+
Ví dụ sau sẽ lấy các trường ID, TEN, HOCPHI từ bảng này với điều kiện là HOCPHI lớn hơn 4:
SQL> SELECT ID, TEN, HOCPHI FROM SINHVIEN WHERE HOCPHI > 2000;
Ví dụ trên sẽ cho kết quả:
+----+----------+----------+ | ID | TEN | HOCPHI | +----+----------+----------+ | 4 | Nhan | 4.5 | | 5 | Huong | 5 | +----+----------+----------+
Ví dụ sau sẽ lấy các trường ID, TEN, HOCPHI của một sinh viên có tên Nhan. Ở đây, điều quan trọng cần ghi nhớ là tất cả các chuỗi nên ở trong các dấu trích dẫn đơn (''), trong khi các giá trị số không cần bất kỳ trích dẫn nào, như sau:
SQL> SELECT ID, TEN, HOCPHI FROM SINHVIEN WHERE TEN = 'Nhan';
Ví dụ trên sẽ cho kết quả:
+----+----------+----------+ | ID | TEN | HOCPHI | +----+----------+----------+ | 4 | Nhan | 4.5 | +----+----------+----------+
Các toán tử AND và OR trong SQL được sử dụng để kết hợp nhiều điều kiện để thu hẹp phạm vi dữ liệu trong một lệnh SQL. Hai loại toán tử này được gọi là toán tử liên hợp.
Các toán tử này cung cấp một phương tiện để tạo nhiều sự so sánh với các toán tử khác nhau trong cùng một lệnh SQL.
Toán tử AND trong SQL
Cú pháp
Cú pháp cơ bản của toán tử AND với mệnh đề WHERE như sau:
SELECT cot1, cot2, cotN FROM ten_bang WHERE [dieu_kien_1] AND [dieu_kien_2]...AND [dieu_kien_N];
Bạn có thể kết hợp N điều kiện bởi sử dụng toán tử AND. Để một hành động, chẳng hạn như một truy vấn, được thực hiện bởi lệnh SQL, thì tất cả điều kiện riêng rẽ trong AND phải là TRUE.
Ví dụ
Bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+ | ID | TEN | TUOI| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4 | | 2 | Viet | 19 | DTVT | 3 | | 3 | Thanh | 18 | KTDN | 4 | | 4 | Nhan | 19 | CK | 4.5 | | 5 | Huong | 20 | TCNH | 5 | +----+---------+-----+-----------+---------+
Ví dụ sau sẽ lấy các trường ID, TEN, HOCPHI từ bảng này với điều kiện là HOCPHI lớn hơn 4VÀ TUOI nhỏ hơn 20.
SQL> SELECT ID, TEN, HOCPHI FROM SINHVIEN WHERE HOCPHI > 2000 AND TUOI < 25;
Ví dụ trên sẽ cho kết quả:
+----+-------+----------+ | ID | TEN | HOCPHI | +----+-------+----------+ | 4 | Nhan | 4.5 | +----+-------+----------+
Toán tử OR trong SQL
Toán tử OR trong SQL được sử dụng để kết hợp nhiều điều kiện trong mệnh đề WHERE của một lệnh SQL.
Cú pháp
Cú pháp của toán tử OR với mệnh đề WHERE như sau:
SELECT cot1, cot2, cotN FROM ten_bang WHERE [dieu_kien_1] OR [dieu_kien_2]...OR [dieu_kien_N]
Bạn có thể kết hợp N điều kiện bởi sử dụng toán tử OR. Để một hành động, chẳng hạn như một truy vấn, được thực hiện bởi lệnh SQL, thì CHỈ MỘT trong tất cả điều kiện riêng rẽ trong OR phải là TRUE.
Ví dụ
Bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+ | ID | TEN | TUOI| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4 | | 2 | Viet | 19 | DTVT | 3 | | 3 | Thanh | 18 | KTDN | 4 | | 4 | Nhan | 19 | CK | 4.5 | | 5 | Huong | 20 | TCNH | 5 | +----+---------+-----+-----------+---------+
Ví dụ sau sẽ lấy các trường ID, TEN, HOCPHI từ bảng này với điều kiện là HOCPHI lớn hơn 4 HOẶC TUOI nhỏ hơn 20.
SQL> SELECT ID, TEN, HOCPHI FROM SINHVIEN WHERE HOCPHI > 2000 OR TUOI < 25;
Ví dụ trên sẽ cho kết quả:
+----+----------+----------+ | ID | TEN | HOCPHI | +----+----------+----------+ | 4 | Nhan | 4.5 | | 5 | Huong | 5 | +----+----------+----------+
Chương này chúng ta sẽ tìm hiểu về mệnh đề WITH và mệnh đề AS trong SQL. Mệnh đề WITH được sử dụng để cung cấp một khối truy vấn con mà có thể được tham chiếu trong một số vị trí bên trong truy vấn chính. Nó được giới thiệu bởi Oracle.
Dưới đây là cú pháp cho mệnh đề WITH trong SQL.
WITH ten_alias AS (lenh_truy_van_con) SELECT danh_sach_cot FROM ten_alias [ten_bang] [WHERE dieu_kien_join]
Khi bạn sử dụng nhiều truy vấn con alias, cú pháp sẽ như sau:
WITH ten_alias_A AS (lenh_truy_van_con) ten_alias_B AS (lenh_truy_van_con_tu_ten_alias_A HOAC lenh_truy_van_con) SELECT danh_sach_cot FROM ten_alias_A , ten_alias_B , [cac_ten_bang] [WHERE dieu_kien_join]
SELECT AS trong SQL
AS trong SQL được sử dụng để gán tạm thời một tên mới cho một cột trong bảng. Việc này giúp biểu diễn các kết quả truy vấn và cho phép lập trình viên gán nhãn cho các kết quả một cách thích hợp, mà không thay tên các cột trong bảng vĩnh viễn. Dưới đây là ví dụ:
Giả sử chúng ta có bảng SINHVIEN như sau:
+---------+-----+-----------+--------+ | TEN | TUOI| KHOAHOC | HOCPHI | ++---------+-----+-----------+---------+ | Hoang | 21 | CNTT | 4 | | Viet | 19 | DTVT | 3 | | Thanh | 18 | KTDN | 4 | | Nhan | 19 | CK | 4.5 | | Huong | 20 | TCNH | 5 | +----+---------+-----+-----------+---------+
Áp dụng cú pháp SELECT AS cho bảng trên, chẳng hạn như sau:
SELECT TEN AS "NAME" TUOI As "AGE", KHOAHOC, HOCPHI, FROM SINHVIEN;
Kết quả của truy vấn trên sẽ là bảng SINHVIEN như sau:
+---------+-----+-----------+--------+ | NAME | AGE| KHOAHOC | HOCPHI | ++---------+-----+-----------+---------+ | Hoang | 21 | CNTT | 4 | | Viet | 19 | DTVT | 3 | | Thanh | 18 | KTDN | 4 | | Nhan | 19 | CK | 4.5 | | Huong | 20 | TCNH | 5 | +----+---------+-----+-----------+---------+
Mệnh đề LIKE trong SQL được sử dụng để so sánh một giá trị với các giá trị tương tự bởi sử dụng các toán tử wildcard. Có hai wildcard được sử dụng kết hợp với toán tử LIKE là:
- Ký hiệu phần trăm (%)
- Dấu gạch dưới (_)
Ký hiệu phần trăm biểu diễn 0, 1 hoặc nhiều ký tự. Ký tự dấu gạch dưới biểu diễn một số hoặc một ký tự đơn.
Cú pháp
Cú pháp cơ bản của các toán tử % và _ trong SQL là:
SELECT FROM ten_bang WHERE column LIKE 'XXXX%' hoac SELECT FROM ten_bang WHERE column LIKE '%XXXX%' hoac SELECT FROM ten_bang WHERE column LIKE 'XXXX_' hoac SELECT FROM ten_bang WHERE column LIKE '_XXXX' hoac SELECT FROM ten_bang WHERE column LIKE '_XXXX_'
Bạn có thể kết hợp N điều kiện bởi sử dụng toán tử AND hoặc OR. Ở đây, XXX có thể là bất kỳ giá trị số hoặc chuỗi nào.
Ví dụ
Bảng dưới liệt kê một số ví dụ minh họa một phần mệnh đề WHERE có các mệnh đề LIKE khác nhau với các toán tử '%' và '_'.
Lệnh | Miêu tả |
---|---|
WHERE HOCPHI LIKE '4%' | Tìm kiếm bất kỳ giá trị nào bắt đầu với 4 |
WHERE HOCPHI LIKE '%4%' | Tìm kiếm bất kỳ giá trị nào mà có 4 ở bất kỳ vị trí nào |
WHERE HOCPHI LIKE '_00%' | Tìm kiếm bất kỳ giá trị nào có 00 trong vị trí thứ hai và ba |
WHERE HOCPHI LIKE '4_%_%' | Tìm kiếm bất kỳ giá trị nào mà bắt đầu với 4 và có độ dài tối thiểu là 3 ký tự |
WHERE HOCPHI LIKE '%4' | Tìm kiếm bất kỳ giá trị nào mà kết thúc với 4 |
WHERE HOCPHI LIKE '_4%0' | Tìm kiếm bất kỳ giá trị nào mà có 2 trong vị trí thứ hai và kết thúc với 3 |
WHERE HOCPHI LIKE '4___0' | Tìm kiếm bất kỳ giá trị nào có 5 chữ số bắt đầu với 4 và kết thúc với 0 |
Sau đây là một ví dụ thực sự, bạn theo dõi bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+ | ID | TEN | TUOI| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4 | | 2 | Viet | 19 | DTVT | 3 | | 3 | Thanh | 18 | KTDN | 4 | | 4 | Nhan | 19 | CK | 4.5 | | 5 | Huong | 20 | TCNH | 5 | +----+---------+-----+-----------+---------+
Ví dụ sau sẽ hiển thị tất cả bản ghi với điều kiện HOCPHI bắt đầu với '4'.
SQL> SELECT * FROM SINHVIEN WHERE HOCPHI LIKE '4%';
Ví dụ trên sẽ cho kết quả:
+----+---------+-----+-----------+--------+ | ID | TEN | TUOI| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4 | | 3 | Thanh | 18 | KTDN | 4 | | 4 | Nhan | 19 | CK | 4.5 |
Mệnh đề TOP được sử dụng để lấy dữ liệu của TOP N số hoặc X phần trăm bản ghi từ một bảng.
Ghi chú: Tất cả Database không hỗ trợ mệnh đề TOP. Ví dụ, MySQL hỗ trợ mệnh đềLIMIT để lấy số bản ghi đã giới hạn và Oracle sử dụng ROWNUM để thực hiện cùng thao tác này.
Cú pháp
Cú pháp cơ bản của mệnh đề TOP với lệnh SELECT như sau:
SELECT TOP number|percent ten_cot FROM ten_bang WHERE [dieu_kien]
Ví dụ
Bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+ | ID | TEN | TUOI| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4 | | 2 | Viet | 19 | DTVT | 3 | | 3 | Thanh | 18 | KTDN | 4 | | 4 | Nhan | 19 | CK | 4.5 | | 5 | Huong | 20 | TCNH | 5 | +----+---------+-----+-----------+---------+
Ví dụ sau trên SQL Server, sẽ lấy 2 bản ghi đầu tiên từ bảng này:
SQL> SELECT TOP 2 * FROM SINHVIEN;
Ví dụ trên sẽ cho kết quả:
+----+---------+-----+-----------+--------+ | ID | TEN | TUOI| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4 | | 2 | Viet | 19 | DTVT | 3 | +----+---------+-----+-----------+---------+
Nếu bạn đang sử dụng MySQL Server, thì đây là một ví dụ tương đương:
SQL> SELECT * FROM SINHVIEN LIMIT 2;
Ví dụ trên sẽ cho kết quả:
+----+---------+-----+-----------+--------+ | ID | TEN | TUOI| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4 | | 2 | Viet | 19 | DTVT | 3 | +----+---------+-----+-----------+---------+
Nếu bạn đang sử dụng Oracle Server, thì đây là một ví dụ tương đương:
SQL> SELECT * FROM SINHVIEN WHERE ROWNUM <= 2;
Ví dụ trên sẽ cho kết quả:
+----+---------+-----+-----------+--------+ | ID | TEN | TUOI| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4 | | 2 | Viet | 19 | DTVT | 3 | +----+---------+-----+-----------+---------+