ISO SQL-standardene SQL Structured Query Language SQL-89 o Originalstandarden o Addendum for Embedded SQL (1994) SQL-92 o ISO/IEC 9075 SQL Database Databasetjener (Oracle) SQL:1999 o ISO/IEC 9075:1999 Det finnes i dag enklere språk for å kommunisere med databaser, men SQL er standardisert... INF102-sql-1 INF102-sql-2 Bruk av SQL Som selvstendig språk som regel interaktivt Som databasespråk i forbindelse med et vertsspråk (som Java, PHP, Pascal, ADA, COBOL, FORTRAN,... ) o Embedded SQL SQL-kommandoer som må prekompileres er lagt inn i programteksten o API (Application Programmer Interface) SQL kan kalles ved hjelp av biblioteksfunksjoner (Ikke ISO-standard, men de-facto-standarder som ODBC og JDBC) o Dynamisk SQL Spørringer lages av programmet under utførelsen Som språk for kommunikasjon mellom datamaskiner En innledende kommentar Teori er en ting, praksis er gjerne noe anna.: Relasjonsdatabaseteorien sier at en relasjon ikke kan ha flere like linjer. I kommersielle databasehåndteringssystemer fravikes denne regelen: Flere like linjer er altså mulig. Derfor snakker vi ofte om tabelldatabaser istedenfor relasjonsdatabaser. SQL er et programmeringsspråk for å håndtere tabelldatabaser. INF102-sql-3 INF102-sql-4
SQLs tre kommandokategorier DML Data Manipulation Language Datamanipuleringsspråk o SELECT o INSERT o UPDATE o DELETE DDL Data Definition Language Datadefinisjonsspråk (for skjemamanipulering) o CREATE o ALTER o DROP DCL Data Control Language Data-kontrollspråk (for tilgangskontroll) o GRANT o REVOKE UI Fylke fylkenavn 02 Akershus 03 Oslo Husholdningsavfall NOT NULL Eksempeldatabasen kommunenr kommunenavn avfallsmengde Halden 04 Moss 02 0211 Vestby 11549 avfallper Innbygger 387,1 403,1 421,6 INF102-sql-5 INF102-sql-6 SQL - Datamanipulering Enkel SQL-spørring Spørring (Query) resultatet er alltid en tabell Attributter vi ønsker ut o SELECT Oppdatering o INSERT o DELETE o UPDATE hente ut linjer (spørring) legge inn nye linjer slette linjer endre eksisterende linjer De fleste SQL på det kommersielle marked er case-insensitive du kan skrive kommandoer med store eller små bokstaver SELECT kommunenr, avfallsmengde Tabell vi henter data fra Alle attributtene SELECT * INF102-sql-7 INF102-sql-8
Filtrerende betingelser SELECT kommunenavn, avfallsmengde WHERE = ; Bare linjer som oppfyller denne betingelsen vil komme med i resultatet Velge ut attributter Velge ut linjer Operatorer i WHERE Matematiske sammenligningsoperatorer = <>!= < <=!>!< >= > Sann hvis likhet Sann hvis ulikhet Sann hvis mindre enn Sann hvis større enn Logiske operatorer AND OR Sann hvis mindre eller lik Sann hvis større eller lik Sann hvis begge sanne Sann hvis en eller begge sanne NOT Sann hvis usann og omvendt Presedensrekkefølge: sammenlikning, NOT, AND, OR. Bruk parenteser! INF102-sql-9 INF102-sql-10 Operatorer i WHERE (forts.) Spesielle operatorer BETWEEN AND... Sann hvis mellom... og......in (verdiliste) Sann hvis... i verdiliste LIKE *) Tekststreng-sammenlikning IS NULL Sann hvis NULL EXISTS Sann hvis NOT NULL Omnavning av attributter Ved hjelp av AS kan vi gi et attributt i resultatet et annet navn enn i tabellen vi henter dataene fra: SELECT kommunenr, avfallsmengde AS avfall *) LIKE tekststreng-sammenlikning med jokertegn: Resultatet får attributtene kommunenr og avfall % et vilkårlig antall av vilkårlige tegn _ ett vilkårlig tegn [tegnsekvens] ett vilkårlig tegn i tegnsekvensen (ikke i Oracle) INF102-sql-11 INF102-sql-12
Sortering I utgangspunktet er linjene i resultatet i vilkårlig rekkefølge De fleste databasehåndteringssystemer sorterer på primærnøkkel For å ha kontroll over rekkefølgen, bruk ORDER BY SELECT kommunenavn, avfallsmengde WHERE = Sortering på flere attributter SELECT kommunenavn, avfallperinnbygger WHERE = ORDER BY avfallperinnbygger DESC, kommunenavn ; ORDER BY avfallsmengde DESC; ASC stigende rekkefølge DESC synkende rekkefølge ASC er default Sorterer alfabetisk på kommunenavn innen like avfallsmengder INF102-sql-13 INF102-sql-14 Hvordan forhindre duplikate linjer Oppdatering legge inn linjer SELECT DISTINCT Nye linjer legges inn med INSERT INTO: Gir som resultat en tabell med ett attributt som inneholder alle hvert av dem forekommer én gang. DISTINCT gjelder kombinasjonen av alle attributter SELECT DISTINCT gir altså en relasjon! INSERT INTO tabellnavn VALUES(liste med verdier); eller INSERT INTO tabellnavn (liste med attributter) VALUES (liste med verdier); Default i SQL er SELECT ALL, dvs. at også duplikater tas med i resultatet (i strid med relasjons-databaseteorien) I den første formen legges verdiene inn i tabellen fra venstre mot høyre (ikke å anbefale). Gjenværende attributter blir NULL. I den andre formen velger vi hvilke attributter som skal få verdier, og i hvilken rekkefølge. Unevnte attributter blir NULL. INF102-sql-15 INF102-sql-16
Legge inn linjer eksempel INSERT INTO Fylke VALUES ( 13, NULL); eller INSERT INTO Fylke (, fylkenavn) VALUES ( 13, NULL); eller INSERT INTO Fylke (fylkenavn, ) VALUES (NULL, 13 ); eller INSERT INTO Fylke () VALUES ( 13 ); Oppdatering fjerne linjer Eksisterende linjer fjernes med DELETE FROM: DELETE FROM tabellnavn WHERE betingelse for linjer som skal fjernes; Eksempel: DELETE FROM Fylke WHERE = 13 ; SQL har ingen angrefunksjon! Vær derfor sikker på at betingelsen er korrekt, slik at det ikke fjernes linjer som ikke skulle vært fjernet. En DELETE FROM uten WHERE fjerner alle linjer i tabellen. INF102-sql-17 INF102-sql-18 Oppdatering endre eksisterende linjer Eksisterende linjer endres med UPDATE: UPDATE tabellnavn SET attributtnavn1 = Verdi eller uttrykk, attributtnavn2 = Verdi eller uttrykk,... WHERE betingelse for linjer som skal endres; Eksempel: UPDATE Husholdningsavfall SET avfallperinnbygger = avfallsmengde*1000/innbyggertall WHERE innbyggertall > 0; SQL Datatilgangskontroll Gi andre brukere tilgang til din database GRANT SELECT GRANT SELECT ON tabellnavn ON tabellnavn TO PUBLIC; TO bruker1, bruker2, ; Trekke tilbake tilgangstillatelse REVOKE ALL PRIVILEGES REVOKE ALL PRIVILEGES ON tabellnavn ON tabellnavn FROM PUBLIC; FROM bruker1, bruker2, ; Bare de mest vanlige og nyttige variantene er vist her INF102-sql-19 INF102-sql-20
Endre databasepassord For å endre databasepassord: ALTER USER brukernavn IDENTIFIED BY nyttpassord; Metadatabasen I Oracle er også metadatabasen en tabelldatabase kalt data dictionary Metadatabasen oppdateres av databasehåndteringssystemet når DDL-kommandoer utføres Bare databasehåndteringssystemet kan oppdatere metadatabasen Det nye passordet må skrives bare én gang på den annen side vises det i klartekst i kommandoen Brukeren kan imidlertid spørre mot metadatabasen med SQL Det er lagt til rette virtuelle tabeller for dette formål INF102-sql-21 INF102-sql-22 Noen spørringer mot metadatabasen i Oracle En oversikt over hele databasen SELECT object_name,object_type FROM user_objects; En oversikt over tabeller SELECT table_name FROM user_tables ; En oversikt over attributter SELECT table_name, column_name, data_type, data_length, nullable FROM user_tab_columns; En oversikt over virtuelle tabeller SELECT view_name FROM user_views; En oversikt over integritetsregler SELECT constraint_name, constraint_type, table_name, delete_rule FROM user_constraints; P = Primary key U = Unique key R = Referential integrity INF102-sql-23 Mer avanserte spørringer Spørringer mot flere tabeller Spørringer der samme tabell inngår flere ganger Spørringer med beregninger Spørringer med aggregerende funksjoner Nestede spørringer Virtuelle tabeller ( views ) INF102-sql-24
Spørringer mot flere tabeller ( join ) SELECT Fylke.,fylkenavn,kommunenr, kommunenavn,avfallsmengde, Fylke WHERE Husholdningsavfall.=Fylke.; Legg merke til: FROM-leddet inneholder flere tabeller WHERE-leddet inneholder join-betingelsen Det må være like mange join-betingelser som det er tabeller i FROMleddet utover den første hvis ikke får vi kartesiske produkter For å kunne referere til ulike attributter med samme navn kvalifiserer vi dem med tabellnavnet Resultat på neste lysark! INF102-sql-25 UI 02 03 02 Resultat 02 fylkenavn Akershus Oslo kommunenr 04 0211 fylkenavn Akershus Fylke Husholdningsavfall kommunenavn Halden Moss Vestby kommunenr 04 0211 Eksempel på join Halden Moss Vestby avfallsmengde kommunenavn SQL-kommandoen på forrige lysark 11549 avfallsmengde 11549 INF102-sql-26 UI 02 03 fylkenavn Akershus Oslo kommunenr 04 Fylke Husholdningsavfall kommunenavn Halden Moss Eksempel på join avfallsmengde Svalbard kommer ikke med i resultatet! Outer join i Oracle-SQL SELECT fylkenavn,kommunenr,kommunenavn,avfallsmengde, Fylke WHERE Husholdningsavfall.(+)=Fylke.; NULL 0000 Svalbard NULL Resultat fylkenavn kommunenr 04 kommunenavn Halden Moss avfallsmengde Outer join er ustandardisert, og SQLkommandoens utseende er derfor avhengig av databasehånderingssystemet. Resultat på neste lysark! INF102-sql-27 INF102-sql-28
UI 02 03 fylkenavn Akershus Oslo kommunenr Eksempel på Outer join Fylke Husholdningsavfall kommunenavn avfallsmengde SQL-kommandoen på forrige lysark Aliaser SELECT F.Fylkenavn,H.Kommunenr,Kommunenavn H, Fylke F WHERE H.Fylkenr = F.Fylkenr; 04 Halden Moss Aliaser NULL 0000 Svalbard NULL Resultat fylkenavn kommunenr kommunenavn Halden avfallsmengde Aliaser brukes for å: Forkorte SQL-uttrykkene Løse navgivingskonflikter (særlig når en tabell joines med seg selv) 04 Moss NULL 0000 Svalbard NULL INF102-sql-29 INF102-sql-30 Eksempel joine en tabell med seg selv Person IU ansattnr ansattnavn sjef Hva heter sjefen? Ans00 Bjørk NULL SELECT P.ansattnr, Ans0002 Li Ans00 P.ansattnavn, Ans0003 Resultat ansattnr Dal ansattnavn Ans00 navnpåsjef S.ansattnavn AS navnpåsjef FROM Person P, Person S Ans00 Bjørk NULL WHERE P.sjef(+) = Ans0002 Li Bjørk S.ansattnr; Ans0003 Dal Bjørk Beregnede attributter SELECT-listen kan inneholde beregnede attributter (beregnede attributter er ikke lagret i databasen): SELECT kommunenavn, avfallsmengde*1000/innbyggertall AS beregnetavfallperinnbygger SELECT kommunenr AS kommunenr /* tekstsammenskjøting i Oracle-SQL */ SELECT 7777 AS tall FROM Fylke -- en spøk? ; INF102-sql-31 INF102-sql-32
Gruppering og aggregeringsfunksjoner Aggregeringsfunksjonene Attributtene i SELECT må enten grupperes eller aggregeres SELECT,SUM(avfallsmengde)AS avfall COUNT(*) COUNT(attributt) COUNT(DISTINCT attributt) Antall linjer i tabellen Antall verdier, NULL unntatt Antall ulike verdier MIN(attributt) Minste verdi GROUP BY ; Resultatet er en tabell der alle linjer med samme er slått sammen til én, og der hver linje inneholder og avfall lik summen av avfallsmengde for fylket. I standard SQL kan aggregeringsfunksjoner ikke brukes på beregnede attributter MAX(attributt) SUM(attributt) AVG(attributt) Største verdi Summen av verdiene Gjennomsnittet av verdiene SUM og AVG virker selvfølgelig bare på numeriske attributter! INF102-sql-33 INF102-sql-34 Noen COUNT-eksempler Betingelser på grupper SELECT COUNT(*) SELECT,SUM(avfallsmengde)AS avfall SELECT COUNT(kommunenavn) GROUP BY HAVING SUM(avfallsmengde) > 1000; SELECT COUNT(DISTINCT kommunenavn) WHERE filtrerer før grupperingen HAVING filtrerer etter grupperingen INF102-sql-35 INF102-sql-36
En fullstendig SELECT SELECT,SUM(avfallsmengde)AS avfall WHERE avfallsmengde < 300 GROUP BY HAVING SUM(avfallsmengde) > 1000 ORDER BY Sum(avfallsmengde) DESC; Utførelsesrekkefølge i SELECT WHERE Velger ut linjer Filtrering FROM Tabellene som skal brukes Gruppering GROUP BY Slår sammen linjer HAVING Velger ut sammenslåtte linjer Først velges ut alle linjer med Avfallsmengde < 300, så grupperes alle linjer med samme Fylkenr sammen til én, så velges ut de hvor summen av Avfallsmengde > 1000, til slutt sorteres på synkende sum av Avfallsmengde. Sortering ORDER BY Sorterer linjer SELECT Attributtene som skal returneres Filtrering av gruppe INF102-sql-37 INF102-sql-38 Nøstede SQL-spørringer Nøstet spørring: Spørring som inneholder en annen spørring den indre spørringen. Eksempel Finn kommunen med størst avfallsmengde: SELECT kommunenr, avfallsmengde Indre spørring utføres først WHERE avfallsmengde =(SELECT MAX(avfallsmengde) ); Datadefinisjon Oppretting og fjerning av tabeller Endring av tabeller Legge inn skranker o Primærnøkler o Referanseintegriteter Virtuelle tabeller INF102-sql-39 INF102-sql-40
Opprette tabell Lag tabell CREATE TABLE tabellnavn ( attributtnavn1 datatype attributtnavn2 datatype NOT NULL,... CONSTRAINT skrankenavn PRIMARY KEY (attributtnavn1,...) ); Eksempel CREATE TABLE Husholdningsavfall ( CHAR(2) NOT NULL, kommunenr CHAR(2) NOT NULL, kommunenavn VARCHAR(25) NOT NULL, avfallsmengde INT NOT NULL, innbyggertall INT NOT NULL, avfallperinnbygger DECIMAL(8,1), CONSTRAINT EntydigKommunenr PRIMARY KEY (kommunenr) ) ; Datatyper, se neste lysark Rød tekst: Integritetsregler INF102-sql-41 ISO SQL datatyper CHARACTER(antall tegn) tegnstreng (inntil 254 tegn) VARCHARACTER( ) tegnstreng (variabel lengde) INTEGER heltall (opptil 11 siffer) SMALLINT små heltall (DBMS-avhengig) NUMERIC(ant siffer,ant desimaler) desimaltall (opptil 20 siffer) DECIMAL(ant siffer,ant desimaler) desimaltall (DBMS-avhengig) FLOAT(presisjon) flytende tall REAL flytende tall (DBMS-avhengig) DOUBLE PRECISION flytende tall (DBMS-avhengig) DATE dato TIME klokkeslett TIMESTAMP dato og klokkeslett BIT binære siffer INF102-sql-42 Noen ORACLE Build in SQL datatyper Built-In Datatype NUMBER(p,s) CHAR(size) VARCHAR2(size) DATE Description Number having precision p and scale s. The precision p can range from 1 to 38. The scale s can range from -84 to 127. Fixed-length character data of length size bytes. Maximum size is 2000 bytes. Default and minimum size is 1 byte. Variable-length character string having maximum length size bytes. Maximum size is 4000, and minimum is 1. You must specify size for VARCHAR2. Valid date range from January 1, 4712 BC to December 31, 9999 AD. Du kan bruke SQL standardtyper, ORACLE SQL vil da oversette til en av sine egne CHAR(2) 02 Datatyping på primitivnivå fylkenavn Akershus CHAR(2) CHAR(4) CHAR(25) kommunenr 04 05 Halden Moss Sarpsborg... er egentlig for primitivt: kommunenavn Ingen automatikk i at har samme verdiområde i ulike tabeller INSERT INTO Husholdningsavfall VALUES (, Moss, )??? avfallsmengde 12600 innbyggertall 26417 25860 46692 INF102-sql-43 INF102-sql-44
Eksplisitt datatyping (SQL:1999) Regler for tabell- og attributtnavn CREATE DISTINCT TYPE Fylkenr_type AS CHAR (2); Et navn (identifier) kan ikke være lengre enn 128 tegn (Oracle: 30 tegn) CREATE TABLE Husholdningsavfall ( Fylkenr Fylkenr_type,... ); Et navn må begynne med en bokstav Tillatte tegn er bokstaver, siffer og _ $ # Et navn kan ikke inneholde mellomrom CREATE TABLE Fylke( Fylkenr Fylkenr_type,... ) ; Reserverte ord kan ikke brukes Navn er case-insensitive Vanlig å henge sammen enkeltord med _ (Min_tabell) Navn skal være meningsfylte, og allikevel ikke for lange INF102-sql-45 INF102-sql-46 Fjerne tabell Fjern tabell DROP TABLE tabellnavn; Fjerner tabellen fullstendig, både metadata og data Eksempler: DROP TABLE Husholdningsavfall ; DROP TABLE Fylke ; Legg merke til at referanseintegritetsregler (se senere) fører til at tabeller må fjernes i en bestemt rekkefølge: Kontrollerte tabeller (de med fremmednøkkelen) først! Endre navn (ikke standard SQL) Endre tabell RENAME tabellnavn TO etannettabellnavn; Legge til attributt ALTER TABLE tabellnavn ADD nyttattributtnavn datatype ; Eksempel: ALTER TABLE Fylke ADD Avfallsmengde INT ; Det er litt ulike regler i forskjellige databasehåndteringssystemer om hvor store endringer som er tillatt. Bruk ikke NOT NULL her! INF102-sql-47 INF102-sql-48
Endre attributt i tabell Endre attributt ALTER TABLE tabellnavn MODIFY attributtnavn nydatatype NOT NULL ; Eksempel Vi forutsetter at Avfallsmengde ALTER TABLE Fylke nå har verdier! MODIFY Avfallsmengde INT NOT NULL ; De fleste databasehåndteringssystemer er meget restriktive med hensyn på endringer av kolonner det allerede finnes data i! Integritetsregler NOT NULL og PRIMARY KEY deklareres som regel i CREATE TABLE. Referanseintegritet deklareres som regel i en separat ALTER TABLE av kontrollert tabell: ALTER TABLE navn_på_kontrollert_tabell ADD CONSTRAINT navn_på_regel FOREIGN KEY(fremmednøkkelattributt) REFERENCES navn_på_kontrollerende_tabell ; Eksempel ALTER TABLE Husholdningsavfall ADD CONSTRAINT AvfallSkalHaFylke FOREIGN KEY() REFERENCES Fylke ; INF102-sql-49 INF102-sql-50 Oppdateringer og integritetsregler Ved forsøk på oppdateringer kan vi komme i konflikt med integritetsreglene. I så fall foreligger følgende muligheter (som deklareres i DML): o Avvise oppdateringen o Gjennomføre oppdateringen på en slik måte at integritetsreglene fremdeles er oppfylt Handlingsmønster ved overtredelse av referanseintegritet ALTER TABLE navn på kontrollert tabell ADD CONSTRAINT navn på regel FOREIGN KEY(fremmednøkkelattributt) REFERENCES navn_på_kontrollerende_tabell ON DELETE referential_action ; Eksempel: Forsøke å fjerne et fylke fra Fylke-tabellen o Avvisning med feilmelding o Fjerne fylket i Fylke-tabellen, og samtidig alle kommunene i fylket i Husholdningsavfall o Sette fremmednøkkelen i Husholdningsavfall til NULL eller UPDATE NO ACTION (gi feilmelding) CASCADE (fjern også kontrollerte linjer) SET NULL (sett fremmednøkkel til NULL) SET DEFAULT (sett fremmednøkkel til default -verdi) INF102-sql-51 INF102-sql-52
Virtuelle tabeller En virtuell tabell er et spørrings-resultat som kan brukes på lik linje med vanlige tabeller i etterfølgende SQL-kommandoer Virtuelle tabeller lagres ikke i databasen endrer datagrunnlaget for spørringen seg, endres også den virtuelle tabellen Virtuelle tabeller brukes i hovedsak til: o Mellomregning i kompliserte spørringer o Datagrunnlag for skjermbilder og applikasjonsprogrammer o Adgangskontroll OBS: Begrensede muligheter for oppdatering av virtuelle tabeller Opprette en virtuell tabell: Virtuelle tabeller i SQL CREATE OR REPLACE VIEW navn_på_virtuell_tabell AS SELECT... ; eller CREATE OR REPLACE VIEW navn_på_virtuell_tabell (attributtliste) AS SELECT... ; Fjerne en virtuell tabell: DROP VIEW navn_på_virtuell_tabell ; I den første CREATE-formen tas attributtnavnene fra SELECT-leddet I den andre formen velger vi attributtnavn selv INF102-sql-53 INF102-sql-54 Bruk av virtuelle tabeller Bruk av virtuelle tabeller (forts.) Vi oppretter en virtuell tabell: CREATE VIEW AvfallAkershus AS SELECT Kommunenr,Kommunenavn,Avfallsmengde WHERE Fylkenr = 02 ; Vi kan nå bruke den virtuelle tabellen: SELECT SUM(Avfallsmengde) FROM AvfallAkershus ; I standard SQL kan vi ikke bruke beregninger, bare attributtnavn i aggregeringsfunksjoner. En virtuell tabell bringer oss rundt denne begrensningen: CREATE VIEW AvfallPerInnbyggerView (beregnetavfallperinnbygger) AS SELECT (avfallsmengde*1000/innbyggertall) SELECT MAX(beregnetAvfallPerInnbygger) FROM AvfallPerInnbyggerView ; INF102-sql-55 INF102-sql-56