0
Tải bản đầy đủ (.pdf) (109 trang)

Tìm kiếm với câu hỏi phức tạp

Một phần của tài liệu GIÁO TRÌNH CƠ SỞ DỮ LIỆU (NGHỀ: CÔNG NGHỆ THÔNG TIN - CAO ĐẲNG) - TRƯỜNG CĐ NGHỀ CÔNG NGHIỆP THANH HÓA (Trang 36 -47 )

CHƢƠNG 2 : NGÔN NGỮ TRUY VẤN SQL

3. KHỐI LỆNH SELECT

3.4. Tìm kiếm với câu hỏi phức tạp

Trong phần này trình bày việc tìm kiếm với nhiều bảng qua việc sử dụng ánh xạ lồng nhau hoặc qua phép kết nối

a. Tìm kiếm bằng kết nối

Trong phép kết nối, các cột tham gia kết nối phải có miền giá trị là sánh đƣợc với nhau. Tên cột của các bảng khác nhau có thể viết tƣờng minh qua tên bảng (Tên _bảng.Tên_cột).

Ví dụ 2.16: Với mỗi mặt hàng đã cung cấp, cho biết số hiệu của mựt hàng, tên và địa chỉ của hãng đã cung cấp mặt hàng đó:

37

SELECT DISTINCT PNO, SNAME, CITY FROM SP, S

WHERE SP.SNO=S.SNO

Chú ý:

- Trong các phép tìm kiếm có hơn một bảng, nếu tên các cột là không duy nhất thì bắt buộc phảo viết tên cột dạng tƣờng minh. Trƣờng hợp không có mệnh đề where khi đó phép tích Đề - các sẽ đƣợc thực hiện.

- Điều kiện trong mệnh đề where thƣờng là điều kiện kết nối dữ liệu hoặc là điều kiện tìm kiếm dữ liệu.

Ví dụ 2.17:

Lập danh sách các lớp có mã khoa là “CNTT” danh sách cần các thông tin MALOP,TENLOP, TENKHOA

SELECT MALOP,TENLOP,TENKHOA FROM lop,khoa

WHERE makhoa=“CNTT” and lop.makhoa=khoa.makhoa; Ví dụ 2.18:

Lập danh sách các sinh viên lớp CDTH2A có điểm thi môn học có mã môn học là “869” lớn hơn hay bằng 8.0

SELECT Sinhvien.MASV,HOTENSV,NU,NGAYSINH,DIEMTHI FROM Sinhvien, ketqua

WHERE malop=”CDTH2A” and MAMH=”869” and

Sinhvien.MASV=Ketqua.MASV and DIEMTHI>=8.0;

b. Tìm kiếm bằng ánh xạ lồng

Là những câu lệnh mà trong thành phần WHERE có chứa thêm một câu lệnh Select khác nữa. Câu lệnh này thƣờng gặp khi dữ liệu cần thiết phải duyệt qua nhiều lần. Đây là một trong những vấn đề khó khăn nhất khi truy vấn dữ liệu

Ví dụ 2.19: Tìm tên những nhà cung cấp đã cung cấp mặt hàng có số hiệu P2: SELECT SNAME

FROM S

WHERE SNO IN (SELECT SNO FROM SP WHERE PNO=‟P2‟)

Ví dụ 2.20: Tìm tên các nhà cung cấp không cung ứng mặt hàng có số hiệu là P1: SELECT SNAME

FROM S

38

Ví dụ 2.21: Lập danh sách những sinh viên lớp CDTH2A có điểm thi lần 1 môn học CSDL cao nhất.

Với câu lệnh này nếu dùng các ngôn ngữ lập trình không có ngôn ngữ hỏi cấu trúc thì thật là dài dòng (đầu tiên phải tìm cho ra số điểm lớn nhất thoã mãn điều kiện trên, sau đó phải duyệt dữ liệu thêm một lần nữa để chọn ra những bộ thỏa đề bài)

SELECT sinhvien.MASV,HOTENSV,NU,NGAYSINH,DIEMTHI FROM sinhvien,ketqua

WHERE MAMH='CSDL' AND Lanthi=1

sinhvien.MASV=Ketqua.MASV AND DIEMTHI>=ALL(SELECT DIEMTHI

FROM ketqua,sinhvien

WHERE MAMH='CSDL' AND Lanthi=1 and sinhvien.MASV=Ketqua.MASV);

Ví dụ 2.2 2:

Lập danh sách những giảng viên cùng khoa với giảng viên NGUYEN VAN THANH ? Giải: Select * From giangvien Where makhoa in (select makhoa from giangvien

where Hotengv=”NGUYEN VAN THANH”);

Chú ý: Về đặc tính sử dụng câu hỏi con:

- Phép lồng nhau có thể đƣợc lồng nhiều mức.

- Câu hỏi con phải đặt trong hai dấu ngoặc đơn trong mệnh đề Where hoặc Having và đi sau toán tử so sánh dữ liệu.

- Nội dung chỉ định trong mệnh đề Select của câu hỏi con chỉ là một tên (Một cột hoặc một biểu thức).

- Kết quả của câu hỏi con phải có kiểu tƣơng thích với Query mẹ. Trong Query con không đƣợc sử dụng các phép toán so sánh Like, Between. Kết quả chọn lọc dữ liệu trong Query con chỉ dùng cho việc so sánh của Query mẹ mà không đƣa ra bảng kết quả, vì vậy trong Query con không đƣợc sử dụng mệnh đề Order by. - Ngƣời ta thƣờng dùng Query con khi giá trị để so sánh cho việc tìm kiếm trong Query mẹ là chƣa tƣờng minh.

39

Lập bảng điểm trung bình lần 1 các môn học của các sinh viên của lớp có mã lớp là CDTH2A. Danh sách cần: MASV, HOTENSV,DIEMTB( (trong đó DIEMTB là thuộc tính tự đặt).

SELECT KETQUA.MASV, HOTENSV,AVG(DIEMTHI) AS DIEMTB FROM SINHVIEN,KETQUA

WHERE MALOP=”CDTH2A” AND LANTHI=1 AND SINHVIEN.MASV=KETQUA.MASV

GROUP BY KETQUA.MASV, HOTENSV Mệnh đề HAVING <điều kiện trên nhóm>

Nếu cần kiểm tra điều kiện của một nhóm thì dùng mệnh đề Having , chẳng hạn nhƣ cho biết những sinh viên nào có điểm trung bình các môn ( 8, những khoa nào có nhiều hơn 100 sinh viên nữ,…

Lƣu ý những thuộc tính có tham gia vào mệnh đề GROUP BY để phân nhóm phải đƣợc liệt kê trong danh sách thuộc tính theo sau từ khóa SELECT. Mệnh đề HAVING <điều kiện trên nhóm> đƣợc sử dụng nhƣ là phép chọn phối hợp với việc phân nhóm dữ liệu.

Ví dụ 2.24: Giống nhƣ ở ví dụ 2.23 nhƣng có thêm điều kiện là điểm trung bình các môn đã thi lớn hơn hoặc bằng 8.0.

SELECT KETQUA.MASV, HOTENSV, AVG(DIEMTHI) AS DIEMTB FROM SINHVIEN,KETQUA,LOP

WHERE MALOP=”CDTH2A” AND LANTHI=1 AND SINHVIEN.MASV=KETQUA.MASV

GROUP BY KETQUA.MASV, HOTENSV HAVING AVG(DIEMTHI)>=8.0;

Trong một lệnh truy vấn tổng hợp, ngoại trừ thành phần SELECT bắt buộc phải đặt lên đầu, thứ tự của các thành phần khác là tùy ý. Thứ tự dịch một lệnh truy vấn tổng hợp là nhƣ sau:

FROM ( WHERE ( GROUP BY ( HAVING ( SELECT( ORDER BY

Suy cho cùng, các chƣơng trình quản lý cũng là việc kết xuất các báo cáo từ các quan hệ, mà SQL cho phép tạo ra những quan hệ này một cách tiện lợi. Vì thế hiểu và vận dụng tốt lệnh truy vấn dữ liệu là một việc làm cực kỳ hiệu quả!

c. Tìm kiếm với từ khóa [NOT] EXISTS

Ví dụ 2.25: Đƣa ra tất cả các thông tin về 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 SNO FROM SP,S

40 WHERE SP.SNO=S.SNO)

Ví dụ 2.26: Đƣa ra tất cả các thông tin về các nhà cung cấp chƣa cung cấp bất cứ mặt hàng nào:

SELECT * FROM S

WHETE NOT EXISTS (SELECT SNO FROM SP,S

WHERE SP.SNO=S.SNO)

d. Tìm kiếm có sử dụng lượng từ ANY và ALL

Ví dụ 2.27: Đƣa ra tên mặt hàng, màu, trọng lƣợng của những mặt hàng đã đƣợc cung cấp bởi nhà cung cấp có số hiệu S1:

SELECT PNAME, COLOR, WEIGHT FROM P

WHERE PNO=ANY(SELECT PNO FROM SP

WHERE SNO=‟S1‟)

Ví dụ 2.28: Tìm số hiệu nhà cung cấp đã cung cấp một mặt hàng nào đó với số lƣợng lớn hơn hoặc bằng số lƣợng mỗi lần cung cấp một mặt hàng của các nhà cung cấp:

SELECT SNO FROM SP

WHERE QTY >=ALL

(SELECT QTY FROM SP) Mệnh đề trên hoàn toàn tƣơng đƣơng với:

SELECT SNO FROM SP WHERE SP

WHERE QTY=(SELECT MAX(QTY) FROM SP)

Chú ý: Trong nhiều trƣơng hợp có thể thay thế giữa các mệnh đề „exists‟ với „in‟

hoặc „not in‟, „equal any‟ tƣơng đƣơng với „not equal all‟ .... Ví dụ 2.29: Ví dụ 2.26 có thể tƣơng đƣơng với:

SELECT * FROM S

WHERE SNO NOT IN (SELECT SNO FROM SP)

41 Hoặc:

SELECT * FROM S

WHERE SNO<>ALL (SELECT SNO FROM SP)

e. Tìm kiếm có chứa phép tính tập hợp

Ví dụ 2.30: Tìm số hiệu những nhà cung cấp hiện thời chƣa cung cấp mặt hàng nào cả: SELEC SNO FROM S MINUS SELECT SNO FROM SP)

Ví dụ 2.31: Tìm số hiệu các mặt hàng đã đƣợc cung cấp bởi các nhà cung cấp có số hiệu là s1 hoặc s2: (SELECT PNO FROM SP WHERE SNO=‟S1‟) UNION (SELECT PNO FROM SP WHERE SNO=‟S2‟ BÀI TẬP: Bài 1: Cho cơ sở dữ liệu sau:

S( mancc, tenncc, diachi): Bảng nhà cung cấp.

P(mahang, tenhang, mausac, gia): Bảng các mặt hàng.

SP(mancc, mahang, soluong): Bảng các mặt hàng đã cung cấp.

Trong đó:

mancc: Mã nhà cung cấp; mahang: Mã của các mặt hàng tenncc: Tên nhà cung cấp; mausac: Màu sắc của các mặt hàng diachi: Địa chỉ của nhà cung cấp; tenhang: Tên các mặt hàng

soluong: Số lƣợng của các mặt hàng; Thực hiện các yêu cầu sau bằng câu hỏi SQL: a. Đƣa ra thông tin của tất cả các nhà cung cấp. b.Tìm tên nhà cung cấp bắt đầu bằng ký tự "H ". c. Tìm tên nhà cung cấp chƣa cung cấp mặt hàng nào.

d.Tìm hiệu số số lƣợng mặt hàng có số hiệu mặt hàng là “P1” cung cấp một lần nhiều nhất và một lần ít nhất của nhà cung cấp có số hiệu là “S1”.

42

e. Tìm tên các mặt hàng màu xanh, kết quả đƣa ra sắp xếp theo thứ tự giảm dần của mã số mặt hàng.

f. Với mỗi mặt hàng đã đƣợc cung cấp, cho biết số hiệu của mặt hàng, tên và địa chỉ của hãng đã cung cấp mặt hàng đó.

g.Tìm tên những nhà cung cấp đã cung cấp mặt hàng có số hiệu P2 h.Tìm tên các nhà cung cấp không cung ứng mặt hàng có số hiệu P1.

i. Cho biết số hiệu nhà cung cấp, số hiệu mặt hàng của các mặt hàng đã đƣợc cung cấp với số lƣợng lớn nhất.

j. Cho biết số hiệu nhà cung cấp, tên nhà cung cấp chƣa cung cấp mặt hàng nào.

Bài 2: Cho cơ sở dữ liệu sau:

Sinhvien(MASV, HOTENSV, NGAYSINH, NOISINH, MALOP). Lop(MALOP, TENLOP, MAKHOA).

Khoa(MAKHOA, TENKHOA).

Monhoc(MAMH, TENMH, DONVIHT).

Giangvien(MAGV, HOTENGV, HOCVI, MAKHOA).

Trong đó:

MASV: Mã số sinh viên; MAGV: Mã số giáo viên HOTENSV: Họ tên của sinh viên; HOTENGV: Họ tên giáo viên

NGAYSINH: Ngày sinh HOCVI: Học vị

NOISINH: Nơi sinh MALOP: Mã lớp

MAMH: Mã môn học MAKHOA: Mã khoa

TENMH: Tên môn học TENKHOA: Tên khoa

DONVIHT: Đơn vị học trình

Thực hiện các yêu cầu sau bằng câu lệnh SQL:

a. Lập danh sách sinh viên gồm MASV, HOTENSV, NGAYSINH, MALOP.

b. Lập danh sách những môn học có số đơn vị học trình >=4. Danh sách cần MAMH, TENMH,DONVIHT.

c. Lập danh sách các lớp có mã khoa là „CNTT‟ danh sách cần các thông tin MALOP,TENLOP, TENKHOA.

d. Lập danh sách những giảng viên cùng khoa với giảng viên NGUYỄN VĂN THÀNH.

Bài 3: Cho các quan hệ với lƣợc đồ sau:

CB (CB#, TenCB, NamSinh, SoNamCT, DiaChi, PHONG#) CQ (PHONG#, TenP, TruongP)

Trong đó:

CB# : Mã cán bộ TenCB: Tên cán bộ

NamSinh: Năm sinh của cán bộ SoNamCT: Số năm công tác DiaChi: Địa chỉ của cán bộ PHONG#: Mã phòng

43

Thực hiện các yêu cầu sau bằng câu lệnh truy vấn SQL: a. Đƣa ra tất cả thông tin của cán bộ.

b.Cho biết tên và địa chỉ của cán bộ thuộc phòng “Kế toán”. c. Cho biết tên những nhân viên có số năm công tác là 15 năm.

d.Cho biết tên phòng có nhân viên quê ở “Thái Bình” và sinh năm 1980.

Bài 4: Cho CSDL sau:

Lop( MALOP, TENLOP, MAKHOA)

Khoa( MAKHOA, TENKHOA, DIENTHOAI) Monthi(MAMT, TENMT)

Ketqua(MASV, MAMT, DIEMTHI)

Sinhvien( MASV, HOTEN, NGAYSINH, MALOP)

Trong đó:

MASV: Mã sinh viên, HOTEN: Họ tên sinh viên, NGAYSINH: Ngày sinh, MALOP: Mã lớp, TENLOP: Tên lớp, MAKHOA: Mã khoa, TENKHOA: Tên khoa, DIENTHOA: Điện thoại của khoa, MAMT: Mã môn thi, TENMT: Tên môn thi, DIEMTHI: Điểm thi.

Thực hiện các yêu cầu sau bằng câu lệnh SQL a. Đƣa ra tất cả thông tin của sinh viên.

b. Đƣa ra thông tin của sinh viên có mã khoa là ”CNTT”. c. Đếm số sinh viên lớp “Cao đẳng nghề khóa 2”.

d. Lập danh sách HOTEN, NGAYSINH của các sinh viên học lớp “ Cao đẳng nghề khóa 2”.

e. Đƣa ra danh sách những khoa có số lƣợng lớp lớn hơn 25.\

Bài 5: Cho CSDL Quản lý lƣơng cán bộ sau:

Chucvu(macv, tencv, phucapcv) Phongban(mapb, tenpb)

Canbo(macb, hoten, macv, mapb, ngaysinh, gioitinh, hesoluong, ladangvien, vaocongdoan, ghi chu)

Trong đó:

Các thuộc tính: macv (Mã chức vụ), tencv (Tên chức vụ), phucapcv (Phụ cấp chức vụ), mapb (Mã phòng ban), tenpb (Tên phòng ban), macb (Mã cán bộ), hoten (Họ tên cán bộ), ngaysinh (Ngày sinh), hesoluong (Hệ số lƣơng), ladangvien (Là đảng viên), vaocongdoan (Vào công đoàn), ghichu (Ghi chú).

Thực hiện các yêu cầu sau bằng câu lệnh SQL: a. Đƣa ra thông tin của tất cả các cán bộ.

b.Đƣa ra danh sách cán bộ đảng viên mà chƣa vào công đoàn. Thông tin gồm: macb, hoten, ngaysinh, gioitinh, hesoluong .

44

d.Hãy lọc ra danh sách cán bộ là Đảng viên và có thực lĩnh lớn hơn 2500000 với thực lĩnh= hesoluong*650000.

Bài 6: Cho Lƣợc đồ cơ sở dữ liệu quản lý nhân viên của một công ty nhƣ sau: Nhanvien(MANV,HOTEN, NU,NGAYSINH,LUONG,MAPB, MACV)

Mỗi nhân viên có một mã nhân viên (MANV) duy nhất, mỗi mã nhân viên xác định họ và tên nhân viên (HOTEN), giới tính (NU), lƣơng (LUONG), mã phòng ban (MAPB), mã chức vụ (MACV).

Phongban(MAPB,TENPB,TRUSO, MANVPHUTRACH, KINHPHI, DOANHTHU)

Mỗi phòng ban có tên gọi phòng ban(TENPB), địa điểm đặt trụ sở (TRUSO), mã nhân viên phụ trách(MANVPHUTRACH), kinh phí hoạt động (KINHPHI), và doanh thu(DOANHTHU)

Chucvu(MACV, TENCV, LUONGTHAPNHAT, LUONGCAONHAT)

Mỗi chức vụ co tên gọi chức vụ (TENCV), mức lƣơng tối

thiểu(LUONGTHAPNHAT), mức lƣơng tối đa (LUONGCAONHAT). Hãy biểu diễn các câu hỏi sau bằng SQL:

a. Lập danh sách gồm các thông tin về các phòng ban trong công ty nhƣ: mã số phòng ban, tên phòng ban, địa điểm trụ sở, mã số ngƣời phụ trách, kinh phí hoạt động, doanh thu.

b. Lập danh sách những nhân viên sinh nhật trong tháng 10

c. Lập danh sách gồm các thông tin mã số nhân viên, họ và tên và lƣơng cả năm của các nhân viên (giả sử rằng luơng cả năm =12*lƣơng)

d. Lập những phòng ban có kinh phí hoạt động cao nhất.

e. Lập danh sách nhân viên của phòng ban có mã số phòng ban là 40. f. Lập danh sách nhân viên của phòng có mã số phòng ban 10,30,50.

g. Lập danh sách các nhân viên có lƣơng tháng từ 2.500.000 đến 4.000.000 h.Tìm những nhân viên có tuổi cao nhất thuộc phòng ban có MAPB là 10

i. Lập danh sách các nhân viên của phòng 10,30,50. kết quả in ra theo thứ tự tăng dần của mã phòng nếu trùng mã phòng thì sắp xếp giảm dần theo mức lƣơng.

k. Lập danh sách các nhân viên phòng 10,30,50, chỉ in ra những ngƣời là lãnh đạo của mỗi phòng ban này.

l. lập danh sách gồm mã phòng mà ngƣời có mức lƣơng cao nhất của phòng lớn hơn hoặc bằng 4.000.000

m. Lập mã phòng ban, tên phòng ban, họ và tên của lãnh đạo phòng tƣơng ứng. n. Lập danh sách những ngƣời làm việc cùng phòng với ông Nguyen Van Thanh o. Lập biết mã số nhân viên, họ và tên, mức lƣơng của ngƣời lãnh đạo ông Nguyen Van Thanh.

p. Lập danh sách nhân viên có mức lƣơng lớn hơn hay bằng mức lƣơng cao nhất của phòng ông Nguyen Van Thanh.

45

q. Cho biết mã số nhân viên, họ và tên , tổng số nhân viên, mức lƣơng cao nhất, mức lƣong thấp nhất, mức lƣơng trung bình của từng phòng ban.

r. Cho biết các nhân viên có mức lƣơng cao nhất của các phòng ban. s. Cho biết số lƣợng nhân viên của mỗi phòng ban.

Bài 7: Cho CSDL QUẢN LÝ ĐIỂM gồm các bảng dữ liệu sau:

1.Bảng SINHVIEN ( MASV#, HOTEN, NAM, KHOA) 2.Bảng DKIEN (MAMH#, MAMH_TRUOC#)

3.Bảng MHOC (MAMH#, TEN_MH, TINCHI, KHOA) 4.Bảng KQUA ( MASV#, MAMH#, DIEM)

5.Bảng K_HOC ( MAKH# , MAMH#, HOCKY, NAM, GV)

Hãy sử dụng các lệnh SQL và các phép toán quan hệ để biểu diễn các yêu cầu sau: a. In ra mã sinh viên và họ tên sinh viên.

b. In ra tên các môn học và tín chỉ

c. Cho biết kết quả học tập của sinh viên có mã số 8

d. Cho biết các mã môn học phải học ngay trƣớc môn có mã số COCSC3320. e .Cho biết các mã môn học phải học ngay sau môn có mã số COCSC3320.

f. Cho biết họ tên sinh viên thuộc về khoa phụ trách môn " Cơ sở dữ liệu" và môn " Toán rời rạc"

g. Sửa lại giá trị cột NAM của sinh viên có họ tên là Sơn thành 2.

h. Cho biết họ tên, các môn học , điểm mà sinh viên đó tham gia với kết quả cuối khóa trên 7 điểm.

i. Cho biết các môn học phải học ngay trƣớc môn " Cơ sở dữ liệu"

Bài 8: Cho lƣợc đồ cơ sở dữ liệu quản lý hồ sơ sinh viên bao gồm các lƣợc đồ

quan hệ:

SV(MaSV, Hoten, Gioitinh, Ngayinh, Lop) MON(MaMH, TenMH, Sotiet)

KQ(MaSV, MaMH, Diemthi)

Hãy thực hiện các câu hỏi sau bằng ngôn ngữ đại số quan hệ:

a. Lập danh sách sinh viên nữ lớp “AT4B” bao gồm các thông tin: Masv, Hoten. b. Lập bảng điểm cho tất cả các sinh viên, bảng điểm gồm cột Masv, TenMH, Diemthi.

c. Lập phiếu điểm cho sinh viên có tên là “AAA” . phiếu điểm gồm các thông tin sau: Tenmh, diemthi.

d. Lập danh sachis dinh viên phải thi lại môn “ cơ sở dữ liệu”. Danh sách gồm Tenlop, Masv, Diemthi.

e. Đƣa ra danh sách các sinh viên chƣa có kết quả thi của các môn học.

Bài 9: Cho cơ sở dữ liệu nhƣ sau:(In đậm và gạch dƣới là khóa chính)

chucvu (macv char(5), tencv char(25)) thanhpho (matp char(5), tentp char(25))

46

phicongtac (macv char(5), matp char(5), phi_1_ngay int) nhanvien (manv char(5), tennv char(25), macv char(5))

dotcongtac (madot int, tp_den char(5), songay int, ngaydi datetime) thamgiacongtac (madot int, manv char(5))

Thực hiện các câu truy vấn sau:

a. Liệt kê danh sách các mã đợt, ngày đi mà đến thành phố có tên là „Hồ Chí Minh‟ với số ngày đi nhiều hơn 7 ngày.

b. Liệt kê danh sách các mã nhân viên, tên nhân viên mà có tham gia vào các đợt công tác đitrong tháng 2 năm 2009 đến thành phố có tên là „Hà Nội‟.

c. Liệt kê danh sách các mã nhân viên, tên nhân viên mà chƣa từng tham gia chuyến công tác nào.

d. Liệt kê danh sách các mã nhân viên, tên nhân viên mà chƣa từng tham gia chuyến công tác nào mà xuất phát trong năm 2008.

e. Liệt kê danh sách các nhân viên, tên nhân viên mà tham gia ít nhất 2 đợt công

Một phần của tài liệu GIÁO TRÌNH CƠ SỞ DỮ LIỆU (NGHỀ: CÔNG NGHỆ THÔNG TIN - CAO ĐẲNG) - TRƯỜNG CĐ NGHỀ CÔNG NGHIỆP THANH HÓA (Trang 36 -47 )

×