-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathLab | SQL Subqueries .sql
More file actions
375 lines (290 loc) · 9.53 KB
/
Lab | SQL Subqueries .sql
File metadata and controls
375 lines (290 loc) · 9.53 KB
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
-- How many copies of the film Hunchback Impossible exist in the inventory system?
-- FILM, tiltel.film, Where tiltel.film = "Hunchback Impossible", INVENTORY
Select * -- Join tables
FROM FILM
LEFT JOIN INVENTORY
ON FILM.film_id = INVENTORY.film_id;
Select FILM.title,INVENTORY.inventory_id -- Show columns
FROM FILM
LEFT JOIN INVENTORY
ON FILM.film_id = INVENTORY.film_id;
SELECT FILM.title, INVENTORY.inventory_id -- filter "Hunchback Impossible"
FROM FILM
LEFT JOIN INVENTORY
ON FILM.film_id = INVENTORY.film_id
WHERE FILM.title = "Hunchback Impossible";
-- Error -- I just need to remove "INVENTORY.inventory_id" because is not in the grup by and not in the agregation (SUM,MAX,COUNT).
SELECT FILM.title, INVENTORY.inventory_id, count(FILM.title) AS Count_inventory -- count films inventory and grop by
FROM FILM
LEFT JOIN INVENTORY
ON FILM.film_id = INVENTORY.film_id
WHERE FILM.title = "Hunchback Impossible"
Group by FILM.title;
--
SELECT FILM.title,count(FILM.title) AS Count_inventory -- count films inventory and grop by
FROM FILM
LEFT JOIN INVENTORY
ON FILM.film_id = INVENTORY.film_id
WHERE FILM.title = "Hunchback Impossible"
Group by FILM.title;
-- chat gdp
SELECT FILM.title, COUNT(INVENTORY.inventory_id) AS inventory_count
FROM FILM
LEFT JOIN INVENTORY
ON FILM.film_id = INVENTORY.film_id
GROUP BY FILM.title;
-- Chap gdp + Ben (I have doubts)
SELECT FILM.title, COUNT(INVENTORY.inventory_id) AS inventory_count
FROM FILM
LEFT JOIN INVENTORY
ON FILM.film_id = INVENTORY.film_id
WHERE FILM.title = "Hunchback Impossible"
GROUP BY FILM.title;
-- List all films whose length is longer than the average of all the films.
-- FILM, film.lenght, avg off all films
SELECT * -- Show film table
FROM FILM;
SELECT title,length -- Show colums
FROM FILM;
SELECT title,length, avg(length) AS avg_length -- Show colums
FROM FILM
GROUP BY length;
SELECT avg(length) AS avg_length -- Show colums
FROM FILM;
SELECT *
FROM FILM
WHERE length > (SELECT avg(length) AS avg_length -- YOu have to put the query if before.
FROM FILM);
SELECT title,length
FROM FILM
WHERE length > (SELECT avg(length) AS avg_length -- YOu have to put the query if before.
FROM FILM);
-- Use subqueries to display all actors who appear in the film Alone Trip.
-- FILM,ACTOR, actor.first_name, where film.title = "Alone Trip"
-- ON FILM.FILM_ID =
SELECT *
FROM FILM
SELECT *
FROM FILM
LEFT JOIN FILM_ACTOR ON FILM.film_id = FILM_ACTOR.film_id
SELECT *
FROM FILM
LEFT JOIN FILM_ACTOR ON FILM.film_id = FILM_ACTOR.film_id
LEFT JOIN actor ON FILM_ACTOR.actor_id = actor.actor_id;
SELECT actor.first_name, film.title
FROM FILM
LEFT JOIN FILM_ACTOR ON FILM.film_id = FILM_ACTOR.film_id
LEFT JOIN actor ON FILM_ACTOR.actor_id = actor.actor_id;
SELECT actor.first_name, film.title
FROM FILM
LEFT JOIN FILM_ACTOR ON FILM.film_id = FILM_ACTOR.film_id
LEFT JOIN actor ON FILM_ACTOR.actor_id = actor.actor_id
WHERE film.title = "Alone Trip"
SELECT last_name, first_name
FROM actor
WHERE actor_id IN (
SELECT actor_id
FROM film_actor
WHERE film_id = (
SELECT film_id
FROM film
WHERE title = 'Alone Trip'
)
);
-- 1
SELECT film_id
FROM film
WHERE title = 'Alone Trip';
-- 2
SELECT actor_id
FROM film_actor
WHERE film_id = 17;
-- 3
SELECT actor_id
FROM film_actor
WHERE film_id = (SELECT film_id
FROM film
WHERE title = 'Alone Trip');
-- 4 error
SELECT *
FROM actor
WHERE actor_id = (SELECT actor_id
FROM film_actor
WHERE film_id = (SELECT film_id
FROM film
WHERE title = 'Alone Trip'));
-- 5 error -- If is has more than one row you don't put = you put IN
SELECT *
FROM actor
WHERE actor_id IN (SELECT actor_id
FROM film_actor
WHERE film_id = (SELECT film_id
FROM film
WHERE title = 'Alone Trip'));
--
SELECT first_name, last_name
FROM actor
WHERE actor_id IN (SELECT actor_id
FROM film_actor
WHERE film_id = (SELECT film_id
FROM film
WHERE title = 'Alone Trip'));
-- Use subqueries to display all actors who appear in the film Alone Trip.
SELECT *
FROM film;
SELECT *
FROM film
WHERE title = "Alone Trip";
SELECT film_id
FROM film
WHERE title = "Alone Trip";
SELECT *
FROM film_actor;
SELECT *
FROM film_actor
WHERE FILM_id = 17;
SELECT *
FROM film_actor
WHERE FILM_id = (SELECT film_id
FROM film
WHERE title = "Alone Trip");
SELECT actor_id
FROM film_actor
WHERE FILM_id = (SELECT film_id
FROM film
WHERE title = "Alone Trip");
SELECT *
FROM actor;
SELECT *
FROM actor
WHERE actor_id IN (SELECT actor_id
FROM film_actor
WHERE FILM_id = (SELECT film_id
FROM film
WHERE title = "Alone Trip"));
SELECT actor_id,first_name,last_name
FROM actor
WHERE actor_id IN (SELECT actor_id
FROM film_actor
WHERE FILM_id = (SELECT film_id
FROM film
WHERE title = "Alone Trip"));
-- Sales have been lagging among young families,
-- and you wish to target all family movies for a promotion. Identify all movies categorized as family films.
-- FILM
SELECT title
FROM film
WHERE rating = 'G' OR rating = 'PG';
-- Get name and email from customers from Canada using subqueries.
-- Do the same with joins. Note that to create a join, you will have
-- to identify the correct tables with their primary keys and foreign keys, that will help you get the relevant information.
-- CUSTOMER, customer.fist_name, customer.name: customer,
-- LEFT JOIN
SELECT *
FROM CUSTOMER
LEFT JOIN ADDRESS ON CUSTOMER.ADDRESS_ID = ADDRESS.ADDRESS_ID
LEFT JOIN CITY ON CITY.CITY_ID = ADDRESS.CITY_ID
LEFT JOIN COUNTRY ON COUNTRY.COUNTRY_ID = CITY.COUNTRY_ID;
SELECT CUSTOMER.first_name,CUSTOMER.email,country.country
FROM CUSTOMER
LEFT JOIN ADDRESS ON CUSTOMER.ADDRESS_ID = ADDRESS.ADDRESS_ID
LEFT JOIN CITY ON CITY.CITY_ID = ADDRESS.CITY_ID
LEFT JOIN COUNTRY ON COUNTRY.COUNTRY_ID = CITY.COUNTRY_ID;
SELECT CUSTOMER.first_name,CUSTOMER.email,country.country
FROM CUSTOMER
LEFT JOIN ADDRESS ON CUSTOMER.ADDRESS_ID = ADDRESS.ADDRESS_ID
LEFT JOIN CITY ON CITY.CITY_ID = ADDRESS.CITY_ID
LEFT JOIN COUNTRY ON COUNTRY.COUNTRY_ID = CITY.COUNTRY_ID
WHERE country = "Canada";
-- Subqueries
-- Get name and email from customers from Canada using subqueries.
-- Do the same with joins. Note that to create a join, you will have
-- to identify the correct tables with their primary keys and foreign keys, that will help you get the relevant information.
SELECT cust.first_name, cust.email, "Canada" as country FROM customer as cust WHERE cust.address_id in (
SELECT addr.address_id FROM address as addr WHERE addr.city_id in (
SELECT c.city_id FROM city as c WHERE c.country_id in (
SELECT country_id FROM country WHERE country = "Canada"
)
)
);
-- Which are the films starred by the most prolific actor? Most prolific actor is defined as the actor that has
-- acted in the most number of films. First you will have to find the most prolific actor and then use
-- that actor_id to find the different films that he/she starred.
SELECT *
FROM film as f
JOIN (
SELECT fa.*
FROM film_actor as fa
JOIN (
SELECT inner_fa.actor_id FROM film_actor as inner_fa
GROUP BY inner_fa.actor_id
ORDER BY COUNT(inner_fa.actor_id) DESC
LIMIT 1
) subq_fa ON subq_fa.actor_id = fa.actor_id
) subq ON f.film_id = subq.film_id
JOIN actor act ON act.actor_id = subq.actor_id;
SELECT *
FROM film_actor
WHERE actor_id in (SELECT max(actor_id) FROM film_actor GROUP BY actor_id);
SELECT actor_id FROM film_actor GROUP BY actor_id ORDER BY COUNT(actor_id) desc LIMIT 1;
-- BRUNO AND BEN
WITH prolific_actor as (
SELECT actor_id,COUNT(actor_id) AS count_actor_id
FROM film_actor fa
GROUP BY actor_id
ORDER BY count_actor_id DESC
LIMIT 1)
SELECT f.*
FROM film_actor fa
JOIN prolific_actor ON prolific_actor.actor_id = fa.actor_id
JOIN film f ON f.film_id = fa.film_id;
-- Films rented by most profitable customer. You can use the customer table and payment
-- table to find the most profitable customer ie the customer that has made the largest sum of payments
-- Films rented by most profitable customer. You can use the customer table and payment
-- table to find the most profitable customer ie the customer that has made the largest sum of payments
-- Find the customer that has made the most amount of payments
SELECT *
FROM customer c;
SELECT *
FROM payment p ;
SELECT payment_id, customer_id, amount
FROM payment p ;
SELECT customer_id, amount
FROM payment p ;
SELECT customer_id, COUNT(amount) as count_amount_of_payments
From payment p
GROUP BY customer_id
Order BY count_amount_of_payments DESC
LIMIT 1;
SELECT *
FROM customer c;
SELECT *
FROM film f ;
SELECT *
FROM film f
LEFT JOIN inventory i ON f.film_id = i.film_id
LEFT JOIN rental r ON i.inventory_id = r.inventory_id
LEFT JOIN customer c ON r.customer_id = c.customer_id;
SELECT f.film_id,c.customer_id
FROM film f
LEFT JOIN inventory i ON f.film_id = i.film_id
LEFT JOIN rental r ON i.inventory_id = r.inventory_id
LEFT JOIN customer c ON r.customer_id = c.customer_id;
SELECT f.film_id,c.customer_id
FROM film f
LEFT JOIN inventory i ON f.film_id = i.film_id
LEFT JOIN rental r ON i.inventory_id = r.inventory_id
LEFT JOIN customer c ON r.customer_id = c.customer_id
WHERE c.customer_id IN ((SELECT customer_id, COUNT(amount) as count_amount_of_paymentsFrom payment p GROUP BY customer_idOrder BY count_amount_of_payments DESC LIMIT 1));
SELECT f.film_id,c.customer_id
FROM film f
LEFT JOIN inventory i ON f.film_id = i.film_id
LEFT JOIN rental r ON i.inventory_id = r.inventory_id
LEFT JOIN customer c ON r.customer_id = c.customer_id
WHERE c.customer_id IN (
SELECT customer_id, COUNT(amount) as count_amount_of_payments
FROM payment p
GROUP BY customer_id
ORDER BY count_amount_of_payments DESC
LIMIT 1
);