22/092VE/E00/RB1 Introduktion til SQL Datalogi 2VE E00 DIKU Forelæsninger 22/9 og 29/9
22/092VE/E00/RB2 Plan for SQL forelæsninger 22/9 SQL92 - DDL Relationel Algebra SQL92 - DML 29/9 SQL99 OQL
22/092VE/E00/RB3 SQL92 Data Definition Language CREATE TABLE ALTER TABLE DROP TABLE CREATE VIEW DROP VIEW CREATE INDEX DROP INDEX
22/092VE/E00/RB4 Tabel behandling CREATE TABLE person (cpr CHAR(10) NOT NULL, navn VARCHAR(50) NOT NULL, vej VARCHAR(80), husnr SMALLINT, by VARCHAR(30), PRIMARY KEY (cpr) ) ALTER TABLE person ADD COLUMN tlf CHAR(8) DROP TABLE person
22/092VE/E00/RB5 Data Manipulation Language Opdatering af data INSERT INTO person (cpr, navn, adr, husnr, by) VALUES (” ”,”Anders And”, ”Paradisæblevej”,14, ”Andeby”) UPDATE person SET husnr=13 WHERE cpr=” ” DELETE FROM person WHERE navn like ”Kla%” AND by=”Andeby”
22/092VE/E00/RB6 Udvælgelse af data Relational Operators defined by Codd (70,72) Union Intersection Difference Cartesian product Restrict Project Join Divide
22/092VE/E00/RB7 Beskrivelse af de otte relationelle operatorer
22/092VE/E00/RB8 SQL92 Data Manipulation Language Forespørgsler Forespørgsel (find cpr og navn på alle i Andeby, sorteret efter navn): SELECT DISTINCT navn, by FROM person WHERE by=”Andeby” ORDER BY navn Resultat: navn by Anders And Andeby Fætter Højben Andeby Joakim Von And Andeby
22/092VE/E00/RB9 Kolonnefunktioner Forespørgsel (list antallet af indbyggere i Andeby): SELECT COUNT(*) FROM person WHERE by=”Andeby” Resultat: COUNT(*) Øvrige funktioner: SELECT SUM(kolonnenavn)… SELECT AVG(kolonnenavn)… SELECT MIN(kolonnenavn)… SELECT MAX(kolonnenavn)…
22/092VE/E00/RB10 Join CREATE TABLE superhelt (navn CHAR(80) NOT NULL, hem_id CHAR(10) NOT NULL, hjemby CHAR(30), PRIMARY KEY (navn,hem_id), FOREIGN KEY (hem_id) REFERENCES person(cpr) ) Forespørgsel (list alle superhelte og deres hemmelige identiteter): SELECT S.navn, P.navn FROM superhelt S, person P WHERE hem_id=cpr Resultat: S.navn P.navn StålandenAnders And
22/092VE/E00/RB11 Gruppering Forespørgsel (list antal superhelte grupperet efter hjemby): SELECT hjemby, count(*) FROM superhelte GROUP BY hjemby Resultat: hjemby count(*) Andeby 1 Metropolis 28
22/092VE/E00/RB12 Nested forespørgsler og Al-kvantorer Forespørgsel (list superhelte som har samtlige evner): SELECT navn FROM superhelt H WHERE NOT EXISTS ( SELECT * FROM superevne E WHERE NOT EXIST ( SELECT * FROM helteevne HE WHERE H.navn = HE.heltenavn AND H.hem_id = HE.hem_id AND E.navn = HE.evnenavn )
22/092VE/E00/RB13 NULL NULL betyder ”værdi ukendt” X = NULL; X <> NULL X IS NULL; X IS NOT NULL X er NULL; X = 10? X og Y er NULL; X = Y? SANDT, FALSK, UKENDT Kun ”SANDT” medtages i resultater, så foreningsmængden af resultaterne SELECT * FROM T WHERE X =5 giver ikke hele tabellen T. Det vil kræve at SELECT * FROM T WHERE X IS NULL også medtages.
22/092VE/E00/RB14 Embedded SQL Pre-compiled EXEC SQL DECLARE … EXEC SQL SELECT x,y INTO :x, :y FROM … Indikator variable for NULL Cursors: EXEC SQL DECLARE C CURSOR FOR SELECT x, y FROM … EXEC SQL OPEN C; while (sqlcode == 0) { EXEC SQL FETCH C INTO :x, :y; } EXEC SQL CLOSE C;
22/092VE/E00/RB15 Optimering af SQL SQL er ”selvoptimerende” Benytter –Indekser –Statistikker Explain/showplan/queryplan/... Masser af standardafvigende optimeringer –Tvungen brug af bestemte indeks –Parallel udførsel –Kreativ brug af indeks (MDAM) –Server optimering (memory etc.)