Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Relationsdatabaser og SQL

Lignende præsentationer


Præsentationer af emnet: "Relationsdatabaser og SQL"— Præsentationens transcript:

1 Relationsdatabaser og SQL
Del 3 af 4: Data Manipulation Language (DML) i SQL Aalborg Universitet, d. 6. september 2006 B e n t M ø l l e r M a d s e n

2 Tegn-forklaring Denne skrifttype er lig kode
STORE BOGSTAVER er lig Oracle kommandoer <tekst> betyder at tekst inkl. større-end og mindre-end tegn skal erstattes med den faktiske tekst/værdi. [tekst] betyder at tekst er valgfri og kan udelades. De firkantede parenteser skal aldrig skrives i koden. {tekst1|tekst2} betyder at en af teksterne adskilt af de lodrette streger skal vælges. De krøllede parenteser skal aldrig skrives i koden.

3 Elementer i en tabel Postnumre Postnumre Postnr Bynavn Postnr Bynavn
9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast

4 SQL til tabeldata Data Manipulation Language (DML)
INSERT UPDATE DELETE SELECT (MERGE) (TRUNCATE) Vedrører de faktiske data i tabeller 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast

5 Insert INSERT INTO <tabelnavn>
[(<kolonner>)] VALUES (<værdier>); INSERT INTO kunder VALUES (115, 'Føtex', null, ' '); INSERT INTO kunder (id, kunde) VALUES (116, 'Netto'); Kunder Id Number Kunde Varchar2 Postnr Dato Date Bemærk, tomt felt

6 Insert data fra anden tabel
INSERT INTO <tabelnavn> [(<kolonner>)] SELECT <kolonnenavne> FROM <tabelnavn>; INSERT INTO kunder_kopi (id, kunde) SELECT (id, kunde) FROM kunder; Bemærk at nøgleordet VALUES udelades ved indsætning af data fra en anden tabel

7 Regler for (indsættelse af) data
Værdierne adskilles med komma , Enkelt anførselstegn ' ' omkring værdier der indsættes (ikke krav ved NUMBER datatype) Der skal (naturligvis) tages hensyn til store og små bogstaver Ved manuel dataindsættelse kan kun én række oprettes for hver INSERT kommando NULL indtastes for et blankt felt. Der skal altid indtastes data i kolonner med NOT NULL betingelse

8 Regler for (indsættelser af) datoer
Da datoer kan antage mange forskellige formater, er det nødvendigt at definere det anvendte datoformat. Direkte i INSERT kommandoen vha. TO_DATE funktionen INSERT INTO kunder VALUES (115, 'Føtex', null, TO_DATE(' ', 'DD-MM-YYYY')); Eller ved at definere et datoformat for hele sessionen. ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY'; INSERT INTO kunder VALUES (115, 'Føtex', null, ' '); Funktionen SYSDATE indsætter dags dato i kolonnen. INSERT INTO kunder VALUES (115, 'Føtex', null, SYSDATE);

9 Sekvenser – fortløbende numre
Sekvenser anvendes hovedsageligt til at danne indholdet i syntetiske primærnøgler CREATE SEQUENCE <sekvensnavn> [INCREMENT BY <antal>] [START WITH <nummer>]; DROP SEQUENCE <sekvensnavn> SELECT * FROM user_sequences; CREATE SEQUENCE kunder_seq INCREMENT BY START WITH 1000; INSERT INTO kunder (id, kunde) VALUES (kunder_seq.nextval, 'Føtex');

10 Opdatering af data UPDATE <tabelnavn> SET <kolonnenavn> = <værdi> [WHERE <betingelse>]; UPDATE kunder SET kunde = 'Bilka', postnr = WHERE kunde = 'A-Z'; Hvis WHERE-sektionen udelades opdateres alle rækker i tabellen!

11 Sletning af data DELETE [FROM] <tabelnavn> [WHERE <betingelse>]; DELETE FROM kunder WHERE kunde = 'Føtex'; TRUNCATE TABLE kunder; TRUNCATE sletter uden mulighed for at foretage rollback/fortryde, men er til gengæld langt hurtigere end DELETE ved større datasæt.

12 Gemme og fortryde Når der arbejdes med data i tabeller gemmes ændringer ikke automatisk. COMMIT; Gemmer ændringer SAVEPOINT <navn på savepoint>; Opretter midlertidigt punkt der kan fortrydes tilbage til ROLLBACK [TO <navn på savepoint>]; Fortryd ændringer siden sidste commit eller bestemt savepoint

13 Udtrække data SELECT - Hvilke data vil jeg have?
FROM - Hvor skal data komme fra? [WHERE] - Hvilke betingelser skal være gældende? [GROUP BY] - Hvordan skal data grupperes? [HAVING] - Hvilke betingelser skal være gældende for grupper? [ORDER BY] - Hvordan skal data sorteres?

14 Komplet udtræk SELECT * FROM postnumre; postnr, bynavn Postnumre
9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Resultat Postnr Bynavn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast

15 Udtræk på delmængde af kolonner - projection
Postnumre SELECT bynavn FROM postnumre; Postnr Bynavn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Resultat Bynavn Aalborg Vrå Århus C Sorø Ikast

16 Sortering af output – stigende (asc) eller faldende (desc)
Postnumre SELECT * FROM postnumre ORDER BY postnr [ASC] Postnr Bynavn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Resultat Postnr Bynavn 4180 Sorø 7430 Ikast 8000 Århus C 9000 Aalborg 9760 Vrå

17 Udtræk på delmængde af rækker - restrict
Postnumre SELECT * FROM postnumre WHERE postnr > 8000; Postnr Bynavn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Resultat Postnr Bynavn 9000 Aalborg 9760 Vrå

18 Betingelser i WHERE Grundlæggende typer af betingelser:
Sammenligning Interval Mængde medlemskab Mønster-match Test for NULL Joins, der fortæller hvordan data fra flere tabeller hænger sammen kan også foretages i WHERE-sektionen, men generelt anbefales det at foretage joins direkte i FROM-sektionen.

19 Sammenligning Følgende type sammenligninger kan foretages mellem kolonner og/eller værdier = Lig med < Mindre end > Større end <= Mindre end eller lig med >= Større end eller lig med != Forskellig fra <> Forskellig fra

20 Interval og mængde medlemskab
Interval inkl. start- og slutværdi (BETWEEN): SELECT <kolonnenavne> FROM <tabelnavn> WHERE <kolonnenavn> BETWEEN <kolonne1 eller værdi1> AND <kolonne2 eller værdi2>; Mængde medlemsskab (IN): SELECT <kolonnenavn> FROM <tabelnavn> IN (<kolonne1 eller værdi1>, <kolonne2 eller værdi2>, …);

21 Mønster-match Mønster-match - jokertegn:
hvis den præcise værdi ikke kendes eller værdier med bestemte karakteristika ønskes WHERE <kolonnenavn> LIKE '<%_>'; _ = præcis én vilkårlig karakter % = 0 til mange vilkårlige karakterer Eks: SELECT * FROM medarbejdere WHERE fornavn LIKE 'Ann_' AND efternavn LIKE '%rist%nsen'; WHERE like

22 Test for NULL Test om feltet er tomt eller ej Eks:
WHERE <kolonnenavn> IS NULL; WHERE <kolonnenavn> IS NOT NULL; Eks: SELECT kunde_id, kunde FROM kunder WHERE tlf IS NOT NULL;

23 Bemærk forskellene i betingelserne!
WHERE Kunde = 'Bilka’ Finder rækker hvor kundenavnet er præcis ’Bilka’. WHERE Kunde = 'Bil%’ Finder rækker hvor kundenavnet er præcis ’Bil%’. WHERE Kunde = 'null’ Finder rækker hvor kundenavnet er præcis ’null’. WHERE Kunde like 'Bil%’ Finder rækker hvor kundenavnet starter med ’Bil’. WHERE Kunde is null Finder rækker hvor kundenavnet er tomt.

24 Flere samtidige betingelser og negation af betingelser
Flere betingelser kan kombineres ved anvendelse af AND og OR i WHERE-sektionen NOT kan anvendes til at negere en betingelse (opnå det modsatte resultat) Evalueringsrækkefølge: Generelt fra venstre mod højre Dog evalueres parenteser først Og NOT evalueres før AND, der evalueres før OR Select * FROM kunder WHERE (postnr >= 9000) AND (kunde = 'Føtex') OR NOT(kunde != 'Bilka');

25 Joins Anvendes til søgning på data fra flere tabeller
Tabellerne samles (”join'es”) via kolonner med ens indhold ofte kolonner med fremmed- og primærnøgler Join kan ske i FROM- eller WHERE-delen Typer af joins Naturligt join Inner join Outer join (left, right, full) Kartesisk produkt

26 Simpelt ”gammeldags” join i WHERE
Postnumre SELECT k.kunde, k.postnr, p.bynavn FROM postnumre p, kunder k WHERE p.postnr = k.postnr Når samme kolonnenavn forekommer i begge tabeller skal kolonnen præciseres med tabelnavnet Postnr Bynavn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Kunder ID Kunde Postnr 101 Bilka 9000 102 Kvickly 105 Spar 4180 103 Ikea 5000 Kunde Postnr Bynavn Bilka 9000 Aalborg Spar 4180 Sorø

27 Naturligt join på alle enslydende kolonner
Postnumre SELECT k.kunde, postnr, p.bynavn FROM postnumre p NATURAL JOIN kunder k Tabelnavn må IKKE stå foran join-kolonnen i et naturligt join Postnr Bynavn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Kunder ID Kunde Postnr 101 Bilka 9000 102 Kvickly 105 Spar 4180 103 Ikea 5000 Kunde Postnr Bynavn Bilka 9000 Aalborg Spar 4180 Sorø

28 Inner Join på delmængde af enslydende kolonnenavne
Postnumre SELECT k.kunde, postnr, p.bynavn FROM postnumre p JOIN kunder k USING (postnr) Tabelnavn må IKKE stå foran join-kolonnen ved USING Postnr Navn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Kunder ID Navn Postnr 101 Bilka 9000 102 Kvickly 105 Spar 4180 103 Ikea 5000 Kunde Postnr Bynavn Bilka 9000 Aalborg Spar 4180 Sorø

29 Inner Join på kolonner med forskellige navne
Postnumre SELECT k.kunde, k.postnr, p.bynavn FROM postnumre p JOIN kunder k ON (p.nr = k.postnr) Nr Bynavn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Kunder ID Kunde Postnr 101 Bilka 9000 102 Kvickly 105 Spar 4180 103 Ikea 5000 Kunde Postnr Bynavn Bilka 9000 Aalborg Spar 4180 Sorø

30 {Left|right|full} outer join
Postnumre SELECT k.kunde, postnr, p.bynavn FROM postnumre p NATURAL RIGHT OUTER JOIN kunder k {LEFT|RIGHT|FULL} OUTER kan tilføjes til alle typer FROM-joins Postnr Bynavn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Kunder Kunde Postnr Bynavn Bilka 9000 Aalborg Kvickly Spar 4180 Sorø Ikea 5000 ID Kunde Postnr 101 Bilka 9000 102 Kvickly 105 Spar 4180 103 Ikea 5000

31 Det kartesiske produkt
Postnumre SELECT k.kunde, k.postnr, p.bynavn FROM postnumre p CROSS JOIN kunder k Resultatet er lig alle kombinationer af rækkerne fra kildetabellerne Postnr Bynavn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Kunder Kunde Postnr Bynavn Bilka 9000 Aalborg Vrå Ikea 5000 Ikast ID Kunde Postnr 101 Bilka 9000 102 Kvickly 105 Spar 4180 103 Ikea 5000

32 Beregninger på kolonner
Postnumre Alle almindelige regneoperationer (plus, minus, gange og division) kan foretages på tal-kolonner Plus og minus kan også foretages på datoer for at lægge dage til eller trække dage fra en dato. SELECT postnr – 1000 AS nyt_postnr FROM postnumre; Postnr Bynavn 9000 Aalborg 9760 Vrå 8000 Århus C 4180 Sorø 7430 Ikast Resultat Nyt_postnr 8000 8760 7000 3180 6430

33 Funktioner Concatenation sammentrækker data fra flere felter til et felt: <kolonnenavn1 eller værdi1> || <kolonnenavn2 eller værdi2> CONCAT(< kolonnenavn1 eller værdi1 >, <kolonnenavn2 eller værdi2>) CONCAT virker kun med to kolonner/værdier af gangen Eks: SELECT 'Navn: ' || kunde AS kundenavn FROM kunder;

34 Funktioner Udtræk en delmængde af teksten i et felt. Tallet m siger hvorfra der skal klippes, mens n er antal tegn fra m der klippes ud SUBSTR (<kolonnenavn>, m,n) SELECT SUBSTR(kunde, 1,3) FROM kunder; Viser de første 3 bogstaver i hver kundes navn Udskift tomme / null værdier med egen tekst/tal eller indholdet fra en anden kolonne. NVL(<kolonnenavn>, <kolonnenavn eller værdi>) SELECT NVL(kunde, 'Ukendt') FROM kunder;

35 Funktioner Find/vis længden af hver enkelt værdi i en kolonne
LENGTH(<kolonnenavn>) Fjern decimaler, så der kun er m antal tilbage TRUNC (<kolonnenavn>, m) Afrund, så der kun er m antal decimaler tilbage ROUND (<kolonnenavn>, m) Fjern foran- og/eller bagvedstillede karakterer TRIM (LEADING [<karakter>] FROM <kolonne>) TRIM (TRAILING [<karakter>] FROM <kolonne>) TRIM ([BOTH] [<karakter>] FROM <kolonne>) TRIM (<kolonne>)

36 Funktioner Konvertering af dataformat TO_CHAR (<kolonnenavn>)
TO_NUMBER (<kolonnenavn>) TO_DATE (<kolonnenavn>,'datoformat') Datoformat f.eks. lig 'DD-MM-YYYY' for ' ' Ændring af tekst til STORE / små bogstaver UPPER (<kolonnenavn>) LOWER (<kolonnenavn>)

37 Aggregeringsfunktioner og GROUP BY
SELECT COUNT(<kolonnenavn> eller *) MIN (<kolonnenavn>) MAX (<kolonnenavn>) AVG (<kolonnenavn>) SUM (<kolonnenavn>) Ved hjælp af GROUP BY kan der laves aggregeringer gruppevis i stedet for alle valgte rækker. HAVING kan anvendes med GROUP BY til at begrænse de grupper, der skal vises. Kan sammenlignes med WHERE

38 Aggregeringsfunktioner - eksempler
SELECT COUNT(*) FROM kunder SELECT MIN (postnr), MAX (postnr) FROM kunder; SELECT postnr, COUNT (*) AS antal FROM kunder GROUP BY postnr HAVING COUNT(*) >= ORDER BY postnr; COUNT(*) 264 MIN(postnr) MAX(postnr) 4180 9000 Postnr Antal 5000 15 7400 19 8200 17 9000 27

39 Distinct DISTINCT finder de unikke værdier i en eller flere kolonne
DISTINCT <kolonnenavn(e)> SELECT DISTINCT postnr FROM KUNDER; SELECT DISTINCT kunde, postnr FROM KUNDER; DISTINCT kan anvendes i aggregerings-funktioner, hvor den mest interessante typisk er COUNT SELECT COUNT(DISTINCT postnr) FROM KUNDER; Hvis man vil tælle unikke værdier over flere kolonner skal de først sammentrækkes til et felt

40 CASE CASE anvendes til at danne nye værdier, hver gang der er et match på eksisterende værdier. (CASE <kolonnenavn> WHEN <originalværdi> THEN <ny værdi> … [ELSE <default_værdi>] END) AS <ny kolonne> (CASE WHEN <betingelse> THEN <ny værdi> … [ELSE <default_værdi>] END) AS <ny kolonne>

41 Case - eksempler SELECT kunde, (CASE postnr WHEN 9000 THEN 'Aalborg’ WHEN 9220 THEN 'Aalborg Øst’ ELSE 'Ukendt by’ END) AS Bynavn FROM kunder; SELECT postnr, bynavn, (CASE WHEN postnr < 5000 THEN ’Sjælland’ WHEN postnr >= 6000 THEN ’Jylland’ ELSE ’Fyn’ END) AS region FROM postnumre;

42 Sæt operatorer Sæt operatorer kombinere resultatet (rækkerne) fra forskellige select-sætninger UNION (Alle rækker minus dubletter) UNION ALL (Alle rækker inkl. dubletter) INTERSECT (Alle dubletter) MINUS (Unikke rækker fra første Select) JOIN UNION/INTERSECT/MINUS

43 Sæt operator - eksempel
Alle unikke samarbejdspartnere og postnr SELECT kunde AS navn, postnr FROM kunder UNION SELECT lev_navn, postnr FROM leverandoerer; Alle samarbejdspartnere, der både er kunder og leverandører fra samme postnr SELECT kunde AS navn, postnr FROM kunder INTERSECT SELECT lev_navn, postnr FROM leverandoerer; navn postnr Ikea 5000 Spar 4180

44 Subqueries Anvendelse af resultatet fra en (indre) SELECT-sætning som input i en anden (ydre) SELECT-sætning. Eks: SELECT <kolonnenavn> FROM <tabelnavn> WHERE <kolonnenavn> IN (SELECT……); SELECT <kolonnenavn> FROM (SELECT……) WHERE …;

45 Subqueries – eksempler
Find navnet på byen der har det største postnr SELECT postnr, bynavn FROM postnumre WHERE postnr = ( SELECT max (postnr) FROM postnr ); Banalt eks. hvor en forespørgsel anvendes som den komplette kilde til en ny forespørgsel SELECT id, kunde FROM ( SELECT * FROM kunder WHERE postnr > 8000 ) ORDER BY kunde;

46 Eksempel på hierarkisk forespørgsel
Medarbejdere Hierarkier kan gemmes i tabeller ved at have ”far/parent”- kolonne, der viser den over- ordnede række. SELECT id, navn, PRIOR navn AS chef, LEVEL FROM medarbejdere CONNECT BY PRIOR id = chef_id START WITH chef_id IS NULL; ID Navn Chef_id 101 Hans 102 Jens 105 Niels 103 Peter Resultat ID Navn Chef Level 102 Jens 1 101 Hans 2 103 Peter 3 105 Niels

47 View Virtuel tabel, der baseres på en gemt SQL-sætning Formål
I databasen gemmes kun sql-sætningen Formål Forenkle komplicerede forespørgsler Implementering af sikkerhed Give forskellige brugere forskellige måder at se de samme data Logisk uafhængighed af ændringer i tabelstrukturer Alle SELECT-forespørgsler kan foretages mod et view Begrænsede muligheder for INSERT, UPDATE og DELETE afhængig af konstruktionen

48 Oprettelsen af et view Oprettelsen af et view Forespørgsel mod et view
CREATE [OR REPLACE] VIEW <viewnavn> AS SELECT <kolonner> FROM <tabelnavne> WHERE … ; Forespørgsel mod et view SELECT * FROM <viewnavn>; Sletning af et view DROP VIEW <viewnavn>; Vis definitionerne af alle views SELECT * FROM user_views;

49 DUAL tabel i Oracle DUAL tabellen er en dummy tabel, der ikke har noget indhold, men som kan anvendes ved SELECT-sætninger, hvor der reelt ikke er en kildetabel Eks: SELECT 5*10 FROM DUAL; SELECT SYSDATE FROM DUAL; SELECT USER FROM DUAL;

50 Trigger En trigger er et lille program, der ved en bruger-defineret aktivitet udfører en bestemt handling. CREATE [OR REPLACE] TRIGGER <trigger-navn> {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON <tabel-navn> [REFERENCING [NEW AS <navn for ny række>] [OLD AS <navn for gammel række>]] [FOR EACH ROW [WHEN (<trigger-betingelse>)]] <trigger-handling>

51 Trigger der automatisk henter næste værdi fra en sekvens ind i en tabel
CREATE OR REPLACE TRIGGER kunde_seq_trigger BEFORE INSERT ON kunder FOR EACH ROW BEGIN IF ( :NEW.kunde_id IS NULL ) THEN SELECT kunde_seq.NEXTVAL INTO :NEW.kunde_id FROM DUAL; END IF; END; /

52 Kommentarer - Comments
Kommentarer der ikke registreres i databasen -- hvis kommentaren kun fylder én linie /* */ hvis kommentaren fylder flere linier Kommentarer der registreres i databasen COMMENT ON TABLE <tabelnavn> IS '<kommentarer>'; COMMENT ON COLUMN <tabelnavn.kolonnenavn> SELECT table_name, comments FROM user_tab_comments WHERE table_name = '<tabelnavn>';

53 Access Rights (DCL) Brugerstyring og hvilke brugere, der har adgang til hvilke data. GRANT <access_right> ON <tabelnavn> TO <user_id>; REVOKE <access_right> ON <tabelnavn> FROM <user_id>; Eks: GRANT SELECT ON kunder TO bmm; REVOKE SELECT ON kunder FROM bmm;

54 Brugerstyring med SQL Opret bruger: Slet bruger Rettigheder til bruger
CREATE USER <brugernavn> IDENTIFIED BY <password>; Slet bruger DROP USER <brugernavn> [CASCADE]; Rettigheder til bruger GRANT CONNECT, RESOURCE, CREATE VIEW TO <brugernavn> Ændre password: ALTER USER <brugernavn> IDENTIFIED BY <nyt password>; Log på med bruger: CONNECT

55 Indeksering Hvorfor? Syntaks Hvilke kolonner skal man så indeksere?
Større hastighed Uden et indeks må databasen søge sekventielt Tilsvarende at skulle finde oplysninger i en bog Syntaks CREATE [UNIQUE] INDEX <indeksnavn> ON <tabelnavn> (<kolonnenavn> [DESC]); Hvilke kolonner skal man så indeksere? Primære og unikke nøgler indekseres automatisk Fremmednøgler Felter der ofte søges på

56 Data dictionary Databasens systemtabeller (ejes af sys):
Tabeldefinitioner Integrity constraints Sikkerhedsinformation Definition af indeks, views, mv.

57 Data dictionary Nyttige views i Oracle's data dictionary: user_tables
user_constraints user_cons_columns (Constraints kolonner) user_views user_sequences user_synonyms user_indexes user_ind_columns (Indeks kolonner)

58 Scripts Et script er en eller flere sql-sætninger placeret i en tekstfil – typisk med endelsen ”.sql”. Kan eksekveres fra SQL-prompten med @<sti og filnavn>; Eksempel: @C:\scripts\create_tables.sql;

59 ?


Download ppt "Relationsdatabaser og SQL"

Lignende præsentationer


Annoncer fra Google