35. SQLite III - MantsSk/CA_PTUA14 GitHub Wiki
Database galite parsisiųsti iš: https://github.com/MantasSkara/CA_Python/blob/master/38-SQL3/teorija.db
Yra du pagrindiniai būdai jungti duomenis iš skirtingų lentelių, vienas iš jų yra naudojant WHERE:
SELECT <stulpeliai> FROM <lentelė1>, <lentelė2> WHERE <jungimo
sąlyga> [AND <paieškos sąlyga>];
Kitas būdas naudoja JOIN:
SELECT <stulpeliai> FROM <lentelė1> JOIN <lentelė 2> ON
<jungimo sąlyga> [WHERE <paieškos sąlyga>];
SELECT person.first_name, person.last_name, car.plate
FROM person, car
WHERE person.car_id = car.id
užklausa iš 3-jų lentelių:
SELECT last_name, make, name
from person, car, company
WHERE person.car_id = car.id AND person.company_id = company.id
ORDER BY name
Pavyzdys su papildomomis sąlygomis:
SELECT last_name, make, name
from person, car, company
WHERE person.car_id = car.id
AND person.company_id = company.id
AND make = "Ford"
ORDER BY name DESC;
Atlikime tuos pačius veiksmus su JOIN:
SELECT person.first_name, person.last_name, car.plate
FROM person
JOIN car
ON person.car_id = car.id
SELECT last_name, make, name
FROM person
JOIN car ON person.car_id = car.id
JOIN company ON person.company_id = company.id
ORDER BY name
SELECT last_name, make, name
FROM person
JOIN car ON person.car_id = car.id
JOIN company ON person.company_id = company.id
WHERE make = "Ford"
ORDER BY name DESC
Kiek sudėtingesnis - suskaičiuokime, kiek kokioje kompanijoje dirba žmonių:
SELECT company.name, count(*) as count
FROM person
JOIN company
ON person.company_id = company.id
GROUP BY company.name
Atrinkime tik tas kompanijas, kuriose dirba daugiau, negu 3 automobilių savininkai:
SELECT company.name, count()
FROM person
JOIN company ON person.company_id = company.id
GROUP BY company.name
HAVING count() > 3
Kokie yra Apple automobilių numeriai?
SELECT plate, name
FROM person
LEFT JOIN car ON person.car_id = car.id
JOIN company ON person.company_id = company.id
WHERE company.name = "Apple"
Išrinkime žmones, mašinų markes ir kontorų pavadinimus tik iš tų kontorų, kuriose dirba ne daugiau kaip 3 žmonės iš sąrašo:
SELECT first_name, last_name, make, company.name
FROM person
JOIN company on person.company_id = company.id
JOIN car on person.car_id = car.id
WHERE person.company_id IN
(SELECT company_id
FROM person
GROUP BY company_id
HAVING count() <= 3)
ORDER BY company.name
- INNER JOIN yra standartinis JOIN, kurį naudojome iki šiol
- LEFT JOIN - jungimo rezultatas yra papildomas kairiosios (pirmosios) lentelės nesujungiamomis eilutėmis.
- RIGHT JOIN - jungimo rezultatas yra papildomas dešiniosios (antrosios) lentelės nesujungiamomis eilutėmis.
- FULL OUTER JOIN - papildoma abiejų lentelių eilutėmis nesujungiamomis eilutėmis.
Populiariausias apart standartinio JOIN yra LEFT JOIN, jį ir panagrinėsime:
SELECT last_name, make, model
FROM person
LEFT JOIN car
ON person.car_id = car.id
Rezultate matome, kad sujungtos buvo ir tos eilutės, kur person neturi car_id.
Parsisiųskite DB – Darbuotojai3, atsidarykite ją programoje DB Browser for SQLite ir skiltyje “Execute SQL” atlikite šias SQL užklausas:
- Išrinkite darbuotojų vardus ir pavardes kartu su projekto pavadinimu, kuriame jie dirba.
- Išsirinkite darbuotojų dirbančių projekte Galerija vardus, pavardes ir projekto pavadinimą.
- Išrinkite visus projekto Projektų valdymas vykdytojus dirbančius Pardavimų skyriuje.
- Išrinkite visas moteris, dirbančias projekte Projektų valdymas ir išveskite į ekraną jų vardus, pavardes ir projekto pavadinimą.
- Išrinkite skyrių pavadinimus su juose dirbančių darbuotojų skaičiumi.
- Apribokite #5 užklausos rezultatą taip, kad rodytų tik tuos skyrius kur dirba bent 5 darbuotojai.
- Išrinkite darbuotojus (vardus, pavardes, pareigas) kartu su skyrių, kuriuose jie dirba pavadinimais, tačiau nesančius tų skyrių vadovais.
- Sukurkite naują įrašą lentelėje “DARBUOTOJAS” (asmens kodas: 38807117896, vardas: Pranas, pavardė:Logis, Dirba nuo: 2009-11-12, visa kita – Null).
- Išrinkite darbuotojų vardus, pavardes ir skyriaus pavadinimą. Rodykite, net ir tuos darbuotojus, kurie nedirba jokiame skyriuje (skyriaus pavadinimą pasiimkite iš lentelės SKYRIUS).
- 1 punkto užklausą pataisykite taip, kad rodytų tik tuos vardus ir projektų pavadinimus kuriuose dirba daugiau nei 4 darbuotojai.