Khi tụi mình lấy dữ liệu từ database, hiếm khi nào cần tất cả các cột luôn. Ví dụ, bảng nhân viên employees có thể có 15 cột: tên, họ, ngày sinh, chức vụ, lương, ngày nhận việc bla bla. Nhưng bạn chỉ cần biết tên và chức vụ thôi. Kéo hết dữ liệu về thì phí tài nguyên và chậm nữa. Đây là lúc nghệ thuật chọn cột cụ thể phát huy tác dụng.
Nếu so sánh, thì giống như bạn có một giỏ cam, táo, chuối mà chỉ muốn lấy mỗi táo ra thôi. Ngon lành đúng không? Giờ mình sẽ làm chuyện đó!
Cú pháp
Nhắc lại cho nhớ, SQL được thiết kế siêu thân thiện với người dùng luôn.
Thứ nhất, chữ hoa chữ thường trong query không quan trọng. Bạn viết SELECT, Select, hay select đều chạy được hết. Thứ hai, xuống dòng thoải mái. DBMS sẽ tự ghép query thành một dòng dài, nên bạn viết kiểu gì cũng được.
Như bạn đoán rồi đó, chỉ có SELECT và FROM thì chưa đủ đâu. Nếu không thì đâu có nhiều chuyện xoay quanh SQL vậy. Query SQL đầy đủ sẽ như này:
SELECT cột
FROM bảng
WHERE điều kiện
GROUP BY cột
HAVING cột
ORDER BY sắp xếp
Trong đó:
cột— là tên các cột bạn muốn lấy.bảng— tên bảng mà bạn lấy dữ liệu từ đó.điều kiện— điều kiện để lọc dòng.sắp xếp— dòng và thứ tự sắp xếp.
Nghe dễ không? Giờ mình sẽ giải thích bằng ví dụ thực tế. Nhưng bắt đầu bằng ví dụ đơn giản trước nha.
Ví dụ query cơ bản
Giả sử tụi mình có bảng students, chứa dữ liệu về sinh viên. Cấu trúc bảng có thể như này:
| id | first_name | last_name | age | grade |
|---|---|---|---|---|
| 1 | Alex | Lin | 20 | A |
| 2 | Anna | Song | 22 | B |
| 3 | Otto | Art | 19 | A |
Bây giờ mình chỉ muốn biết mỗi họ last_name và điểm grade của tất cả sinh viên thôi.
Query sẽ như này:
SELECT last_name, grade
FROM students;
Kết quả trả về:
| last_name | grade |
|---|---|
| Lin | A |
| Song | B |
| Art | A |
Chúc mừng nha, bạn vừa tiết kiệm tài nguyên database và làm kết quả dễ đọc hơn rồi đó!
Nối chuỗi
Chọn dữ liệu thì bạn làm được rồi, giờ thử cái gì vui hơn đi. Trong bảng của mình, tên và họ nằm ở hai cột khác nhau. Viết query để có cột tên đầy đủ của sinh viên nha.
Để nối hai chuỗi trong PostgreSQL thì dùng toán tử ||. SELECT query sẽ như này:
SELECT first_name || last_name, grade
FROM students;
Kết quả trả về:
| first_name || last_name | grade |
|---|---|
| AlexLin | A |
| AnnaSong | B |
| OttoArt | A |
Ơ. Hình như thiếu gì đó. Ví dụ như khoảng trắng giữa tên và họ! Sửa lại nha.
SELECT first_name || ' ' || last_name, grade
FROM students;
Kết quả trả về:
| first_name || ' ' || last_name | grade |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
Đẹp rồi. Nội dung bảng kết quả nhìn ổn, nhưng cái tiêu đề thì sao? Muốn nó là full name hay đơn giản name thôi, chứ không phải first_name || ' ' || last_name. Nhìn xấu và khó hiểu. Nhưng có cách giải quyết luôn.
Chọn với alias (bí danh)
Query SQL có thể dễ đọc hơn nhờ alias. Alias là đặt tên mới cho cột trong phạm vi query. Alias dùng từ khóa AS (thực ra bỏ cũng được, nhưng nên dùng cho dễ đọc).
Xem ví dụ này:
SELECT first_name AS "Tên", last_name AS "Họ", grade AS "Điểm"
FROM students;
Kết quả trả về:
| Tên | Họ | Điểm |
|---|---|---|
| Alex | Lin | A |
| Anna | Song | B |
| Otto | Art | A |
Ở đây tụi mình:
- Đổi tên cột cho dễ hiểu bằng tiếng Việt.
- Dùng alias trong query với
AS.
Nếu sếp hay khách hàng cần xuất dữ liệu cho người dùng mà không muốn họ hoa mắt khi nhìn bảng - alias là bạn thân luôn.
Giờ cải thiện query lấy tên đầy đủ luôn nha.
SELECT first_name || ' ' || last_name AS "Tên đầy đủ", grade AS "Điểm"
FROM students;
Kết quả trả về:
| Tên đầy đủ | Điểm |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
Quá ổn. Đúng ý mình luôn.
Tại sao chỉ chọn một số cột?
- Hiệu năng
Hãy tưởng tượng bạn làm với bảng cực lớn, hàng triệu dòng, hàng trăm cột. Lấy hết dữ liệu bằng SELECT * có thể mất vài phút hoặc cả tiếng, tốn tài nguyên server nữa. Chỉ lấy cái cần thôi là đủ rồi.
- Dễ đọc
Khi chỉ lấy cột cần thiết, kết quả dễ hiểu hơn nhiều. Không thì nhìn kết quả như đọc newsfeed dài ngoằng tối thứ sáu vậy.
- Giảm lỗi
Dữ liệu càng ít, khả năng sai càng thấp. Nhất là khi bạn còn xử lý tiếp dữ liệu đó nữa.
Lưu ý gì?
Alias cho bảng
Một cách khác để xử lý tên bảng dài là dùng alias cho bảng. Alias nên gợi nhớ tên bảng gốc hoặc liên quan logic tới nội dung bảng.
SELECT sa05.first_name, sa05.course_id
FROM students_archive_2005 AS sa05
Cách này cực hữu ích nếu bạn có tên bảng dài kiểu university_students_enrollments_records thì có thể dùng usr hoặc us
Lỗi thường gặp khi chọn cột cụ thể
Sai tên cột. Nếu bạn viết sai tên cột, sẽ nhận được lỗi kiểu:
ERROR: column "lastname" does not exist. Nhớ kiểm tra kỹ tên cột nha.Tên bị trùng. Khi query nhiều bảng, nhớ chỉ rõ trường thuộc bảng nào. Ví dụ,
students.first_name.Dùng
SELECT *— bẫy cho newbie. Đúng là tiện, nhưng dự án lớn thì không nên! Luôn chọn đúng cột bạn cần thôi.
GO TO FULL VERSION