数据库原理理论sql练习2

Uncategorized
16k words

前言(注意!!!)

理论SQLoj题目发现有如下错误
1.第二题查找的电影发行年份(电影上映日期字段中提取),排序才是按前面的电影年份。( 非错误,应该是理解会有歧义的题目描述)
2.第11题查询喜剧电影中评分最高的前三名的电影名称,除名称外还需要返回这三者的评分(题目错误
3.第12题查询与唐国强共同出演同一部影片的演员id和姓名(实际要求的答案是演员姓名和id(顺序描述错误))(题目错误
4.第14题查询评分最高的科幻电影的名称。除了名称之外还需要返回其平均评分。(题目错误

题目要求
1.列出所有姓张的导演的导演编号和姓名信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
数据库结构
movies数据库
+-------------------------+
| Tables in this database |
+-------------------------+
| actor |
| awards |
| director |
| genres |
| movie |
| movie_awards |
| movie_cast |
| movie_direction |
| movie_genres |
| rating |
| reviewer |
+-------------------------+

actor
+------------+-------------+
| Field | Type |
+------------+-------------+
| act_id | int(11) |
| act_name | varchar(50) |
| act_gender | char(1) |
+------------+-------------+

actor
+--------+-------------+------------+
| act_id | act_name | act_gender |
+--------+-------------+------------+
| 5001 | 唐国强 | 男 |
| 5002 | 张国立 | 男 |
| 5003 | 巩俐 | 女 |
| 5004 | 葛优 | 男 |
| 5005 | 张小斐 | 女 |
| 5006 | 周迅 | 女 |
| 5007 | 汤姆·克鲁斯 | 男 |
| 5008 | 刘若英 | 女 |
| 5009 | 鲍国安 | 男 |
| 5010 | 张译 | 男 |
| 5011 | 尊龙 | 男 |
| 5012 | 邬君梅 | 女 |
| 5013 | 马丽 | 女 |
| 5014 | 沈腾 | 男 |
+--------+-------------+------------+

awards
+-----------+-------------+
| Field | Type |
+-----------+-------------+
| awd_id | int(11) |
| awd_level | varchar(50) |
| awd_name | varchar(50) |
| awd_loc | varchar(50) |
+-----------+-------------+

awards
+--------+-----------+----------------------+----------+
| awd_id | awd_level | awd_name | awd_loc |
+--------+-----------+----------------------+----------+
| 401 | 国际 | 奥斯卡金像奖 | 美国 |
| 402 | 国际 | 戛纳电影节金棕榈奖 | 法国 |
| 403 | 国际 | 威尼斯电影节金狮奖 | 意大利 |
| 404 | 国际 | 柏林国际电影节金熊奖 | 德国 |
| 405 | 国内 | 中国电影金鸡奖 | 中国 |
| 406 | 国内 | 大众电影百花奖 | 中国 |
| 407 | 国内 | 香港电影金像奖 | 中国香港 |
| 408 | 国内 | 台湾电影金马奖 | 中国台湾 |
| 409 | 国内 | 中国电影华表奖 | 中国 |
| 410 | 国际 | 亚太国际电影节 | 亚洲 |
| 411 | 国内 | 华鼎奖 | 中国 |
| 412 | 国际 | 长春国际电影节 | 中国 |
+--------+-----------+----------------------+----------+

director
+------------+-------------+
| Field | Type |
+------------+-------------+
| dir_id | int(11) |
| dir_name | varchar(50) |
| dir_gender | char(1) |
+------------+-------------+

director
+--------+-------------------+------------+
| dir_id | dir_name | dir_gender |
+--------+-------------------+------------+
| 201 | 娄烨 | 男 |
| 202 | 张艺谋 | 男 |
| 203 | 贾玲 | 女 |
| 204 | 张艾嘉 | 女 |
| 205 | 吴宇森 | 男 |
| 206 | 田晓鹏 | 男 |
| 207 | 谢晋 | 男 |
| 208 | 郭帆 | 男 |
| 209 | 文牧野 | 男 |
| 210 | 韩三平 | 男 |
| 211 | 黄建新 | 男 |
| 212 | 贝纳尔多·贝托鲁奇 | 男 |
| 213 | 张迟昱 | 男 |
+--------+-------------------+------------+

genres
+-----------+-------------+
| Field | Type |
+-----------+-------------+
| gen_id | int(11) |
| gen_title | varchar(50) |
+-----------+-------------+

genres
+--------+-----------+
| gen_id | gen_title |
+--------+-----------+
| 301 | 动作 |
| 302 | 喜剧 |
| 303 | 科幻 |
| 304 | 恐怖 |
| 305 | 爱情 |
| 306 | 剧情 |
| 307 | 动画 |
| 308 | 冒险 |
| 309 | 悬疑 |
| 310 | 武打仙侠 |
| 311 | 奇幻 |
| 312 | 家庭 |
| 313 | 传记 |
| 314 | 历史 |
| 315 | 战争 |
| 316 | 音乐 |
| 317 | 纪录片 |
| 318 | 西部 |
| 319 | 体育 |
| 320 | 惊悚 |
+--------+-----------+

movie
+----------------+-------------+
| Field | Type |
+----------------+-------------+
| mov_id | int(11) |
| mov_title | varchar(50) |
| mov_year | int(11) |
| mov_time | int(11) |
| mov_lang | varchar(50) |
| mov_dt_rel | date |
| mo_rel_country | varchar(50) |
+----------------+-------------+

movie
+--------+------------------+----------+----------+----------+------------+----------------+
| mov_id | mov_title | mov_year | mov_time | mov_lang | mov_dt_rel | mo_rel_country |
+--------+------------------+----------+----------+----------+------------+----------------+
| 101 | 建国大业 | 2009 | 140 | 普通话 | 2009-09-16 | 中国 |
| 102 | 苏州河 | 1998 | 83 | 普通话 | 2000-09-07 | 中国 |
| 103 | 你好李焕英 | 2020 | 128 | 普通话 | 2021-02-12 | 中国 |
| 104 | 末代皇帝 | 1986 | 163 | 普通话 | 1987-10-23 | 意大利 |
| 105 | 活着 | 1994 | 132 | 普通话 | 1994-06-30 | 中国 |
| 106 | 第二十一条 | 2024 | 141 | 普通话 | 2024-02-10 | 中国 |
| 107 | 我不是药神 | 2017 | 117 | 普通话 | 2018-07-05 | 中国 |
| 108 | 鸦片战争 | 1996 | 153 | 普通话 | 1997-06-09 | 中国 |
| 109 | 赤壁 | 2008 | 145 | 普通话 | 2008-07-10 | 中国 |
| 110 | 碟中谍2 | 1999 | 123 | 英语 | 2000-05-24 | 美国 |
| 111 | 流浪地球 | 2017 | 125 | 普通话 | 2019-02-05 | 中国 |
| 112 | 西游记之大圣归来 | 2015 | 89 | 普通话 | 2015-07-10 | 中国 |
| 113 | 少女小渔 | 1994 | 104 | 普通话 | 1995-04-22 | 中国台湾 |
| 114 | 归来 | 2013 | 111 | 普通话 | 2014-05-16 | 中国 |
| 115 | 独行月球 | 2022 | 122 | 普通话 | 2022-07-29 | 中国 |
+--------+------------------+----------+----------+----------+------------+----------------+

movie_awards
+----------+-------------+
| Field | Type |
+----------+-------------+
| mov_id | int(11) |
| awd_id | int(11) |
| awd_type | varchar(50) |
+----------+-------------+

movie_awards
+--------+--------+------------------+
| mov_id | awd_id | awd_type |
+--------+--------+------------------+
| 101 | 405 | 最佳录音 |
| 101 | 406 | 最佳故事片 |
| 101 | 409 | 优秀导演 |
| 101 | 409 | 优秀故事片 |
| 101 | 409 | 优秀电影音乐 |
| 101 | 412 | 最佳华语故事片奖 |
| 103 | 405 | 最佳女主角 |
| 103 | 405 | 最佳女配角 |
| 103 | 405 | 最佳导演处女作 |
| 104 | 401 | 最佳导演 |
| 104 | 401 | 最佳影片 |
| 104 | 401 | 最佳改编剧本 |
| 105 | 402 | 最佳男演员 |
| 105 | 402 | 评审团 |
| 107 | 405 | 最佳导演处女作 |
| 107 | 406 | 优秀影片 |
| 107 | 406 | 最佳男配角 |
| 107 | 407 | 最佳两岸华语电影 |
| 107 | 411 | 中国最佳影片 |
| 107 | 411 | 中国电影最佳导演 |
| 108 | 405 | 最佳故事片 |
| 111 | 405 | 最佳录音 |
| 111 | 405 | 最佳故事片 |
| 113 | 408 | 最佳女主角 |
| 113 | 410 | 最佳女主角 |
| 113 | 410 | 最佳电影 |
+--------+--------+------------------+

movie_cast
+-----------+-------------+
| Field | Type |
+-----------+-------------+
| act_id | int(11) |
| mov_id | int(11) |
| role_name | varchar(50) |
+-----------+-------------+

movie_cast
+--------+--------+-----------+
| act_id | mov_id | role_name |
+--------+--------+-----------+
| 5001 | 101 | 毛泽东 |
| 5002 | 101 | 蒋介石 |
| 5003 | 105 | 家珍 |
| 5003 | 114 | 冯婉瑜 |
| 5004 | 105 | 福贵 |
| 5005 | 103 | 李焕英 |
| 5006 | 102 | 牡丹 |
| 5007 | 110 | 伊森·亨特 |
| 5008 | 113 | 小渔 |
| 5009 | 108 | 林则徐 |
| 5011 | 104 | 溥仪 |
| 5013 | 106 | 李茂娟 |
| 5013 | 115 | 马蓝星 |
| 5014 | 115 | 独孤月 |
+--------+--------+-----------+

movie_direction
+--------+---------+
| Field | Type |
+--------+---------+
| dir_id | int(11) |
| mov_id | int(11) |
+--------+---------+

movie_direction
+--------+--------+
| dir_id | mov_id |
+--------+--------+
| 201 | 102 |
| 202 | 105 |
| 202 | 106 |
| 202 | 114 |
| 203 | 103 |
| 204 | 113 |
| 205 | 109 |
| 205 | 110 |
| 206 | 112 |
| 207 | 108 |
| 208 | 111 |
| 209 | 107 |
| 210 | 101 |
| 211 | 101 |
| 212 | 104 |
| 213 | 115 |
+--------+--------+

movie_genres
+--------+---------+
| Field | Type |
+--------+---------+
| mov_id | int(11) |
| gen_id | int(11) |
+--------+---------+

movie_genres
+--------+--------+
| mov_id | gen_id |
+--------+--------+
| 101 | 306 |
| 101 | 314 |
| 102 | 306 |
| 103 | 302 |
| 103 | 311 |
| 104 | 306 |
| 104 | 314 |
| 105 | 306 |
| 106 | 306 |
| 107 | 306 |
| 108 | 314 |
| 109 | 314 |
| 109 | 315 |
| 110 | 301 |
| 111 | 303 |
| 112 | 307 |
| 113 | 306 |
| 114 | 306 |
| 115 | 302 |
| 115 | 303 |
+--------+--------+

rating
+---------------+--------------+
| Field | Type |
+---------------+--------------+
| mov_id | int(11) |
| rev_id | int(11) |
| rev_stars | decimal(3,2) |
| num_o_ratings | int(11) |
+---------------+--------------+

rating
+--------+--------+-----------+---------------+
| mov_id | rev_id | rev_stars | num_o_ratings |
+--------+--------+-----------+---------------+
| 101 | 8001 | 7.39 | 25111 |
| 101 | 8003 | 8.78 | 11158 |
| 101 | 8004 | 8.56 | 88899 |
| 101 | 8005 | 9.11 | 55557 |
| 101 | 8006 | 9.00 | 4444 |
| 101 | 8007 | 8.88 | 56455 |
| 101 | 8008 | 9.40 | 5263 |
| 101 | 8012 | 8.00 | 88649 |
| 101 | 8013 | 7.99 | 5586 |
| 101 | 8014 | 8.11 | 91542 |
| 102 | 8011 | 8.56 | 16942 |
| 103 | 8007 | 8.52 | 12561 |
| 103 | 8008 | 8.77 | 1154 |
| 103 | 8012 | 8.99 | 21020 |
| 103 | 8013 | 9.22 | 2112 |
| 103 | 8014 | 6.66 | 21211 |
| 104 | 8004 | 7.22 | 1212 |
| 105 | 8002 | 7.46 | 21567 |
| 106 | 8008 | 7.98 | 4582 |
| 107 | 8001 | 9.00 | 84478 |
| 107 | 8006 | 6.98 | 68545 |
| 108 | 8011 | 8.66 | 87448 |
| 109 | 8012 | 8.46 | 7145 |
| 110 | 8007 | 8.75 | 31555 |
| 111 | 8008 | 8.90 | 65841 |
| 113 | 8009 | 6.98 | 544 |
| 114 | 8010 | 7.50 | 26923 |
| 115 | 8010 | 7.40 | 93838 |
+--------+--------+-----------+---------------+

reviewer
+----------+-------------+
| Field | Type |
+----------+-------------+
| rev_id | int(11) |
| rev_name | varchar(50) |
+----------+-------------+

reviewer
+--------+----------+
| rev_id | rev_name |
+--------+----------+
| 8001 | 王小小 |
| 8002 | 青丝 |
| 8003 | 墨染 |
| 8004 | 谦谦君子 |
| 8005 | 乐淘淘 |
| 8006 | 张思睿 |
| 8007 | 吴赛文 |
| 8008 | 蒋艾特 |
| 8009 | 格物阳明 |
| 8010 | 东坡居士 |
| 8011 | 流云 |
| 8012 | 扬帆 |
| 8013 | 李欢笑 |
| 8014 | 宋礼 |
+--------+----------+
1
2
3
4
SELECT dir_id, dir_name
FROM director
WHERE dir_name LIKE '张%';

2.查找在2010-2020年期间拍摄的电影信息,包括电影编号,电影名称和电影发行年份,查询结果按电影年份升序排序。

1
2
3
4
5
6
7
8
9
10
SELECT 
mov_id,
mov_title,
YEAR(mov_dt_rel) AS release_year
FROM
movie
WHERE
mov_year BETWEEN 2010 AND 2020
ORDER BY
release_year ASC;

3.找出那些没有参演任何影片的演员,输出这些演员的ID信息。

1
2
3
4
SELECT act_id
FROM actor
WHERE act_id NOT IN (SELECT DISTINCT act_id FROM movie_cast);

4.编写一个SQL查询,查找所有评分为8星或8星以上的评论者的昵称。

1
2
3
4
5
SELECT DISTINCT r.rev_name
FROM reviewer r
JOIN rating rt ON r.rev_id = rt.rev_id
WHERE rt.rev_stars >= 8;
# 这个查询通过连接reviewer表和rating表,选择所有评分大于或等于8的评论者的昵称,并确保结果中没有重复的昵称。

5.查询电影《活着》的所有演员信息,返回演员表的所有字段。

1
2
3
4
5
6
SELECT a.*
FROM actor a
JOIN movie_cast mc ON a.act_id = mc.act_id
JOIN movie m ON mc.mov_id = m.mov_id
WHERE m.mov_title = '活着';
# 这个查询通过连接actor、movie_cast和movie表,选择电影《活着》的所有演员信息。

6.查询平均评分最高的电影ID和名称,平均评分,参评人数.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
### 参考答案
SELECT
m.mov_id,
m.mov_title,
AVG(r.rev_stars) AS average_rating,
SUM(r.num_o_ratings) AS total_ratings
FROM
movie m
JOIN
rating r ON m.mov_id = r.mov_id
GROUP BY
m.mov_id, m.mov_title
ORDER BY
average_rating DESC, total_ratings DESC
LIMIT 1;

1
2
3
4
5
6
7
8
### 可能(错误)的答案
SELECT m.mov_id, m.mov_title, AVG(r.rev_stars) AS avg_rating, COUNT(r.rev_id) AS num_of_ratings
FROM rating r
JOIN movie m ON r.mov_id = m.mov_id
GROUP BY m.mov_id, m.mov_title
ORDER BY avg_rating DESC
LIMIT 1;

分析:
你提到的查询与之前的查询有几个关键区别:

  1. 聚合函数的使用

    • 你提供的查询使用了 SUM(r.num_o_ratings),这是计算每部电影的总评分人数,而我之前的查询是使用 COUNT(r.rev_id),计算的是评论数量。
  2. 排序依据

    • 你的查询首先按 average_rating 排序,然后按 total_ratings 排序,以确保在平均评分相同的情况下,评论人数更多的电影排在前面。而我之前的查询只按 average_rating 排序。
  3. 别名命名

    • 在你的查询中,平均评分使用了 average_rating 作为别名,而之前的查询使用了 avg_rating

总体来说,你的查询更全面,能够提供更精准的结果,尤其是在处理评分相同的电影时。

7.列出所有获奖项目超过3项(不包含3项)的电影ID和获奖类型以及奖项编号信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
## 参考答案
-- 首先,找出获奖项目超过3项的电影ID
WITH movie_award_counts AS (
SELECT
mov_id,
COUNT(DISTINCT awd_id) AS award_count
FROM
movie_awards
GROUP BY
mov_id
HAVING
COUNT(DISTINCT awd_id) > 3
)

-- 然后,获取这些电影的具体获奖信息
SELECT
ma.mov_id,
ma.awd_type,
ma.awd_id
FROM
movie_awards ma
JOIN
movie_award_counts mac ON ma.mov_id = mac.mov_id
ORDER BY
ma.mov_id, ma.awd_id;

1
2
3
4
5
6
7
# 可能错误的答案
SELECT ma.mov_id, aw.awd_level, ma.awd_id
FROM movie_awards ma
JOIN awards aw ON ma.awd_id = aw.awd_id
GROUP BY ma.mov_id, aw.awd_level, ma.awd_id
HAVING COUNT(ma.awd_id) > 3;

分析:
参考答案与之前的查询有几个主要区别:

  1. 使用了CTE(公共表表达式)

    • 参考答案首先通过CTE movie_award_counts 找出获奖项目超过3项的电影ID。这样可以分步处理,提高可读性。
  2. DISTINCT关键字

    • 参考答案中的 COUNT(DISTINCT awd_id) 确保计算唯一的获奖项目,而我之前的查询没有使用 DISTINCT,可能会导致计数重复的获奖项目。
  3. 分开查询逻辑

    • 参考答案将获取获奖信息的步骤与计数分开,首先筛选出符合条件的电影ID,然后在第二步中查询这些电影的具体获奖信息。这种方法更清晰,容易理解。
  4. 排序

    • 参考答案在结果中添加了 ORDER BY ma.mov_id, ma.awd_id,这使得结果按照电影ID和奖项编号进行排序,增强了结果的可读性。

总结来说,参考答案通过分步处理和使用 DISTINCT 来确保准确性和可读性,是一种更为精确和清晰的查询方法。

8.查询有不少于3位评论者进行打分的电影片名和最高评分分数。

1
2
3
4
5
6
7
8
9
10
11
12
13
## 正确答案一
SELECT
m.mov_title,
MAX(r.rev_stars) AS highest_rating
FROM
movie m
JOIN
rating r ON m.mov_id = r.mov_id
GROUP BY
m.mov_id, m.mov_title
HAVING
COUNT(DISTINCT r.rev_id) >= 3;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
## 正确答案2
-- 首先,找出评论者数量不少于3的电影ID
WITH movie_reviewer_counts AS (
SELECT
mov_id,
COUNT(DISTINCT rev_id) AS reviewer_count
FROM
rating
GROUP BY
mov_id
HAVING
COUNT(DISTINCT rev_id) >= 3
),

-- 然后,找到这些电影的最高评分
max_ratings AS (
SELECT
mov_id,
MAX(rev_stars) AS max_rating
FROM
rating
WHERE
mov_id IN (SELECT mov_id FROM movie_reviewer_counts)
GROUP BY
mov_id
)

-- 最后,获取这些电影的片名和最高评分
SELECT
m.mov_title,
mr.max_rating
FROM
movie m
JOIN
max_ratings mr ON m.mov_id = mr.mov_id;

9.找出所有参演了电影“建国大业”的演员姓名和ID

1
2
3
4
5
6
7
8
9
10
11
12
-- 选择参演了电影“建国大业”的演员姓名和ID
SELECT
a.act_name,
a.act_id
FROM
actor a
JOIN
movie_cast mc ON a.act_id = mc.act_id
JOIN
movie m ON mc.mov_id = m.mov_id
WHERE
m.mov_title = '建国大业';

1
2
3
4
5
SELECT a.act_id, a.act_name
FROM actor a
JOIN movie_cast mc ON a.act_id = mc.act_id
WHERE mc.mov_id = 101; -- 电影《建国大业》的ID为101

10.查询所有电影信息,包括电影ID,电影名,是否获奖,获奖数量(未获奖是数量为0)
–其中“是否获奖”列要求:如果电影获至少一项奖时,显示“是”,否则显示“否”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
m.mov_id,
m.mov_title,
CASE
WHEN COUNT(ma.awd_id) > 0 THEN '是'
ELSE '否'
END AS 是否获奖,
COUNT(ma.awd_id) AS 获奖数量
FROM
movie m
LEFT JOIN
movie_awards ma ON m.mov_id = ma.mov_id
GROUP BY
m.mov_id, m.mov_title;

分析:
LEFT JOIN 用于连接 movie 表和 movie_awards 表,以确保所有电影都被列出,即使没有获奖。
CASE 语句用于判断电影是否获奖,若获奖数量大于0则显示“是”,否则显示“否”。
COUNT(ma.awd_id) 用于计算获奖数量,未获奖的电影将显示为0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
## 答案2
-- 计算每部电影的获奖数量
WITH movie_award_counts AS (
SELECT
mov_id,
COUNT(*) AS award_count
FROM
movie_awards
GROUP BY
mov_id
)

-- 查询所有电影信息,包括电影ID、电影名、是否获奖以及获奖数量
SELECT
m.mov_id,
m.mov_title,
CASE
WHEN mac.award_count > 0 THEN '是'
ELSE '否'
END AS 是否获奖,
COALESCE(mac.award_count, 0) AS 获奖数量
FROM
movie m
LEFT JOIN
movie_award_counts mac ON m.mov_id = mac.mov_id
ORDER BY
m.mov_id;

11.查询“喜剧”电影中,评分最高的前3名的电影名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
## 正确答案
-- 首先,找出所有属于“喜剧”类型的电影ID
WITH comedy_movies AS (
SELECT
mg.mov_id
FROM
movie_genres mg
JOIN
genres g ON mg.gen_id = g.gen_id
WHERE
g.gen_title = '喜剧'
),

-- 然后,获取这些电影的评分信息
movie_ratings AS (
SELECT
m.mov_id,
m.mov_title,
r.rev_stars
FROM
movie m
JOIN
rating r ON m.mov_id = r.mov_id
WHERE
m.mov_id IN (SELECT mov_id FROM comedy_movies)
)

-- 最后,根据评分对这些电影进行排序,并选择评分最高的前3名
SELECT
mr.mov_title,
MAX(mr.rev_stars) AS max_rating
FROM
movie_ratings mr
GROUP BY
mr.mov_id, mr.mov_title
ORDER BY
max_rating DESC
LIMIT 3;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 错误答案
SELECT
m.mov_title
FROM
movie m
JOIN
movie_genres g ON m.mov_id = g.mov_id
JOIN
rating r ON m.mov_id = r.mov_id
WHERE
g.gen_id = 302 -- 喜剧的gen_id
ORDER BY
r.rev_stars DESC
LIMIT 3;

分析:
我的查询和参考答案的区别主要在于处理“喜剧”类型电影的步骤。以下是关键区别:

  1. 使用CTE(公共表表达式):参考答案使用CTE来分步处理查询。首先,它创建一个名为comedy_movies的CTE,以筛选出所有属于“喜剧”类型的电影ID。然后,在movie_ratings CTE中获取这些电影的标题和评分。

  2. 评分聚合:参考答案在获取评分信息时,使用了MAX(mr.rev_stars)来找到每部电影的最高评分,并按此进行排序。而原查询未进行这样的聚合。

  3. 筛选和排序方式:参考答案通过分步骤和子查询逐步筛选和排序,确保先得到所有喜剧电影,然后再对其评分进行处理。

原查询则直接连接所有表,结果的不同主要体现在以下几个方面:

  1. 评分计算:参考答案通过MAX(mr.rev_stars)只选择每部喜剧电影的最高评分,而原查询可能会将同一部电影的多个评分都考虑在内,导致结果中同一部电影的评分重复出现。

  2. 数据的准确性:参考答案确保每部电影只出现一次,且评分是它的最高分,这样能更准确地反映出评分最高的前3部喜剧电影。而原查询如果没有聚合,可能会导致结果不准确,出现同一电影多次。

  3. 结果集的完整性:参考答案的结构更清晰,能确保所有操作分开进行,便于调试和理解。原查询如果未妥善处理,可能会错过一些电影或产生冗余数据。

总体而言,参考答案更能准确反映“喜剧”电影中评分最高的前3部电影,而原查询可能导致结果不一致或不完整。

12.查询与“唐国强”共同出演同一部影片的演员ID和姓名。

cnmd6!
,66666666666
666666
666
这个b题目,要求演员ID和姓名,结果tmd是演员姓名和ID
CNMD!!!!!!!!!!!!!
CNMD!!!!!!!!!!!!!
CNMD!!!!!!!!!!!!!!!!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
-- 找出唐国强的act_id
WITH tang_guoqiang AS (
SELECT
act_id
FROM
actor
WHERE
act_name = '唐国强'
),

-- 找出唐国强参演的所有电影
tang_movies AS (
SELECT
mov_id
FROM
movie_cast
WHERE
act_id = (SELECT act_id FROM tang_guoqiang)
),

-- 找出与唐国强共同出演同一部电影的演员(不包括唐国强自己)
co_actors AS (
SELECT
mc.act_id,
a.act_name
FROM
movie_cast mc
JOIN
actor a ON mc.act_id = a.act_id
JOIN
tang_movies tm ON mc.mov_id = tm.mov_id
WHERE
mc.act_id != (SELECT act_id FROM tang_guoqiang) -- 排除唐国强自己
)

-- 选择共同出演的演员ID和姓名(不包括唐国强自己)
-- 就是这里,cccccc
SELECT
ca.act_name,
ca.act_id
FROM
co_actors ca;

13.查询“吴宇森”执导的电影,包括电影ID,电影名,平均评分,推荐度。
———-“推荐度”列要求:如评分6以下显示“不推荐”;评分6-8时,显示“推荐”;评分8以上时,显示“强烈推荐”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT 
m.mov_id,
m.mov_title,
AVG(r.rev_stars) AS average_rating,
CASE
WHEN AVG(r.rev_stars) < 6 THEN '不推荐'
WHEN AVG(r.rev_stars) BETWEEN 6 AND 8 THEN '推荐'
ELSE '强烈推荐'
END AS recommendation
FROM
movie m
JOIN
movie_direction d ON m.mov_id = d.mov_id
LEFT JOIN
rating r ON m.mov_id = r.mov_id
WHERE
d.dir_id = (SELECT dir_id FROM director WHERE dir_name = '吴宇森')
GROUP BY
m.mov_id, m.mov_title
ORDER BY
m.mov_id;

14.查询评分最高的“科幻”电影的名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
-- 获取科幻类型的gen_id
WITH sci_fi_genre AS (
SELECT
gen_id
FROM
genres
WHERE
gen_title = '科幻'
),

-- 获取所有科幻电影及其平均评分
sci_fi_movies AS (
SELECT
m.mov_id,
m.mov_title,
AVG(r.rev_stars) AS avg_rating
FROM
movie m
JOIN
movie_genres mg ON m.mov_id = mg.mov_id
JOIN
rating r ON m.mov_id = r.mov_id
WHERE
mg.gen_id = (SELECT gen_id FROM sci_fi_genre)
GROUP BY
m.mov_id, m.mov_title
),

-- 找出平均评分最高的科幻电影
highest_rated_sci_fi AS (
SELECT
mov_title,
avg_rating,
RANK() OVER (ORDER BY avg_rating DESC) AS rank
FROM
sci_fi_movies
)

-- 返回评分最高的科幻电影
SELECT
mov_title,
avg_rating
FROM
highest_rated_sci_fi
WHERE
rank = 1;

15.找出参演了“张艺谋”导演的全部影片的演员的姓名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-- 获取张艺谋导演的所有电影
WITH zhang_yimou_movies AS (
SELECT
md.mov_id
FROM
movie_direction md
WHERE
md.dir_id = 202 -- 张艺谋的dir_id
),

-- 获取所有参演张艺谋电影的演员及其参演的电影数量
zhang_yimou_actors AS (
SELECT
mc.act_id,
a.act_name,
COUNT(DISTINCT mc.mov_id) AS movie_count
FROM
movie_cast mc
JOIN
actor a ON mc.act_id = a.act_id
JOIN
zhang_yimou_movies zym ON mc.mov_id = zym.mov_id
GROUP BY
mc.act_id, a.act_name
)

-- 找出参演了张艺谋全部影片的演员
SELECT
za.act_name
FROM
zhang_yimou_actors za
WHERE
za.movie_count = (SELECT COUNT(DISTINCT mov_id) FROM zhang_yimou_movies);
Comments