SQL HiA
SQL
• SQL(Structured Query Language, uttales: sequel eller ess-que-ell)
er et komplett sett av kommandoer for aksess til en relasjons-database.
• SQL er i dag standard database-språk for relasjons-databaser.
• SQL benyttes til:
- Opprette datase-tabeller
- Lagre data
- Gjenfinne data
- Endre data
- Endre tabell-strukturer
- Kombinere og beregne data
- Ta hånd om database-sikkerhet
• SQL er mengde-orientert, dvs kan anvendes på en gruppe av records
eller enkelt-record.
• SQL er ikke-prosedyrisk, men kan innebygges i prosedyre-språk.
3.
SQL HiA
Historikk
• 1970Codd beskrev en relasjons-algebra
for organisering av data inn i tabeller.
“A Relational Model of Data for Large Shared Data Banks”.
• 1974 “SEQUEL: A structured English Query Language”.
Oppfyller kravene i Codd’s relasjons-algebra.
• 1976 SEQUEL/2
IBM prototype kalt System R.
• 1980 Navnet endres til SQL.
ANSI-standard.
• 1997 SQL m/objektorientering
4.
SQL HiA
SQL Data-språkfor alle ?
SQL var opprinnelig tenkt å skulle være
ET DATABASE-SPRÅK FOR ALLE
I praksis bygges SQL inn i et høgnivåspråk
for bl.a. å bedre brukergrensesnittet.
5.
SQL HiA
Hva beståren database av ?
• Selve databasen med lagrede data
• Data Dictionary (System-kataloger)
med alle nødvendige opplysninger om databasens struktur
• DBMS - DataBase Management System
Database software til operasjoner på databasen
SQL HiA
Database-system -Eksempler
Bruker
Bruker
Bruker
Appl.
Appl.
Appl.
DBMSDBMS
DDDD
DatabaseDatabase
Centura Team/Web Developer
SQLTalk
C++ SQL/API
SQLBase
SQLServer
Oracle
8.
SQL HiA
Eksempel påinnhold i en database
TablesTables
IndexesIndexes
TriggersTriggers
ViewsViews ProceduresProcedures
RulesRules
DatatypesDatatypes
DefaultsDefaults
Database
9.
SQL HiA
Database /Tabell / Rad / Kolonne
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Database
Tabell
Rad
Post
Record
Kolonne
Felt
10.
SQL HiA
Flerbrukersystem Client/ Server
DatabaseDBMSDBMS
Application_2Application_2
SQL-Request
Data
Application_3Application_3
Application_1Application_1
Client Server
11.
SQL HiA
Typer avSQL-kommandoer (1)
• Data Definition Commands ( DDL )
• Data Manipulation Commands ( DML )
• Data Query Commands ( DQL )
• Transaction Control Commands
• Data Administation Commands
• Data Control Commands
SQL HiA
Typer avSQL-kommandoer (4)
• Data Control Commands (1)
ALTER DATABASE
ALTER DBAREA
ALTER PASSWORD
ALTER STOGROUP
ALTER TABLE
ALTER TRIGGER
CHECK DATABASE
CHECK TABLE
COMMENT ON
15.
SQL HiA
Typer avSQL-kommandoer (5)
• Data Control Commands (2)
CREATE DATABASE
CREATE DBAREA
CREATE EVENT
CREATE INDEX
CREATE STOGROUP
CREATE SYNONYM
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
16.
SQL HiA
Typer avSQL-kommandoer (6)
• Data Control Commands (3)
DBATTRIBUTE
DEINSTALL DATABASE
DROP DBAREA
DROP EVENT
DROP INDEX
DROP STOGROUP
DROP SYNONYM
DROP TABLE
DROP TRIGGER
DROP VIEW
GRANT
GRANT EXECUTE ON
INSTALL DATABASE
LABEL
LOAD
LOCK DATABASE
17.
SQL HiA
Typer avSQL-kommandoer (7)
• Data Control Commands (4)
REVOKE
REVOKE EXECUTE ON
ROWCOUNT
SET DEFAULT STOGROUP
UNLOAD
UNLOCK DATABASED
UPDATE STATISTICS
SQL HiA
CREATE DBAREA
CREATEDBAREA dbarea name
AS filename
SIZE megabyte
Oppretter et fysisk database-område av gitt størrelse i megabyte (default 1MB)
CREATE DBAREA Handel_1 AS Vol_1:CenturaHandel_1 SIZE 5
CREATE DBAREA Handel_2 AS Vol_1:CenturaHandel_2 SIZE 10
CREATE DBAREA Handel_3 AS Vol_2:CenturaHandel_3 SIZE 10
Vol_1 Vol_2
Handel_2
Handel_1 Handel_3
25.
SQL HiA
CREATE STOGROUP
Oppretteren storage group
CREATE STOGROUP stogroup name
,
USING dbarea-name
CREATE STOGROUP Handel_Files
USING Handel_1, Handel_2
CREATE STOGROUP Handel_Log
USING Handel_3
StorageGroup
Handel_Files
StorageGroup
Handel_Log
Handel_2
Handel_1 Handel_3
26.
SQL HiA
CREATE DATABASE
Oppretteren database
CREATE DATABASE databasename
IN stogroup name
LOG TO stogroup name
CREATE DATABASE Handel
IN Handel_Files
LOG TO Handel_Log
Data Log filer
Handel_2
Handel1 Handel_3
Databasen Handel
SQL HiA
Data-typer (SQLBase )
Char(length) Max 254 tegn
VarChar(length) Max 254 tegn
Long VarChar Vilkårlig lengde, tekst og binære data
SmallInt [-32768, +32767] 5 siffer
Integer [-2147483648, + 2147483647] 10 siffer
Decimal[(prec, scale)] [-999....., + 999.....] 15 siffer
precision: Totalt ant siffer (5 default)
scale: Ant desimaler (0 default)
Float[prec] Vilkårlig tall opp til 15 siffer totalt
Number Vilkårlig tall opp til 15 siffer totalt
DateTime Format Day.Time
Day ant dager siden 10.12.1899
Time = Frac part (0 = 12:00 AM)
TimeStamp Samme som DateTime (DB2 komp.)
Date Time part = 0
Time Date part = 0
33.
SQL HiA
INSERT
Innsetter enrad i en tabellInnsetter en rad i en tabell
INSERT table name
view name ,
( column name )
VALUES ( constant )
bind variable ADJUSTING cursor name
system keyword
subselect
34.
SQL HiA
INSERT -Eksempel
INSERT INTO Adr
VALUES (5002,”Bergen”)
INSERT INTO Adr
VALUES (6400,”Molde”)
INSERT INTO Adr
VALUES (9000,”Tromsø”)
PNr Sted
5002 Bergen
6400 Molde
9000 Tromsø
Adr (ID = PNr)
35.
SQL HiA
INSERT -Eksempel
INSERT INTO Adr (PNr,Sted)
VALUES(:1,:2)
$DATATYPES NUMERIC,CHARACTER
5002,Bergen
6400,Molde
9000,Tromsø
/
PNr Sted
5002 Bergen
6400 Molde
9000 Tromsø
Adr (ID = PNr)
36.
SQL HiA
Innsetting avtabell-verdier - Adr
INSERT INTO Adr
VALUES (5002,”Bergen”)
INSERT INTO Adr
VALUES (6400,”Molde”)
INSERT INTO Adr
VALUES (9000,”Tromsø”)
PNr Sted
5002 Bergen
6400 Molde
9000 Tromsø
Adr (ID = PNr)
37.
SQL HiA
Innsetting avtabell-verdier - Adr
INSERT INTO Adr (PNr,Sted)
VALUES(:1,:2)
$DATATYPES NUMERIC,CHARACTER
5002,Bergen
6400,Molde
9000,Tromsø
/
PNr Sted
5002 Bergen
6400 Molde
9000 Tromsø
Adr (ID = PNr)
SQL HiA
SELECT
SELECT SelectItem
ALL,
DISTINCT *
FROM TableSpecification
,
WHERE SearchCondition
GROUP BY GroupingColumn
,
HAVING SearchCondition
ORDER BY SortSpecification
,
40.
SQL HiA
Select -Enkel bruk
SELECT SNr, Navn, PNr
FROM Selger
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
Resultatsett
SQL HiA
SELECT -Bruk av *
SELECT *
FROM Selger
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
43.
SQL HiA
SELECT -Enkelt-felter
SELECT PNr, Navn
FROM Selger
PNr Navn
5002 Nilsen
6400 Olsen
9000 Hansen
6400 Berg
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
44.
SQL HiA
SELECT -Distinct
SELECT DISTINCT SNr
FROM Salg
SNr
1
2
4
5
Hvis flere felter nevnes i Select-statementet, vil Distinct gjelde alle disse, dvs kun de rader
hvor alle de nevnte feltene er like medfører sløyfing av duplikate rader.
Distinct er hensiksmessig i tilknytning til sub-queries.
SNr VNr Mengde
5 8 30
2 1 20
2 3 10
1 5 50
1 8 40
4 1 70
4 3 50
4 5 20
Salg (ID = SNr + VNr)
45.
SQL HiA
WHERE
SELECT SNr,Navn, PNr
FROM Selger
WHERE PNr = 6400
SNr Navn PNr
2 Olsen 6400
4 Berg 6400
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
46.
SQL HiA
WHERE
SELECT VNr,Pris
FROM Vare
WHERE Pris > 300
VNr Pris
8 500
3 400
VNr Pris
8 500
1 200
3 400
5 300
Vare (ID = VNr)
47.
SQL HiA
WHERE
SELECT SNr,Navn, PNr
FROM Selger
WHERE PNr = 6400 AND Navn > ‘C’
SNr Navn PNr
2 Olsen 6400
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
48.
SQL HiA
WHERE
SELECT SNr,Navn, PNr
FROM Selger
WHERE PNr = 6400 OR SNr > 3
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
4 Berg 6400
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
49.
SQL HiA
WHERE
SELECT SNr,Navn, PNr
FROM Selger
WHERE PNr = 6400 OR NOT SNr > 3
SNr Navn PNr
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
50.
SQL HiA
SQL -3-verdi logikk
A op B
True
False
NULL
WHERE-test Ok ved True
GROUP BY -test Ok ved True og
NULL
AND True False NULL
True True False NULL
False False False False
NULL NULLFalse NULL
OR True False NULL
True True True True
False True False NULL
NULL True NULLNULL
NOT True False NULL
False True NULL
51.
SQL HiA
IN
SELECT PNr,Sted
FROM Adr
WHERE Sted IN (‘Molde’,Tromsø’)
PNr Sted
6400 Molde
9000 Tromsø
PNr Sted
5002 Bergen
6400 Molde
9000 Tromsø
Adr (ID = PNr)
52.
SQL HiA
BETWEEN
SELECT SNr,Navn, PNr
FROM Selger
WHERE SNr BETWEEN 1 AND 4
SNr Navn PNr
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
53.
SQL HiA
Joker-symbol %og _
SELECT SNr, Navn, PNr
FROM Selger
WHERE Navn LIKE ‘N%’
SNr Navn PNr
5 Nilsen 5002
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
54.
SQL HiA
Joker-symbol %og _
SELECT SNr, Navn, PNr
FROM Selger
WHERE Navn LIKE ‘%sen’
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
55.
SQL HiA
Joker-symbol %og _
SELECT SNr, Navn, PNr
FROM Selger
WHERE Navn LIKE ‘Ni%sen’
SNr Navn PNr
5 Nilsen 5002
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
56.
SQL HiA
Joker-symbol %og _
SELECT SNr, Navn, PNr
FROM Selger
WHERE Navn LIKE ‘Ni_sen’
SNr Navn PNr
5 Nilsen 5002
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
57.
SQL HiA
Joker-symbol %og _
SELECT SNr, Navn, PNr
FROM Selger
WHERE Navn LIKE ‘Ni/_%’
SNr Navn PNrSNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
58.
SQL HiA
Joker-symbol %og _
SELECT SNr, Navn, PNr
FROM Selger
WHERE Navn LIKE ‘Ni//%’
SNr Navn PNrSNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
59.
SQL HiA
NULL
SELECT SNr,Navn, PNr
FROM Selger
WHERE PNr IS NULL
SNr Navn PNrSNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
60.
SQL HiA
NULL
SELECT SNr,Navn, PNr
FROM Selger
WHERE PNr IS NOT NULL
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
SQL HiA
Join -Kobling av en tabell mot seg selv
SELECT First.Navn, Sec.Navn, First.PNr
FROM Selger First, Selger Sec
WHERE First.PNr = Sec.PNr
First.Navn Sec.Navn First.PNr
Nilsen Nilsen 5002
Olsen Olsen 6400
Berg Olsen 6400
Hansen Hansen 9000
Olsen Berg 6400
Berg Berg 6400
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
84.
SQL HiA
Join -Kobling av en tabell mot seg selv (uten
dublering)
SELECT First.Navn, Sec.Navn, First.PNr
FROM Selger First, Selger Sec
WHERE First.PNr = Sec.PNr AND
First.Navn < Sec.Navn
First.Navn Sec.Navn First.PNr
Berg Olsen 6400SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
85.
SQL HiA
Join -Kobling av en tabell mot seg selv
Nr Navn Sjef
105 Adams 112
107 Smith 105
110 Clark
112 Cruz 107
115 Jones 112
SELECT First.Navn, Sec.Navn
FROM Tilsatt First, Tilsatt Sec
WHERE First.Sjef = Sec.Nr
Tilsatt
Navn Sjef
Smith Adams
Cruz Smith
Adams Cruz
Jones Cruz
List ut alle tilsatte med tilhørende sjef
Nr Navn Sjef
105 Adams 112
107 Smith 105
110 Clark
112 Cruz 107
115 Jones 112
First
Nr Navn Sjef
105 Adams 112
107 Smith 105
110 Clark
112 Cruz 107
115 Jones 112
Sec
86.
SQL HiA
Join utenParent / Child relasjon
Navn TilsattDato
Adams 12.02.90
Jones 17.10.91
Smith 14.06.92
Clark 21.10.92
Cruz 04.01.93
OrdreNr Dato Belop
11305 05.07.89 1000
11296 12.02.90 2000
15320 15.04.92 1500
15900 12.02.90 7200
17541 04.07.93 3100
Tilsatt Ordre
SELECT Ordre.OrdreNr
FROM Tilsatt, Ordre
WHERE Ordre.Dato = Tilsatt.TilsattDato AND
Tilsatt.Navn = ‘Adams’
Lister ut alle ordre som ble ekspedert samme dato som Adams ble tilsatt.
OrdreNr
11296
15900
Ordre
87.
SQL HiA
Join m/NULL-verdier
SNrNavn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen
4 Berg 6400
Selger
PNr Sted
5002 Bergen
6400 Molde
9000 Tromsø
Adr
SELECT Navn, PNr
FROM Selger
List selgere med tilhørende postnummer
Navn PNr
Nilsen 5002
Olsen 6400
Hansen
Berg 6400
88.
SQL HiA
Join m/NULL-verdier
SNrNavn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen
4 Berg 6400
Selger
PNr Sted
5002 Bergen
6400 Molde
9000 Tromsø
Adr
SELECT Navn, Sted
FROM Selger, Adr
WHERE Selger.PNr = Adr.PNr
List selgere med tilhørende postnummer
Navn Sted
Nilsen Bergen
Olsen Molde
Berg Molde
Hansen mangler
89.
SQL HiA
Join -Outer Join ANSI standard
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen
4 Berg 6400
Selger
PNr Sted
5002 Bergen
6400 Molde
9000 Tromsø
Adr
SELECT Navn, Sted
FROM Selger, Adr
WHERE Selger.PNr *= Adr.PNr
List selgere med tilhørende postnummer
Navn Sted
Nilsen Bergen
Olsen Molde
Hansen
Berg Molde
90.
SQL HiA
Join -Outer join SQLBase
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen
4 Berg 6400
Selger
PNr Sted
5002 Bergen
6400 Molde
9000 Tromsø
Adr
SELECT Navn, Sted
FROM Selger, Adr
WHERE Selger.PNr = Adr.PNr (+)
List selgere med tilhørende postnummer
Navn Sted
Nilsen Bergen
Olsen Molde
Hansen
Berg Molde
91.
SQL HiA
Join -Outer join SQLBase NULLVALUE
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen
4 Berg 6400
Selger
PNr Sted
5002 Bergen
6400 Molde
9000 Tromsø
Adr
SELECT Navn, @NULLVALUE(Sted,’Ukjent’)
FROM Selger, Adr
WHERE Selger.PNr = Adr.PNr (+)
List selgere med tilhørende postnummer
Navn Sted
Nilsen Bergen
Olsen Molde
Hansen Ukjent
Berg Molde
92.
SQL HiA
Join -Left / Right / Complete
1. Begynn med inner join med matchende kolonner
2. For hver rad i den første tabellen som ikke matcher en rad i den andre tabellen
(pga NULL i første tabell), adder til en rad med verdier fra den første tabellen
og NULL-verdier fra den andre tabellen.
3. For hver rad i den andre tabellen som ikke matcher en rad i den første tabellen
(pga NULL-verdier i andre tabell), adder til en rad med verdier fra den andre
tabellen og NULL-verdier fra den første tabellen.
Outer join Step ANSI syntaks SQLBase
Left Step 1 + 2 c1 *= c2 c1 = c2 (+)
Right Step 1 + 3 c1 =* c2 c1 (+) = c2
Full Step 1 + 2 + 3 c1 *=* c2 c1 (+) = c2 (+)
SQL HiA
UPDATE
Oppdaterer entabellOppdaterer en tabell
UPDATE table name
view name correlation name
SET column name = expression
NULL
WHERE search condition CHECK EXISTS
CURRENT OF cursor name
100.
SQL HiA
Oppdatering avdatabasen
UPDATE Vare
SET Pris = 450
WHERE VNr = 3
UPDATE Vare
SET Pris = 450
UPDATE Vare
SET Pris = Pris * 1.10
WHERE VNr = 3
UPDATE Vare
SET Pris = Pris * 1.10
UPDATE Tab
SET a = ...
b = ...
c = ...
101.
SQL HiA
DELETE
Sletter rad(er)i en tabellSletter rad(er) i en tabell
DELETE table name
view name correlation name
WHERE search condition
CURRENT OF cursor name
102.
SQL HiA
DELETE -Eksempel
DELETE FROM Salg
WHERE SNr = 4 AND
VNr= 3
DELETE FROM Salg
Sletting av samtlige poster
i tabellen Salg.
SQL HiA
String funksjoner
@CHARASCII tegn til en desimal kode
@CODE ASCII tegn til første tegn i en string
@DECODE Returnerer en string, gitt et uttrykk
@EXACT Sammenligner to stringer
@FIND Posisjon til string1 i string2
@LEFT Første (venstre) substring
@LENGTH Lengden av en string
@LOWER Omgjøring til små bokstaver
@MID Returnerer en string, gitt startpunkt
@NULLVALUE Returnerer string/tall spesifisert ved y hvis x er NULL
@PROPER Omgjøring av første bokstav i hvert ord til stor bokstav
@REPEAT Konkatenering av en string med seg selv n ganger
@REPLACE Erstatter tegn i en string
@RIGHT Siste (høyre) substring
@SCAN Søker en string etter gitt mønster
@STRING Omgjøring av tall til string
@SUBSTRING Returnerer en del av en string
@TRIM Redusering av blanke tegn (innledende og multiple)
@UPPER Omgjøring til store bokstaver
@VALUE Omgjøring fra string til tall
106.
SQL HiA
Date /Time funksjoner
@DATE Konvertering til dato
@DATETOCHAR Edit en dato
@DATEVALUE Edit en dato
@DAY Dag i måneden
@HOUR Time til en dag
@MICROSECOND Mikrosekund
@MINUTE Minutt i en time
@MONTH Måneden i et år
@MONTHBEG Første dag i en måned
@NOW Gjeldende Date / Time
@QUARTER Tall som representerer kvartal
@QUARTERBEG Første dag i et kvartal
@SECOND Sekunder av et minutt
@TIME Returnerer date/time
@TIMEVALUE Returnerer en date/time verdi fra hh:mm:ss
@WEEKBEG Mandag av uke
@WEEKDAY Dag av en uke
@YEAR År relativt til 1900
@YEARBEG Første dag i året
@YEARNO Kalender år
SQL HiA
Finans funksjoner
@CTERMAntall perioder for å oppnå en fremtidig verdi
@FV Fremtidig verdi av ekvidistante innbetalinger
@PMT Periodiske innbetalinger ved nedbetaling
@PV Verdi av ekvidistante innbetalinger
@RATE Renter for å vokse til gitt beløp
@SLN Rettlinjet verdi-foringelse
@SYD Sum av et års verdi-foringelse
@TERM Antall innbetalings-perioder for gitt investering
109.
SQL HiA
Spesielle funksjoner
@CHOOSEVelger en verdi basert på korrelasjon
@DECIMAL Desimal verdi av en hexadesimal string
@DECRYPT Dekrypting av et passord
@DECODE Returnerer en string, gitt et uttrykk
@HEX Hexadesimal string fra et desimal-tall
@LICS Sortering basert på internasjonalt tegn-sett
SQL HiA
Funksjoner -Eksempel
SELECT SNr, @PROPER(Navn)
FROM SelgerAdr
WHERE @UPPER(@TRIM(Navn)) = ‘HANSEN’
Usikkerhet angående skrivemåte av navn i databasen (små eller store bokstaver, mellomrom, ... )
112.
SQL HiA
@CHOOSE
@CHOOSE (SelNr,a, b, c, d, e, f, g)
SNr <= 0 gir første liste-verdi a, SNr = 1 neste verdi b, …, SNr >=6 gir her siste verdi g
SelNr Resultat
0
-1
2
12
a
a
c
g
SQL HiA
@FV
@FV (Belop,p, n)
Returnerer fremtidig verdi av en serie av n antall innbetalinger (hver lik Belop)
til p prosent rente.
n
(1 + p/100) - 1
Belop * -------------------
p/100
115.
SQL HiA
SQL Etstørre eksempel (1)
SELECT StlngMax.Periode, StlngMax.StRang, COUNT(*),
@ROUND(AVG(Ektekskap.EVarighet),1)
FROM StlngMax, Ekteskap
WHERE StlngMax.PersonID = Ekteskap.MannID AND
Ekteskap.ENrMann = 1 AND
GROUP BY StlngMax.Periode, StlngMax.StRang
List ut for hver tidsperiode og stilling gjennomsnittlig ekteskapsvariget (1.ekteskap med 1 desimal) for hver person
i tabellen StlngMax samt totalt antall personer som er med i beregningen (for hver periode)
StlngMax Ekteskap
PersonID
…..
Periode
StRang
MannID
KvinneID
…..
ENrMann
ENrKvinne
EVarighet
Periode Stilling GjEVarighet Count
1500-1549 Kap 29,3 211
Sp 30,1 105
…..
1550-1599 Kap 31,2 323
Sp 31,7 258
…..
…..
116.
SQL HiA
SQL -Et større eksempel (2)
SELECT StlngMax.StRang, StlngMax.Periode, COUNT(*),
@ROUND(AVG(Ektekskap.EVarighet),1)
FROM StlngMax, Ekteskap
WHERE StlngMax.PersonID = Ekteskap.MannID AND
Ekteskap.ENrMann = 1 AND
GROUP BY StlngMax.StRang, StlngMax.Periode
List ut for hver stilling og tidsperiode gjennomsnittlig ekteskapsvariget (1. ekteskap med 1 desimal) for hver person
i tabellen StlngMax samt totalt antall personer som er med i beregningen (for hver periode)
StlngMax Ekteskap
PersonID
…..
Periode
StRang
MannID
KvinneID
…..
ENrMann
ENrKvinne
EVarighet
Stilling Periode GjEVarighet Count
Kap 1500-1549 29,3 211
1550-1599 31,2 323
…..
Sp 1500-1549 30,1 105
1550-1599 31,7 258
…..
117.
SQL HiA
UNLOAD
Laster datafra en database ut til en fil av gitt formatLaster data fra en database ut til en fil av gitt format
SQL ‘file name’ source ta
COMPRESS DATA CONTROL ‘file name’ OVERWRITE ALL
ASCII ‘file name’ sou
DATA CONTROL ‘file name’ OVERWRITE
DIF ‘file name’ sou
DATA CONTROL ‘file name’ OVERWRITE
DATABASE ‘file name’
COMPRESS SHEMA CONTROL ‘file name’ OVERWRITE
ALL
CLIENT LOG ‘logfile name’
SERVER
118.
SQL HiA
UNLOAD -Eksempel
UNLOAD DATA SQL c:dataAdr.txt Adr
INSERT INTO Adr (PNr,Sted)
VALUES(:1,:2)
$DATATYPES NUMERIC,CHARACTER
5002,Bergen
6400,Molde
9000,Tromsø
/
Kopierer data fra database-tabellen Adr, prefikser dataene med en INSERT-kommando (pga SQL)
og lagrer dette til tekstfilen c:dataAdr.txt.
119.
SQL HiA
LOAD
Laster datafra en fil av gitt format inn til en tabell i databasenLaster data fra en fil av gitt format inn til en tabell i databasen
LOAD SQL ‘file name’
COMPRESS CONTROL ‘file name’
ASCII ‘file name’ table name
CONTROL ‘file name’
DIF ‘file name’
CONTROL ‘file name’ table name
ON CLIENT LOG ‘logfile name’ START AT line
SERVER
SQL HiA
ALTER TABLE
Endrerpå kolonne-strukturen i en tabellEndrer på kolonne-strukturen i en tabell
ALTER TABLE table name
,
DROP column name
ADD column name data type
(size) NOT NULL
NOT NULL WITH DEFAULT
,
RENAME column name new name
TABLE new name
,
MODIFY column name
data type (length) NULL
NOT NULL
NOT NULL WITH DEFAULT
122.
SQL HiA
ALTER TABLE- Eksempel
ALTER TABLE Bedrift
MODIFY BedriftsNavn Char(50)
ALTER TABLE Bedrift
ADD Tlf Char(8)
Endrer datatype og/eller kolonnelengde
Legger til en kolonne
123.
SQL HiA
ALTER TABLE(Referential Integrity)
Endrer på PRIMARY KEY / FOREIGN KEY strukturen i en tabellEndrer på PRIMARY KEY / FOREIGN KEY strukturen i en tabell
ALTER TABLE table name
,
PRIMARY KEY ( column name )
DROP
,
,
FOREIGN KEY ( column name ) REFERENCES parent table name
DROP foreign key
name
ON DELETE RESTRICT
CASCADE
SET NULL
124.
SQL HiA
ALTER TABLE(Error Message)
Endrer på USERERROR strukturen i en tabellEndrer på USERERROR strukturen i en tabell
ALTER TABLE table name
ADD USERERROR error number
DROP
MODIFY
FOR ‘DELETE_PARENT’ OF PRIMARY KEY
‘UPDATE_PARENT’ FOREIGN KEY key name
‘UPDATE_DEPENDENT’
125.
SQL HiA
ALTER TRIGGER
Enable/ Disable en triggerEnable / Disable en trigger
ALTER TRIGGER trigger name ENABLE
DISABLE
126.
SQL HiA
COMMIT
Commits alleendringene til databasen siden forrige COMMIT eller ROLLBACK.
Commits gjelder alle SqlHandles / Cursors som gjeldende applikasjon
har koblet opp mot databasen.
COMMIT
WORK TRANSACTION <id> FORCE
127.
SQL HiA
ROLLBACK
Omgjør sistetransaksjonOmgjør siste transaksjon
ROLLBACK
savepoint identifier
TRANSACTION <id> FORCE
SQL HiA
CREATE INDEX
Oppretteren indeksOppretter en indeks
EATE INDEX index name
UNIQUE CLUSTERED HASHED
,
table name ( column name )
ASC
DESC
CTFREE integer constant SIZE integer value ROWS
BUCKET
Max size = 6 + number of + sum of <= 255
columns in length of all
index columns in
index
130.
SQL HiA
CREATE INDEX- Eksempel
CREATE UNIQUE INDEX Bidndx
ON Bedrift (BedriftsID)
CREATE INDEX BnNdx
ON Bedrift (BedriftsNavn)
131.
SQL HiA
CREATE SYNONYM
Opprettersynonym (alias) navn til en tabellOppretter synonym (alias) navn til en tabell
CREATE SYNONYM synonym name
PUBLIC
FOR table name
authorization ID view name
SQL HiA
UNION
Genererer resultatsettsom union av multiple SELECTGenererer resultatsett som union av multiple SELECT
UNION
ALL
select command
,
ORDER BY integer constant
ASC
DESC
SELECT …
UNION ALL
SELECT …
UNION ALL
SELECT …
...
Duplikater blir ikke eliminert
134.
SQL HiA
UPDATE STATISTICS
Oppdatererstatistikk-informasjon i databasen.
Benyttes til å generere applikasjonsplan.
Oppdaterer statistikk-informasjon i databasen.
Benyttes til å generere applikasjonsplan.
UPDATE STATISTICS
INDEX index name
,
SET system catalog column name = expression
,
DISTINCTCOUNT (index key) = expression
TABLE
,
SET system catalog column name = expression
DATABASE
135.
SQL HiA
Brukere /Privilegier
• Ulike brukere gis ulike passord.
• Data i en tabell skal være tilgjengelig for noen brukere,
men sperret for andre.
• Noen brukere skal kunne gjøre endringer i en tabell,
andre skal kun få lov til å lese fra tabellen.
• I en tabell kan det være ønskelig med ulike restriksjoner
knyttet til enkelt-kolonner.
• Noen brukere nektes bruk av interaktiv SQL-aksess,
mens de samme brukerne kan benytte andre applikasjons-program
for oppdatering av den samme databasen.
Eventuelle restriksjoner er da innebygget i applikasjons-programmet.
136.
SQL HiA
Brukere /Privilegier
• Brukere med DBA-privilegier
• Brukere med RESOURCE-privilegier
• Brukere med CONNECT-privilegier
Det finnes tre hoved-typer brukere:
SQL HiA
CONNECT
• Adgangtil databasen.
• Adgang til å manipulere spesifikke tabeller i følge tilordnede privilegier.
139.
SQL HiA
RESOURCE
• Adgangtil å opprette tabeller, indekser og clustre.
• Alle rettigheter til operasjoner på egenopprettede tabeller.
• Adgang til å modifisere privilegier til egenopprettede tabeller
for gyldige brukere av databasen.
140.
SQL HiA
DBA
• Allerettigheter til enhver tabell i databasen.
• Alle rettigheter til
Grant (tilordne) / Modify (endre) / Revoke ( fjerne)
tabell-privilegier til enhver bruker.
• DBA kan ikke opprette nye brukere
og heller ikke endre passord eller autoritet til eksisterende brukere.
Dette kan kun utføres av SYSADM.
141.
SQL HiA
Tilordning avautoritet / privilegier
GRANT CONNECT
TO Nilsen IDENTIFIED BY Katt
GRANT CONNECT
TO Olsen IDENTIFIED BY Gris
GRANT CONNECT
TO Hansen IDENTIFIED BY Hest
GRANT RESOURCE
TO Olsen
GRANT DBA
TO Hansen
GRANT SELECT, UPDATE (Navn, PNr) ON Selger
TO Olsen
SQL HiA
Table Privileges
,
GRANTALL
SELECT
INSERT
DELETE
INDEX
ALTER
UPDATE
,
( ColumnName )
, ,
ON TableName TO AuthID
ViewName PUBLIC
144.
SQL HiA
SQL /Høgnivåspråk
SQL har mange sterke sider,
men språket er ikke et komplett programmerings-språk
på linje med Fortran, C, Pascal, Cobol, ...
SQL ble opprinnelig benyttet interaktivt ved direkte å gi
SQL-kommandoer med umiddelbar respons.
Brukervennligheten til SQL vil øke radikalt ved å innebygge SQL
som en del av et komplett prosedyre-språk.
To bruks-måter for SQL:
- Interaktiv bruk av SQL
- SQL innebygget i et komplett prosedyre-språk
145.
SQL HiA
SQL innebyggetsom en del av et komplett prosedyre-språk
• Embedded SQL
SQL-statement legges inn sammen med den øvrige program-kode.
Blanding av prosedyre-språkets egne statement og SQL-statement.
Spesielle SQL-statement benyttes som aksess mot databasen.
En spesiell SQL-prekompilator scanner den kombinerte koden,
og lager sammen med de øvrige program-verktøyene et eksekverbart program.
• Application Program Interface ( API )
Programmet ( høgnivå-språket ) kommuniserer med DBMS
gjennom et sett av funksjoner kalt application program interface ( API ).
Programmet overfører SQL-statement til DBMS gjennom API-kall
og benytter API til aksess mot databasen.
SQL-statementene overføres via parametre i API-kallene.
146.
SQL HiA
Embedded SQL/ API
DBMS API Embedded Language Support
DB2 Nei APL, Assembler, Basic, Cobol, Fortran, PL/I
SQL/DS Nei APL, Assembler, Basic, Cobol, Fortran, PL/I, Prolog
Oracle Ja Ada, C, Cobol, Fortran, Pascal, PL/I
Ingres Nei Ada, Basic, C, Fortran, Pascal, PL/I
Sybase Ja Ingen
Informix Nei Ada, C, Cobol
OS/2 EE Nei C
SQLBase Ja Ingen
SQL HiA
SQL-prosessering
• Parsing(traversering) av SQL-statement.
Oppbryting av statementet i individuelle ord og kontroll av syntaksen.
• Validitering av statementet.
Kontroll av tabell/kolonne-navn mot system-katalogene.
Kontroll av brukers rettigheter assosiert med statementet.
• Optimalisering av statementet.
Vurdering av alternative løsninger.
Bør indeks benyttes?
Hvordan optimalisere join mot søke-kriterier?
Kan table-scan unngås?
Valg av alternativ.
• Generering av en applikasjons-plan for statementet.
Applikasjons-planen er en binær representasjon av steppene
for statement-utføring og er DBMS’s eksekverbare kode.
• Eksekvering av statementet.
149.
SQL HiA
SQL-prosessering
SELECT A,B,C
FROMX,Y
WHERE A < 5000 AND
C = ‘ABC’
Parse statement
Validate statement
Optimize statement
Generate Application Plan
Execute statement
Binary form of
SQL statement
Database
system catalog
150.
SQL HiA
SQL knyttetopp mot høgnivåspråk-variabler
EXEC SQL SELECT SNrID, PNr
INTO :Nr, :Navn, :PostNr
FROM Selger
WHERE SNrID = 2
EXEC SQL INSERT INTO Selger
VALUES (:Nr, :Navn, :PostNr)
151.
SQL HiA
Resultat-sett medmer enn en record
ApplikasjonApplikasjon
DatabaseDatabase
Resultat-sett
Record_1
Record_2
Record_3
...
SQL-statement
Cursor
Fetch
152.
SQL HiA
Embedded SQL- Eksempel
main()
{
...
printf(“Enter office number: “);
scanf(“%d”, &officenum);
exec sql select city, region, target, sales
into :cityname, :regionname, :targetval, :salesval
from offices
where office = :officenum;
printf(“City: %sn”, cityname);
...
}
153.
SQL HiA
5 faserved generering av embedded SQL-program
• Embedded SQL-kilde-kode scannes av en SQL prekompilator.
SQL-statementene lokaliseres og prosesseres.
Ulike prekompilatorer kreves for hvert programmerings-språk supportert av DBMS.
• Prekompilatoren gir to filer som output:
- Kildekode strippet for SQL-statement.
SQL-statementene erstattes av private DBMS-rutiner og som gir run-time link
mellom programmet og DBMS.
Disse er vanligvis kjent kun av prekompilatoren og er ikke public interface til databasen.
- Kopi av strippede SQL-statement, kalt database request module (DBRM).
• Vertsspråk-kompilatoren traverserer strippet kilde-kode fra forrige fase
og gir en objekt-kode som output.
• Linkeren lenker objekt-koden fra foregående fase med private DBMS-rutiner.
• DBRM-modulen generert av prekompilatoren i fase 2 scannes av et spesielt BIND-program.
Dette programmet går gjennom de 5 fasene for prosessering av SQL-statement
og genererer en applikasjons-plan for hvert statement.
Resultatet er en kombinert applikasjons-plan for hele programmet,
og denne planen blir lagret i databasen, vanligvis med samme navn som selve
hoved-programmet.
154.
SQL HiA
5 faserved generering av embedded SQL-program
Embedded SQL source programEmbedded SQL source program
Stripped source programStripped source program Database request moduleDatabase request module
Precompiler
Compiler BIND
Object codeObject code DBMS libraryDBMS library Application planApplication plan
Linker
Executable programExecutable program
Application plan
Database
Application plan
Database
155.
SQL HiA
SQL API
•Programmet begynner sin database-aksess ved et API-kall
som knytter programmet til databasen.
• For å sende et SQL-statement til DBMS, bygger programmet opp statementet
som en tekst-streng som plasseres i et buffer og kaller deretter opp en API-funksjon
som overfører buffer-innholdet til DBMS.
• Programmet gjør et API-kall for status-kontroll av DBMS-forespørselen
og for å håndtere eventuelle feil.
• Hvis SQL-statementet er en query, kalles en API-funksjon for å hente database-data
inn i et program-buffer.
Vanligvis returneres en rad eller en kolonne ad gangen.
• Programmet avslutter sin database-aksess med et API-kall som kobler programmet
fra DBMS.
SQL HiA
SQL API- Program-eksempel
main()
{
...
DBSETLUSER(loginrec, “Scott”);
DBSETLPWD (loginrec, “Tiger”);
...
dbproc = dbopen(loginrec, ““);
...
printf(“Raise/lower quotas by how much:”);
gets(sAmount);
dbcmd(dbproc,”Update salesreps set quotas = quota + “);
dbcmd(dbproc,sAmount);
dbsqlexec(dbproc);
status = dbresults(dbproc);
if (status != SUCCEED)
printf(“Error during update.n”);
else
printf(“Update successful.n”);
dbexit(dbproc);
...
}
158.
SQL HiA
SAL funksjonaliteti SQLBase (1)
SqlClearImmediate Disconnect Sql Handle benyttet av SqlImmediate
SqlClose Lukker en navngitt cursor
SqlCommit Commit gjeldende SQL transaksjon
SqlConnect Connect en Sql Handle til en database
SqlDisconnect Disconnect en Sql Handle fra en database
SqlDropStoredCmd Sletter en lagret kommando eller lagret prosedyre
SqlError Henter gjeldende error kode for gitt Sql Handle
SqlExecute Eksekverer et SQL statement, lagret kommendo eller lagret prosedyre
SqlExists Sjekker eksistens av spesifisert(e) rad(er)
SqlFetchNext Henter neste rad i et resultatsett
SqlFetchPrevious Henter forrige rad i et resultatsett
SqlFetchRow Henter gitt rad i et resultatsett
SqlGetErrorPosition Returnerer offset i en error innen et SQL statement
SqlGetErrorText Returnerer error-tekst for et gitt SQL error number
SqlGetModifiedRows Returnerer antall endrete rader i en INSERT, UPDATE eller DELETE
SqlGetParameter Returnerer en databaseparameter
SqlGetParameterAll Returnerer en databaseparameter
SqlGetResultSetCount Returnerer antall rader i et resultatsett
SqlGetRollbackFlag Returnerer database rollback flag
159.
SQL HiA
SAL funksjonaliteti SQLBase (2)
SqlImmediate Kompilerer og eksekverer et SQL statement
SqlOpen Navngir en cursor og eksekverer et SQL statement
SqlPrepare Kompilerer et SQL statement eller ikke-lagret prosedyre
SqlPrepareAndExecute Kompilerer og eksekverer et SQL statement eller ikke-lagret prosedyre
SqlRetrieve Henter en lagret kommando eller lagret prosedyre
SqlSetIsolationLevel Setter isolasjonsnivå
SqlSetLockTimeout Setter timeout periode for venting på en lås
SqlSetParameter Setter en database parameter
SqlSetParameterAll Setter en database parameter
SqlSetResultSet Setter resultatsett mode på/av
SqlStor Kompilerer og lagrer en kommando eller prosedyre
160.
SQL HiA
Relaterte SQLTalkkommandoer
ERASE Sletter en lagret kommando eller lagret prosedyre
EXECUTE Eksekverer en lagret kommando eller lagret prosedyre
PERFORM Eksekverer enten en preparert SQL kommando / lagret prosedyre
eller gjenfinner en lagret kommando / lagret prosedyre
PREPARE Kompilerer en SQL kommando eller ikke-lagret prosedyre
SET TRACE Enable/Diasable statement tracing
SET TRACEFILE Trace output til server-fil eller servers aktivitets-skjerm
SHOW TRACE Viser enabling/disabling av TRACE
SHOW TRACEFILE Viser trace output (server-fil eller aktivitets-skjerm)
STORE Kompilerer og lagrer en kommando eller prosedyre i systemkatalogene
(og dens eksekveringsplan for seinere eksekvering)
#2 SQL er standard databasespråk for relasjons-databaser.
#3 Oversikt over hva SQL-forkortelsen betyr
og hvilke tjenester vi kan få utført ved hjelp av dette databasespråket.
#4 Historikk.
Arbeidet med såkalte relasjons-databaser ble påbegynt
på begynnelsen av 70-tallet.
Codd sto sentralt i dette arbeidet.
Relasjons-databaser med tilhørende språk SQL
er basert på en matematisk grein som heter relasjons-algebra.
#5 SQL var påtenkt å skulle være et dataspråk for enhver,
dvs språket skulle være så enkelt at hvemsomhelst kunne lære det
og bruke det.
Slik ble det ikke. Selv om SQL er et relativt greit språk å lære,
har det vist seg nødvendig å bygge språket inn i høgnivåspråk
eller ulike utviklingsverktøy. Det siste gir mulighet til at en bruker
ved hjelp av pek og klikk kan foreta aksesser mot databaser.
#6 En database kan vi dele i følgende tre hoved-deler:
- Selve databasen hvor dataene ligger lagret.
- Data Dictionary (System-kataloger) hvor det ligger lagret informasjon om
databasens struktur (eierforhold, tilgangsrettigheter, tabeller, relasjoner, …)
- DBMS (Database Management System).
Dette er program (software) til bruk ved operasjoner (lesing, oppdatering,
innsetting, sletting, …) på databasen.
#7 Til høyre vises databasens tre hoved-deler:
Selve dataene, DD (Data Dictionary) og DBMS.
Brukere av databasen benytter ulike applikasjons-program ved operasjoner
mot databasen. Disse applikasjons-programmene opererer ikke direkte på
databasen, men henvender seg til DBMS. DBMS fungerer altså som et slags
mellomledd mellom brukernes applikasjons-program og selve dataene
i databasen.
#9 La oss se litt nærmere på selve databasen der dataene ligger lagret.
I en relasjons-database ligger alle dataene lagret i såkalte tabeller.
Dette er to-dimensjonale arrays bestående av rader og kolonner.
Views:Virtuelle tabeller.
Dataene kan være deler av tabell-data eller
en sammenslåing av data fra flere relaterte tabeller.
Indexes:Hjelpetabeller for raskere oppslag i tabeller.
Procedures:Ferdigkompilerte sekvenser av SQL-statement.
Triggers:Ferdigkompilerte rutiner som eksekveres under gitte
forutsetninger.
Rules:Regler for kolonne-verdier (eks: Datoer skal være innen 1-31.
Datatypes:Opplysninger om datatyper i de enkelte kolonner (eks: Number)
Defaults:Kolonne-verdier hvis ingenting annet er spesifisert
(eks: Dagens dato hvis ingenting annet er spesifisert)
#10 En del viktige begrep:
- Database
- Tabell
- Rad / Post / Record
- Kolonne / Felt
#12 De ulike SQL-kommandoene er det vanlig å gruppere
etter ulike bruks-områder.
#19 Relasjonsdatabase-språket er det vanlig å bruke på to hovedmåter:
- Interaktivt ved at brukeren selv eksplisitt skriver SQL-statementene.
- SQL-statementene innebygges i et høgnivåspråk eller annet
utviklings-verktøy.
Med et godt grensesnitt vil SQL på denne måten være enklere å bruke
ved at brukeren stort sett benytter seg av kun pek og klikk.
Ingen SQL-kunnskaper er nødvendig for brukeren.
#20 I denne slide-serien skal vi vise eksempler med bruk av SQL
på databasen Handel som inneholder de fire tabellene
Selger - Adr - Vare - Salg.
Tabellene er enkle slik at det er enkelt å verifisere (kontrollere)
resultatene fra et SQL-statement.
Tabellen ovenfor er en 1NF tabell som på neste side er splittet
i de fire nevnte tabellene hvor alle er på 3NF.
#22 1:n relasjonene mellom de fire Handel-tabellene
Selger - Adr - Vare - Salg.
#23 En del viktige begrep:
- Database
- Tabell
- Rad / Post / Record
- Kolonne / Felt
#28 Syntaks for SQL-kommandoen CREATE TABLE
for oppretting av en tabell i en tilkoblet database.
Hver kolonne i tabellen må ha et navn og en datatype.
I tillegg kan andre tilleggsopplysninger om enkelt-kolonner oppgis,
f.eks. størrelse (size) som viser antall tegn eller siffer i en kolonne.
#29 Oppretting av tabellen Adr.
Tabellen inneholder to kolonner: PNr (PostNummer) og Sted.
PNr er av datatypen Integer (heltall)
Sted kan inneholde inntil 20 tegn.
PNr danner ID i denne tabellen.
ID-kolonner må alltid ha data, derfor NOT NULL bak denn kolonnen.
Andre kolonner kan også ha NOT NULL hvis ønskelig.
PRIMARY KEY medfører (sammen med UNIQUE INDEX)
at PNr skal være ID i denne tabellen.
AdrNdx er navnet på den indeksen som er knyttet til kolonnen PNr
i tabellen Adr.
Indeksen må være UNIQUE siden PNr er ID.
Indekser på andre kolonner (som ikke er entydigie) må ikke ha UNIQUE.
Store og små bokstaver kan benyttes fritt, men det anbefales
at SQL-reserverte ord skrives med store bokstaver.
#30 Oppretting av tabellen Selger.
SNr danner ID. Derfor NOT NULL i denne kolonnen,
PRIMARY Key(SNr) og CREATE UNIQUE INDEX på denne kolonnen.
Kolonnen PNr danner koblingen mot tabellen Adr
og er en fremmednøkkel (FOREIGN KEY) i tabellen Selger (siden PNr er ID i tabellen Adr).
De to kolonnene (PNr) i tabellene Selger og Adr trenger ikke ha
samme navn i de to tabellene.
REFERENCES Adr ON DELETE RESTRCT betyr at forsøk på å slette
poster i foreldre-tabellen (her Adr) avslås hvis det finnes tilhørende
poster i barne-tabellen (her Selger).
Kolonnen Navn og også tillagt en indeks slik at søk på navn
kan foregå raskt. Denne indeksen må ikke være UNIQUE
siden flere ulike selgere kan ha like navn.
Tabellen Adr må opprettes før tabellen Selger
fordi Selger inneholder en fremmednøkkel som er koblet mot Adr.
#31 Oppretting av tabellen Vare.
Kolonnen VNr danner ID.
#32 Oppretting av tabellen Salg.
SNr og VNr danner tilsammen ID.
Hver av disse er hver for seg fremmednøkler i tabelln Salg
(SNr er ID i Selger og VNr er ID i Vare.
UNIQUE INDEX må nå omfatte både SNr og VNr som en samlet enhet.
#37 Innsetting av data i tabellen Vare.
SQL-kommandoen INSERT benyttes.
#38 SQLBase gir i tillegg til bruk av standard INSERT
også muligheten til å kjøre flere rader inn for hver INSERT.
Merk: Tekst-data skal ikke omsluttes av anførselstegn.
Ingen space (blanke mellom rom) kan benyttes.
#39 Innsetting av data i tabellen Selger (bruk av spesiell INSERT i SQLBase).
#41 Enkel bruk av SELECT.
Farge-bruk:- RødSQL-statement
- BlåDatabase-tabell
- GulResultat-sett
Bak SELECT er spesifisert de kolonnene som vi ønker i vårt output
(her SNr, Navn og PNr i denne rekkefølge).
Bak FROM spesifiseres hvilke(n) tabell(er) dataene skal hentes fra
(her kun tabellen Selger).
Store og små bokstaver kan brukes om hverandre, men det anbefales
å benytte store bokstaver for reserverte SQL-ord.
SELECT-statementet er delt på to linjer og innrykk er benyttet.
Dette er ikke nødvendig, men det øker lesbarheten.
#42 Kolonne-kvalifisering.
Vi kan (hvis ønskelig, og må hvis nødvendig)
kvalifisere hver enkelt kolonne ved å prefikse kolonnene
med tabell-navn etterfulgt av punktum.
Slik kvalifisering er ikke nødvendig i dette eksemplet, men er påkrevd
hvis data skal hentes fra flere tabeller og output inneholder kolonne(r)
hvor kolonne-navn er felles i mer enn en av de involverte tabellene.
#43 Hvis alle kolonnene i en tabell skal være med i output,
kan * benyttes istedet for å liste opp samtlige kolonner.
Hvis * benyttes når flere tabeller er involvert, så vil samtlige kolonner
fra alle tabellene bli med i output.
#44 Utlisting av kolonnene PNr og Navn (i denne rekkefølge)
fra tabellen Selger.
#45 Skriv ut samtlige ulike (vha DISTINCT) SNr fra tabellen Salg.
Hvis flere kolonner skal være med i output, vil DISTINCT gjelde
alle disse kolonnene.
#46 Betingelser (vha WHERE) i et SQL-statement.
Her listes ut SNr, Navn og PNr fra tabellen Selger
for de av selgerne hvor PNr (postnummer) er lik 6400.
To rader oppfyller betingelsen.
#47 Utlisting av poster fra tabellen Vare
hvor vare-prisen er større enn 300.
#48 Utlisting av SNr, Navn og PNr fra tabellen Selger
når både betingelsen PNr = 6400 og betingelsen Navn &gt; ‘C’
er oppfylt.
#49 Utlisting av SNr, Navn og PNr fra tabellen Selger
når minst en av betingelsene PNr = 6400 eller SNr &gt; 3
er oppfylt.
#50 Utlisting av SNr, Navn og PNr fra tabellen Selger
når minst en av betingelsene PNr = 6400 eller NOT SNr &gt; 3
er oppfylt.
NOT SNr &gt; 3 er det samme som SNr &lt;= 3.
#51 I de fleste tilfeller fra dagliglivet er vi vant til at et utsagn er enten
sant eller galt.
De finnes imidlertid mange tilfeller hvor vi må ta hensyn til flere muligheter.
Fra matematikken er det vel kjent at vi har mange såkalte uavgjørbare
utsagn, dvs utsagn som hverken er sanne eller gale.
Eks: Lag mengden bestående av alle mengder som ikke er inneholdt
i seg selv. Så spør vi: Er denne mengden inneholdt i seg selv eller er den
ikke. Svarer vi ja, så blir svaret galt. Svarer vi nei, blir svaret galt.
I database-sammenheng må vi ta hensyn til såkalte NULL-felt, dvs
felt hvor det mangler data.
Når vi skal ta sammensatte utsagn (med AND, OR, NOT, …)
når slike NULL-felt er involvert, får vi resultater (True, False og NULL)
som vist ovenfor.
Legg merke til at WHERE-statement er ok kun ved resultat True,
mens GROUP BY-statement er ok både ved resultat True og NULL.
Det siste henger sammen med at vi ønsker såkalte NULL-grupper
med i output.
#52 List ut PNr og Sted fra tabellen Adr
hvor Sted er med i mengden bestående av Molde og Tromsø.
#53 List ut SNr, Navn og PNr fra tabellen Selger
hvor SNr ligger mellom 1 og 4 (1 og 4 inkludert).
#54 Hvis vi skal søke på navn, vil vi ofte være usikre på stavelsen av navnet.
Hvis vi er sikre på at navnet begynner på N, men er usikre på resten,
kan vi i WHERE-statementet bytte ut likehetstegnet (=) med LIKE
og skrive videre ‘N%’.
Tegnet % står for ‘hva som helst’, dvs alle navn som begynner på ‘N’
vil bli skrevet ut.
#55 Utskrift av alle navn (i tillegg til SNr og PNr)
som slutter på ‘sen’.
#56 Utskrift av alle navn som begynner på ‘N’ og slutter på ‘sen’.
#57 Utskrift av alle navn som begynner på ‘Ni’ og som slutter på ‘sen’
og som har nøyaktig ett tegn mellom ‘Ni’ og ‘sen’.
#58 Hvis underscore ( _ ) som markerer ett enkelt tegn selv skal være
med i navnet, må _ prefikses med slash ( / ).
#59 Hvis slash ( / ) selv skal være med i navnet,
må slash selv prefikses med en slash.
#60 List ut alle rader fra tabellen Selger hvor feltet PNr er tomt (NULL).
#61 List ut aller rader fra tabellen Selger hvor feltet PNr inneholder data
(er NOT NULL).
#62 List ut summen av alle verdiene i kolonnen Mg i tabellen Salg.
#63 List ut gjennomsnittsverdien av alle verdiene i kolonnen Mg
i tabellen Salg.
Mg-felter som ikke inneholder data (NULL) blir ikke regnet med
i gjennomsnittsverdien.
#65 COUNT(*) Lister ut totalt antall rader (her 8) i tabellen Person.
COUT(Navn) Lister ut totalt antall rader (her 7) hvor det er plassert data
i feltet Navn.
COUNT(Adr)Lister ut totalt antall rader (her 6) hvor det er plassert data
i feltet Adr.
#66 COUNT(Adr)Lister ut totalt antall rader (her 6)
hvor det er plassert data i feltet Navn.
COUNT(DISTINCT Adr)Lister ut totalt antall rader (her 5)
hvor det er plassert ulike
(og samtidig ikke NULL) verdier i feltet Adr.
#67 Lister ut totalt antall ulike varemengder fra kolonnen Mg
i tabellen Salg.
#68 Lister ut største verdien i kolonnen Mg i tabellen Salg.
#69 Lister ut minste verdi i kolonnen Mg i tabellen Salg.
#70 Lister ut største sum av verdiene SNr og VNr i en rad i tabellen Salg.
#71 GROUP BY benyttes til å dele output opp i grupper og samtidig
benytte aggregatfunksjoner.
I eksemplet ovenfor grupperes de enkelte radene i Salg-tabellen på SNr.
For hver SNr (for hver selger) skrives ut den raden som har høyest Mg.
Resultatet er vist i den gule tabellen til høyre.
Den midterste (grønne) tabellen er kun tatt med som en slags
mellomregning.
GROUP BY krever at de samme kolonnene (her SNr)
(borstett fra aggregatfunksjonene) står oppført både i SELECT-listen
og i GROUP BY listen.
#72 List ut største verdi av Mg gruppert på hver enkelt selger
og innenfor hver enkelt selger på VNr.
Eksemplet er litt spesielt og gir her som output hele tabellen Salg.
Derimot ser vi tydelig at resultatene er gruppert.
#73 HAVING setter betingelser på hver enkelt gruppe
i motsetning til WHERE som setter betingelser på hver enkelt rad.
#74 List ut VNr og Pris*1.5, dvs prisen i output er justert opp med 50%
i forhold til prisen i tabell-kolonnen.
#75 Teksten Kr påføres bakerst på hver rad i tillegg til VNr og Pris.
#76 Sortering i stigende rekkefølge på kolonnen SNr.
#77 Sortering i stigende rekkefølge på kolonnen PNr, deretter i synkende
rekkefølge på kolonnen SNr, dvs innenfor hver enkelt gruppe med
lik PNr sorteres radene i synkende rekkefølge på SNr.
#78 Gruppene SNr / VNr sortert i stigende rekkefølge på VNr.
#79 Sortering i synkende rekkefølge på kolonne nr 3, dvs kolonnen PNr
i tabellen Selger.
#80 Med Join menes søking etter data i mer enn en enkelt tabell.
Vi ønsker her output med oversikt over Navn, PNr og Sted for hver enkelt
selger.
Navn og PNr kan vi finne i tabellen Selger, mens Sted finnes i tabellen Adr.
Når vi skal søke i flere tabeller samtidig (her Selger og Adr),
lister vi disse opp (adskilt med komma) bak FROM.
Rekkefølgen på disse tabellene er vilkårlig.
Videre må vi i WHERE-statementet koble disse tabellen korrekt, dvs
vi må her forlange at kolonnen PNr i Selger-tabellen og kolonnen PNr
i Adr-tabellen stemmer overens.
Uten denne betingelsen ville vi få som output alle radkombinasjoner
mellom rader i Selger og rader i Adr, dvs tilsammen 3*4 = 12 rader.
I SELECT-listen bør kolonne-navnene kvalifiseres med tilhørende
tabell-navn.
#81 Ovenfor ser vi output (12 rader) ved Join mellom Selger og Adr
når vi utelater tabell-koblingen i WHERE-statementet.
#82 Her er koblingen mellom Selger og Adr satt på igjen.
Blant de 12 radene som er output når tabell-koblingen er utelatt,
er uthevet med rød farge de PNr-verdiene som ikke stemmer overens
i de to tabellene.
I output gjenstår da kun de radene som er markert med *.
#83 Ovenfor søkes etter data i alle fire tabellene Selger, Adr, Vare og Salg.
Mellom disse finnes i alt 3 1:n relasjoner, dvs 3 koblinger
og disse finner vi igjen i WHERE-statementet.
#84 Kobling av en tabell mot seg selv.
Siden tabellen Selger skal kobles mot seg selv, må vi lage to alias-navn
(her First og Sec) for denne tabellen.
#85 Her er antall rader i output ved kobling av tabellen Selger mot seg selv
redusert ved at en tilleggsbetingelse er lagt på.
#86 Kobling av en tabell mot seg selv.
Tabellen Tilsatt inneholder opplysninger om samtlige tilsatte
og hvem som er sjef for hver enkelt tilsatt.
Vi ønsker å liste ut navnene på hver enkelt tilsatt samt navn på sjef
for hver av disse tilsatte.
Vi lager to alias’er First og Sec for tabellen Tilsatt.
Hvis vi i output ønsker tilsatt-navn i venstre kolonne og sjef-kolonne
til høyre, er det viktig at WHERE-statementet er
First.Sjef = Sec.Nr og ikke First.Nr = Sec.Sjef .
#87 I eksemplet ovenfor lister vi ut alle ordre som er registrert
samme dato som Adams ble tilsatt.
Eksemplet viser Join mellom to tabeller som i utgangspunktet
ikke er koblet ved hjelp av fremmednøkler.
#88 Hva med Join (kobling mellom tabeller) hvis en eller flere av
koblings-kolonnene mangler data (NULL-verdier).
Uten å spesifisere kobling vha WHERE vil resultatet, ikke uventet,
bli som vist ovenfor.
#89 Ved NULL-kolonner og tabell-kobling vha WHERE
vil radene med NULL-verdier i koblings-kolonnene utebli
fra resultatsettet.
#90 Vha såkalt Outer Join vil rader med NULL-verdier i koblings-kolonner
kunne bli med i resultatsettet slik som vist ovenfor.
Syntaksmessig (standard SQL) plasseres tegnet * rett til venstre
for likhetstegnet i WHERE-koblingen når den først-nevnte tabellen
i koblingen inneholder NULL-verdi koblings-kolonne.
#91 Outer Join markeres i standard SQL vha * plassert like ved likhetstegnet i
WHERE-koblingen.
I databasen SQLBase markeres dette istedet ved tegnet + plassert i parentes
bak den sistnevnte koblings-kolonnen.
#92 Hvis vi i output ønsker en bestemt tekst (her Ukjent) i NULL-verdi kolonnen
ved Outer Join, kan funksjonen @NULLVALUE benyttes.
#93 Ovenfor vises reglene ved Outer Join med NULL-verdi kolonner
både i den førstnevne og den sistnevnte kolonnen.
#94 SQL-statement kan skrives i flere nivåer.
Dette kalles Multiple Query-nivåer.
I statementet ovenfor med WHERE SNr = …
må resultatsettet fra påfølgende SELECT-statement
ikke inneholde mer enn en enkelt rad.
Hvis resultat-settet kan inneholde mer enn en enkelt rad,
må statement-delen byttes ut med WHERE SNr IN ...
#95 Ovenfor er to likeverdige SQL-statement.
Første statement benytter muliple query-nivåer,
mens andre statement benytter join.
#97 Et view er en virtuell (tenkt) tabell og kan være en del av en tabell
eller en sammensetning av flere tabeller.
CREATEVIEW benyttes for å lage et view.
#98 SELECT-statement benyttet på view’et SelgerAdr.
#99 Et view bestående av sammensetning av tabellene
Selger, Adr, Vare og Salg.
#112 Eksempel på bruk av funksjonene PROPER, UPPER og TRIM.
PROPER omformer første bokstav til stor bokstav,
mens resten blir små bokstaver.
UPPER omformer aller bokstaver til store bokstaver.
TRIM fjerner multiple space (blanke) og innledende blanke.
Eksemplet viser hvordan vi kan søke etter Hansen i databasen
når vi er usikre på hvordan navnet er skrevet inn i database-tabellen
(eks: Hansen, HANSEN, hansen, HAnsEn, haNSen, …).
#151 SQL knyttet opp mot høgnivåspråk-variabler.
Høgnivåspråk-variablene er prefikset med kolon ( : ).
#152 Ved forespørsel mot en database får vi ut et såkalt resultatsett.
Dette resultatsettet inneholder aller rader (records, poster)
som oppfyller betingelsene i SQL-statementet.
For å kunne behandle en enkelt rad ad gangen fra dette resultatsettet,
benyttes ofte en såkalt cursor.
Vha denne cursor og en såkalt Fetch-kommando
kan en enkelt rad ad gangen hentes frem fra resultatsettet.