sailors 水手信息表
boats 船信息表
reserves 水手订船信息表
CREATE TABLE sailors(
sid VARCHAR(20) PRIMARY KEY,
sname VARCHAR(20),
rating INT,
age REAL
);
CREATE TABLE boats(
bid VARCHAR(20) PRIMARY KEY,
bname VARCHAR(20),
color VARCHAR(20)
);
CREATE TABLE reserves(
sid VARCHAR(20),
bid VARCHAR(20),
day TIMESTAMP,
CONSTRAINT fk_sid FOREIGN KEY (sid) REFERENCES sailors(sid),
CONSTRAINT fk_bid FOREIGN KEY (bid) REFERENCES boats(bid),
CONSTRAINT pk PRIMARY KEY (sid,bid)
);
0.查找只定过红色船的水手姓名
SELECT sid, sname
FROM sailors
WHERE sid in (
SELECT DISTINCT sid
FROM reserves
) AND sid not in (
SELECT DISTINCT sid
FROM reserves as r
JOIN boats as b
ON r.bid = b.bid
WHERE b.color != '红色'
)
1.查找定了103号船的水手的名字 OK
SELECT sname
FROM sailors
WHERE sid in (
SELECT DISTINCT sid
FROM reserves
WHERE bid = 3
)
2.查找定了红色船水手的姓名 OK
SELECT sname
FROM sailors
WHERE sid in (
SELECT distinct sid
FROM reserves as r
JOIN boats as b
ON r.bid = b.bid
WHERE b.color = '红色'
)
3.将年龄小于30的水手级别+1 OK
UPDATE sailors
SET rating = rating + 1
WHERE age < 30;
4.查找定了红色船而没有定绿色船的水手姓名 OK
SELECT SNAME
FROM sailors as s
WHERE s.sid IN (
SELECT DISTINCT r.sid
FROM reserves as r
JOIN boats as b
ON r.bid = b.bid
WHERE color = '红色'
)
AND s.sid NOT IN (
SELECT DISTINCT r.sid
FROM reserves as r
JOIN boats as b
ON r.bid = b.bid
WHERE color = '绿色'
);
5.查找没有定过船的水手信息 OK
SELECT *
FROM sailors as s
WHERE s.sid not in (
SELECT DISTINCT sid
FROM reserves
)
6.查找定过船而没有定过红色船的水手信息 OK
SELECT *
FROM sailors as s
WHERE s.sid in (
SELECT DISTINCT sid
FROM reserves
) AND s.sid not in (
SELECT distinct sid
FROM reserves as r
JOIN boats as b
ON r.bid = b.bid
WHERE color = '红色'
)
7.查找没有定过红色船的水手信息 OK
SELECT *
FROM sailors as s
where s.sid not in (
SELECT distinct sid
FROM reserves as r
JOIN boats as b
ON r.bid = b.bid
WHERE color = '红色'
)
8.查找定过所有船的水手姓名和编号 OK
CREATE view v_order
AS
SELECT DISTINCT sid, bid
FROM reserves;
SELECT sid, sname
FROM sailors
WHERE sid in (
SELECT sid
FROM v_order
GROUP BY sid
HAVING count(*) = (
SELECT count(*)
FROM boats
)
)
9.查找年龄最大的水手姓名和年龄 OK
SELECT *
FROM sailors
ORDER BY age DESC
LIMIT 0,1
-- pos len
10.统计水手表中每个级别组的平均年龄和级别组 OK
SELECT rating, avg(age) as avg_age
FROM sailors
GROUP BY rating
11.统计水手表中每个人数不少于2人的级别组中 年满18岁水手 的平均年龄和级别组
SELECT rating, avg(age) as avgage
FROM sailors
WHERE rating in (
SELECT rating
FROM sailors
GROUP BY rating
HAVING count(*) >= 2
) AND age >= 18
GROUP BY rating
12.统计水手表中每个级别组的人数
SELECT rating, count(*)
FROM sailors
GROUP BY rating
13.统计水手表中人数最少的级别组及人数
SELECT rating, count(*) as cnt
FROM sailors
GROUP BY rating
ORDER BY count(*)
LIMIT 1