1 Trường Đạihọc Công nghệ thông tin Ôn thi cao họcnăm 2009 Đạisố quan hệ và ngôn ngữ SQL Relational Algebra & SQL PGS.TS. Đỗ Phúc Khoa Hệ thống thông tin
1
Trường Đại học Công nghệ thông tin
Ôn thi cao học năm 2009
Đại số quan hệ và ngôn ngữ SQLRelational Algebra & SQL
PGS.TS. Đỗ PhúcKhoa Hệ thống thông tin
2
Năm phép toán cơ bản
• Selection ( σ ) : chọn.
• Projection ( π ) : chiếu.
• Descartes-product ( × ) tích Descartes.• Set-difference ( — ) hiệu• Union ( ∪ ) hợp.
3
sname ratingyuppy 9lubber 8guppy 5rusty 10
Chiếu (projection)sid sname rating age28 yuppy 9 35.031 lubber 8 55.544 guppy 5 35.058 rusty 10 35.0
)2(, Sratingsnameπ
S2age35.055.5Ví dụ:
Chỉ giữ lại các thuộc tính đượcchỉ định trong danh sách chiếu. πage S( )2
4
Chọn -selection (σ)
• Chọn các dòng thỏa điều kiện.
σ rating S>8 2( )
sname ratingyuppy 9rusty 10
π σsname rating rating S, ( ( ))>8 2
sid sname rating age 28 yuppy 9 35.0 31 lubber 8 55.5 44 guppy 5 35.0 58 rusty 10 35.0
5
Hợp và hiệu
• Các phép toán này yêu cầu 2 quan hệ nhập phảitương thích– Cùng số thuộc tính.– Cùng tên và kiểu.
6
Hợp- Unionsid sname rating age22 dustin 7 45.031 lubber 8 55.558 rusty 10 35.044 guppy 5 35.028 yuppy 9 35.0
S S1 2∪
sid sname rating age22 dustin 7 45.031 lubber 8 55.558 rusty 10 35.0
sid sname rating age28 yuppy 9 35.031 lubber 8 55.544 guppy 5 35.058 rusty 10 35.0
S1
S2
7
Hiệu- Set Differencesid sname rating age22 dustin 7 45.031 lubber 8 55.558 rusty 10 35.0
sid sname rating age28 yuppy 9 35.031 lubber 8 55.544 guppy 5 35.058 rusty 10 35.0
S1
S2
sid sname rating age22 dustin 7 45.0
S S1 2−
S2 – S1
sid sname rating age28 yuppy 9 35.044 guppy 5 35.0
8
Toán tử giao ( Intersection)
• các quan hệ phải tương thích
• Có thể biểu diễn qua phép hợp và phép hiệu
R ∩ S = R − (R − S)
9
Giao - Intersectionsid sname rating age22 dustin 7 45.031 lubber 8 55.558 rusty 10 35.0
sid sname rating age28 yuppy 9 35.031 lubber 8 55.544 guppy 5 35.058 rusty 10 35.0
S1
S2
sid sname rating age31 lubber 8 55.558 rusty 10 35.0
S S1 2∩
10
Tích Descartes
• Kết từng dòng của quan hệ đầu ( R ) với từngdòng của quan hệ thứ hai (S):
R X S
11
Ví dụ về tích Descartes
Students Coursesstud# name course course# name100 Fred PH PH Pharmacy200 Dave CM CM Computing300 Bob CM
Students X Courses =
stud# Students.name course course# Courses.name100 Fred PH PH Pharmacy100 Fred PH CM Computing200 Dave CM PH Pharmacy200 Dave CM CM Computing300 Bob CM PH Pharmacy300 Bob CM CM Computing
12
Theta kết
• Tích Descartes có áp dụng điều kiện:
R ⋈ <condition> S
13
Ví dụ về Theta kết
Students Coursesstud# name course course# name100 Fred PH PH Pharmacy200 Dave CM CM Computing300 Bob CM
Students ⋈ stud# = 200 Courses
stud# Students.name course course# Courses.name200 Dave CM PH Pharmacy200 Dave CM CM Computing
14
Phép kết trong :Inner Join (Equijoin)
• Phép kết Theta với điều kiện <condition> làbằng nhau (=) giữa khóa chính và khóa ngoại.
R ⋈ <R.primary_key = S.foreign_key> S
15
Ví dụ về Inner Join
Students Coursesstud# name course course# name100 Fred PH PH Pharmacy200 Dave CM CM Computing300 Bob CM
Students ⋈ course = course# Courses
stud# Students.name course course# Courses.name100 Fred PH PH Pharmacy200 Dave CM CM Computing300 Bob CM CM Computing
16
Phép kết tự nhiên ( natural join)
• Phép kết trong (inner join) sinh ra dữ liệu dư (trong ví dụ trướcta có: course và course#). Để loại bỏ trường hợp trùng này, tadùng:
π < stud#, Students.name, course, Courses.name >
(Students ⋈ <course = course#> Courses)hayR1= Students ⋈ <course = course#> Courses
R2= π < stud#, Students.name, course, Courses.name > R1Kết quả này được gọi là kết tự nhiên (natural join) giữa Students
và Courses
17
Ví dụ về kết tự nhiên (Natural Join)
Students Coursesstud# name course course# name100 Fred PH PH Pharmacy200 Dave CM CM Computing300 Bob CM
R1= Students ⋈ <course = course#> CoursesR2= π < stud#, Students.name, course, Courses.name > R1stud# Students.name course Courses.name100 Fred PH Pharmacy200 Dave CM Computing300 Bob CM Computing
18
Phép kết ngoài (Outer Joins)
• Phép kết trong + các dòng của bảng không thỏa<condition>.
• Phép kết ngoài trái: R <R.primary_key = S.foreign_key> STất cả các dòng trong R được giữ lại và các dòng không thỏa của
S được dồn các trị NULL
• Phép kết ngoài phải: R <R.primary_key = S.foreign_key> STất cả các dòng trong S được giữ lại và các dòng không thỏa của
R được dồn các trị NULL
19
Ví dụ về phép kết ngoài tráiLeft Outer Join
Students Coursesstud# name course course# name100 Fred PH PH Pharmacy200 Dave CM CM Computing400 Peter EN CH Chemistry
Students <course = course#> Courses
stud# Students.name course course# Courses.name100 Fred PH PH Pharmacy200 Dave CM CM Computing400 Peter EN NULL NULL
20
Ví dụ về phép kết ngoài phảiRight Outer Join Students Coursesstud# name course course# name100 Fred PH PH Pharmacy200 Dave CM CM Computing400 Peter EN CH Chemistry
Students <course = course#> Courses
stud# Students.name course course# Courses.name100 Fred PH PH Pharmacy200 Dave CM CM ComputingNULL NULL NULL CH Chemistry
21
Phép chia: Division
• Dùng cho biểu thức “tất cả ” trong truy vấn sau: Tìm mã thủy thủ (sids) đặt tất cả (all) các thuyền(boats).
• Vd: cho A có 2 thuộc tính x và y; B chỉ có mộtthuộc tính y:
A/B (chia) chứa tất cả các bộ (x) sao cho mọibộ y trong B đều có bộ xy trong A.
{ }),( AyxByxBA ∈∃∈∀=
22
Ví dụ phép chia A/B
sno pnos1 p1s1 p2s1 p3s1 p4s2 p1s2 p2s3 p2s4 p2s4 p4
pnop2
pnop2p4
pnop1p2p4
snos1s2s3s4
snos1s4
A
B1B2
A/B1 A/B2
B3
snos1A/B3
23
Ví dụ về phép chia• Tìm tất cả khách hàng có tài khoản tại tất cả chi
nhánh nằm ở ChVille
– Branch (bname, assets, bcity)– Account (bname, acct#, cname, balance)
24
Ví dụ về phép chiaR1: Tìm tất cả các chi nhánh tại ChvilleR2: Tìm cặp (bname, cname) từ AccountR3: Các khách của r2 có tài khoản tại tất cả chi nhánh có
tên trong r1
123)(2
)(1
,
''
rrrAccountr
r
cnamebname
BranchChvillebcitybname
÷=
=
==
π
σπ
25
Biểu diễn phép chia A/B dùng các toán tử cơbản
)))((( ABAxx −×ππ
26
Cơ sở dữ liệu
• Cho CSDL câu lạc bộ thuyền buồm
• Sailors(Sid,Sname, rating, age):thủy thủ• Boat(Bid,color): thuyền• Reserves(Sid,Bid,ReservedDate):đặt chỗ
27
Tìm tên thủy thủ (sailors) đặt thuyền có mã(bid) #103
π σsname bid serves Sailors(( Re ) )=103 ><• Solution 1:
• Solution 2: π σsname bid serves Sailors( (Re ))=103 ><
Sailors(Sid,Sname, rating, age):thủy thủBoat(Bid,color): thuyềnReserves(Sid,Bid,ReservedDate):đặt chỗ
28
Tìm tên thủy thủ (sailors) đặt thuyền màuđỏ ( red boat)
• Thông tin về màu đỏ chỉ có trong quan hệBoats, ta cần thêm một phép kết:
π σsname color red Boats serves Sailors(( ' ' ) Re )=
>< ><
Giải pháp tốt hơn ( tối ưu truy vấn):
π π π σsname sid bid color red Boats s Sailors( (( ' ' ) Re ) )=
>< ><
Sailors(Sid,Sname, rating, age):thủy thủBoat(Bid,color): thuyềnReserves(Sid,Bid,ReservedDate):đặt chỗ
29
Tìm tên thủy thủ (sailors) đặt thuyền màu đỏvà màu xanh lục
ρ π σ( , (( ' ' ) Re ))Tempred sid color red Boats serves=
><
π sname Tempred Tempgreen Sailors(( ) )∩ ><
ρ π σ( , (( ' ' ) Re ))Tempgreen sid color green Boats serves=
><
30
Tìm tên thủy thủ (sailors) đặt tất cả cácthuyền
• Phép chia:
ρ π π( , ( , Re ) / ( ))Tempsids sid bid serves bid Boats
π sname Tempsids Sailors( )><
Sailors(Sid,Sname, rating, age):thủy thủBoat(Bid,color): thuyềnReserves(Sid,Bid,ReservedDate):đặt chỗ
31
Chứng minh biểu thức đại số quan hệ
Cho q là quan hệ trên tập thuộc tính RS ( R∪S), chứngminh: q ⊆ ∏R( q) ∏S(q)
Chứng minh:Cho t ∈ q, theo đ/n của phép chiếu t[R] ∈ ∏R( q) và
t[S] ∈ ∏S(q)Ta có theo định nghĩa của phép kết:
t[RS] ∈ ∏R( q) ∏S(q)Do vậy t =t[RS] ∈ ∏R( q) ∏S(q)
32
Chứng minh biểu thức đại số quan hệ
• Cho quan hệ r(R) , A và B là hai thuộc tính củaquan hệ R, chứng minh:
σ A=a (σ B=b(r) ) = σ B=b (σ A=a(r) )• Chứng minh:
σ A=a (σ B=b(r) ) = σ A=a ({t ∈r | t[B]=b})={t’ ∈ {t ∈ r | t[B]=b}| t’[A]=a }={t ∈r| t[A]=a ∧ t[B]=b }={t’ ∈ {t ∈ r | t[A]=a}| t’[B]=b }=σ B=b (σ A=a(r) )
33
Chứng minh biểu thức đại số quan hệ
• Cho 2 quan hệ r, s , A là thuộc tính của quan hệR,S. Chứng minh:
σ A=a (r ∩ s) = σ A=a ( r) ∩ σ A=a(s) )• Chứng minh:
σ A=a (r ∩ s) =σ A=a (t ∈ r ∧ t ∈ s) = { t’ ∈ {t|t ∈ r ∧ t ∈ s}| t[A]=a}={t|t ∈ r và t[A]=a} ∩ {t|t ∈ s và t[A]=a }σ A=a ( r ) ∩ σ A=a ( s )
34
Đại số quan hệ và ngôn ngữ SQL
35
Toán tử một ngôi (unary operations)
Selectionσ course = ‘Computing’ StudentsIn SQL:Select *From StudentsWhere course = ‘Computing’;
Projectionπ stud#, name Students In SQL:Select stud#, nameFrom Students;
Selection & Projectionπ stud#, name (σ course = ‘Computing’ Students)In SQL:Select stud#, nameFrom studentsWhere course = ‘Computing’;
36
Toán tử hai ngôi/kếtBinary Operations/Joins
Tích Descartes: Students X CoursesIn SQL:Select * From Students, Courses;
Theta kết: Students ⋈ <stud# =200> CoursesIn SQL:Select * From Students, CoursesWhere stud# = 200;
37
Toán tử hai ngôi/kết
Inner Join (Equijoin): Students ⋈ <course=course#> CoursesIn SQL:Select * From Students, CoursesWhere course=course#;
Natural Join:R1= Students ⋈ <course = course#> CoursesR2= π < stud#, Students.name, course, Courses.name > R1In SQL:Select stud#, Students.name, course, Courses.nameFrom Students, CoursesWhere course=course#;
38
Phép kết ngoài (Outer Joins)
Left Outer JoinStudents <course = course#> CoursesIn SQL:Select * From Students, CoursesWhere course = course#(+)
Right Outer JoinStudents <course = course#> CoursesIn SQL:Select * From Students, CoursesWhere course(+) = course#
39
Tổ hợp các phép toán một ngôi và hai ngôi
R1= Students ⋈ <course=course#> CoursesR2= σ <address=“Aberdeen”> R1R3= π <Students.name, Course.name> R2
In SQL:Select Students.name, Courses.nameFrom Students, CoursesWhere course=course# AND address=“Aberdeen”;
40
Các toán tử tập hợp
Union: R ∪ SIn SQL:Select * From RUnion
Select * From S;
Intersection: R ∩ SIn SQL:Select * From RIntersectSelect * From S;
Difference: R - SIn SQL:Select * From RMinusSelect * From S;
41
Các toán tử trong SQL
Between, In, Like, Not
42
Các toán tử SQL
SELECT *FROM BookWHERE catno BETWEEN 200 AND 400;
SELECT *FROM ProductWHERE prod_desc BETWEEN ‘C’ AND ‘S’;
SELECT *FROM BookWHERE catno NOT BETWEEN 200 AND 400;
43
Các toán tử SQL
SELECT CatnoFROM LoanWHERE Date-Returned IS NULL;
SELECT CatnoFROM LoanWHERE Date-Returned IS NOT NULL;
44
Các toán tử SQL
SELECT NameFROM MemberWHERE memno IN (100, 200, 300, 400);
SELECT NameFROM MemberWHERE memno NOT IN (100, 200, 300, 400);
45
Các toán tử SQL SELECT Name FROM MemberWHERE address NOT LIKE ‘%Aberdeen%’;
SELECT Name FROM MemberWHERE Name LIKE ‘_ES%’;
Note: In MS Access, use * and # instead of % and _
46
Chọn giá trị phân biệt
Studentstud# name address100Fred Aberdeen200Dave Dundee300Bob Aberdeen
SELECT Distinct address FROM Student;
addressAberdeenDundee
47
Các bài tập về SQL
48
Lược đồ CSDL
• Professor(ssn, profname, status, salary)• Course(crscode, crsname, credits)• Taught(crscode, semester, ssn)
Giá định (1) Mỗi khóa học chỉ có một giáo sư phụ tráchtrong trong mỗi học kỳ; (2) tất cả giáo sư đều có lươngkhác nhau; (3) tất cả giáo sư có tên khác nhau; (4) tất cảkhóa học có tên khác nhau; (5) thuộc tính status có thểcó các giá trị “Full”, “Associate”, và “Assistant”.
49
Truy vấn 1
Liệt kê tất cả giáo sư đã dạy khóa họccó mã ‘CSC6710’ nhưng không dạykhóa học có mã ‘CSC7710’.
50
Lời giải ĐSQH
πssn(σcrscode=‘CSC6710’(Taught))-πssn(σcrscode=‘CSC7710’(Taught))
51
Lời giải SQL
(SELECT ssnFrom TaughtWhere crscode = ‘CSC6710’)EXCEPT(SELECT ssnFrom TaughtWhere crscode = ‘CSC7710’))
52
Truy vấn 2
Liệt kê các giáo sư đã dạy các khóa họccó mã ‘CSC6710’ và ‘CSC7710’.
53
Đại số quan hệ
πssn(σcrscode=‘CSC6710’ ∧ crscode=‘CSC7710’(Taught), SAI!
πssn(σcrscode=‘CSC6710’(Taught)) ∩πssn(σcrscode=‘CSC7710’(Taught)), ĐÚNG!
54
SQL
SELECT T1.ssn From Taught T1, Taught T2,Where T1.crscode = ‘CSC6710’ AND T2.crscode=‘CSC7710’ AND T1.ssn=T2.ssn
55
Truy vấn 3
Liệt kê các giáo sư không dạy môn cómã số ‘CSC7710’.
56
Đại số quan hệ
πssn(σcrscode<>‘csc7710’(Taught)), SAI!
πssn(Professor)-πssn(σcrscode=‘csc7710’(Taught)), ĐÚNG!
57
SQL
(SELECT ssnFrom Professor)EXCEPT(SELECT ssnFrom Taught TWhere T.crscode = ‘CSC7710’)
58
Truy vấn 4
Liệt kê các giáo sư đã dạy môn học cómã ‘CSC6710’ và ‘CSC7710” trongcùng một học kỳ
59
Đại số quan hệ
πssn(σcrscode1=‘CSC6710’(Taught[crscode1, ssn, semester]) σcrscode2=‘CSC7710’(Taught[crscode2, ssn, semester]))
60
SQL
SELECT T1.ssn From Taught T1, Taught T2,Where T1.crscode = ‘CSC6710’ AND T2.crscode=‘CSC7710’ AND T1.ssn=T2.ssn AND T1.semester=T2.semester
61
Truy vấn 5
Liệt kê các giáo sư đã dạy môn có mã‘CSC6710’ hay môn học có mã‘CSC7710” nhưng không dạy cả haimôn.
62
Đại số quan hệ
πssn(σcrscode=‘CSC6710’ ∨
crscode=‘CSC7710’(Taught))-(πssn(σcrscode=‘CSC6710’(Taught)) ∩πssn(σcrscode=‘CSC7710’(Taught)))
63
SQL
(SELECT ssnFROM Taught TWHERE T.crscode=‘CSC6710’ OR T.crscode=‘CSC7710’)Except(SELECT T1.ssn From Taught T1, Taught T2,Where T1.crscode = ‘CSC6710’) AND T2.crscode=‘CSC7710’ AND T1.ssn=T2.ssn)
64
Truy vấn 6
Trả về các khóa học không bao giờ mở.
65
Đại số quan hệ
πcrscode(Course)-πcrscode(Taught)
66
SQL
(SELECT crscodeFROM Course)EXCEPT(SELECT crscodeFROM TAUGHT)
67
Truy vấn 7
Liệt kê các khóa học được dạy tối thiểutrong 2 học kỳ.
68
Đại số quan hệ
πcrscode(σ semester1 <> semester2(
Taught[crscode, ssn1, semester1] Taught[crscode, ssn2, semester2]))
69
SQL
SELECT T1.crscodeFROM Taught T1, Taught T2WHERE T1.crscode=T2.crscode AND T1.semester <> T2.semester
70
Truy vấn 8
Liệt kê các khóa học được dạy trong ítnhất là 10 học kỳ.
71
SQL
SELECT crscodeFROM TaughtGROUP BY crscodeHAVING COUNT(*) >= 10
72
Truy vấn 9
Liệt kê các khóa học được dạy trong ítnhất là 5 giáo sư khác nhau.
73
SQL
SELECT crscodeFROM (SELECT DISTINCT crscode, ssn FROM TAUGHT) GROUP BY crscodeHAVING COUNT(*) >= 5
SELECT crscodeFROM Course CWHERE (SELECT COUNT(DISTINCT *) FROM Taught T
WHERE T.crscode = C.crscode) >=5.
74
Truy vấn 10
Liệt kê tên các giáo sư đã dạy khóa họccó mã ‘CSC6710’.
75
Đại số quan hệ
πprofname(σcrscode=‘CSC6710’(Taught) Professor)
76
SQL
SELECT P.profnameFROM Professor P, Taught TWHERE P.ssn = T.ssn AND T.crscode = ‘CSC6710’
77
Truy vấn 11
Liệt kê tên của các full professors đãdạy môn học có mã ‘CSC6710’.
78
Đại số quan hệ
πprofname(σcrscode=‘csc6710’(Taught) σstatus=‘full’(Professor))
79
SQL
SELECT P.profnameFROM Professor P, Taught TWHERE P.status = ‘full’ AND P.ssn = T.ssn AND T.crscode = ‘CSC6710’
80
Truy vấn 12
Liệt kê tên của các full professors đãdãy ít nhất là 2 khóa học trong một họckỳ.
81
Đại số quan hệ
πprofname(πssn(σ crscode1 <> crscode2(
Taught[crscode1, ssn, semester] Taught[crscode2, ssn, semester])))
σ status=‘full’(Professor))
82
SQL
SELECT P.profnameFROM Professor P, Taught T1, Taught T2WHERE P.status = ‘Full’ AND P.ssn = T1.ssn AND T1.ssn = T2.ssnAND T1.crscode <> T2.crscode AND T1.semester = T2.semester
83
SQL
SELECT P.profnameFROM Professor PWHERE status = ‘Full’ AND ssn IN(SELECT ssnFROM TaughtGROUP BY ssn, semesterHAVING COUNT(*) >= 2)
84
Truy vấn 13
Xóa các giáo sư không dạy khóa họcnào.
85
SQL
DELETE FROM ProfessorWHERE ssn NOT IN(SELECT ssnFROM Taught)
86
SQL
DELETE FROM ProfessorWHERE ssn IN((SELECT ssn FROM Professor)EXCEPT(SELECT ssn FROM Taught))
87
SQL
DELETE FROM Professor PWHERE NOT EXISTS(SELECT * FROM Taught T WHERE T.ssn = P.ssn)
88
Truy vấn 14
Đổi tất cả tín chỉ (credits) sang 4 chocác khóa học được giảng dạy trong họckỳ mùa thu năm 2006 (f2006 semester).
89
SQL
UPDATE CourseSET credits = 4WHERE crscode IN(
SELECT crscodeFROM Taught WHERE semester = ‘f2006’
)
90
Truy vấn 15
Liệt kê tên của các giáo sư đã dạy hơn30 tín chỉ khóa học.
91
SQL
SELECT profnameFROM ProfessorWHERE ssn IN(
SELECT T.ssnFROM Taught T, Course CWHERE T.crscode = C.crscodeGROUP BY T.ssnHAVING SUM(C.credits) > 30
)
92
Truy vấn 16
Liệt kê tên của các giáo sư đã dạy nhiềukhóa học nhất trong học kỳ mùa xuânnăm 2006 (S2006).
93
SQL
SELECT profnameFROM Professor WHERE ssn IN(
SELECT ssn FROM Taught WHERE semester = ‘S2006’GROUP BY ssnHAVING COUNT(*) =
(SELECT MAX(Num)FROM
(SELECT ssn, COUNT(*) as NumFROM TaughtWHERE semester = ‘S2006’GROUP BY ssn)
))
94
Truy vấn 17
Liệt kê tên các khóa học mà giáo sư‘Smith” đã dạy trong học kỳ mùa thunăm 2007.
95
Đại số quan hệ
πcrsname(σprofname=‘Smith’(Professor) σsemester=‘f2007’(Taught)
Course)
96
SQL
SELECT crsnameFROM Professor P, Taught T, Course CWHERE P.profname = ‘Smith’ AND P.ssn = T.ssn AND T.semester = ‘F2007’ AND T.crscode = C.crscode
97
Truy vấn 18
Hãy liệt kê theo thứ tự thời gian cáckhóa học mà giáo sư có mã số ssn = 123456789 đã dạy trong từng học kỳ.
98
SQL
SELECT semester, COUNT(*)FROM TaughtWHERE ssn = ‘123456789’GROUP BY semesterORDER BY semester ASC
99
Truy vấn 19
Hãy liệt kê theo thứ tự từ điển tên củatừng giáo sư và số các khóa học đãgiảng dạy.
100
SQL
SELECT P.profname, COUNT(*)FROM Professor P, Taught TWHERE P.ssn = T.ssnGROUP BY P.ssn, P.profnameORDER BY P.profname ASC
101
Truy vấn 20
Xóa các giáo sư đã dạy ít hơn 10 khóahọc.
102
SQL
DELETE FROM ProfessorWHERE ssn IN(
SELECT ssnFROM TaughtGROUP BY ssnHAVING COUNT(*) < 10
)
103
Truy vấn 21
Xóa các giáo sư đã dạy ít hơn 40 tínchỉ.
104
SQL
DELETE FROM ProfessorWHERE ssn IN(
SELECT T.ssnFROM Taught T, Course CWHERE T.crscode = C.crscodeGROUP BY ssnHAVING SUM(C.credits) < 40
)
105
Truy vấn 22
Liệt kê các giáo sư không dạy bất kỳkhóa học nào trong 3 học kỳ (F2006, W2007, F2007).
106
SQL
SELECT *FROM Professor PWHERE NOT EXISTS(
SELECT *FROM TaughtWHERE P.ssn = T.ssn AND (T.semester = ‘F2006’ OR T.semester = ‘W2007’ OR T.semester=‘F2007’))
)
107
Truy vấn 23
Liệt kê tên các khóa học mà giáo sưSmith không dạy.
108
Đại số quan hệ
πcrsname(Course) -πcrsname(σprofname=‘Smith’(Professor) (Taught) Course)
109
SQL
SELECT crsnameFROM Course CWHERE NOT EXISTS
SELECT *FROM Professor P, Taught TWHERE P.profname=‘Smith’ AND P.ssn = T.ssn AND
T.crscode = C.crscode)
110
Truy vấn 24
Liệt kê tên các khóa học được giảngdạy bởi tất cả giáo sư.
111
Đại số quan hệ
πcrscode, ssn(Taught)/ πssn(Professor)
112
SQL
SELECT crscodeFROM Taught T1WHERE NOT EXISTS(
(SELECT ssnFROM Professor)EXCEPT(SELECT ssnFROM Taught T2WHERE T2.crscode = T1.crscode)
)
113
Truy vấn 25
Liệt kê tên của các khóa học đượcgiảng dạy trong tất cả các học kỳ.
114
Đại số quan hệ
πcrscode, semester(Taught)/ πsemester(Taught)
115
SQL
SELECT crscodeFROM Taught T1WHERE NOT EXISTS(
(SELECT semesterFROM Taught)EXCEPT(SELECT semesterFROM Taught T2WHERE T2.crscode = T1.crscode)
)
116
Truy vấn 26
Liệt kê các khóa học CHỈ được giảngdạy bởi các trợ lý giáo sư (assisitant) professors.
117
Đại số quan hệ
πcrscode(Course) - πcrscode(σstatus≠‘Assistant’(Professor) Taught)
118
SQL
SELECT crscodeFROM Course CWHERE c.crscode NOT IN(
(SELECT crscodeFROM Taught T, Professor PWHERE T.ssn = P.ssn AND P.status=‘Junior’
)
119
Truy vấn 27
Liệt kê tên của các giáo sư giảng dạynhiều khóa học nhất trong học kỳ Fall 2001.
120
SQL SolutionSELECT *FROM Professor P1WHERE Not EXISTS(
SELECT * FROM Professor P2WHERE(
(SELECT COUNT(*)FROM Taught WHERE Taught.ssn = P2.ssn AND
Taught.semester=‘F2001’)> (SELECT COUNT(*)FROM Taught WHERE Taught.ssn = P1.ssn AND
Taught.semester=‘F2001’))
121
Truy vấn 28
Liệt kê tên của giáo sư có lương caonhất.
122
SQL Solution
SELECT *FROM ProfessorWHERE salary = (
(SELECT MAX(salary)FROM Professor P
)
123
Truy vấn 29
Liệt kê tên của giáo sư có lương caoxếp thứ nhì.
124
SQL Solution
SELECT *FROM Professor P1WHERE 1 = (
(SELECT COUNT(*)FROM Professor P2WHERE P2.salary > P1.salary
)