280 likes | 408 Views
Object Query Language (OQL). Rastislav Kadle ček 2013. HOFFER, Prescott, McFadden. Modern Database Management, chapter 15. ODMG OQL User Manual. Obsah. Co je OQL? Primitivní datové typy jazyka OQL První dotazy Uvažovaná Struktura databáze Kolekce v OQL Základní struktura dotazu
E N D
ObjectQueryLanguage(OQL) RastislavKadleček 2013 HOFFER, Prescott, McFadden. Modern Database Management, chapter 15. ODMG OQL User Manual.
Obsah • Co je OQL? • Primitivní datové typy jazyka OQL • První dotazy • Uvažovaná Struktura databáze • Kolekce v OQL • Základní struktura dotazu • Filtrování kolekcí • Konstrukce výsledků • Agregační operátory • Operátory „Define“, „Element“, „Exists“, „Like“, „Group By“, „Order By“ • (Multi)množinové operátory
Co je OQL? • Object Query Language • Dotazovací jazyk podobný SQL (SQL-92) • Na rozdíl od SQL je objektově orientovaný • ODMG (Object Data Management Group) standard pro dotazování nad objektově orientovanými databázovými systémy • 2 režimy – API pro programovací jazyky nebo interaktivní režim • Díky jeho rozsáhlosti neexistuje žádna implementace, která by zahrnovala celou jeho specifikaci • Existujíci implementace: • GemStone Systems – GemFire (http://www.gemfire.com) • Versant - Versant Object Database (http://www.versant.com)
Primitivní datové typy OQL • OQL rozlišuje následovné primitivní datové typy: • Boolean: hodnoty true,false • Integer: celé číslo, např. 10 • Float: desetinné číslo, např. 3,14 nebo 314.16e-2 • Character: jeden znak ohraničený jednoduchými uvozovkami, např. ’z’ • String: řetězec znaků ohraničených dvojitými uvozovkami, např. „toto je řetězec“ • Reference na objekt: reference na instanci třídy nebo nil
První dotazy • Aritmetické operace: • Vyhodnotí aritmetický výraz a vrátí výsledek • Dotaz na hodnotu vlastnosti objektu: • Uvažujme třídu Student, která má vlastnost „name“ – jméno studenta • Jan je instance třídy Student 2 * 2 4 Jan.name “Jan Novák”
První dotazy • Dotaz na konkrétní prvek pole (první prvek má index 0): • Volání metody objektu: • Zavolá danou metodu objektu a vrátí její výsledek • Metoda „age“ vypočte věk studenta z aktuálního data a data narození studenta students[3].name “Jan Novák” students[3].age 23
Uvažovaná struktura databáze classStudent { ( extentstudents) attributestringname; attributeDatedateOfBirth; attributeAddressaddress; attributePhonephone; relationship set CourseOffering takes inverse CourseOffering::taken_by; shortage( ); floatgpa( ); booleanregister_for(string crse, short sec, string term); }; structPhone { shortarea_code; longpersonal_number; }; structAddress { stringstreet_address; stringcity; stringzip; stringcountry; };
Uvažovaná struktura databáze classCourse { ( extentcourses) attributestringcrse_code; attributestringcrse_title; attributeshortcredit_hrs; relationship set Course has_prereqsinverse Course::is_prereq_for; relationship set Course is_prereq_forinverse Course::has_prereqs; relationship list CourseOffering offers inverse CourseOffering::belongs_to; shortenrollment( ); }; classCourseOffering { ( extentcourseofferings) attributestringterm; attribute enum section {1, 2, 3, 4, 5, 6, 7, 8}; relationship set Student taken_byinverse Student::takes; relationship Course belongs_toinverse Course::offers; shortenrollment( ); };
Kolekce v OQL • Jazyk OQL rozeznává následující druhy kolekcí: • Množina (Set) • Neuspořádaná kolekce objektů, ve které se objekty nesmí opakovat (každý objekt tam může být pouze jednou) • Multimnožina (Bag) • Na rozdíl od množiny se objekty mohou opakovat • Seznam (List) • Uspořádaná kolekce objektů, objekty se v ní mohou opakovat • Pole (Array) • Uspořádaná kolekce objektú, každý objekt má index své pozice a je možné se na nej odkazovat
Základní struktura dotazu • Dotaz nám umožňuje vybrat ze specifikované kolekce prvky splňující požadovaná kritéria • Dotaz vrací multimnožinu prvků • Dotaz pozůstává ze 3 částí – select .. from .. where • select • definuje strukturu výsledku dotazu • from • specifikuje kolekci, nad kterou bude dotaz spuštěn • where • nepovinná část • predikát, který umožnuje nastavit kritéria, která musí splňovat objekt, který bude zařazen do výsledku
Filtrování kolekcí • Dotaz slouží k výběru prvků splňujúcich kritéria z kolekce • Výsledkem je multimnožina objektů • Dotaz najde v kolekci všech studentů studenty se jménem „Jan Novák“ • V dotazech je možné využít i vlastnosti vnořených datových struktur select s from s in students wheres.name = “Jan Novák” select s from s in students wheres.address.city = “Praha”
Filtrování kolekcí • Je také možné zřetězit několik podmínek za pomoci logických spojek and, or nebo negovat (operátor !) • Po změně objektů v databázi může nastat situace, že některé objekty jsou najednou rovny hodnotě nil • Tyto objekty je možné z kolekce explicitně vyloučit • Není to však potřeba • Pro větší pohodlí programátora OQL automaticky přeskakujenil-ové objekty • Když má objekt hodnotu nil, je predikát v sekci where vždy vyhodnocen jako false select s from s in students where s != nil and s.address.city = “Praha”
Klíčové slovo DISTINCT • Protože výsledkem dotazu je multimnožina, výsledek může obsahovat duplicitní objekty • Duplicitní objekty je možné odstranit použitím klíčového slova DISTINCT • Výsledná kolekce zaručene neobsahuje duplicity – je to množina selectdistinct s from s in students wheres.address.city = “Praha”
Sledování cesty v dotazu • Objekty jsou vzájemně propojené vztahy mezi nimi – tvoří graf • Při dotazování je možné sledovat libovolnou cestu v tomto grafu • Vrátí předměty, které navštěvuje student se jménem „Jan Novák“ selectdistinct cr from s in students, co in s.takes, cr in co.belongs_to wheres.name = „Jan Novák“
Konstrukce výsledků • Dosud probrané příklady vždy vracely kolekci celých objektů • Je možné se dotazovat jen na určité atributy těchto objektů • Vrátí množinu kódů předmětů, které mají dotaci větší než 2 hodiny • Jedná se o množinu textových řetezců selectdistinct c.crse_code from c in courses wherec.credit_hrs > 2
Konstrukce výsledků • Také je možné dotazovat se na více atributů zároveň • Vrátí množinu struktur pozůstávajících z názvů a kódů předmětů, které mají dotaci větší než 2 hodiny selectdistinct c.crse_title, c.crse_code from c in courses wherec.credit_hrs > 2 [ { “crse_title” => “Dotazovací jazyky I”, “crse_code” => “NDBI001” }, … ]
Konstrukce výsledků • Krom toho je možné v dotaze použít klíčové slovo struct • Toto klíčové slovo umožnuje konkretizovat přesnou strukturu, jakou má mít každý prvek výsledné kolekce • Je možné ho použít i vnořeně selectstruct ( name: s.name, address: struct ( street: s.address.street_address, city: s.address.city ) ) from s in students wheres.address.country = “CZ”
Konstrukce výsledků • Výsledkem dotazu je multimnožina datových struktur tvaru: • [ • { “name” = > “Jan Novák”, • “address” => { • “street” => “Anglická 3”, • “city” => “Praha” • } • } • … • ]
Agregační operátory • V jazyku OQL jsou k dispozicinasledujíciagregační operátory: • count– počet (objektů vkolekci) • min – nejmenší hodnota (v kolekcihodnot) • max – největší hodnota (v kolekcihodnot) • sum – součet (hodnot v kolekci) • avg – průměrná hodnota (z hodnot v kolekci) • Příklad: Zjištení celkového počtustudentů • Příklad: Nalezení průměrné dotace hodin předmětů selectcount (students) selectavg(cr.credit_hrs) from cr in courses
Operátory - Define • Pomocí operátoru define je možné přiřadit jméno k výsledku dotazu – můžeme se pak na něj odvolat z jiného dotazu • Může to výrazně zpřehlednit dlouhé dotazy • K pojmenovaným dotazům je možné přistupovat pouze v rámci stejného sezení – až do použití příkazu commit nebo abort define PredmetySe2Hodinama as select c from c in courses wherec.credit_hrs = 2 selectc.crse_title from c in PredmetySe2Hodinama
Operátory - Element • V případě, že máme kolekci pozůstávající pouze z jednoho prvku, je možné tento prvek z dané kolekce extrahovat použitím operátoru element element ( select s from s in students where s.name = “Jan Novák” )
Operátory - Exists • Pomocí operátoru exists je možné zjistit, jestli v kolekci existuje alespoň jeden objekt splňující požadovaná kritéria • Přiklad: Dotaz vybere jména studentů, kteří navštěvují předmět s kódem „NDBI001“ select s.name from s in students whereexists c in s.takes.belongs_to : c.crse_code = „NDBI001“
Operátory - Like • Operátor like umožňuje testování textových řetězců na částečnou shodu • Znak ‘*’ je divoká karta, která zastává libovolný textový řetězec včetně prázdného řetezce • Příklad: Dotaz vrátí všechny studenty, kteří mají křestní jméno „Jan“ • Příklad: Dotaz vrátí všechny studenty, kteří mají příjmení „Novák “ select s from s in students where s.name like“Jan *” select s from s in students where s.name like“* Novák”
Operátory – Group By • Pomocí operátora group by je možné prvky výsledku „sgrupit“ dohromady podle určitého výrazu • Výsledkem dotazu obsahujícího operátor group by je (multi)množina dvojic, kde každá dvojice pozůstává z hodnoty „sgrupujícího“ výrazu a množiny objektů, pro které se výraz vyhodnotil na tuto hodnotu select s from s in students group by s.age [ { “age” => “21”, {“name” => “KristýnaKrásná”} }, { “age” => “23”, {“name” => “Jan Novák”, “name” => “Petr Černý”} }, … ]
Operátory – Order By • Operátor order by umožňuje seřadit výsledky dotazu dle specifikovaného výrazu • Je možné specifikovat více výrazů pro řazení najednou • Výsledkem dotazu obsahujícího operátor order by je vždy kolekce typu seznam • Směr řazení je možné specifikovat pro každý výraz použitím klíčových slov asc (vzestupně) a desc (sestupně) select s.name from s in students order by s.name asc, s.agedesc
(Multi)množinové operátory • V jazyku OQL jsou k dispozici nasledujíci operátory definované pro množiny a multimnožiny: • union (+) – sjednocení • intersect (*) – průnik • except (-) – rozdíl • Příklad: Sjednocení množin 22 a 23 let starých studentů (select s from s in students where s.age = 22) + (select s from s in students where s.age = 23)