Câu 1* trong SELECT * FROM user; có nghĩa là gì?
SELECT — Lấy dữ liệu từ bảng
Học câu lệnh SQL SELECT từ cơ bản. Bao gồm chọn toàn bộ và một phần cột, bí danh AS, lọc hàng với WHERE, và kết hợp toán tử so sánh với AND / OR — tất cả chạy trực tiếp trên trình duyệt của bạn.
Về SQL được dạy trong khóa học này
Khóa học này dạy cú pháp SQL phổ quát hoạt động trên các RDBMS chính — MySQL, Oracle, PostgreSQL, SQL Server, v.v.. Các kiến thức cơ bản như CREATE TABLE / SELECT / WHERE / JOIN / GROUP BY được viết giống nhau dù bạn chuyển sang cơ sở dữ liệu nào.
Vì lý do kỹ thuật, console trên trình duyệt chạy SQLite, nhưng bất cứ khi nào một tính năng khác biệt giữa các cơ sở dữ liệu (ràng buộc độ dài kiểu, cách liệt kê bảng, v.v.) bạn sẽ thấy ghi chú song song như Trong MySQL bạn sẽ viết... để biết dùng gì ở nơi khác.
SELECT — lấy tất cả các cột
Để lấy dữ liệu ra khỏi bảng, bạn dùng câu lệnh SELECT. SELECT là cấu trúc được dùng nhiều nhất trong SQL: tạo báo cáo, hiển thị màn hình, phân tích dữ liệu, xử lý lô — gần như mọi thao tác "đọc" dữ liệu đều bắt đầu bằng SELECT.
Hãy bắt đầu với dạng lấy tất cả các cột của một bảng nguyên trạng. Dấu * (sao) trong SELECT * là ký hiệu cho "tất cả các cột," và FROM table_name theo sau chỉ định lấy từ bảng nào.
-- Lấy tất cả cột và tất cả hàng từ bảng user
SELECT * FROM user;
Lấy chỉ các cột cụ thể
SELECT * thuận tiện, nhưng trong các ứng dụng thực tế thường tốt hơn nếu chỉ lấy các cột bạn cần. Khối lượng dữ liệu được gửi và nhận giảm xuống, chỉ các cột bạn muốn hiển thị quay lại, và xử lý phía sau vẫn đơn giản.
Để chọn cột, liệt kê tên cột ngăn cách bằng dấu phẩy ngay sau SELECT. Thứ tự bạn viết là thứ tự chúng xuất hiện trong kết quả.
-- Chỉ lấy name và age (2 cột)
SELECT name, age FROM user;
-- Bạn cũng có thể đảo thứ tự cột
SELECT city, name FROM user;
AS — đặt bí danh cho cột
Mặc định, tiêu đề cột trong kết quả của một SELECT hiển thị tên cột gốc. Với column AS alias bạn có thể thay đổi tên cột phía kết quả thành bất cứ thứ gì bạn muốn. Điều này không thay đổi tên cột trong bảng cơ sở — nó chỉ là "cột này nên được gọi là gì trong kết quả SELECT này."
Bí danh cũng tiện dụng khi bạn muốn đặt tên cho một biểu thức. Phép toán như age + 1 hoặc kết quả hàm tổng hợp như SUM(price) không có tên cột mặc định, nên không có AS thì tiêu đề sẽ là biểu thức thô — khó hiển thị hoặc làm việc từ mã ứng dụng của bạn.
-- Đặt bí danh cho cột
SELECT name AS user_name, age AS user_age FROM user;
-- Đặt bí danh cho biểu thức (tính tuổi năm sau)
SELECT name, age + 1 AS next_year_age FROM user;
AS có thể được lược bỏ
SELECT name AS user_name FROM user; và SELECT name user_name FROM user; (với AS bị bỏ) có cùng nghĩa. Tuy nhiên, viết AS làm cho "đây là một bí danh" rõ ràng với người đọc, nên khóa học này luôn viết AS một cách rõ ràng.
Nếu bạn cần khoảng trắng hoặc ký tự không-ASCII trong bí danh, hãy bao bằng dấu nháy kép: AS "Tuổi năm sau".
WHERE — lọc hàng theo điều kiện
Đến giờ bạn đã học cách chọn cột. Bây giờ hãy xem lọc hàng. Bằng cách thêm WHERE condition sau SELECT cols FROM table, chỉ những hàng thỏa mãn điều kiện mới có trong kết quả.
Hãy nghĩ về SELECT như chọn theo chiều dọc (cột) và WHERE như chọn theo chiều ngang (hàng).
Toán tử so sánh
Bên trong WHERE, các điều kiện sử dụng toán tử so sánh (ký hiệu so sánh giá trị và trả về true/false). Toán tử so sánh của SQL trông khá giống các ngôn ngữ lập trình khác, với một điểm cần lưu ý: bằng nhau là một dấu = đơn, không phải ==.
| Toán tử | Ý nghĩa | Ví dụ |
|---|---|---|
| = | Bằng | age = 30 |
| <> | Không bằng (!= cũng được) | city <> 'Tokyo' |
| < | Nhỏ hơn | age < 30 |
| > | Lớn hơn | age > 30 |
| <= | Nhỏ hơn hoặc bằng | age <= 30 |
| >= | Lớn hơn hoặc bằng | age >= 30 |
-- Lấy người dùng từ 30 tuổi trở lên
SELECT * FROM user WHERE age >= 30;
-- Lấy hàng có city là Tokyo (chuỗi đặt trong dấu nháy đơn)
SELECT * FROM user WHERE city = 'Tokyo';
-- Lấy hàng có city khác Tokyo
SELECT * FROM user WHERE city <> 'Tokyo';
So sánh chuỗi với `=` phân biệt chữ hoa chữ thường
Trong console của khóa học này, so sánh chuỗi với `=` phân biệt chữ hoa chữ thường. WHERE name = 'alice' sẽ không khớp 'Alice' — kết quả là 0 hàng. Trong MySQL, collation thường khiến phép so sánh này không phân biệt chữ hoa chữ thường mặc định, nên cùng truy vấn có thể trả về 1 hàng.
`WHERE column = NULL` không hoạt động như bạn mong đợi
Viết WHERE name = NULL sẽ không lấy "các hàng có name là NULL." Trong SQL, NULL được coi là "không xác định," và = NULL luôn được đánh giá thành NULL — mà WHERE lọc bỏ. Để lấy các hàng NULL, dùng cú pháp chuyên dụng WHERE column IS NULL. Chúng ta sẽ đề cập chi tiết trong bài chuyên sâu về WHERE — bây giờ chỉ cần nhớ "đừng dùng = NULL."
AND / OR — kết hợp nhiều điều kiện
Trong công việc thực tế bạn thường cần kết hợp các điều kiện: "người dùng ở Tokyo từ 30 tuổi trở lên," "thành viên có hạng gold hoặc platinum." SQL kết hợp các điều kiện với AND (cả hai đều đúng) và OR (một trong hai đúng).
Một toán tử hữu ích nữa là NOT (phủ định điều kiện). NOT (city = 'Tokyo') nghĩa là "không phải Tokyo." <> làm cùng việc, nên hiện tại chỉ tập trung vào AND và OR.
| Toán tử logic | Ý nghĩa | Ví dụ |
|---|---|---|
| AND | Cả hai điều kiện đều đúng | age >= 30 AND city = 'Tokyo' |
| OR | Một trong hai điều kiện đúng | city = 'Tokyo' OR city = 'Osaka' |
| NOT | Phủ định điều kiện | NOT (city = 'Tokyo') |
-- Người dùng ở Tokyo từ 30 tuổi trở lên
SELECT name, age, city FROM user WHERE city = 'Tokyo' AND age >= 30;
-- Người dùng ở Tokyo hoặc Osaka
SELECT name, city FROM user WHERE city = 'Tokyo' OR city = 'Osaka';
Dùng dấu ngoặc khi trộn AND và OR
Khi AND và OR xuất hiện trong cùng một WHERE, AND được đánh giá trước OR. A OR B AND C thực ra nghĩa là A OR (B AND C) — không phải thứ tự bạn viết.
Để tránh bất ngờ, làm rõ thứ tự đánh giá bằng dấu ngoặc khi trộn AND và OR. Ví dụ, "(Tokyo hoặc Osaka) và từ 30 trở lên" là WHERE (city = 'Tokyo' OR city = 'Osaka') AND age >= 30. Dấu ngoặc cũng làm rõ ý định của bạn với người đọc — khi nghi ngờ, hãy thêm chúng.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Câu nào mô tả tốt nhất vai trò của SELECT và WHERE?
Câu 3Toán tử so sánh <> của SQL có nghĩa là gì?