Viết rõ thông tin muốn lấy
SQL cho phép mô tả cần những cột nào và những hàng thỏa điều kiện nào. Ta đọc yêu cầu trước rồi tách thành SELECT, FROM và WHERE.
Bốn thành phần cơ bản
SELECT chọn cột hoặc biểu thức; FROM chỉ bảng; WHERE lọc hàng; ORDER BY sắp xếp kết quả với ASC tăng, DESC giảm. Không có ORDER BY thì không nên dựa vào một thứ tự kết quả cụ thể. Chuỗi trong ví dụ SQL đặt trong dấu nháy đơn. AND yêu cầu đồng thời, OR chọn một trong các điều kiện; dùng ngoặc để nhóm ý.
Các bài DB03–DB04 dùng bảng HocSinh dưới đây, với Diem là số:
| MaHS | HoTen | Lop | Diem |
|---|---|---|---|
| H01 | An | 12A | 8 |
| H02 | Binh | 12B | 6 |
| H03 | Chi | 12A | 9 |
| H04 | Dung | 12B | 8 |
Tìm điểm của lớp 12A
```sql
SELECT HoTen, Diem
FROM HocSinh
WHERE Lop = '12A'
ORDER BY Diem DESC;
```
WHERE giữ An và Chi. SELECT lấy tên, điểm; ORDER BY giảm dần cho kết quả Chi 9 rồi An 8. Đây là sắp xếp kết quả truy vấn, không khẳng định thứ tự lưu vật lí của bảng đã thay đổi.
Thử vận dụng
Muốn lấy học sinh lớp 12B đồng thời điểm ít nhất 8, điều kiện nào đúng?
OR còn nhận học sinh lớp khác có điểm cao.
Đúng: Dung thỏa cả lớp và điểm.
Dấu > loại mất điểm 8.
Sai lớp cần tìm.
Lời giải
Hai yêu cầu cùng đúng nên dùng AND và >= để nhận cả điểm 8. Kết quả là Dung.
Chọn giá trị không trùng
```sql
SELECT DISTINCT Lop
FROM HocSinh
ORDER BY Lop;
```
Kết quả có hai lớp 12A và 12B. DISTINCT loại các hàng trùng trong kết quả đang chọn; không xóa học sinh trùng lớp khỏi bảng gốc.
Ví dụ xem cách làm
Viết truy vấn lấy MaHS của học sinh điểm dưới 8 trong bảng đã cho.
Lời giải
```sql
SELECT MaHS
FROM HocSinh
WHERE Diem < 8;
```
Kết quả H02.
Ví dụ xem cách làm
SELECT HoTen FROM HocSinh; có bảo đảm trả theo thứ tự chữ cái không? Nêu cách yêu cầu rõ.
Lời giải
Không. Cần thêm ORDER BY HoTen ASC nếu muốn sắp tăng theo quy tắc đối chiếu chuỗi của hệ quản trị.
Những điều cần nhớ
Tách cột cần xem khỏi hàng cần lọc. Ghi rõ điều kiện và ORDER BY khi thứ tự có ý nghĩa; DISTINCT chỉ tác động lên kết quả chọn.
Đang học