Học bằng cách đọc theo thứ tự

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;
Cấu trúc câu lệnh SELECT
SELECTFROMWHEREDanh sách cột* / name, ageTên bảnguserĐiều kiện hàngage >= 30Chọn cộtBảng đíchLọc hàng
SELECT chỉ định lấy cột nào, FROM chỉ định lấy từ bảng nào, và WHERE chỉ định giữ hàng nào. Hãy nắm vị trí và vai trò của từng phần.

Lấy tất cả các cột và tất cả các hàng từ bảng user được thiết lập ở đầu bài viết. (Chạy đúng thì phần giải thích sẽ hiện ra.)

① Viết và chạy SELECT * FROM user;.

② Xác nhận kết quả trả về 5 hàng với bốn cột id / name / age / city.

SQL Editor

Chạy truy vấn để xem kết quả

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ả.

Tất cả cột vs. các cột cụ thể — chọn cột thay đổi khối lượng dữ liệu
SELECT *SELECT name, age4 cột(id / name / age / city)2 cột(name / age)Tất cả cột xuất hiện trong kết quảChỉ các cột cần thiếtXem nhanh dữ liệuỨng dụng và báo cáo chính thứcThu hẹp các cộtThu hẹp đầu raChọn theo nhu cầu
SELECT trả về mọi cột (tốt cho kiểm tra), và một danh sách cột chỉ trả về thứ bạn cần (tốt cho production). Mũi tên ở mỗi hàng so sánh "trái (SELECT ) vs. phải (SELECT name, age)" theo cùng một chiều.
-- 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;

Hãy hình dung một màn hình danh sách người dùng chỉ hiển thị "tên và tuổi."

① Từ bảng user, chỉ lấy hai cột nameage theo thứ tự đó.

② Xác nhận kết quả là 5 hàng × 2 cột và id cùng city không có trong đó.

SQL Editor

Chạy truy vấn để xem kết quả

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.

Cách AS hoạt động — viết lại tiêu đề cột kết quả
Câu lệnh SELECTTiêu đề kết quảGiá trị mẫuSELECT name FROM username(tên gốc)Alice / Bob /...SELECT name AS user_name FROM useruser_name(bí danh)Alice / Bob /...(giá trị không đổi)SELECT age + 1 AS next_year FROM usernext_year(tên cho biểu thức)31 / 26 /...(age + 1)Chỉ tiêu đề thành bí danhĐặt tên biểu thức
AS chỉ thay đổi tiêu đề ở phía kết quả; tên cột thực tế của bảng không thay đổi. Phép toán và kết quả hàm tổng hợp không có tên mặc định, nên đặt tên cho chúng bằng AS là cách tiếp cận chuẩ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;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".

Hãy hình dung một màn hình danh sách người dùng cần hiển thị "tuổi hiện tại" cùng với "tuổi năm sau."

① Từ bảng user, lấy name, age, và age + 1.

② Dùng AS để đặt bí danh cho cột thứ ba (age + 1) là next_year_age.

③ Xác nhận kết quả là 5 hàng × 3 cột và tiêu đề của cột thứ ba là next_year_age.

SQL Editor

Chạy truy vấn để xem kết quả

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).

SELECT thu hẹp cột; WHERE thu hẹp hàng
SELECT name, age (thu hẹp dọc)WHERE id = 2 (thu hẹp ngang → 1 hàng)idnameagecity1Alice30Tokyo2Bob25Osaka3Carol35Tokyo
SELECT name, age (dải xanh lá dọc) cắt 4 cột xuống 2; WHERE id = 2 (dải xanh dương ngang) cắt 3 hàng xuống 1. Giao điểm — name và age của Bob — là kết quả cuối cùng 1 hàng × 2 cột.

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ĩaVí dụ
=Bằngage = 30
<>Không bằng (!= cũng được)city <> 'Tokyo'
<Nhỏ hơnage < 30
>Lớn hơnage > 30
<=Nhỏ hơn hoặc bằngage <= 30
>=Lớn hơn hoặc bằngage >= 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."

Hãy hình dung một yêu cầu: "hiển thị mọi người dùng từ 30 tuổi trở lên."

① Từ bảng user, lấy mọi hàng có age từ 30 trở lên.

② Xác nhận kết quả là 3 hàng (Alice / Carol / Eve) và Bob cùng Dave không có trong đó.

SQL Editor

Chạy truy vấn để xem kết quả

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ĩaVí dụ
ANDCả hai điều kiện đều đúngage >= 30 AND city = 'Tokyo'
ORMột trong hai điều kiện đúngcity = 'Tokyo' OR city = 'Osaka'
NOTPhủ định điều kiệnNOT (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.

Hãy hình dung một yêu cầu: "liệt kê name và city của người dùng sống ở Tokyo hoặc Osaka, từ 25 tuổi trở lên, và không phải Carol." Bài tập này luyện kết hợp AND, OR, và NOT.

① Từ bảng user, lấy namecity.

② Dùng WHERE kết hợp ba điều kiện với AND: `city` là `'Tokyo'` hoặc `'Osaka'`, `age` từ 25 trở lên, và `name` không phải `'Carol'`. Làm cho thứ tự đánh giá của phần OR rõ ràng bằng dấu ngoặc.

③ Xác nhận kết quả là 3 hàng (Alice Tokyo / Bob Osaka / Eve Tokyo), với Carol (Tokyo / 35) và Dave (Kyoto / 28) bị loại.

SQL Editor

Chạy truy vấn để xem kết quả
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1* trong SELECT * FROM user; có nghĩa là gì?

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ì?