SQL练习 (水手 船 订购信息)

sailors 水手信息表

boats 船信息表
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
发布了123 篇原创文章 · 获赞 1 · 访问量 5436

猜你喜欢

转载自blog.csdn.net/bijingrui/article/details/105034096