CodeGym /Các khóa học /SQL SELF /Chọn cột cụ thể: lấy dữ liệu theo tên cột

Chọn cột cụ thể: lấy dữ liệu theo tên cột

SQL SELF
Mức độ , Bài học
Có sẵn

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ó SELECTFROM 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:

  1. Đổi tên cột cho dễ hiểu bằng tiếng Việt.
  2. 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?

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

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

  1. 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ể

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

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

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

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Trích xuất dữ liệu sử dụng alias
Trích xuất dữ liệu sử dụng alias
2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Tạo cột mới bằng cách sử dụng dữ liệu từ các cột khác
Tạo cột mới bằng cách sử dụng dữ liệu từ các cột khác
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION