Reklama
Wizyt
Dzisiaj: 308Wszystkich: 520585

SQL - select i złączenia

Technikum » ABD » SQL » SQL - select i złączenia

use zajecia
create table klienci
(klient_id int not null primary key identity(1,1),
klient_imie varchar(255),
klient_data datetime default getdate()
)

create table adresy (
adres_id int not null primary key identity(1,1),
adres_ulica varchar(255),
adres_miejscowosc varchar(255),
adres_klient_id int,
adres_typ int
)

insert into klienci (klient_imie) values ('Krzys');
insert into klienci (klient_imie) values ('Adam');
insert into klienci (klient_imie) values ('Andrzej');
insert into klienci (klient_imie) values ('Marek');
insert into klienci (klient_imie) values ('Ania');
insert into klienci (klient_imie) values ('Marysia');
insert into adresy (adres_miejscowosc,adres_ulica,adres_typ,adres_klient_id) values ('Poznan','Poznanska',1,1);
insert into adresy (adres_miejscowosc,adres_ulica,adres_typ,adres_klient_id) values ('Warszawa','Warszawska',2,1);
insert into adresy (adres_miejscowosc,adres_ulica,adres_typ,adres_klient_id) values ('Gniezno','Dworcowa',1,2);
insert into adresy (adres_miejscowosc,adres_ulica,adres_typ,adres_klient_id) values ('Krakow','Glowna',1,3);
insert into adresy (adres_miejscowosc,adres_ulica,adres_typ,adres_klient_id) values ('Gdansk','Bursztynowa',1,4)
insert into adresy (adres_miejscowosc,adres_ulica,adres_typ,adres_klient_id) values ('Olsztyn','Polska',1,5)
delete from klienci where klient_id = 5

Po wykonaniu tego skryptu proszę sprawdzić czy wyniki poniższych zapytań są zgodne:
select * from adresy;
select * from klienci

Jeśli wszystko się zgadza proszę wykonać poniższe ćwiczenia. W przypadku wątpliwości zapraszam do lektury:

Zadania

1) Pokaż w jakich miejscowościach mieszkają klienci (kolumny: klient_imie, adres_miejscowosc)
2) Pokaż w jakich miejscowościach klienci posiadają adresy typu 1 (kolumny: klient_imie, adres_miejscowosc)
3) Pokaż dla jakich adresów nie ma przypisanych klientów ( przygotuj min. 2 rozwiązania)
4) Pokaż dla jakich klientów nie ma przypisanych adresów ( przygotuj min. 2 rozwiązania)
5) Pokaż w jednej kolumnie imiona i nazwy miejscowości dla wszystkich klientów
6) Dlaczego klient z id=6 w poprzednim zadaniu wyświetlił się jako null? Jak to obejść?
7) Pokaż klientów którzy posiadają więcej niż 1 adres
8) pokaż klientów którzy posiadają tylko i wyłącznie 1 adres
9) Podziel klientów na grupy ze względu na pierwszą literę imienia i policz ile przypada adresów na każdą z grup.

Odpowiedzi:
1) Pokaż w jakich miejscowościach mieszkają klienci (kolumny: klient_imie, adres_miejscowosc)
select klient_imie,adres_miejscowosc from klienci
inner join adresy on
adres_klient_id=klient_id


Pozostaje jeszcze kwestia wyjaśnienia dlaczego Krzyś pokazał się dwa razy:
Dodając kolumny do zapytania:
select klient_imie,adres_miejscowosc,klient_id,adres_klient_id,adres_id from klienci
inner join adresy on
adres_klient_id=klient_id


Widać wyraźnie iż Krzys ma przypisane 2 różne adresy.

2) Pokaż w jakich miejscowościach klienci posiadają adresy typu 1 (kolumny: klient_imie, adres_miejscowosc)
select klient_imie,adres_miejscowosc from klienci
inner join adresy on
adres_klient_id=klient_id
where adres_typ = 1


Lub można też użyć innego zapisu:
select klient_imie,adres_miejscowosc from klienci
inner join adresy on
adres_klient_id=klient_id and adres_typ = 1

wynik zapytania będzie dokładnie taki sam.

3) Pokaż dla jakich adresów nie ma przypisanych klientów ( przygotuj min. 2 rozwiązania)
Poniżej rozwiązania korzystające ze złączeń:
select adres_miejscowosc,klient_id from adresy
left outer join klienci on
adres_klient_id = klient_id
where klient_id is null

Lub można na odwrót, korzystając ze złączenia prawostronnego:
select adres_miejscowosc,klient_id from klienci
right outer join adresy on
adres_klient_id = klient_id
where klient_id is null

Podane rozwiązania bazują na złączeniach, jednak proszę być świadomym że takie zadanie da się rozwiązać jeszcze inaczej.

4) Pokaż dla jakich klientów nie ma przypisanych adresów ( przygotuj min. 2 rozwiązania)
To zadanie jest analogiczne do poprzedniego.
select klient_imie,adres_miejscowosc from klienci
left outer join adresy on
adres_klient_id = klient_id
where adres_id is null

I tak samo jak poprzednie zadanie można je wykonać z pomocą złączenia prawostronnego:
select klient_imie,adres_miejscowosc from adresy
right outer join klienci on
adres_klient_id = klient_id
where adres_id is null

5) Pokaż w jednej kolumnie imiona i nazwy miejscowości dla wszystkich klientów
select adres_miejscowosc + ' ' + klient_imie from klienci
left outer join adresy on
adres_klient_id = klient_id

6) Dlaczego klient z id=6 w poprzednim zadaniu wyświetlił się jako null? Jak to obejść?
W poprzednich wynikach widać że ostatni wiersz wyświetlił się jako null, jest to spowodowane operacją konkatenacji łańcucha z wartością null (Imię + null) = null.

7) Pokaż klientów którzy posiadają więcej niż 1 adres
select klient_imie from klienci
inner join adresy on
adres_klient_id=klient_id
group by klient_imie
having count(*) > 1

8) pokaż klientów którzy posiadają tylko i wyłącznie 1 adres
select klient_imie from klienci
inner join adresy on
adres_klient_id=klient_id
group by klient_imie
having count(*) =1

9) Podziel klientów na grupy ze względu na pierwszą literę imienia i policz ile przypada adresów na każdą z grup.
select LEFT(klient_imie,1),COUNT(*) from klienci
inner join adresy on
adres_klient_id=klient_id
group by LEFT(klient_imie,1)

Reklama