Sakila MySQL skaičiavimų ir lentelių jungimo užklausos

# Pasirinkti filmo, kurio id yra 10 nuomos detales (title, rental_rate, rental_date, return_date, inventory_id):

SELECT f.`title` AS 'Filmo pavadinimas', f.`rental_rate` AS 'Nuomos reitingas', 
r.`rental_date` AS 'Isnuomavimo pradzia', r.`return_date` AS 'Grazinimo data',
r.`inventory_id` AS 'Inventoriaus Nr' 
FROM `film` f INNER JOIN `inventory` i 
ON f.`film_id` = i.`film_id`
INNER JOIN `rental` r 
ON i.`inventory_id` = r.`inventory_id`
where f.film_id = 10;
# Kiek aktorių yra aktorių lentelėje:

SELECT COUNT(`actor_id`) AS 'Is viso aktoriu' FROM `actor`;
# Kurie filmai nebuvo grąžinti:

SELECT f.`title`, r.`return_date` FROM `film` f 
INNER JOIN `inventory` i 
ON f.`film_id` = i.`film_id`
INNER JOIN `rental` r 
ON i.`inventory_id` = r.`inventory_id`
WHERE r.`return_date` IS NULL;
# Išrinkti nuomininkų vardus ir pavardes, kurie nuomojosi 35 ir daugiau filmų:

SELECT CONCAT(c.`first_name`, ' ', c.`last_name`) AS 'Nuomininkas', COUNT(r.`customer_id`) AS 'Isnuomotu filmu skaicius'
FROM `customer` c 
INNER JOIN `rental` r 
ON c.customer_id = r.customer_id
#GROUP BY c.`first_name` ASC
GROUP BY r.`customer_id` ASC
HAVING COUNT(r.`customer_id`) >=35
# Išrinkti filmus (pavadinimas, data), išnuomotus po x datos:

SELECT f.`title` AS 'Filmo pavadinimas', r.`rental_date` AS 'Issinuomojimo data'
FROM `film` f 
INNER JOIN `inventory` i 
ON f.`film_id` = i.`film_id`
INNER JOIN `rental` r 
ON i.`inventory_id` = r.`inventory_id`
WHERE r.`rental_date` >= '2006-01-01'
ORDER BY r.`rental_date` DESC;
# Išrinkti 10 populiariausių filmų pagal nuomą (filmo pavadinimas, išnuomojimų skaičius):

SELECT f.`title` AS 'Filmo pavadinimas', COUNT(r.`rental_id`) AS 'Issinuomojimu skaicius'
FROM `film` f 
INNER JOIN `inventory` i 
ON f.`film_id` = i.`film_id`
INNER JOIN `rental` r 
ON i.`inventory_id` = r.`inventory_id`
WHERE r.`rental_date` IS NOT NULL
GROUP BY f.`film_id`, f.`title`
ORDER BY COUNT(r.`rental_id`) DESC
LIMIT 10;
# Kokia vidutinė nuomos trukmė:

SELECT AVG(TIMESTAMPDIFF(HOUR, `rental_date`, `return_date`)) AS 'Vidutine nuomos trukme' 
FROM `rental`;

SELECT AVG(TIMESTAMPDIFF(HOUR, `rental_date`, `return_date`)) AS 'Vidutine nuomos trukme' 
FROM `rental`
WHERE `inventory_id` = 7;
# 10 daugiausiai pinigų išleidusių nuomininkų ir kiek jie išleido:

SELECT c.`first_name`, c.`last_name`, SUM(p.`amount`)
FROM `customer` c 
INNER JOIN `payment` p 
ON c.`customer_id` = p.`customer_id`
GROUP BY c.`customer_id`, c.`first_name`
ORDER BY  SUM(p.`amount`) DESC
LIMIT 10;
# Kurie 3 aktoriai suvaidino daugiausiai filmuose vaidmenų:

SELECT CONCAT(a.`first_name`, ' ', a.`last_name`) AS 'Aktorius', COUNT(f.`film_id`) AS 'Suvaidino vaidmenu'
FROM `actor` a 
INNER JOIN `film_actor` fa 
ON a.`actor_id` = fa.`actor_id`
INNER JOIN `film` f 
ON fa.`film_id` = f.`film_id`
GROUP BY a.`actor_id`
ORDER BY COUNT(f.`film_id`) DESC
LIMIT 3;
#Ar iš nuomos parduotuvės nr 2 galima išsinuomoti šiuo metu filmą ACADEMY DINOSAUR:

select f.`title` AS 'Filmo pavadinimas', r.`return_date` AS 'Grazinimo data'
FROM `film` f INNER JOIN inventory i 
ON f.`film_id` = i.`film_id`
INNER JOIN `rental` r 
ON i.`inventory_id` = r.`inventory_id`
WHERE f.`title` = 'ACADEMY DINOSAUR'
AND i.`store_id` = '2'
AND r.`rental_date` IS NOT NULL
AND r.`return_date` IS NULL;

(Jeigu grąžina null, vadinasi filmas negrįžęs ir jo išnuomoti negalima)
#Atvaizduoti ir suskaičiuoti pasikartojančias pavardes:

SELECT `last_name` as 'Pavarde', COUNT(`last_name`) AS 'Pavardziu skaicius'
FROM `actor`
GROUP BY `last_name`
ORDER BY COUNT(`last_name`) DESC;
#Kiek įrašų yra actor lentelėje:

select count(*) as 'Is viso irasu' from actor;
#Parodyti aktorius su skirtingomis pavardėmis:

select distinct last_name as 'Pavarde' from actor;
#Parodyti aktorių vardus ir pavardes bet filtruojant tik aktorius su skirtingomis pavardėmis:

SELECT first_name as 'Vardas', last_name as 'Pavarde'
FROM actor
where last_name IN (
select last_name
from actor
group by last_name
having count(*) = 1
);
#Kiek aktorių yra su skirtingomis pavardėmis:

select count(distinct last_name) as 'Nepasikartojanciu pavardziu skaicius' from actor;
#Atvaizduoti address lentelės 10 įrašų, pagal district:

select * from address
order by district
limit 10;
#Atvaizduoti address lentelę:

select * from address;
#Kiek yra address lentelėje eilučių:

select count(*) as 'Eiluciu skaicius' from address;
#Atvaizduoti skirtingus district:

select distinct district from address;
#Suskaičiuoti kiek yra skirtingų district:

select count(distinct district) as 'Skirtingi district' from address;
#Atvaizduoti address ir district tik su 1 kartą pasikartojan2iu district pavadinimu:

select address, district 
from address
where district in (
select district
from address
group by district
having count(*) = 1
);
#Atvaizduoti name, last_update category lentelės tik su unikaliomis name reikšmėmis:

select name, last_update 
from category
where name in(
select name 
from category
group by name
having count(*) = 1
);
#Atvaizduoti trumpiausią, ilgiausią, vidutinio ilgio filmą:

select avg(length) from film;
select min(length) from film;
select max(length) from film;
#Atvaizduoti min ir max + filmo pavadinimas (avg skaičiuoja vidurkį, todėl tikėtina, kad užklausa nieko negrąžins):

select title as 'Pavadinimas', length as 'Max ilgis' from film
where length = (select max(length) from film);

select title, length from film
where length = (select min(length) from film);
#Išvesti filmo pavadinimą, kategoriją ir jo trukmę (filmo ilgį) mažėjančia tvarka pagal trukmę:

select f.title, c.name, f.length
from film f 
inner join film_category fc 
on f.film_id = fc.film_id
inner join category c 
on fc.category_id = c.category_id
order by f.length DESC;
#Išvesti payments tam tikrai datai (vasario mėn):

select * from payment where payment_date like '%02-%';
#Išrinkti kokiai sumai kiekvienas darbuotojas (staff) 2005 m. liepos mėn. išnuomavo filmų:

select st.first_name, st.last_name, p.payment_date, p.amount from staff st 
inner join payment p
on st.staff_id = p.staff_id
where p.payment_date like '2005-07%'
order by p.amount;
#Išrinkti ir susumuoti kokiai sumai kiekvienas darbuotojas (staff) 2005 m. liepos mėn. išnuomavo filmų:

select st.first_name, st.last_name, sum(p.amount) as total_amount 
from staff st 
inner join payment p
on st.staff_id = p.staff_id
where p.payment_date like '2005-07%'
group by st.staff_id, st.first_name, st.last_name
order by total_amount desc, st.first_name;
#Išrinkti aktorius kurių vardas yra Victor, Adam, John naudojant in:

select * from actor where first_name in ('albert', 'adam', 'john');
#Išrinkti 5 daugiausiai uždirbusias filmų kategorijas, rikiuoti mažėjančia tvarka:

select c.name, sum(p.amount) as total_amount
from category c 
join film_category fc 
on c.category_id = fc.category_id
join film f 
on fc.film_id = f.film_id
join inventory i 
on f.film_id = i.film_id
join rental r 
on i.inventory_id = r.inventory_id
join payment p 
on r.rental_id = p.rental_id
group by c.name
order by total_amount desc
Limit 5;
#Kiek parduotuvės uždirbo iš nuomos, išvesti duomenis mažėjančia tvarka pagal sumą:

select s.store_id as store, sum(p.amount) as amount
from store s 
join inventory i 
on s.store_id = i.store_id
join rental r 
on i.inventory_id = r.inventory_id
join payment p 
on r.rental_id = p.rental_id
group by store
order by amount desc;
#Išvesti aktoriaus vardą ir pavardę viename langelyje ir pavaizduoti didžiosiomis raidėmis rikiuojant pagal vardą/pavardę:

select upper(concat(first_name, ' ', last_name)) as 'Actors' from actor
order by last_name;

select actor_id, first_name, last_name from actor
where last_name like '%LL%'
order by last_name, first_name;
#Išvesti aktorių id, vardą ir pavardę kurių pavardėje yra dviguma L ('LL') + išrikiuoti pagal vardą/pavardę:

select actor_id, first_name, last_name from actor
where last_name like '%LL%';
#Panaudojant IN išrinkti pasirinktas šalis:

select country_id, country from country
where country in ('Afghanistan', 'Bangladesh', 'China');
#Redaguoti lentelės kolonas: po country įterpti "language":

alter table country add language varchar(45) after country;
# Pakeisti varchar(45) į varchar(90):

alter table country modify column language varchar(90);
#Ištrinti language stulpelį:

alter table country drop column language;
#Išvesti ir suskaičiuoti pasikartojančias pavardes iš aktorių lentelės mažėjančia tvarka:

select last_name as Pavarde, count(last_name) as Skaicius from actor
group by last_name
order by Skaicius desc;
#Išvesti aktorių pavardes, kurios pasikartoja 3 ir daugiau kartų:

select last_name as Pavarde, count(last_name) as Skaicius from actor
group by Pavarde
having Skaicius > 3;
#Pakeisti aktoriaus ELVIS MARX pavardę į PRESLEY:

update actor set last_name ='PRESLEY' where actor_id = 22;
#'payment' lentelės sukūrimo užklausa:

show create table payment;
#Atvaizduoti address lentelės 10 įrašų, pagal district:

select * from address
order by district
limit 10;
#Išvesti staff vardus, pavardes ir adresus:

#select s.first_name, s.last_name, a.address from staff s 
join address a 
on s.address_id = a.address_id;
#Išvesti filmų sąrašą ir prie kiekvieno filmo pateikti jame vaidinusių aktorių skaičių:

select f.title as film, count(fa.actor_id) as amount from film f 
join film_actor fa 
on f.film_id = fa.film_id 
group by film
order by amount desc;
#Kiek inventoriaus sandėlyje yra 'Hunchback Impossible' kopijų:
select f.title as title, count(i.film_id) as amount from film f 
join inventory i 
on f.film_id = i.film_id 
where title = 'Hunchback Impossible'
group by title
order by amount desc;