Tutorial 5: Advanced SQL
Tutorial 5: Advanced SQL
Q1: Find the average age of all sailors with a rating of 10.
Q3: Find the age of the youngest sailor for each rating level.
Q4: For each red boat, find the number of reservations for this boat
Q5: Find sailors whose rating is greater than that of some sailor
called Tom. Use SOME.
SELECT sid
FROM Sailors
WHERE rating > SOME (SELECT rating
FROM Sailors
WHERE sname=‘Tom’)
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
Q6: Find sailors whose rating is greater than every sailor called Tom. Use
ALL.
SELECT sid
FROM Sailors
WHERE rating > ALL (SELECT rating
FROM Sailors
WHERE sname=‘Tom’)
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
Q7: Find the sailors with the lowest rating. Use ALL.
SELECT sid
FROM Sailors
WHERE rating <= ALL (SELECT rating
FROM Sailors)
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
Q9: Find the name of sailors who are older than the oldest sailors with a
rating of 10.
SELECT sname
FROM Sailors
WHERE age > ( SELECT MAX (age)
FROM Sailors
WHERE rating = 10)
OR
SELECT sname
FROM Sailors
WHERE age > ALL ( SELECT age
FROM Sailors
WHERE rating = 10)
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
Q10: Find names of sailors who’ve reserved boat #103. Use EXISTS.
SELECT sname
FROM Sailors S
WHERE EXISTS (SELECT *
FROM Reserves R
WHERE R.bid=103 AND S.sid=R.sid)
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
Q11: Find names of sailors who’ve made at most one reservation for boat
#103. Use nested query.
SELECT sname
FROM Sailors S
WHERE 2 > (SELECT COUNT(*)
FROM Reserves R
WHERE R.bid=103 AND S.sid=R.sid)
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
Q12: Find the sailors who have made reservations for all red boats.
Q13: Find names of sailors who’ve reserved boat #103. Use IN.
SELECT sname
FROM Sailors
WHERE sid IN (SELECT sid
FROM Reserves
WHERE bid=103)
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
Q14: Find names of sailors who’ve reserved a red boat. Use IN.
SELECT sname
FROM Sailors
WHERE sid IN (SELECT sid
FROM Reserves
WHERE bid IN (SELECT bid
FROM Boats
WHERE color=‘red’))
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
Q15: Find names of sailors who’ve NOT reserved a red boat. Use NOT IN
and IN.
SELECT sname
FROM Sailors
WHERE sid NOT IN (SELECT sid
FROM Reserves
WHERE bid IN (SELECT bid
FROM Boats
WHERE color=‘red’))
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
Q16: Find names of sailors who’ve reserved a boat that is NOT red. Use
NOT IN and IN.
SELECT sname
FROM Sailors
WHERE sid IN (SELECT sid
FROM Reserves
WHERE bid NOT IN (SELECT bid
FROM Boats
WHERE color=‘red’))
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
Q17: Find names of sailors who’ve NOT reserved a boat that is NOT red.
(i.e., who have reserved only red boats or haven’t reserved any boat.) Use
NOT IN.
SELECT sname
FROM Sailors
WHERE sid NOT IN (SELECT sid
FROM Reserves
WHERE bid NOT IN (SELECT bid
FROM Boats
WHERE color=‘red’))
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
SELECT sid
FROM Reserves
GROUP BY sid, day
HAVING count(*) > 1
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)
SELECT sname
FROM Reserves R, Sailors S
WHERE R.sid = S.sid
GROUP BY R.sid, day, sname
HAVING count(*) > 1
Sailors S
sid sname rating age
22 dustin 7 45
31 lubber 8 55
58 rusty 10 35
40 justin 9 30
Reserves R Boats B
sid bid day bid bname color
22 104 02/28/07 101 Interlake blue
22 102 02/28/07 102 Interlake red
58 103 03/12/07 103 Clipper green
40 104 03/12/07 104 Marine red
40 103 03/13/08