SQL là gì?
SQL, viết tắt của Structured Query Language (Ngôn ngữ Truy vấn có Cấu trúc), là một công cụ mạnh mẽ để tìm kiếm trong lượng dữ liệu lớn trong cơ sở dữ liệu và trả về thông tin cụ thể để phân tích. Học SQL là kỹ năng nền tảng cho bất kỳ ai muốn bước vào lĩnh vực dữ liệu, dù là vai trò business analyst, data analyst, data scientist hay data engineer.
Trong hướng dẫn này, bạn sẽ tìm hiểu 25 lệnh SQL phổ biến nhất—đủ cho hầu hết các tác vụ liên quan đến cơ sở dữ liệu của bạn.
Các lệnh SQL kèm ví dụ
Bảng ví dụ
Xuyên suốt hướng dẫn, chúng ta sẽ dùng các bảng films và soundtracks.
|
films |
|||||
|
movie_name |
director |
revenue |
date |
genre |
language |
|
Avengers: Age of Ultron |
J. Whedon |
1400000000 |
2015 |
Action |
English |
|
Amelie |
Jean-Pierre Jeunet |
174000000 |
2002 |
Drama |
French |
|
soundtracks |
||
|
soundtrack |
composer |
date |
|
Inception: Music from the Motion Picture |
Hans Zimmer |
2010 |
|
Le Fabuleux Destin D’Amelie Poulain |
Yann Tiersen |
2001 |
1. SELECT
Câu lệnh SELECT dùng để chỉ định những cột nào của bảng cơ sở dữ liệu sẽ được đưa vào kết quả.
Ví dụ này chỉ chọn các cột movie_name và director; các cột khác sẽ không được trả về.
SELECT movie_name, director
FROM films;
Để chọn tất cả các cột từ một bảng, bạn có thể chạy SELECT * (đọc là "star"). Ví dụ này chọn toàn bộ cột từ bảng films.
SELECT *
FROM films;
2. LIMIT
Giới hạn số lượng dòng trả về từ một bảng là mẹo hữu ích để tăng tốc thời gian truy vấn. Để giới hạn số dòng, bạn có thể dùng lệnh LIMIT. Ví dụ này chọn toàn bộ cột từ bảng films rồi giới hạn kết quả ở 10 dòng đầu tiên.
SELECT *
FROM films
LIMIT 10;
3. AS
Để đổi tên một cột hoặc một bảng trong kết quả trả về, bạn có thể dùng lệnh AS để đặt bí danh (alias) cho đầu ra. Ví dụ này chọn cột movie_name và đặt bí danh là movie_title.
SELECT movie_name AS movie_title
FROM films;
4. SELECT DISTINCT
Tập dữ liệu thường có các dòng hoặc giá trị trùng lặp trong một cột. Kết hợp SELECT với DISTINCT sẽ loại bỏ trùng lặp. Ví dụ này trả về các giá trị duy nhất trong cột director.
SELECT DISTINCT director
FROM films;
5. COUNT
COUNT() trả về số dòng trong bảng hoặc trong nhóm. Ví dụ này trả về số dòng trong bảng films, sau đó đổi tên kết quả thành number_of_films.
SELECT COUNT(*) AS number_of_films
FROM films;Bắt đầu học SQL miễn phí
Thao tác dữ liệu trong SQL
6. MIN
MIN() trả về giá trị nhỏ nhất trong một cột số. Với cột văn bản, MIN() trả về giá trị đầu tiên theo thứ tự bảng chữ cái. Ví dụ này trả về bộ phim có doanh thu thấp nhất.
SELECT MIN(revenue) AS minimum_revenue,
FROM films;
7. MAX
MAX() trả về giá trị lớn nhất trong một cột số. Với cột văn bản, MAX() trả về giá trị cuối cùng theo thứ tự bảng chữ cái. Ví dụ này trả về bộ phim có doanh thu cao nhất.
SELECT MAX(revenue) AS maximum_revenue,
FROM films;
8. SUM
SUM() trả về tổng các giá trị số. Ví dụ này trả về tổng doanh thu của tất cả các phim được liệt kê trong bảng films.
SELECT SUM(revenue) AS total_revenue
FROM films;
9. AVERAGE
AVERAGE tính trung bình cộng của một cột. Ví dụ này trả về doanh thu trung bình của tất cả các phim trong bảng films.
SELECT AVERAGE(revenue) AS average_earned
FROM films;
10. WHERE
Mệnh đề WHERE lọc các dòng khớp với một điều kiện nhất định. Ví dụ dưới đây, chúng ta lọc các phim kiếm được hơn 500 triệu đô la.
SELECT revenue
FROM films
WHERE revenue > 500000000;
Các toán tử điều kiện khác có thể dùng như <, >, =>, <=, == (bằng), != (khác) để lọc.
11. HAVING
Mệnh đề HAVING tương tự mệnh đề WHERE, nhưng chỉ dùng được với các hàm tổng hợp trong khi WHERE thì không. Ví dụ trong truy vấn dưới, chúng ta chọn tất cả thể loại phim có ít nhất 50 phim trong danh mục của chúng:
SELECT movie_name, director, date, COUNT(genre)
FROM films
GROUP BY genre
HAVING COUNT(genre) >= 50;
Dưới đây là một ví dụ khác nhóm phim theo xếp hạng độ tuổi và chỉ chọn những xếp hạng có doanh thu trung bình trên 100 triệu:
SELECT movie_name, director, date, revenue
FROM films
GROUP BY age_rating
HAVING AVERAGE(genre) >= 100;
12. AND
Toán tử AND dùng khi lọc các dòng thỏa mãn hơn một điều kiện. Trong ví dụ dưới, chúng ta sẽ lọc các phim tiếng Anh có doanh thu hơn 500 triệu đô la.
SELECT *
FROM films
WHERE revenue > 500000000 AND
language == "English";
13. OR
OR là một toán tử điều kiện khác cho phép bạn chọn các dòng nếu bất kỳ điều kiện nào được phân tách bởi OR là đúng. Ví dụ này trả về các phim tiếng Anh kiếm dưới 100 triệu đô la hoặc các phim tiếng Pháp kiếm hơn 500 triệu đô la.
SELECT *
FROM films
WHERE (revenue < 100000000 AND language == "English") OR
(revenue > 500000000 AND language == “French”);
14. BETWEEN
BETWEEN cho phép bạn chọn các dòng trong một khoảng giá trị nhất định, giúp mệnh đề WHERE ngắn gọn và dễ đọc hơn. Trong ví dụ trên, chúng ta chọn tất cả các phim phát hành từ 2020 đến 2022.
SELECT *
FROM films
WHERE date BETWEEN 2020 AND 2022;
15. IN
Toán tử IN là cách viết rút gọn cho nhiều mệnh đề OR. Ví dụ này trả về tất cả các phim phát hành vào một trong các năm—1998, 1966, 2001 và 2012.
SELECT movie_name, date, revenue
FROM films
WHERE date IN (1998, 1966, 2001, 2012);
16. LIKE
Toán tử LIKE cho phép bạn tìm kiếm mẫu trong cột văn bản bằng các chuỗi đặc biệt gọi là wildcard. Wildcard giúp bạn tìm các chuỗi văn bản khớp mẫu xác định. Ví dụ, dùng wildcard “A% W%” trên cột director sẽ tìm tất cả đạo diễn có tên bắt đầu bằng A và họ bắt đầu bằng W.
SELECT *
FROM films
WHERE director LIKE "A% W%";
17. GROUP BY
GROUP BY cho phép bạn nhóm các dòng dựa trên giá trị cột. GROUP BY thường đi kèm các hàm tổng hợp như COUNT, MIN, MAX, AVERAGE, v.v. Trong ví dụ dưới, chúng ta tìm doanh thu trung bình của từng thể loại phim.
SELECT AVERAGE(revenue), movie_name, director, date
FROM films
GROUP BY genre;
Chúng ta có thể dùng MIN, MAX hoặc COUNT(revenue) để tìm doanh thu thấp nhất, cao nhất hoặc số lượng phim trong mỗi thể loại. Lưu ý rằng câu lệnh GROUP BY về thực tế sẽ không ảnh hưởng đến truy vấn nếu không dùng với một hàm tổng hợp.
18. ORDER BY
ORDER BY cho phép bạn sắp xếp các dòng dựa trên giá trị cột. Bạn có thể sắp xếp tăng dần (mặc định) hoặc giảm dần bằng cách thêm ASC hoặc DESC. Ví dụ này sắp xếp doanh thu theo thứ tự tăng dần.
SELECT *
FROM films
ORDER BY revenue ASC;
19. UPDATE
UPDATE dùng để thay đổi giá trị của các ô riêng lẻ trong một bảng hiện có. Nó đi cùng từ khóa SET. Ví dụ này cập nhật tên đạo diễn từ “J. Whedon” thành “Joss Whedon”.
UPDATE films
SET director = "Joss Whedon"
WHERE director = "J. Whedon"
Mệnh đề WHERE là tối quan trọng khi viết câu lệnh UPDATE. Nếu thiếu, truy vấn trên sẽ khiến tất cả phim đều do Joss Whedon đạo diễn.
20. ALTER TABLE
Bạn có thể dùng câu lệnh ALTER TABLE để sửa đổi thuộc tính của bảng và các cột (không phải giá trị ô thực tế). Ví dụ: đổi tên cột, thêm cột mới, xóa cột hoặc thay đổi kiểu dữ liệu. Các ví dụ dưới đây minh họa việc xóa cột date và thêm cột age_rating.
ALTER TABLE films
DROP COLUMN date;
ALTER TABLE films
ADD COLUMN age_rating;
21. CREATE TABLE
CREATE TABLE tạo một bảng mới trong cơ sở dữ liệu. Dưới đây, chúng ta tạo bảng “libraries” với bốn cột—một cột số nguyên tên là id, một cột ký tự tên name, một cột ký tự tên version, và một cột số nguyên tên num_downloads.
CREATE TABLE libraries (
lib_id int,
name varchar(100),
version varchar(100),
num_downloads int
)
22. INSERT INTO
Câu lệnh INSERT INTO có thể dùng để thêm hàng mới vào bảng. Trong ví dụ này, chúng ta thêm phim “Doctor Strange” vào bảng films.
INSERT INTO films (movie_name, director, revenue, date, genre, language)
VALUES ("Doctor Strange 2", “Sam Raimi”, 409000000, 2022, “Action”, “English”)
23. INNER JOIN
Lệnh INNER JOIN chọn các dòng có giá trị khớp nhau ở cả hai bảng. Ví dụ, trong truy vấn dưới đây, chúng ta join các bảng films và soundtracks trên cột chung date để trả về các phim và nhạc phim phát hành cùng năm.
SELECT *
FROM films
INNER JOIN soundtracks
ON films.date = soundtracks.date
LIMIT 10;
24. LEFT JOIN
LEFT JOIN giữ lại toàn bộ bản ghi gốc ở bảng bên trái và trả về giá trị thiếu cho bất kỳ cột nào từ bảng bên phải nơi trường join không tìm thấy khớp.
SELECT *
FROM films
LEFT JOIN soundtracks
ON films.date = soundtracks.date
LIMIT 10;
25. RIGHT JOIN
RIGHT JOIN giữ lại toàn bộ bản ghi gốc ở bảng bên phải và trả về giá trị thiếu cho bất kỳ cột nào từ bảng bên trái nơi trường join không tìm thấy khớp.
SELECT *
FROM films
LEFT JOIN soundtracks
ON films.date = soundtracks.date
LIMIT 10;
Cheat Sheet lệnh SQL
Để tìm hiểu thêm về SQL, hãy xem các tài nguyên sau: