Partnerem kanału jest justjoin.it - portal z największą ilością ofert pracy z widełkami! Szukasz pracy gdzie wymagana jest znajomość SQL'a?! Zajrzyj: ▶ bit.ly/justjoin-sql Inne oferty od justjoin.it: ▶ bit.ly/justjoin-python ▶ bit.ly/justjoin-php ▶ bit.ly/justjoin-security
Pierwszą rzeczą, którą robię, gdy odpala kolejny odcinek tej serii, to danie like'a w ciemno :D Dorzuciłem też parę groszy, aby choć trochę wspomóc was rozwijaniu nauki o DB
mam tendencje do zapominania o rozwiązaniu z wykorzystaniem EXIST i IN, bo jesli wynik zwraca wektor-tablice to pierwsze co mam w głowie to zeby złączyć orginalną tablice z tą uzyskaną
MAM PYTANIE, ale zanim je zadam, to dziękuję za kurs ;) Czy istnieje możliwość połączenia JOIN'em tabelę wirtualną (wygenerowaną zapytaniem) z tabelą z bazy, aby wygenerować kolejne zapytanie?
Jakie zapytanie jest w stanie zwrócić informację o wszystkich autach, a w dodatkowej kolumnie średnią cenę dla danej marki? (dla marki której dotyczy dany rekord)
też się nad tym zastanawiałam ale do tego chyba nie trzeba twoerzyć podzapytania tylko w select stworzyć avg z ceny i pogrupować wg kolumny marka, ale mogę się mylić bo dopiero się tego uczę
import bazy wyp. v4 w MySQL Workbench jest utrudniony przez błędy, program mówi, że ilość znaków na nr rejestracyjny jest zbyt mała, z niejasnych powodów program nie chciał także uzupełnić ostatniej tabeli. Udało mi się to dopiero, gdy zmieniłem ilość znaków w kolumnie nr rejestracyjny, chociaż błąd dotyczył (chyba) czegoś innego, mianowicie Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`wypozyczalnia_samochodow_v4`.`dane_wypozyczen`, CONSTRAINT `s_1` FOREIGN KEY (`id_samochodu`) REFERENCES `samochody` (`id_samochodu`) ON UPDATE CASCADE).
Challenge accepted 22:30 SELECT samochody.marka, samochody.model, samochody.nr_rejestracyjny, samochody.cena_katalogowa, (SELECT round(AVG(samochody.cena_katalogowa), 2) FROM samochody WHERE samochody.marka='opel') AS 'średnia cena za Opla', concat( CASE WHEN ((SELECT AVG(samochody.cena_katalogowa)*(-1) FROM samochody WHERE samochody.marka='opel') + samochody.cena_katalogowa) > 0 THEN '+' ELSE '' END, (SELECT round(AVG(samochody.cena_katalogowa)*(-1)) FROM samochody WHERE samochody.marka='opel') + samochody.cena_katalogowa) AS 'cena względem średniej', CASE WHEN ((SELECT AVG(samochody.cena_katalogowa)*(-1) FROM samochody WHERE samochody.marka='opel') + samochody.cena_katalogowa) > 0 THEN 'powyżej' WHEN ((SELECT AVG(samochody.cena_katalogowa)*(-1) FROM samochody WHERE samochody.marka='opel') + samochody.cena_katalogowa) < 0 THEN 'poniżej' ELSE 'równa' END AS 'cena powyżej/równa/poniżej średniej' FROM samochody WHERE samochody.marka='opel';
Nie widzę nigdzie odpowiedzi do zadań na końcu, więc tu zamieszczam moje rozwiązania. 1. SELECT klienci.id_klienta FROM klienci WHERE klienci.id_klienta NOT IN (SELECT wypozyczenia.id_klienta FROM wypozyczenia WHERE id_klienta IS NOT NULL) 2. SELECT klienci.imie_klienta, klienci.nazwisko_klienta FROM klienci WHERE klienci.id_klienta NOT IN (SELECT klienci.id_klienta FROM klienci INNER JOIN wypozyczenia ON wypozyczenia.id_klienta=klienci.id_klienta INNER JOIN dane_wypozyczen ON dane_wypozyczen.id_wypozyczenia=wypozyczenia.id_wypozyczenia INNER JOIN samochody ON samochody.id_samochodu=dane_wypozyczen.id_samochodu INNER JOIN klasy_samochodow ON klasy_samochodow.id_klasy=samochody.id_klasy WHERE klasy_samochodow.nazwa_klasy= 'sedan') 3. SELECT samochody.marka, samochody.model, samochody.nr_rejestracyjny, samochody.cena_katalogowa, COUNT(dane_wypozyczen.id_wypozyczenia) as 'ile' FROM samochody INNER JOIN dane_wypozyczen ON dane_wypozyczen.id_samochodu=samochody.id_samochodu GROUP BY samochody.model 4. SELECT samochody.marka, samochody.model, COUNT(dane_wypozyczen.id_wypozyczenia) 'ile' FROM samochody INNER JOIN dane_wypozyczen ON dane_wypozyczen.id_samochodu=samochody.id_samochodu GROUP BY samochody.marka HAVING COUNT(dane_wypozyczen.id_wypozyczenia) = (SELECT COUNT(dane_wypozyczen.id_wypozyczenia) 'min' FROM samochody INNER JOIN dane_wypozyczen ON dane_wypozyczen.id_samochodu=samochody.id_samochodu GROUP BY samochody.marka ORDER BY COUNT(dane_wypozyczen.id_wypozyczenia) LIMIT 1)
Można prościej zadanie 4 - bez HAVING: SELECT samochody.marka, samochody.model, COUNT(dane_wypozyczen.id_wypozyczenia) FROM samochody INNER JOIN dane_wypozyczen ON dane_wypozyczen.id_samochodu=samochody.id_samochodu GROUP BY samochody.marka ORDER BY `COUNT(dane_wypozyczen.id_wypozyczenia)` ASC LIMIT 1
Ad. Zadania domowego 4 Podane w pliku na blogu rozwiązanie pokazuje auta, które zostały wypożyczone najmniej razy - konkretne sztuki (nr rejestracyjny). Czy właściwą odpowiedzią na pytanie "wyświetl marki i modele aut" nie będzie pokazanie marki i modelu, który był wypożyczany najrzadziej? Kod: SELECT samochody.marka, samochody.model, COUNT(dane_wypozyczen.id_samochodu) as "Ile_razy" FROM samochody INNER JOIN dane_wypozyczen on dane_wypozyczen.id_samochodu=samochody.id_samochodu GROUP by samochody.model HAVING Ile_razy = (SELECT COUNT(dane_wypozyczen.id_samochodu) as "ilość" FROM samochody INNER JOIN dane_wypozyczen on dane_wypozyczen.id_samochodu=samochody.id_samochodu GROUP by samochody.model ORDER BY COUNT(dane_wypozyczen.id_samochodu) ASC LIMIT 1);
bez zmiennych jak bez ręki... # 22:42 SELECT ROUND(AVG(samochody.cena_katalogowa), 2) INTO @avg FROM samochody WHERE samochody.marka = 'opel'; SELECT samochody.marka, samochody.model, samochody.cena_katalogowa, ROUND((samochody.cena_katalogowa - @avg), 2) AS 'cena wzgledem sredniej', (IF(ROUND((samochody.cena_katalogowa - @avg), 2) > 0, 'powyzej', 'ponizej')) AS 'cena powyzej/ponizej sredniej' FROM samochody WHERE samochody.marka = 'opel'
udało mi się prościej (w MySQL workbench): SELECT *, (SELECT round(avg(samochody.cena_katalogowa), 2) FROM samochody WHERE samochody.marka = 'opel') as 'srednia', (SELECT samochody.cena_katalogowa - srednia) AS 'roznica', IF((SELECT samochody.cena_katalogowa - srednia)>0, 'powyzej sredniej', 'ponizej sredniej') AS 'powyzej/ponizej' FROM samochody WHERE samochody.marka = 'opel';
SELECT samochody.marka, samochody.model, samochody.nr_rejestracyjny, samochody.cena_katalogowa, samochody.cena_katalogowa - avg_cena.cena_srednia AS cena_względem_średniej, IF(samochody.cena_katalogowa - avg_cena.cena_srednia > 0, "powyżej_średniej", "poniżej_średniej") AS powyżej_poniżej_średniej FROM samochody JOIN (SELECT ROUND(AVG(samochody.cena_katalogowa),2) AS cena_srednia FROM samochody WHERE samochody.marka = "opel") AS avg_cena ON samochody.marka = "opel";
Partnerem kanału jest justjoin.it - portal z największą ilością ofert pracy z widełkami!
Szukasz pracy gdzie wymagana jest znajomość SQL'a?! Zajrzyj:
▶ bit.ly/justjoin-sql
Inne oferty od justjoin.it:
▶ bit.ly/justjoin-python
▶ bit.ly/justjoin-php
▶ bit.ly/justjoin-security
naprawdę super kurs! Mam nadzieję, że będzie kontynuacja :)
Bardzo przydatny materiał ! Dziękujemy
Kawał dobrej roboty!:) Jakieś plany na kolejne filmy z SQL?
*Dziękuję* 😊👍
Pierwszą rzeczą, którą robię, gdy odpala kolejny odcinek tej serii, to danie like'a w ciemno :D Dorzuciłem też parę groszy, aby choć trochę wspomóc was rozwijaniu nauki o DB
Czekamy na kolejny odcinek :)
Super :) Pomocny materiał :)
poszlo mi dobrze naprawde!
Kiedy następny odcinek z SQL-a?
Dziękuję za ten znakomity kurs. Czy to już koniec, czy będą kolejne odcinki/sezony?
Czy będzie dalej kontynuowana seria sql, będą następne odcinki ?
mam tendencje do zapominania o rozwiązaniu z wykorzystaniem EXIST i IN, bo jesli wynik zwraca wektor-tablice to pierwsze co mam w głowie to zeby złączyć orginalną tablice z tą uzyskaną
przydałby się nowy odcineczek z sql :)
Kiedy będzie 2 część Canvas?
Pozdro z mechana ❤
MAM PYTANIE, ale zanim je zadam, to dziękuję za kurs ;)
Czy istnieje możliwość połączenia JOIN'em tabelę wirtualną (wygenerowaną zapytaniem) z tabelą z bazy, aby wygenerować kolejne zapytanie?
Witam, gdzie można znaleźć rozwiązania do zadań domowych?
Jakie zapytanie jest w stanie zwrócić informację o wszystkich autach, a w dodatkowej kolumnie średnią cenę dla danej marki? (dla marki której dotyczy dany rekord)
też się nad tym zastanawiałam ale do tego chyba nie trzeba twoerzyć podzapytania tylko w select stworzyć avg z ceny i pogrupować wg kolumny marka, ale mogę się mylić bo dopiero się tego uczę
import bazy wyp. v4 w MySQL Workbench jest utrudniony przez błędy, program mówi, że ilość znaków na nr rejestracyjny jest zbyt mała, z niejasnych powodów program nie chciał także uzupełnić ostatniej tabeli. Udało mi się to dopiero, gdy zmieniłem ilość znaków w kolumnie nr rejestracyjny, chociaż błąd dotyczył (chyba) czegoś innego, mianowicie Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`wypozyczalnia_samochodow_v4`.`dane_wypozyczen`, CONSTRAINT `s_1` FOREIGN KEY (`id_samochodu`) REFERENCES `samochody` (`id_samochodu`) ON UPDATE CASCADE).
Kiedy nowy odcinek? ;-))
Poleca ktoś jakąś książkę w miarę nową do SQL?
Zrobicie odcinek z egzaminu inf04?
Może w przyszłym roku. Pozdrawiamy!
ok
Challenge accepted 22:30
SELECT
samochody.marka,
samochody.model,
samochody.nr_rejestracyjny,
samochody.cena_katalogowa,
(SELECT round(AVG(samochody.cena_katalogowa), 2)
FROM samochody
WHERE samochody.marka='opel') AS 'średnia cena za Opla',
concat(
CASE
WHEN ((SELECT AVG(samochody.cena_katalogowa)*(-1)
FROM samochody
WHERE samochody.marka='opel') + samochody.cena_katalogowa) > 0 THEN '+'
ELSE '' END,
(SELECT round(AVG(samochody.cena_katalogowa)*(-1))
FROM samochody
WHERE samochody.marka='opel') + samochody.cena_katalogowa) AS 'cena względem średniej',
CASE
WHEN ((SELECT AVG(samochody.cena_katalogowa)*(-1)
FROM samochody
WHERE samochody.marka='opel') + samochody.cena_katalogowa) > 0 THEN 'powyżej'
WHEN ((SELECT AVG(samochody.cena_katalogowa)*(-1)
FROM samochody
WHERE samochody.marka='opel') + samochody.cena_katalogowa) < 0 THEN 'poniżej'
ELSE 'równa' END AS 'cena powyżej/równa/poniżej średniej'
FROM samochody
WHERE samochody.marka='opel';
Nie widzę nigdzie odpowiedzi do zadań na końcu, więc tu zamieszczam moje rozwiązania.
1.
SELECT
klienci.id_klienta
FROM klienci
WHERE klienci.id_klienta NOT IN
(SELECT
wypozyczenia.id_klienta
FROM wypozyczenia
WHERE id_klienta IS NOT NULL)
2.
SELECT
klienci.imie_klienta,
klienci.nazwisko_klienta
FROM klienci
WHERE klienci.id_klienta
NOT IN (SELECT
klienci.id_klienta
FROM klienci INNER JOIN wypozyczenia ON wypozyczenia.id_klienta=klienci.id_klienta
INNER JOIN dane_wypozyczen ON dane_wypozyczen.id_wypozyczenia=wypozyczenia.id_wypozyczenia
INNER JOIN samochody ON samochody.id_samochodu=dane_wypozyczen.id_samochodu
INNER JOIN klasy_samochodow ON klasy_samochodow.id_klasy=samochody.id_klasy
WHERE klasy_samochodow.nazwa_klasy= 'sedan')
3.
SELECT
samochody.marka,
samochody.model,
samochody.nr_rejestracyjny,
samochody.cena_katalogowa,
COUNT(dane_wypozyczen.id_wypozyczenia) as 'ile'
FROM samochody
INNER JOIN dane_wypozyczen ON dane_wypozyczen.id_samochodu=samochody.id_samochodu
GROUP BY samochody.model
4.
SELECT
samochody.marka,
samochody.model,
COUNT(dane_wypozyczen.id_wypozyczenia) 'ile'
FROM samochody
INNER JOIN dane_wypozyczen ON dane_wypozyczen.id_samochodu=samochody.id_samochodu
GROUP BY samochody.marka
HAVING COUNT(dane_wypozyczen.id_wypozyczenia) = (SELECT
COUNT(dane_wypozyczen.id_wypozyczenia) 'min'
FROM samochody
INNER JOIN dane_wypozyczen ON dane_wypozyczen.id_samochodu=samochody.id_samochodu
GROUP BY samochody.marka
ORDER BY COUNT(dane_wypozyczen.id_wypozyczenia)
LIMIT 1)
Można prościej zadanie 4 - bez HAVING:
SELECT
samochody.marka,
samochody.model,
COUNT(dane_wypozyczen.id_wypozyczenia)
FROM samochody
INNER JOIN dane_wypozyczen ON dane_wypozyczen.id_samochodu=samochody.id_samochodu
GROUP BY samochody.marka
ORDER BY `COUNT(dane_wypozyczen.id_wypozyczenia)` ASC
LIMIT 1
Ad. Zadania domowego 4
Podane w pliku na blogu rozwiązanie pokazuje auta, które zostały wypożyczone najmniej razy - konkretne sztuki (nr rejestracyjny).
Czy właściwą odpowiedzią na pytanie "wyświetl marki i modele aut" nie będzie pokazanie marki i modelu, który był wypożyczany najrzadziej?
Kod:
SELECT
samochody.marka,
samochody.model,
COUNT(dane_wypozyczen.id_samochodu) as "Ile_razy"
FROM samochody
INNER JOIN dane_wypozyczen on dane_wypozyczen.id_samochodu=samochody.id_samochodu
GROUP by samochody.model
HAVING Ile_razy = (SELECT
COUNT(dane_wypozyczen.id_samochodu) as "ilość"
FROM samochody
INNER JOIN dane_wypozyczen on dane_wypozyczen.id_samochodu=samochody.id_samochodu
GROUP by samochody.model
ORDER BY COUNT(dane_wypozyczen.id_samochodu) ASC
LIMIT 1);
bez zmiennych jak bez ręki... # 22:42
SELECT ROUND(AVG(samochody.cena_katalogowa), 2) INTO @avg FROM samochody WHERE samochody.marka = 'opel';
SELECT
samochody.marka,
samochody.model,
samochody.cena_katalogowa,
ROUND((samochody.cena_katalogowa - @avg), 2) AS 'cena wzgledem sredniej',
(IF(ROUND((samochody.cena_katalogowa - @avg), 2) > 0, 'powyzej', 'ponizej')) AS 'cena powyzej/ponizej sredniej'
FROM samochody
WHERE samochody.marka = 'opel'
udało mi się prościej (w MySQL workbench):
SELECT
*,
(SELECT round(avg(samochody.cena_katalogowa), 2)
FROM samochody
WHERE samochody.marka = 'opel') as 'srednia',
(SELECT
samochody.cena_katalogowa - srednia) AS 'roznica',
IF((SELECT
samochody.cena_katalogowa - srednia)>0, 'powyzej sredniej', 'ponizej sredniej') AS 'powyzej/ponizej'
FROM samochody
WHERE samochody.marka = 'opel';
22:43:
SET @srednia = (SELECT ROUND(AVG(samochody.cena_katalogowa),2)FROM samochody WHERE samochody.marka='opel');
SELECT
samochody.marka,
samochody.model,
samochody.nr_rejestracyjny,
samochody.cena_katalogowa,
@srednia,
IF(samochody.cena_katalogowa > @srednia, CONCAT('+',' ',ROUND(samochody.cena_katalogowa-@srednia, 2)),CONCAT('-',' ',ROUND(@srednia-samochody.cena_katalogowa, 2))) AS 'cena względem średnej',
IF(samochody.cena_katalogowa > @srednia,'powyżej', 'poniżej') AS 'cena powyżej / ponżej średniej'
FROM samochody WHERE samochody.marka='opel'
SELECT
samochody.marka,
samochody.model,
samochody.nr_rejestracyjny,
samochody.cena_katalogowa,
samochody.cena_katalogowa - avg_cena.cena_srednia AS cena_względem_średniej,
IF(samochody.cena_katalogowa - avg_cena.cena_srednia > 0, "powyżej_średniej", "poniżej_średniej") AS powyżej_poniżej_średniej
FROM
samochody
JOIN
(SELECT
ROUND(AVG(samochody.cena_katalogowa),2) AS cena_srednia
FROM
samochody
WHERE
samochody.marka = "opel") AS avg_cena
ON
samochody.marka = "opel";