Cộng đồng chia sẻ tri thức Doc24.vn

4. Truy vấn dữ liệu

Gửi bởi: Phạm Thọ Thái Dương vào ngày 2020-02-14 04:14:36

Mục lục
* * * * *

Khối câu lệnh phổ dụng: SELECT - FROM – WHERE. Ta có thể sử dụng theo cú pháp chung như sau:

SELECT [*| DISTINCT] <Danh sách các cột [AS <Bí danh>]> FROM <Danh sách Tên bảng/Tên View>
[WHERE <Biểu thức điều kiện>] [GROUP BY <Danh sách cột>] [HAVING <Điều kiện>]
[ORDER BY <Tên cột/ Số thứ tự cột/Biểu thức> [ASC/DESC]]

1. Tìm kiếm theo câu hỏi đơn giản

Tìm kiếm đơn giản:

  • Nếu xuất hiện giá trị * nghĩa là xem toàn bộ các cột của bảng. Select * From SINHVIEN;
  • Nếu sử dụng DISTINCT thì sẽ lấy giá trị đại diện. Select Distinct S#, P# From SP;

Xử lý xâu: dùng toán tử [NOT] LIKE <Mẫu so sánh>

  • Dùng dấu gạch dưới để thay cho một ký tự.
  • Dùng dấu % để thay cho một dãy các ký tự tuỳ ý.

Ví dụ 2.9. Cho bảng hồ sơ sinh viên HOSOSV(MaSV, Hodem, TenSV, Ngaysinh, MaLop). Hãy cho biết mã và họ tên sinh viên có hai chữ đầu là 'Ba'

Select MaSV, Hodem+TenSV as Hoten From HOSOSV
Where TenSV like 'Ba%'

Ví dụ 2.10. Cho bảng hồ sơ sinh viên HOSOSV(MaSV, Hodem, TenSV, Ngaysinh, MaLop). Hãy cho biết mã và họ tên sinh viên có không có hai chữ đầu là 'Ba'

Select MaSV, Hodem+TenSV as Hoten From HOSOSV
Where TenSV like 'Ba%'
  • Sử dụng Between và IN để xác định phạm vi:

Ví dụ 2.11. Cho bảng thông tin sách mượn SACHMUON(MaBD, MaSach, NgayMuon, NgayTra). Hãy cho biết mã các bạn đọc mượn sách của thư viện trong khoảng ngày {1/1/2008} và {31/3/2008}

Select MaBanĐoc
From SACHMUON
Where NgayMuon Between {1/1/2000} and {31/3/2000}

2. Sử dụng các hàm thư viện

Các hàm thư viện thực hiện các thao tác như thống kê dữ liệu, tính toán dữ liệu có sẵn như:

  • Count(): Dùng để đếm các bảng ghi,
  • Max(): Trả về giá trị lớn nhất của một tập hợp các giá trị,
  • Min(): Trả về giá trị lớn nhất của một tập hợp các giá trị,
  • Sum(): Trả về tổng giá trị của một tập hợp các giá trị,
  • Avg():Trả về giá trị trung bình của một tập hợp các giá trị,

Ví dụ 2.12.: Cho bảng DIEM(MaSV, MaMH, DiemL1, DiemL2). Hãy xem sinh viên có mã SV061001 đã tham gia thi bao nhiêu môn:

Select Count(MaMH) AS Tongso From DIEM
where MaSV='SV061001';

Ví dụ 2.13: Cho biết điểm thi cao nhất lần 1 của môn có mã '03AB'

Select Max(DiemL1) as DiemCN From DIEM
Where MaMH='03AB';

Ví dụ 2.14. Cho biết chênh lệnh giữa điểm thi cao nhất và thấp nhất của môn có mã môn học là '03AB'

Select (Max(DiemL1) - Min (DiemL1)) As Chenh_Lenh From DIEM
where MaMT='03AB';

3. Tìm kiếm nhờ các mệnh đề

  • Sử dụng phân nhóm GROUP BY: Mệnh đề GROUP BY được sử dụng để tạo hiệu quả sắp xếp và tính toán theo từng phân nhóm.

Ví dụ 2.15. Cho biết tình hình thi của từng sinh viên: Select MaSV, MaMH, DiemL1, DiemL2

From DIEM Group By MaSV
  • Sử dụng HAVING: Mệnh đề HAVING dùng để đặt điều kiện lọc cho các phân nhóm con.

Ví dụ 2.16. Cho bảng mặt hàng đã được cung cấp SP(S#, P#, QTY). Tìm mã những nhà cung cấp cung cấp ít nhất 2 mặt hàng:

Select S# From SP Group By S#
Having Count(Distinct P#)>=2;

Ví dụ 2 .17. Tìm mã các sinh viên không có môn thi nào dưới 5 Select MaSV From DIEM

Group By MaSV Having Min(Diem)>=5;

Chú ý: Having đi sau Group By để đặt điều kiện chọn lọc ra những phân nhóm thoả mãn điều kiện sau Having. Nếu không có từ khoá Group By thì Having sẽ tác động trên toàn bảng coi như một phân nhóm duy nhất.

  • Sử dụng Order By: Được sử dụng để tạo hiệu quả sắp xếp dữ liệu. Ta có thể sắp xếp theo chiều tăng (ASC) hoặc giảm (DESC).

            + Ta có thể tác động sắp xếp lại trên từng phân nhóm bởi Order By.

Ví dụ 2.18. Cho biết tình hình thi lần 1 của mỗi sinh viên sao cho kết quả điểm thi được sắp xếp giảm dần.

SELECT MaSV, MaMT, ĐiemL1 GROUP BY MaSV
ORDER BY Diem DESC
  • Chú ý: Tương tự HAVING, nếu trước Order by không có Group By thì hiệu quả sắp xếp dữ liệu sẽ tác động trên toàn bảng và bảng được coi như một phân nhóm chính.  

4. Câu hỏi phức tạp

Khi thực hiện các truy vấn làm việc với dữ liệu từ 2 bảng trở nên thì điều kiện xử lý phức tạp hơn.

- Tự kết nối:

Ví dụ 2.19. Kiểm tra bảng kết quả thi KETQUA(SoBD, MaMT, Diem) có bị nhập trùng hay không? Nghĩa là nhập trùng MaSV, MaMT nhưng điểm thi lại khác nhau (nhập 2 lần).

SELECT a.SoBD, a.MaMT, a.Diem, b.Diem From KETQUA a, KETQUA b
Where (a.SoBD=b.SoBD) and (a.MaMT=b.MaMT) and (a.Diem>b.Diem)

- Kết nối nhiều bảng:

Ví dụ 2.20. Cho biết kết quả thi môn Toán của các sinh viên.

+ CREATE VIEW MaToan AS
SELECT MaMT From MONTHI
Where TenMon='Toán'

+ CREATE VIEW TAM AS
SELECT a.SoBD, a.Diem
From KETQUA a, MaToan b
Where a.MaMT=b.MaMT;

+ SELECT a.SoBD, TenSV, a.Diem From Tam a, THISINH b Where a.SoBD=b.SoBD

Ví dụ 2.21. Liên kết nhiều bảng authors, titleauthor và title.

SELECT au_lname, au_fname, title, price FROM authors JOIN titleauthor ON authors.au_id = titleauthor.au_id JOIN titles ON titleauthor.title_id = titles.title_id ORDER BY au_lname, au_fname

- Ánh xạ lồng

Ví dụ 2.22. Cho các quan hệ:

S(S#, SNAME, STATUS, CITY) SP(S#, P#, QTY)
P(P#, PNAME, COLOR, WEIGH)

Hãy cho biết mã và tên các hãng có bán sản phẩm màu đỏ.

SELECT S#, SNAME From S Where S# IN (SELECT S# From SP Where P# IN
(Select P# From P Where COLOR='Red'));

- Sử dụng các lượng từ: EXISTS, ANY, ALL,…

Ví dụ 2.23. Cho các bảng trong ví dụ 2.22. Tìm các nhà cung cấp đã cung cấp ít nhất một mặt hàng nào đó.

SELECT * From S Where EXISTS
(SELECT * From SP Where SP.S# =S.S#);

Ta có thể thay thế bằng câu lệnh: SELECT * From S

Where 0 < (SELECT Count(*) From SP Where SP.S#=S.S#);

Ví dụ 2.24. Tìm tên những mặt hàng có mã số mặt hàng mà mặt hàng nào đó mà hãng S1 đã bán.

SELECT PNAME From P Where S# = ANY
(SELECT P# From SP Where S#='S1');

Ví dụ 2.25. Tìm những hãng cung cấp số lượng một lần một mặt hàng nào đó > số lượng mỗi lần của các hãng cung cấp.

SELECT S From SP
Where QTY>= ALL (SELECT QTY From SP ); hay
SELECT S From SP Where QTY= (SELECT Max(QTY) From SP );