Autor, Název akce Databázové systémy a SQL Lekce 4 Daniel Klimeš Autor, Název akce Subdotazy SQL Daniel Klimeš, Databázové systémy a SQL 2 Zanořené dotazy • uzavřené v kulatých závorkách () • stejná syntaxe jako obyčejný dotaz • vložení: SELECT sloupec FROM tabulka WHERE podmínka GROUP BY HAVING ORDER BY • •místo názvu sloupce •místo názvu tabulky •v sekci WHERE Autor, Název akce Subdotazy SQL - místo sloupce Daniel Klimeš, Databázové systémy a SQL 3 SELECT COUNT(patient_id), (SELECT COUNT (*) FROM patients) FROM patient_study GROUP BY 0; - vnořený dotaz na pozici sloupce musí vrátit právě jeden řádek! Cvičení: Napište dotaz, který vrátí seznam všech studentů, počet jejich registrovaných předmětů a kolik je to procent ze všech dostupných předmětů Autor, Název akce Zanořený dotaz – místo názvu tabulky Daniel Klimeš, Databázové systémy a SQL 4 Subdotaz na pozici FROM nahrazuje tabulku SELECT COUNT(*) FROM ( SELECT study_id, COUNT(*) FROM patient_study GROUP BY study_id ) • Jakýkoliv SELECT dotaz je možné ozávorkovat a použít místo tabulky • Počet možných zanoření závisí na konkrétním databázovém SW •Využijte předchozí dotaz a vypočítejte kolik studento-předmětů bude odučeno Autor, Název akce Vnořený dotaz za WHERE Daniel Klimeš, Databázové systémy a SQL 5 Varianty: • WHERE sloupec = (SELECT sloupec FROM… zanořený dotaz musí vrátit právě 1 řádek a 1 sloupec • WHERE sloupec = ANY (SELECT sloupec FROM… • WHERE sloupec IN (SELECT sloupec FROM … • WHERE sloupec > ALL (SELECT sloupec FROM … zanořený dotaz musí vrátit 1 sloupec a libovolný počet řádků • • •WHERE EXISTS (SELECT * FROM…. • WHERE NOT EXISTS (SELECT * FROM… zanořený dotaz může vracet libovolný počet řádků i sloupců Zanořené dotazy se obvykle propojují s nadřazeným dotazem pomocí podmínky v sekci WHERE Autor, Název akce Domácí úkol Daniel Klimeš, Databázové systémy a SQL • Vytvoření schématu patients/patient_study/sites/studies/studies_site spuštěním skriptu schema_pg.sql • Import dat patients.txt, patient_study.txt, studies.txt, sites.txt (příkaz COPY) Zjistěte počet pacientů v jednotlivých studiích po pracovištích a dle pohlaví STUDY_NAME, SITE, SEX, počet pacientů • Autor, Název akce Vnořený dotaz za WHERE Daniel Klimeš, Databázové systémy a SQL 7 SELECT * FROM student WHERE datum_narozeni = ( SELECT MAX(datum_narozeni) FROM student); SELECT * FROM student WHERE datum_narozeni >= ALL ( SELECT datum_narozeni FROM student); SELECT * FROM student tab1 WHERE NOT EXISTS ( SELECT * FROM student tab2 WHERE tab2. datum_narozeni > tab1.datum_narozeni ); Nejmladší student: Autor, Název akce Cvičení 2 Daniel Klimeš, Databázové systémy a SQL 8 Napište 3 varianty, které zobrazí řádek s nejstarším studentem Napište dotaz, který vrátí všechny studenty kromě nejstaršího a nejmladšího Vypište všechny studie a počet zařazených pacientů v jednotlivých letech a u každé nejmladšího a nejstaršího pacienta v daném roce STUDY_NAME, rok(DATE_OF_ENROLLMENT), min(date_of_birth), max(date_of_birth) Zjistěte počet pacientů ve studiích, kde počet pacientek není větší než 10 STUDY_NAME, počet pacientů Najděte předměty, kam se přihlásil alespoň jeden student (muž) a vypište celkový počet přihlášených studentů Autor, Název akce Domácí úkol Daniel Klimeš, Databázové systémy a SQL 1) Najděte předměty, kam se přihlásil alespoň jeden student (muž) a vypište celkový počet přihlášených studentů Název předmětu, počet přihlášených studentů (ženy i muži) 2) Najděte předměty, kam se nepřihlásil ani jeden student (muž) a vypište celkový počet přihlášených studentů Název předmětu, počet přihlášených studentek