StructuredQueryLanguage(SQL) Themen: ErstelenundÄndernvonTabelen AbfragenvonDaten Einfügen,ÄndernundLöschenvonDaten Erstelennutzerde niertersichten(views) 2012Claßen,Kempa,Morcinek 1/23
SQL Historie System R mitsequel UniBerkeley INGRES (RelationalSoftwareInc) OracleV2mitSQL HistoriederDB-SpracheSQL SQL De-Facto- Standard (referentiele Integrität) SQL-86 SQL-92 (EntryLevelSQL) SQL-89 SQL:1999 (Prozeduren, OO-Konzepte) SQL:2003 (XM L-Verarbeitung, OLAP-Funktionen) SQL:2008 SQL:2006 (XQuery) 1970 1975 1980 1985 1990 1995 2000 2005 2010 SQL:86:SQL wird Industriestandard,ANSI1986,ISO 1987 SQL:89(ANSI-SQL / ISO9075):kleinereAnpasungen,Erweiterungum die MöglichkeitzurDenitionreferentielerIntegritätsbedingungen SQL:92/SQL2:Festlegung von dreisprachschichten:entrylevel:grundlegendste Anweisungen(AnlegenvonTabelen,Datenmanipulation),einziggültigerDatentypist Zeichenkete,MUSSvonalenRDBMSunterstütztwerden;Interm ediate Level:weitere AnweisungenzurDatende nition,funktionen,verbund-undmengenoperatoren;ful Level:enthältale SQL-Anweisungen und weitere Funktionen zbfürdie Verbindungsverwaltung SQL:1999/SQL3(ISO/IEC 9075:1999):Unterstützung prozeduralerstrukturen und Trigger,reguläreAusdrücke,rekursiveAbfragen,Integrationvonobjektorientierten Konzepten,AufteilungdesStandardsinmehrereTeile,dieeinzelnweiterentwickelt werdensolen SQL:2003(ISO/IEC 9075:2003):uaFunktionen zurverarbeitung von XM L-Daten, erweiterteolap-funktionen (W indow-funktionen) SQL:2006(ISO/IEC 9075-14:2006)und SQL:2008(ISO/IEC 9075-14:2008):be sere Integration von XM L (Im port/exportvon XM L,Verwendung von XQuery) 2012Claßen,Kempa,Morcinek 2/23
DVD-Verleih WeitereInformationenzurMySQL-BeispieldatenbankSAKILA: http://devmysqlcom/doc/sakila/en/sakilahtml http://forgemysqlcom/wiki/sakilasampledb PortierungenfürandereDatenbanksysteme: http://codegooglecom/p/sakila-sample-database-ports/ 2012Claßen,Kempa,Morcinek 3/23
Datendenition CREATETABLE EineTabeleerstelen CREATETABLE films (film_id integer NOT NULL, title varchar(255) NOT NULL, description varchar(4000) UNIQUE, release_year date default NULL, language_id integer NOT NULL REFERENCES language (language_id), rental_duration integer NOT NULL default '3', rental_rate number(4,2) NOT NULL default '499', length integer default NULL, rating varchar(5) NOT NULL CHECK (rating IN('G','PG','PG-13','R','NC-17')) default 'G', CONSTRAINTpk_films PRIMARYKEY (film_id) ); Legende: Domänenintegrität(Spaltenebene) Entitätsintegrität(Zeilenebene) ReferentieleIntegrität(Tabelenebene) AleInformationenwerdenexplizitalsWerteinTabelendargestelt Domänenintegrität(Spaltenebene) -(Standard-)Datentypen -nutzerde niertedatentypen (UDT) -NULL-W erte -Vorgabewerte(DEFAULT) DerDEFAULT-Wertmusdem DatentypderSpalteentsprechen -CHECK-Constraints(Prüfbedingungen) Entitätsintegrität(Zeilenebene) -Constraints(UNIQUE,PRIMARY KEY) ReferentieleIntegrität(Tabelenebene) -Constraints(FOREIGN KEY) -Trigger Sieheauch:[Faeskorn-W oyke2007],abschnit531f 2012Claßen,Kempa,Morcinek 4/23
Datendenition ALTER TABLE BeziehungenzwischenTabelenfestlegen City Country Primärschlüsel (primarykey) Fremdschlü sel (foreign key) ALTER TABLE City ADD CONSTRAINT fk_city FOREIGN KEY (country_id) REFERENCES Country (country_id); MitFOREIGN KEYwird einereferentieleintegritätsbedingung zwischen Tabelen de niertderfremdschlü selverweist(meist)aufdenprimärschlü seleineranderen Tabele Diereferenzierte(Primärschlüsel-)Tabelemusexistieren,bevorderFrem dschlü sel de niertwirddiefremdschlü selspaltemu sebenfalsexistieren,bevordiereferentiele Integritätsbedingung festgelegtwird Sieheauch:[Faeskorn-W oyke2007],abschnit5310 2012Claßen,Kempa,Morcinek 5/23
SELECT DieSyntaxderSELECT-Anweisung SQL-Anweisung Kommentar Klauseln - Ermittelt Kunden aus Deutschland SELECT name, address, city FROM Customers WHERE country = 'Germany' ORDER BY name; Schlüselwörter Bezeichner Separator SQL isteineformatfreiesprache -Groß-und Kleinschreibung beliebig -1 bisn Leerzeichen alstrennzeichen -Zeilentrennung beliebig,abernichtinnerhalb von Schlü selwörtern SQL-Anweisungenmüssensepariertwerden -Vorderzweiten und jederweiteren SQL-Anweisung einerfolgevon Anweisungen stehtein Separator -TypischerSeparatorist; SQL benutztsprachelemente -Schlü selwörter -Bezeichner(fürTabelen,Spalten, ) -Konstanten 2012Claßen,Kempa,Morcinek 6/23
SELECT SpaltenauswählenmitSELECT Customers SELECT name, address, city FROM Customers; Sieheauch:[Faeskorn-W oyke2007],abschnit552 2012Claßen,Kempa,Morcinek 7/23
SELECT WHERE ZeilenauswählenmitWHERE Customers SELECT * FROM Customers WHERE country = 'United States'; Sieheauch:[Faeskorn-W oyke2007],abschnit555 2012Claßen,Kempa,Morcinek 8/23
NULL NULListkein W ert Rental SELECT rental_id, rental_date, return_date FROM rental WHERE return_date IS NULL; NULL-W ertewerden durchgängig gleich alsunbekannteoderfehlendedaten behandelt unddatentypunabhängigvonstandardwertenunterschieden Sieheauch:[Faeskorn-W oyke2007],abschnit5321und5552,s250f 2012Claßen,Kempa,Morcinek 9/23
Verbund TabelenverbundherstelenmitJOIN Films Actors SELECT * Umbenennung FROM Films AS f INNER JOIN Actors AS a ON ffilm_id = afilm_id; DerVerbundzwischenTabelenerfolgtindenmeistenFälenüberdieBeziehung Primärschlüsel-Fremdschlüsel(referentieleIntegrität) In obigerergebnistabele werden nurdie Zeilen verbunden,beidenen derw ertdes A tributesfilm_idübereinstim m t! AlternativeVariantezum Beipielverbund(Theta-Join): SELECT * FROM Films AS f, Actors AS a WHERE ffilm_id = afilm_id; HinweisefürdasAufstelenvonVerbünden: -beliebig vieletabelen sind (theoretisch)m iteinanderverknüpfbar -SELECT-Klauselkann Spalten m ehrerertabelen enthalten -gleichnam igespalten sind eindeutig zu kennzeichnen (TabellennameSpaltenname) -im VerbundistjederVergleichsoperatormöglich -N Tabelen erfordern mindestensn-1 Verbundoperationen zurverm eidung eines kartesischen Produktes Sieheauch:[Faeskorn-W oyke2007],abschnit553und554 2012Claßen,Kempa,Morcinek 10/23
Gruppierung Wertegruppierenundaggregieren Rentals SELECT title, count(*) AS quantity FROM Rentals GROUP BY title; EineGruppekanneineodermehrereSpalteneinerTabeleumfasenundwirddurchdie GleichheitdergespeichertenDatenindiesenA tributende niert AggregatfunktionenberechnenWerteüberaleZeilen -einertabele,wenn kein Gruppierungsm erkm alexistiert ODER -einergruppevon Zeilen,wenn ein Gruppierungsm erkm alexistiert Aggregatfunktionen: COUNT AnzahlZeilen SUM Summierung AVG Durchschnit MIN Minimum MAX Maximum Sieheauch:[Faeskorn-W oyke2007],abschnit556 2012Claßen,Kempa,Morcinek 11/23
Datenmanipulation INSERT EineneueZeileeinfügen -- Daten zum Kunden CECIL WINES werden erfasst INSERT INTO Customers (ID, name, address,"zip code", city) VALUES (512, 'CECIL WINES', '548 Uruapan Street','35653','London'); Customers DieeinzufügendenDatenmüsendem DatentypderjeweiligenSpalteentsprechen WurdeeineSpaltemitNOT NULLde niert,so istaufjeden Falein W ertanzugeben oderdasdatenbanksytem lieferteinefehlermeldungwegenverstoßesgegendie Integritätsbedingung WurdefürdieSpalteeinStandardwert(DEFAULT)festgelegt,so wird dieserautomatisch in die neue Zeile eingetragen,falskein expliziterw ertangegeben wird Sieheauch:[Faeskorn-W oyke2007],abschnit541 2012Claßen,Kempa,Morcinek 12/23
Datenmanipulation INSERT MehrereZeileneinfügen -- Datenübernahme aus einer anderen Kundentabelle INSERT INTO Customers (name, address,"zip code", city) SELECT name, strasse, plz, ort FROM Kunden; Customers Kunden Sieheauch:[Faeskorn-W oyke2007],abschnit541 2012Claßen,Kempa,Morcinek 13/23
Datenmanipulation DELETE ZeilenausderTabelelöschen -- Kunde Nr 8 wird gelöscht DELETE FROM Customers WHERE ID = 8; Customers Achtung!OhneWHERE-Klauselwird dergesamtetabeleninhaltgelöscht! Sieheauch:[Faeskorn-W oyke2007],abschnit543 2012Claßen,Kempa,Morcinek 14/23
Datenmanipulation UPDATE Spaltenwerteändern -- Kunde Nr 3 ist umgezogen UPDATE Customers SET address ='Feldweg 11', "zip code" ='3001', city ='Bern' WHERE ID = 3; Customers EswirdjeweilsdiegesamteZeileausgetauscht Sieheauch:[Faeskorn-W oyke2007],abschnit542 2012Claßen,Kempa,Morcinek 15/23
Datenmanipulation Löschen Customers Löschen Löschen Spalte(n) löschen Spalte(n)- wert löschen *) UPDATE Zeile(n) löschen ALTER TABLE DELETE *) NOT NULLbeachten 2012Claßen,Kempa,Morcinek 16/23
Verbund FehlendeDatenmitOuter-Join nden -- Welche Filme befinden sich (nicht) im Bestand? SELECT ffilm_id, title, inventory_id, ifilm_id FROM Film f LEFT OUTER JOIN Inventory i ON ffilm_id = ifilm_id; Film Inventory DieAnwendungeinesäußerenVerbundes(OUTER JOIN)isterforderlich,wenn nach Wertengesuchtwird,zudenenkeinekorespondierendenWerteinanderenTabelen existieren DasBeispielzeigtauchFilme,diesich(ggw)nichtim BestandbendenNichtzujeder Zeileinfilmexistierteineko respondierendezeilein inventoryfehlende W erte werdenalsnulldargestelt EininnererVerbund(INNER JOIN)hä tediesew erteaufgrund fehlenderfremdschlü sel nichtangezeigt Sieheauch:[Faeskorn-W oyke2007],abschnit413,s137f 2012Claßen,Kempa,Morcinek 17/23
Verbund RekursionmitSelf-JoinauLösen Store_staK -- Zeige Mitarbeiter und ihre Vorgesetzten SELECT estaff_id, efirst_name ' ' elast_name AS employee, mstaff_id, mfirst_name ' ' mlast_name AS manager FROMStore_staffAS e JOINStore_staffAS monemanager_id=mstaff_id; EinSelf-Joinistein norm alerverbund,dereinetabelemitsichselbst,dhzeilen ein undderselbentabelemiteinanderverknüpft Im BeispielbendensichPrimärschlüsel(staff_id)undFremdschlüsel(manager_id) inderselbentabeleum einetabelemehrfachanzusprechen,isteinaliasname anzugebendieserzeugtmehrerevirtueletabelen,diewiegewohntverknüpftwerden können 2012Claßen,Kempa,Morcinek 18/23
Unterabfrage AbfragenalsBestandteilandererAbfragen SkalareUnterabfrage(scalarsubquery) WHERE amount > (SELECT max(amount) FROM Payment) -- UPDATE Film SET replacement_cost = (SELECT avg(cost) FROM Old_films); Tabelen-Unterabfrage(tablesubquery) FROM customer c INNER JOIN (SELECT aaddress_id, aaddress, ccity FROM Address a INNER JOIN City c ON acity_id = ccity_id )ca ON caddress_id = caaddress_id EineUnter-(auchSub-)SELECT-Anweisung wird alsverbund jedereinzelnen Ergebniszeileder(Haupt-)SELECT-Anweisung m itden in dersub-select-anweisung enthaltenen Tabelen realisiertsiekann daherauch alternativalsverbund formuliert werden: SELECT * FROM Tabelle1 WHERE SpalteA = (SELECT SpalteB FROM Tabelle2 WHERE ); istidentisch m it SELECT * FROM Tabelle1 t1 INNER JOIN Tabelle2 t2 ON t1spaltea = t2spalteb; Tabelen-Unterabfragenkönnenauchgebildetwerdenmit Quantoren:ALL,ANYbzwSOME Prädikaten:IN,EXISTS Sieheauch:[Faeskorn-W oyke2007],abschnit559 2012Claßen,Kempa,Morcinek 19/23
Unterabfrage Abfragenkönnenvoneinanderabhängigsein VergleicheinesEinzelwerteseinerGruppemitdem (aggregierten)gruppenwert: -- Welche Kunden haben je Land überdurchschnittlich -- viel ausgegeben? SELECT customer_id, last_name, paid FROM Customers AS cu WHERE paid > (SELECT avg(pamount) FROM Payments AS pa WHERE cucountry_id = pacountry_id); DerzeilenweiseVergleichineinerkoreliertenUnterabfrageistein Performance-Kiler, dafürjedezeilederunterabfragederverbundmitderhauptabfrageneuberechnet werdenmuskorelierteunterabfragensoltendahersparsam eingesetztwerden Sieheauch:[Faeskorn-W oyke2007],abschnit559,s263 2012Claßen,Kempa,Morcinek 20/23
Unterabfrage (Nicht-)Existenzvon W erten prüfen -- Welche Filme befinden sich nicht im Bestand? SELECT film_id, title, length FROM Film AS f WHERE NOT EXISTS (SELECT * FROM Inventory AS i WHERE ffilm_id = ifilm_id); EXISTSistwahr,wenn dieunterabfragemindestenseine ZeilealsErgebniszurückliefert Sieheauch:[Faeskorn-W oyke2007],abschnit5593 AlternativenzuEXISTS EXISTS Alternative WHERE EXISTS (SELECT * FROM ) WHERE 0 < (SELECT COUNT(*) FROM ) WHERE NOT EXISTS (SELECT * FROM ) WHERE 0 = (SELECT COUNT(*) FROM ) 2012Claßen,Kempa,Morcinek 21/23
ExterneSicht(View) EineSichtaufausgewählteDatenerstelen CREATE VIEW Customers_DACH (ID, name, stadt, land) AS SELECT ID, name, city, country FROM Customers WHERE country IN ('Germany', 'Austria', 'Switzerland') WITH CHECK OPTION; Customers Customers_DACH VorteilederNutzungvonSichten: SichtenvereinfachendenDatenzugriDerNutzerkann einesichtaufrufen,ohnedie komplexenbeziehungenzwischendentabelenkennenzumü sen Sichtenliefern im m erden aktuelen Stand derdatenw ird eine Tabele aktualisiert, zeigen dievon ihrabgeleiteten Sichten dieänderungautomatisch an Sichtenerhöhen diesicherheitdurch explizite Spaltenauswahlkann eine eingeschränkte SichtaufdieDatenerzeugtwerdenNutzer,dienurZugriKsrechteaufdieSichten haben,sehenauchnurdiesedaten DatenmanipulationüberSichten ÜbereineSichtkönnenprinzipielDateneingefügt,geändertundgelöschtwerdenUnter bestimmtenbedingungenisteinesichtalerdingsnichtaktualisierbar,zbwenndie SELECT-Anweisung Funktionen inklaggregatfunktionen oderunterabfragen enthält DieKlauselWITH CHECK OPTIONkann füreineveränderbaresichtbenutztwerden,um das EinfügenoderÄndernanZeilenzuverhindern,diederWHERE-Klausel widersprechen Sieheauch:[Faeskorn-W oyke2007],abschnit535 2012Claßen,Kempa,Morcinek 22/23
Metadaten (M eta-)daten abfragen SELECT Column_Name, Data_Type, Is_Nullable FROM Information_SchemaColumns WHERE Table_Name = 'Customers'; Customers Metadaten SELECT Column_Name, Data_Type, Nullable FROM User_Tab_Columns -- Oracle-Version WHERE Table_Name = 'Customers'; DieStruktureinerDatenbankwirdineinem Systemkatalog(auchMetadatenoderData Dictionarygenannt)aufderselbenlogischenEbenewiedieDaten,dhinTabelen, beschriebenundkannmithilfederdatenbankspracheabgefragtwerden Sieheauch:[Faeskorn-W oyke2007],abschnit58 2012Claßen,Kempa,Morcinek 23/23