Standard databasespråk

Slides:



Advertisements
Liknende presentasjoner
Mer om SQL-spørringer og funksjoner
Advertisements

Hans Olav Norheim
Tabeller av objekter Klassen ArrayList
Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring
Design av sikre web-applikasjoner
SQLHiA DAT 2800 Databaser I Flerbrukerproblematikk.
Kap 01 Generelt om databaser
Mange til mange sammenhengen
Kap 02 Relasjonsdatabaser
Høgskolen i Oslo Webprogrammering SQL og databaser del 3.
Java database persistence framework.  SELECT by FROM postnr AS p WHERE ( SELECT DISTINCT postnr FROM addr AS a WHERE user.adrId = a.Id ) = p.postnr;
LC238D Datamodellering og databaser Introduksjon til fagfeltet Else Lervik, august 2012Forelesning 1, uke 34 Datafilerside.
Avansert SQL og problemløsning
XMLSchema.  Innledende eksempler: Tove 4. Janni 5. Huskelapp 6. Ikke glem avtalen til helgen 7. Vi har sett DTD’en til dette xml dok. Her kommer.
Essbase for nybegynnere
SQL, del 1 - select Hva er SQL? side 2 Eksempelbase side 3
Databaser Verktøybok om Access med innslag av Frontpage: Snarveien til Access.
Datamodellering og databaser Else Lervik, oktober 2011 Forelesning 9, uke 41 SQL, del 2 Eksempelbaseside 2 Virtuelle.
SQLHiA Data-integritet. SQLHiA Data integritet Påkrevde data:Noen kolonner i en database-tabell må ha en eller annen verdi. Dette gjøres ved å sette NOT.
Inge Os Sales Consulting Manager Oracle 10 g Server.
Databasehåndtering med MySQL
SQL The questing beast Sir Thomas Mallory. Codds krav 5.Krav om omfattende språk for datahåndtering Det må finnes et relasjonelt språk som støtter datadefinisjon,
Relasjonsmodellen og relasjonsalgebra
Filer Finne minste Finne Største Beregne gjennomsnitt Variabler Tabeller – Arrays Lage frekvenstabell.
Utvider eksemplet om biler fra forrige gang med mer feilsjekk Tid og Dato.
Jæger: Robuste og sikre systemer INF150 Programmering torsdag 7.9 Bakgrunn for øvelse 2 Bruk av variabler i beregninger Ser på tekststrenger (3.4 Strings.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 2.10 Default values – standardverdier ved oppstart MER OM: Sub-prosedyrer og sub-funksjoner.
Gjennomgang av prøven Tidsangivelse. Prøven deles ut Vi fyller ut øvelsen sammen.
Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, uke 44 Å programmere databasetjeneren – JavaDB.
Relasjonsmodellen, del II
Datamodellering og databaser Else Lervik, oktober 2011 Forelesning 9, uke 41 SQL, del 2 Eksempelbaseside 2 Virtuelle.
Å lage sikre klasser Unntaksklassene i Java-API-et Unntakshåndtering i databasesammenheng try-catch-finally-setningen Trelagsarkitektur; egen databaseklasse.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 4.9 Forrige gang til og med: 3.2 Visual Basic Events (60-73) Nå: Litt om Group Box, CheckBox.
In 135 Datamodellering og databaser Introduksjon, Enkeltentiteten, Informasjon Ola Bø.
INF150 Programmering mandag 11.9
Sqlite Et lite eksempel på en SQL- database. SQL kan startes på ulike måter Kommandolinjeversjon or Windows –Programmet må innstalleres Hentes fra
SQLHiA SQL Syntaks. SQLHiA SQL SQL (Structured Query Language, uttales: sequel eller ess-que-ell) er et komplett sett av kommandoer for aksess til en.
1 Kap 02 Relasjonsdatabaser. Data-organisering - Manuelt Ansatte Pasienter Utstyr Økonomi Avdelinger RøntgenOnkologisk.
SQLHiA Kap 12 Dynamisk SQL. SQLHiA SQLHiA FlerbrukersystemClient / Server Database DBMS Application_2 SQL-Request Data Application_3 Application_1 ClientServer.
SQLHiA DAT 2800 Databaser I Prosedyrer / Triggere.
DAT 202 Databaser Del 1.
DAG HOFTUN KNUTSEN Bruk og misbruk av SQL DAG HOFTUN KNUTSEN
Administrasjon av SQL Server 2008 Av: Ole Kristian Bangås Fagansvarlig SQL Server.
SQLHiA Transaksjoner. SQLHiA TransaksjonDefinisjon En transaksjon er en serie av en eller flere SQL-statement som til sammen danner en logisk enhet. Med.
Kap 02 Tabeller / Tabelloperasjoner. Enkeltvariable Les inn nedbørmengde for årets 12 måneder: Les n1 Les n2 … Les n12 n1 n2 n12.
Structured Query Language Kræsj-kurs
Triggere Mutasjoner i basen. Triggers Triggers are stored procedures that execute automatically when something (event) happens in the database: : data.
Instead-of-trigger Faglig forum. Instead-of-trigger Problem: En har et VIEW som består av mange JOINs. Komplekst å oppdatere alle tabellene som inngår.
Skjema/Forms HTML II IT og læring 2/20 november 2001.
Eksempel på SQL ”SQL-setninger” har en struktur som likner på ”naturlig språk”, med ”verb, subjekter og adjektiver”. SQL-setningene begynner alltid med.
Dynamiske nettsider PHP Del 1 – variable. PHP  PHP (Personal Home Page)  Fritt tilgjengelig programmeringsspråk  åpen kildekode  Plattformuavhengig.
Andre funksjoner. Her kommer en beskrivelse av søkefunksjoner, knapper og annen funksjonalitet. 2.
Introduksjon I126 Databaser og datamodellering Høsten 2000 Institutt for informatikk Universitet i Bergen.
Fødselsdato (dmå) er født har lønn Ansatt (ansnr) Beløp (NKr)+ Telefon
Linq To SQL Fagdag 20. November DataContext  DataContexten er mappingen mot databasen –Generer objekter for alle entiteter (tabeller), med properties.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 18.9 Lesing av data fra fil og skriving av data til fil. Side 411 – 4.. Kap 4.
Oppgaver til kodegenerering etc. INF-5110, 2013 Oppgave 1: Vi skal se på koden generert av TA-instruksjonene til høyre i figur 9.10 i det utdelte notatet,
INF3100 – – Ellen Munthe-Kaas Indeksering UNIVERSITETET I OSLO © Institutt for Informatikk Utvalgte animerte lysark: lysark nr. 7, 8, 9, 10,
Eksempel: Sletting ved tynn indeks Slett post med a = 60 –Ingen endring nødvendig i indeksen. Slett post med a = 40 –Den første posten i blokken er blitt.
1 Java Database Connectivity (JDBC) Norvald H. Ryeng
Trondheim Lytte- og Læresenter. Sammendrag Prosjektet ble iverksatt fordi Trondheim Lytte- og Læresenter så behovet i å ha et elektronisk kundearkiv i.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 25.9 MER OM: Sub-prosedyrer og sub-funksjoner Kap 4.
Upload av bildefiler Utdrag fra ImageIn Ved Kirsten Klæbo Tirsdag 25/11-03.
Bompasseringer Mål: Slå sammen data om bompasseringer fra mange bomselskap. Sende ut en samlefaktura til hver bileier.
SPSS-kurs. Program Dagen vil bli delt inn i fire bolker: Bolk 1 - 9:30-10:30 – Åpne/lagre datasett, datatyper, definere variable. Bolk 2 – 10:45-11:30.
SPSS-kurs.
Bompasseringer Mål: Slå sammen data om bompasseringer fra mange bomselskap. Sende ut en samlefaktura til hver bileier.
Oversikt Access Hva en bør beherske så langt. Tabeller Felt Typer (heltall, desimaltall, tekst, Boolean) Primary Key.
PL/SQL تعريف المتغيرات
Database.
Utskrift av presentasjonen:

Standard databasespråk SQL SQL Standard databasespråk for relasjons-databaser SQL er standard databasespråk for relasjons-databaser.

SQL er i dag standard database-språk for relasjons-databaser. 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. Oversikt over hva SQL-forkortelsen betyr og hvilke tjenester vi kan få utført ved hjelp av dette databasespråket.

1976 SEQUEL/2 IBM prototype kalt System R. Historikk 1970 Codd 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 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.

SQL Data-språk for alle ? SQL var opprinnelig tenkt å skulle være ET DATABASE-SPRÅK FOR ALLE 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. I praksis bygges SQL inn i et høgnivåspråk for bl.a. å bedre brukergrensesnittet.

Hva består en 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 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.

Database-system Bruker Appl. Database DBMS Bruker Appl. DD Bruker 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. Appl.

Database-system - Eksempler Centura Team/Web Developer Bruker Appl. Database DBMS SQLTalk Bruker Appl. C++ SQL/API DD Bruker Appl. SQLBase SQLServer Oracle

Eksempel på innhold i en database Views Procedures Rules Tables Datatypes Indexes Defaults 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) Triggers

Database / Tabell / Rad / Kolonne 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 Rad Post Record Kolonne Felt En del viktige begrep: - Database - Tabell - Rad / Post / Record - Kolonne / Felt

Flerbrukersystem Client / Server Database DBMS Application_1 SQL-Request Data Application_2 Application_3

Typer av SQL-kommandoer (1) Data Definition Commands ( DDL ) Data Manipulation Commands ( DML ) Data Query Commands ( DQL ) Transaction Control Commands Data Administation Commands Data Control Commands De ulike SQL-kommandoene er det vanlig å gruppere etter ulike bruks-områder.

Typer av SQL-kommandoer (2) Data Definition Commands ( DDL ) CREATE EVENT CREATE INDEX CREATE SYNONYM CREATE TABLE CREATE TRIGGER CREATE VIEW PROCEDURE Data Manipulation Commands ( DML ) DELETE INSERT UPDATE Data Query Commands ( DQL ) SELECT

Typer av SQL-kommandoer (3) Transaction Control Commands COMMIT ROLLBACK SAVEPOINT Data Administration Commands AUDIT MESSAGE START AUDIT STOP AUDIT

Typer av SQL-kommandoer (4) Data Control Commands (1) ALTER DATABASE ALTER DBAREA ALTER PASSWORD ALTER STOGROUP ALTER TABLE ALTER TRIGGER CHECK DATABASE CHECK TABLE COMMENT ON

Typer av SQL-kommandoer (5) Data Control Commands (2) CREATE DATABASE CREATE DBAREA CREATE EVENT CREATE INDEX CREATE STOGROUP CREATE SYNONYM CREATE TABLE CREATE TRIGGER CREATE VIEW

Typer av SQL-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

Typer av SQL-kommandoer (7) Data Control Commands (4) REVOKE REVOKE EXECUTE ON ROWCOUNT SET DEFAULT STOGROUP UNLOAD UNLOCK DATABASED UPDATE STATISTICS

Interaktivt vha et interface-program Bruksmåte Interaktivt vha et interface-program Innebygget i et programmerings-språk 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.

Salg-tabell - 1NF SNr Navn Sted PNr VNr Pris Mengde 5 Nilsen Bergen 5002 8 500 30 2 Olsen Molde 6400 1 200 20 2 Olsen Molde 6400 3 400 10 1 Hansen Tromsø 9000 5 300 50 1 Hansen Tromsø 9000 8 500 40 4 Berg Molde 6400 1 200 70 4 Berg Molde 6400 3 400 50 4 Berg Molde 6400 5 300 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. SNr Selger-nummer Navn Selger-navn Sted Arbeids-sted for selger PNr Post-nummer (for Sted) VNr Vare-nummer Pris Vare-pris Mengde Antall solgte vare-enheter

Salg-tabeller - 3NF Selger (ID = SNr) Adr (ID = PNr) Vare (ID = VNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø VNr Pris 8 500 1 200 3 400 5 300 Salg (ID = SNr + VNr) 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 ID Fremmed- nøkkel Fire 3NF tabeller fra databasen Handel.

Salg-tabeller - 3NF Selger Adr Vare Salg 1:n relasjonene mellom de fire Handel-tabellene Selger - Adr - Vare - Salg.

Database / Tabell / Rad / Kolonne 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 Rad Post Record Kolonne Felt En del viktige begrep: - Database - Tabell - Rad / Post / Record - Kolonne / Felt

Partisjonering av en database Vol_1 Vol_2 Step 1: Opprett DatabaseArea Handel_1 Handel_3 Handel_2 StorageGroup Handel_Files StorageGroup Handel_Log Step 2: Opprett StorageGroup Handel_1 Handel_3 Handel_2 Data Log filer Step 3: Opprett Database Handel_3 Handel_1 Databasen Handel Handel_2

CREATE DBAREA Oppretter et fysisk database-område av gitt størrelse i megabyte (default 1MB) CREATE DBAREA dbarea name AS filename SIZE megabyte Vol_1 Vol_2 CREATE DBAREA Handel_1 AS Vol_1:\Centura\Handel_1 SIZE 5 CREATE DBAREA Handel_2 AS Vol_1:\Centura\Handel_2 SIZE 10 CREATE DBAREA Handel_3 AS Vol_2:\Centura\Handel_3 SIZE 10 Handel_1 Handel_3 Handel_2

CREATE STOGROUP Oppretter en storage group CREATE STOGROUP stogroup name , USING dbarea-name StorageGroup Handel_Files StorageGroup Handel_Log CREATE STOGROUP Handel_Files USING Handel_1, Handel_2 CREATE STOGROUP Handel_Log USING Handel_3 Handel_1 Handel_3 Handel_2

CREATE DATABASE Oppretter en database CREATE DATABASE databasename IN stogroup name LOG TO stogroup name Databasen Handel Data Log filer CREATE DATABASE Handel IN Handel_Files LOG TO Handel_Log Handel1 Handel_3 Handel_2

CREATE TABLE <TableName> Oppretter en tabell CREATE TABLE <TableName> (<ColumnName> <DataType>[<Size>], <ColumnName> <DataType>[<Size>], ...) Database 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. Tabell_1 Tabell_2 Tabell_3

Oppretting av Salg-tabeller - Adr Adr (ID = PNr) PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø CREATE TABLE Adr ( PNr Integer NOT NULL, Sted Char(20), PRIMARY Key(PNr) ) CREATE UNIQUE INDEX AdrNdx ON Adr(PNr) 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.

Oppretting av Salg-tabeller - Selger Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 CREATE TABLE Selger ( SNr Integer NOT NULL, Navn Char(20), PNr Integer, PRIMARY KEY(SNr), FOREIGN KEY(PNr) REFERENCES Adr ON DELETE RESTRICT ) CREATE UNIQUE INDEX SlgNrNdx ON Selger(SNr) CREATE INDEX SlgNaNdx ON Selger(Navn) ID Fremmednøkkel 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.

Oppretting av Salg-tabeller - Vare Vare (ID = VNr) VNr Pris 8 500 1 200 3 400 5 300 CREATE TABLE Vare ( VNr Integer NOT NULL, Pris Integer, PRIMARY Key(VNr) ) CREATE UNIQUE INDEX VareNdx ON Vare(VNr) Oppretting av tabellen Vare. Kolonnen VNr danner ID.

Oppretting av Salg-tabeller - Salg Salg (ID = SNr + VNr) 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 CREATE TABLE Salg ( SNr Integer NOT NULL, VNr Integer NOT NULL, Mg Integer, PRIMARY KEY(SNr,VNr), FOREIGN KEY(SNr) REFERENCES Selger ON DELETE RESTRICT, FOREIGN KEY(VNr) REFERENCES Vare ON DELETE RESTRICT ) CREATE UNIQUE INDEX SalgNdx ON Salg(SNr,VNr) 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.

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 Ulike datatyper i SQLBase.

Innsetter en rad i en tabell INSERT Innsetter en rad i en tabell INSERT table name view name , ( column name ) VALUES ( constant ) bind variable ADJUSTING cursor name system keyword subselect

INSERT - Eksempel Adr (ID = PNr) PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø INSERT INTO Adr VALUES (5002,”Bergen”) INSERT INTO Adr VALUES (6400,”Molde”) VALUES (9000,”Tromsø”)

INSERT - Eksempel Adr (ID = PNr) PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø INSERT INTO Adr (PNr,Sted) VALUES(:1,:2) \ $DATATYPES NUMERIC,CHARACTER 5002,Bergen 6400,Molde 9000,Tromsø /

Innsetting av tabell-verdier - Adr Adr (ID = PNr) PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø INSERT INTO Adr VALUES (5002,”Bergen”) INSERT INTO Adr VALUES (6400,”Molde”) VALUES (9000,”Tromsø”) Innsetting av data i tabellen Vare. SQL-kommandoen INSERT benyttes.

Innsetting av tabell-verdier - Adr Adr (ID = PNr) PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø INSERT INTO Adr (PNr,Sted) VALUES(:1,:2) \ $DATATYPES NUMERIC,CHARACTER 5002,Bergen 6400,Molde 9000,Tromsø / 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.

Innsetting av tabell-verdier - Selger Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 INSERT INTO Selger (SNr,Navn,PNr) VALUES(:1,:2,:3) \ $DATATYPES NUMERIC,CHARACTER 5,Nilsen,5002 2,Olsen,6400 1,Hansen,9000 4,Berg,6400 / Innsetting av data i tabellen Selger (bruk av spesiell INSERT i SQLBase).

SELECT SELECT SelectItem ALL , DISTINCT * FROM TableSpecification , WHERE SearchCondition GROUP BY GroupingColumn HAVING SearchCondition ORDER BY SortSpecification

Select - Enkel bruk SELECT SNr, Navn, PNr FROM Selger Selger (ID = SNr) 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 Enkel bruk av SELECT. Farge-bruk: - Rød SQL-statement - Blå Database-tabell - Gul Resultat-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. Resultatsett

Select Kvalifiserte kolonne-navn SELECT Selger.SNr, Selger.Navn, Selger.PNr FROM Selger Selger (ID = SNr) 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 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.

SELECT - Bruk av * SELECT * FROM Selger Selger (ID = SNr) 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 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.

SELECT - Enkelt-felter SELECT PNr, Navn FROM Selger Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 PNr Navn 5002 Nilsen 6400 Olsen 9000 Hansen 6400 Berg Utlisting av kolonnene PNr og Navn (i denne rekkefølge) fra tabellen Selger.

SELECT - Distinct SELECT DISTINCT SNr FROM Salg Salg (ID = SNr + VNr) 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 SNr 1 2 4 5 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. 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.

WHERE SELECT SNr, Navn, PNr FROM Selger WHERE PNr = 6400 Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 2 Olsen 6400 4 Berg 6400 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.

WHERE SELECT VNr, Pris FROM Vare WHERE Pris > 300 Vare (ID = VNr) 8 500 1 200 3 400 5 300 VNr Pris 8 500 3 400 Utlisting av poster fra tabellen Vare hvor vare-prisen er større enn 300.

WHERE SELECT SNr, Navn, PNr FROM Selger WHERE PNr = 6400 AND Navn > ‘C’ Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 2 Olsen 6400 Utlisting av SNr, Navn og PNr fra tabellen Selger når både betingelsen PNr = 6400 og betingelsen Navn > ‘C’ er oppfylt.

WHERE SELECT SNr, Navn, PNr FROM Selger WHERE PNr = 6400 OR SNr > 3 Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 4 Berg 6400 Utlisting av SNr, Navn og PNr fra tabellen Selger når minst en av betingelsene PNr = 6400 eller SNr > 3 er oppfylt.

WHERE SELECT SNr, Navn, PNr FROM Selger WHERE PNr = 6400 OR NOT SNr > 3 Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 Utlisting av SNr, Navn og PNr fra tabellen Selger når minst en av betingelsene PNr = 6400 eller NOT SNr > 3 er oppfylt. NOT SNr > 3 er det samme som SNr <= 3.

SQL - 3-verdi logikk True WHERE-test Ok ved True False NULL WHERE-test Ok ved True GROUP BY -test Ok ved True og NULL A op B AND True False NULL True True False NULL False False False False NULL NULL False NULL OR True False NULL True True True True False True False NULL NULL True NULL NULL 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. NOT True False NULL False True NULL

IN SELECT PNr, Sted FROM Adr WHERE Sted IN (‘Molde’,Tromsø’) Adr (ID = PNr) PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø PNr Sted 6400 Molde 9000 Tromsø List ut PNr og Sted fra tabellen Adr hvor Sted er med i mengden bestående av Molde og Tromsø.

BETWEEN SELECT SNr, Navn, PNr FROM Selger WHERE SNr BETWEEN 1 AND 4 Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 List ut SNr, Navn og PNr fra tabellen Selger hvor SNr ligger mellom 1 og 4 (1 og 4 inkludert).

Joker-symbol % og _ SELECT SNr, Navn, PNr FROM Selger WHERE Navn LIKE ‘N%’ Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 5 Nilsen 5002 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.

Joker-symbol % og _ SELECT SNr, Navn, PNr FROM Selger WHERE Navn LIKE ‘%sen’ Selger (ID = SNr) 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 Utskrift av alle navn (i tillegg til SNr og PNr) som slutter på ‘sen’.

Joker-symbol % og _ SELECT SNr, Navn, PNr FROM Selger WHERE Navn LIKE ‘Ni%sen’ Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 5 Nilsen 5002 Utskrift av alle navn som begynner på ‘N’ og slutter på ‘sen’.

Joker-symbol % og _ SELECT SNr, Navn, PNr FROM Selger WHERE Navn LIKE ‘Ni_sen’ Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 5 Nilsen 5002 Utskrift av alle navn som begynner på ‘Ni’ og som slutter på ‘sen’ og som har nøyaktig ett tegn mellom ‘Ni’ og ‘sen’.

Joker-symbol % og _ SELECT SNr, Navn, PNr FROM Selger WHERE Navn LIKE ‘Ni/_%’ Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr Hvis underscore ( _ ) som markerer ett enkelt tegn selv skal være med i navnet, må _ prefikses med slash ( / ).

Joker-symbol % og _ SELECT SNr, Navn, PNr FROM Selger WHERE Navn LIKE ‘Ni//%’ Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr Hvis slash ( / ) selv skal være med i navnet, må slash selv prefikses med en slash.

NULL SELECT SNr, Navn, PNr FROM Selger WHERE PNr IS NULL Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr List ut alle rader fra tabellen Selger hvor feltet PNr er tomt (NULL).

NULL SELECT SNr, Navn, PNr FROM Selger WHERE PNr IS NOT NULL Selger (ID = SNr) 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 List ut aller rader fra tabellen Selger hvor feltet PNr inneholder data (er NOT NULL).

Aggregat-funksjoner - Sum SELECT SUM(Mg) FROM Salg Salg (ID = SNr + VNr) 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 Sum(Mg) 290 List ut summen av alle verdiene i kolonnen Mg i tabellen Salg.

Aggregat-funksjoner - Avg SELECT AVG(Mg) FROM Salg Salg (ID = SNr + VNr) 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 Avg(Mg) 36.25 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.

Aggregat-funksjoner - COUNT SELECT COUNT(*) FROM Salg Salg (ID = SNr + VNr) 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 Count(*) 8 List ut totalt antall rader i tabellen Salg.

Aggregat-funksjoner Count Null-verdier i kolonne-funksjoner SELECT COUNT(*), COUNT(Navn), COUNT(Adr) FROM Person Navn Adr Nilsen Storgt 3 Havnegt 7 Hansen Gågata 20 Berg Knutsen Storgt 3 Olsen Ekornv 4 Persen Madsen Svingen 8 COUNT(*) COUNT(Navn) COUNT(Adr) 8 7 6 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.

Aggregat-funksjoner Count / Distinct SELECT COUNT(Adr), COUNT(DISTINCT Adr), FROM Person Navn Adr Nilsen Storgt 3 Havnegt 7 Hansen Gågata 20 Berg Knutsen Storgt 3 Olsen Ekornv 4 Persen Madsen Svingen 8 COUNT(Adr) COUNT(DISTINCT Adr) 6 5 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.

Aggregat-funksjoner - Count / Distinct SELECT COUNT(DISTINCT Mg) FROM Salg Salg (ID = SNr + VNr) 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 Count(Distinct Mg) 6 Lister ut totalt antall ulike varemengder fra kolonnen Mg i tabellen Salg.

Aggregat-funksjoner - Max SELECT MAX(Mg) FROM Salg Salg (ID = SNr + VNr) 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 Max(Mg) 70 Lister ut største verdien i kolonnen Mg i tabellen Salg.

Aggregat-funksjoner - Min SELECT MIN(Mg) FROM Salg Salg (ID = SNr + VNr) 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 Min(Mg) 10 Lister ut minste verdi i kolonnen Mg i tabellen Salg.

Aggregat-funksjoner - Max SELECT MAX(SNr+VNr) FROM Salg Salg (ID = SNr + VNr) 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 Max(SNr+VNr) 13 Lister ut største sum av verdiene SNr og VNr i en rad i tabellen Salg.

Group By SELECT SNr, MAX(Mg) FROM Salg GROUP BY SNr SNr VNr Mengde 1 5 50 1 8 40 2 1 20 2 3 10 4 1 70 4 3 50 4 5 20 5 8 30 Salg (ID = SNr + VNr) 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 SNr Max(Mg) 1 50 2 20 4 70 5 30 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.

Group By SELECT SNr, VNr, MAX(Mg) FROM Salg GROUP BY SNr, VNr Salg (ID = SNr + VNr) 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 SNr VNr Max(Mg) 1 5 50 1 8 40 2 1 20 2 3 10 4 1 70 4 3 50 4 5 20 5 8 30 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.

Group By / Having SELECT SNr, VNr, MAX(Mg) FROM Salg GROUP BY SNr, VNr HAVING MAX(Mg) > 30 Salg (ID = SNr + VNr) 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 SNr VNr Max(Mg) 1 5 50 1 8 40 4 1 70 4 3 50 HAVING setter betingelser på hver enkelt gruppe i motsetning til WHERE som setter betingelser på hver enkelt rad.

Uttrykk SELECT VNr, Pris*1.5 FROM Vare Vare (ID = VNr) VNr Pris 8 500 1 200 3 400 5 300 VNr Pris*1.5 8 750 1 300 3 600 5 450 List ut VNr og Pris*1.5, dvs prisen i output er justert opp med 50% i forhold til prisen i tabell-kolonnen.

Tekst-plassering i utlisting SELECT VNr, Pris, ‘Kr’ FROM Vare Vare (ID = VNr) VNr Pris 8 500 1 200 3 400 5 300 VNr Pris ‘Kr’ 8 500 Kr 1 200 Kr 3 400 Kr 5 300 Kr Teksten Kr påføres bakerst på hver rad i tillegg til VNr og Pris.

Order By SELECT SNr, Navn, PNr FROM Selger ORDER BY SNr Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 1 Hansen 9000 2 Olsen 6400 4 Berg 6400 5 Nilsen 5002 Sortering i stigende rekkefølge på kolonnen SNr.

Order By Asc / Desc SELECT SNr, Navn, PNr FROM Selger ORDER BY PNr ASC, SNr DESC Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 5 Nilsen 5002 4 Berg 6400 2 Olsen 6400 1 Hansen 9000 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.

Order By / Group By SELECT SNr, VNr, MAX(Mg) FROM Salg GROUP BY SNr, VNr ORDER BY VNr Salg (ID = SNr + VNr) 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 SNr VNr Max(Mengde) 2 1 20 4 1 70 2 3 10 4 3 50 4 5 20 1 5 50 5 8 20 1 8 40 Gruppene SNr / VNr sortert i stigende rekkefølge på VNr.

Kolonne-nummer-sortering SELECT SNr, Navn, PNr FROM Selger ORDER BY 3 DESC Selger (ID = SNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SNr Navn PNr 1 Hansen 9000 2 Olsen 6400 4 Berg 6400 5 Nilsen 5002 Sortering i synkende rekkefølge på kolonne nr 3, dvs kolonnen PNr i tabellen Selger.

Join Selger (ID = SNr) Adr (ID = PNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø SELECT Selger.Navn, Selger.PNr, Adr.Sted FROM Selger, Adr WHERE Selger.PNr = Adr.PNrID Navn PNr Sted Hansen 9000 Tromsø Olsen 6400 Molde Berg 6400 Molde Nilsen 5002 Bergen 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.

Join - Produkt-tabell Selger SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 Selger Adr SNr Navn PNr PNr Sted 5 Nilsen 5002 5002 Bergen 2 Olsen 6400 5002 Bergen 1 Hansen 9000 5002 Bergen 4 Berg 6400 5002 Bergen 5 Nilsen 5002 6400 Molde 2 Olsen 6400 6400 Molde 1 Hansen 9000 6400 Molde 4 Berg 6400 6400 Molde 5 Nilsen 5002 9000 Tromsø 2 Olsen 6400 9000 Tromsø 1 Hansen 9000 9000 Tromsø 4 Berg 6400 9000 Tromsø Adr PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø Ovenfor ser vi output (12 rader) ved Join mellom Selger og Adr når vi utelater tabell-koblingen i WHERE-statementet. SELECT Selger.SNr, Selger.Navn, Selger.PNr Adr.Sted FROM Selger, Adr

Join Selger Adr SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø Selger Adr SNr Navn PNr Sted 5 Nilsen 5002 Bergen 2 Olsen 6400 Bergen 1 Hansen 9000 Bergen 4 Berg 6400 Bergen 5 Nilsen 5002 Molde 2 Olsen 6400 Molde 1 Hansen 9000 Molde 4 Berg 6400 Molde 5 Nilsen 5002 Tromsø 2 Olsen 6400 Tromsø 1 Hansen 9000 Tromsø 4 Berg 6400 Tromsø * SELECT Selger.Navn, Selger.PNr, Adr.Sted FROM Selger, Adr WHERE Selger.PNr = Adr.PNr 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 *. Feilkoblinger ( PNr) markert med rødt felt. Gjenstående korrekte poster i resultatsett markert med * .

Join SELECT Selger.Navn, Adr.Sted Vare.VNr, Vare.Pris Salg.Mg FROM Selger, Adr, Vare, Salg WHERE Selger.PNr = Adr.PNr AND Salg.SNr = Selger.SNr AND Salg.VNr = Vare.VNr Navn Sted VNr Pris Mg Nilsen Bergen 8 500 30 Olsen Molde 1 200 20 Olsen Molde 3 400 10 Berg Molde 1 200 70 Berg Molde 3 400 50 Bergn Molde 5 300 20 Hansen Tromsø 5 300 50 Hansen Tromsø 8 500 40 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.

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 Selger (ID = SNr) 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 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.

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 Selger (ID = SNr) First.Navn Sec.Navn First.PNr Berg Olsen 6400 SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 Her er antall rader i output ved kobling av tabellen Selger mot seg selv redusert ved at en tilleggsbetingelse er lagt på.

Join - Kobling av en tabell mot seg selv Tilsatt First Sec Nr Navn Sjef 105 Adams 112 107 Smith 105 110 Clark 112 Cruz 107 115 Jones 112 Nr Navn Sjef 105 Adams 112 107 Smith 105 110 Clark 112 Cruz 107 115 Jones 112 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 Navn Sjef Smith Adams Cruz Smith Adams Cruz Jones Cruz 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 . List ut alle tilsatte med tilhørende sjef

Join uten Parent / Child relasjon Tilsatt Ordre 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 Ordre SELECT Ordre.OrdreNr FROM Tilsatt, Ordre WHERE Ordre.Dato = Tilsatt.TilsattDato AND Tilsatt.Navn = ‘Adams’ OrdreNr 11296 15900 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. Lister ut alle ordre som ble ekspedert samme dato som Adams ble tilsatt.

Join m/NULL-verdier Selger Adr SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 4 Berg 6400 PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø SELECT Navn, PNr FROM Selger Navn PNr Nilsen 5002 Olsen 6400 Hansen Berg 6400 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. List selgere med tilhørende postnummer

Join m/NULL-verdier Selger Adr SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 4 Berg 6400 PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø SELECT Navn, Sted FROM Selger, Adr WHERE Selger.PNr = Adr.PNr Navn Sted Nilsen Bergen Olsen Molde Berg Molde Ved NULL-kolonner og tabell-kobling vha WHERE vil radene med NULL-verdier i koblings-kolonnene utebli fra resultatsettet. List selgere med tilhørende postnummer Hansen mangler

Join - Outer Join ANSI standard Selger Adr SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 4 Berg 6400 PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø SELECT Navn, Sted FROM Selger, Adr WHERE Selger.PNr *= Adr.PNr Navn Sted Nilsen Bergen Olsen Molde Hansen Berg Molde 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. List selgere med tilhørende postnummer

Join - Outer join SQLBase Selger Adr SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 4 Berg 6400 PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø SELECT Navn, Sted FROM Selger, Adr WHERE Selger.PNr = Adr.PNr (+) Navn Sted Nilsen Bergen Olsen Molde Hansen Berg Molde 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. List selgere med tilhørende postnummer

Join - Outer join SQLBase NULLVALUE Selger Adr SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 4 Berg 6400 PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø SELECT Navn, @NULLVALUE(Sted,’Ukjent’) FROM Selger, Adr WHERE Selger.PNr = Adr.PNr (+) Navn Sted Nilsen Bergen Olsen Molde Hansen Ukjent Berg Molde Hvis vi i output ønsker en bestemt tekst (her Ukjent) i NULL-verdi kolonnen ved Outer Join, kan funksjonen @NULLVALUE benyttes. List selgere med tilhørende postnummer

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 (+) Ovenfor vises reglene ved Outer Join med NULL-verdi kolonner både i den førstnevne og den sistnevnte kolonnen.

Multiple Query-nivåer SELECT SNr, VNr, Mg FROM Salg WHERE SNr = ( SELECT SNr FROM Selger WHERE Navn = ‘Hansen’) Selger (ID = SNr) Salg (ID = SNr + VNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 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 SNr VNr Mg 1 5 50 1 8 40 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 ...

Multiple Quer-nivåer - Join Selger (ID = SNr) Multippel Query-nivå SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 SELECT SNr, VNr, Mg FROM Salg WHERE SNr = ( SELECT SNr FROM Selger WHERE Navn = ‘Hansen’) Salg (ID = SNr + VNr) 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 Join SELECT Salg.SNr, Salg.VNr, Salg.Mg FROM Salg, Selger WHERE Selger.SNr = Salg.SNr AND Selger.Navn = ‘Hansen’ Ovenfor er to likeverdige SQL-statement. Første statement benytter muliple query-nivåer, mens andre statement benytter join.

Multiple Query-nivåer - EXISTS Vare (ID = VNr) Salg (ID = SNr + VNr) Vare (ID = VNr) VNr Pris 8 500 1 200 3 400 5 300 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 VNr Pris 8 500 1 200 3 400 5 300 SELECT Vare.VNr, Vare.Pris FROM Vare WHERE EXISTS ( SELECT Salg.VNr FROM Salg WHERE Salg.VNr = Vare.VNr ) Exists. List ut fra vare-tabellen vare-nummer inkludert pris for alle varene som er blitt solgt.

View Selger (ID = SNr) Adr (ID = PNr) SNr Navn PNr 5 Nilsen 5002 2 Olsen 6400 1 Hansen 9000 4 Berg 6400 PNr Sted 5002 Bergen 6400 Molde 9000 Tromsø SelgerAdr Selger Adr SNr Navn PNr Sted 5 Nilsen 5002 Bergen 2 Olsen 6400 Molde 1 Hansen 9000 Tromsø 4 Berg 6400 Molde 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. CREATE VIEW SelgerAdr AS SELECT Selger.SNr, Selger,Navn, Selger.PNr, Adr.Sted FROM Selger, Adr WHERE Adr.PNr = Selger.PNr

View SELECT SNr, Navn, PNr, Sted FROM SelgerAdr SelgerAdr Selger Adr 5 Nilsen 5002 Bergen 2 Olsen 6400 Molde 1 Hansen 9000 Tromsø 4 Berg 6400 Molde SNr Navn PNr Sted 5 Nilsen 5002 Bergen 2 Olsen 6400 Molde 1 Hansen 9000 Tromsø 4 Berg 6400 Molde SELECT-statement benyttet på view’et SelgerAdr.

View CREATE VIEW SelgerTot AS SELECT Selger.SNr, Selger.Navn, Selger.PNr, Adr.Sted, Salg.Mg, Vare.VNr, Vare.Pris FROM Selger, Adr, Vare, Salg WHERE Adr.PNr = Selger.PNr AND Salg.SNr = Selger.SNr AND Salg.VNr = Vare.VNr SNr Navn PNr Sted Mg VNr Pris 1 Hansen 9000 Tromsø 50 5 300 1 Hansen 9000 Tromsø 40 8 500 2 Olsen 6400 Molde 20 1 200 2 Olsen 6400 Molde 10 3 400 4 Berg 6400 Molde 70 1 200 4 Berg 6400 Molde 50 3 400 4 Berg 6400 Molde 20 5 300 5 Nilsen 5002 Bergen 30 8 500 Et view bestående av sammensetning av tabellene Selger, Adr, Vare og Salg.

UPDATE UPDATE table name view name correlation name Oppdaterer en tabell UPDATE table name view name correlation name SET column name = expression NULL WHERE search condition CHECK EXISTS CURRENT OF cursor name

Oppdatering av databasen UPDATE Vare SET Pris = 450 WHERE VNr = 3 UPDATE Vare SET Pris = Pris * 1.10 WHERE VNr = 3 UPDATE Vare SET Pris = 450 UPDATE Vare SET Pris = Pris * 1.10 UPDATE benyttes til oppdatering av tabeller. UPDATE Tab SET a = ... b = ... c = ...

Sletter rad(er) i en tabell DELETE Sletter rad(er) i en tabell DELETE table name view name correlation name WHERE search condition CURRENT OF cursor name

DELETE - Eksempel DELETE FROM Salg WHERE SNr = 4 AND VNr= 3 Sletting av samtlige poster i tabellen Salg. DELETE FROM Salg

Matematikk funksjoner Finans funksjoner SQL Funksjoner Aggregat funksjoner String funksjoner Date / Time funksjoner Logiske funksjoner Spesielle funksjoner Matematikk funksjoner Finans funksjoner SQL inneholder mange funksjoner, delt inn i grupper som vist ovenfor.

Aggregat-funksjoner AVG Gjennomsnitt COUNT Antall MAX Maksimum @MEDIAN Middelverdi MIN Minimum SUM Sum @SDV Standard avvik Aggregat-funksjoner.

String funksjoner @CHAR ASCII 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 String-funksjoner.

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 Date / Time funksjoner.

Matematikk funksjoner @ABS Absolutt-verdi @ACOS Arcus cosinus @ASIN Arcus sinus @ATAN Arcus tangens @ATAN2 To-kvadrant arcus tangens @COS Cosinus @EXP Eksponential-funksjon @FACTORIAL Fakultet @INT Heltallsdel @LN Naturlige logaritme @LOG 10’er logaritme @MOD Divisjonsrest @PI Tallet Pi (=3.14159265...) @ROUND Avrunding @SIN Sinus @SQRT Kvadratrot @TAN Tangens Matematikk-funksjoner.

Finans funksjoner @CTERM Antall 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 Finans-funksjoner.

Spesielle funksjoner @CHOOSE Velger 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 Spesielle funksjoner.

Logiske funksjoner @IF Tester og returnerer 1 hvis TRUE, 2 hvis FALSE @ISNA Returnerer TRUE hvis NULL Logiske funksjoner.

Funksjoner - Eksempel SELECT SNr, @PROPER(Navn) FROM SelgerAdr WHERE @UPPER(@TRIM(Navn)) = ‘HANSEN’ 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, …). Usikkerhet angående skrivemåte av navn i databasen (små eller store bokstaver, mellomrom, ... )

@CHOOSE @CHOOSE (SelNr, a, b, c, d, e, f, g) SelNr Resultat -1 2 12 a -1 2 12 a c g SNr <= 0 gir første liste-verdi a, SNr = 1 neste verdi b, …, SNr >=6 gir her siste verdi g

@CHOOSE SELECT @CHOOSE(@WEEKDAY(FDato), ‘Lø’, ‘Sø’, ‘Ma’, ‘Ti’, ‘On’, ‘To’, ‘Fr’) FROM Person List ut uke-dagen til fødselsdagen til samtlige personer i tabellen Person

@FV @FV (Belop, p, n) n (1 + p/100) - 1 Belop * ------------------- 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

SQL Et større eksempel (1) StlngMax Ekteskap MannID KvinneID ….. ENrMann ENrKvinne EVarighet Periode Stilling GjEVarighet Count PersonID ….. Periode StRang 1500-1549 Kap 29,3 211 Sp 30,1 105 ….. 1550-1599 Kap 31,2 323 Sp 31,7 258 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 SQL - Et større eksempel. 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)

SQL - Et større eksempel (2) StlngMax Ekteskap MannID KvinneID ….. ENrMann ENrKvinne EVarighet Stilling Periode GjEVarighet Count PersonID ….. Periode StRang Kap 1500-1549 29,3 211 1550-1599 31,2 323 ….. Sp 1500-1549 30,1 105 1550-1599 31,7 258 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 .SQL - Et større eksempel. 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)

Laster data fra en database ut til en fil av gitt format UNLOAD Laster data fra en database ut til en fil av gitt format UNLOAD SQL ‘file name’ source table COMPRESS DATA CONTROL ‘file name’ OVERWRITE ALL ASCII ‘file name’ source table DATA CONTROL ‘file name’ OVERWRITE DIF ‘file name’ source table DATABASE ‘file name’ COMPRESS SHEMA CONTROL ‘file name’ OVERWRITE ALL ON CLIENT LOG ‘logfile name’ SERVER

UNLOAD - Eksempel INSERT INTO Adr (PNr,Sted) VALUES(:1,:2) \ UNLOAD DATA SQL c:\data\Adr.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:\data\Adr.txt.

Laster data fra en fil av gitt format inn til en tabell i databasen LOAD Laster 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

LOAD - Eksempel LOAD SQL c:\data\Adr.txt

Endrer på kolonne-strukturen i en tabell ALTER TABLE Endrer 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

ALTER TABLE - Eksempel ALTER TABLE Bedrift Endrer datatype og/eller kolonnelengde ALTER TABLE Bedrift MODIFY BedriftsNavn Char(50) ADD Tlf Char(8) Legger til en kolonne

ALTER TABLE (Referential Integrity) Endrer 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

ALTER TABLE (Error Message) Endrer 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’

Enable / Disable en trigger ALTER TRIGGER Enable / Disable en trigger ALTER TRIGGER trigger name ENABLE DISABLE

COMMIT COMMIT WORK TRANSACTION <id> FORCE Commits alle endringene 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

Omgjør siste transaksjon ROLLBACK Omgjør siste transaksjon ROLLBACK savepoint identifier TRANSACTION <id> FORCE

Genererer SAVEPOINT til bruk ved ROLLBACK SAVEPOINT savepoint identifier

CREATE INDEX CREATE INDEX index name UNIQUE CLUSTERED HASHED , Oppretter en indeks CREATE INDEX index name UNIQUE CLUSTERED HASHED , ON table name ( column name ) ASC DESC PCTFREE integer constant SIZE integer value ROWS BUCKETS Max size = 6 + number of + sum of <= 255 columns in length of all index columns in index

CREATE INDEX - Eksempel CREATE UNIQUE INDEX Bidndx ON Bedrift (BedriftsID) CREATE INDEX BnNdx ON Bedrift (BedriftsNavn)

Oppretter synonym (alias) navn til en tabell CREATE SYNONYM Oppretter synonym (alias) navn til en tabell CREATE SYNONYM synonym name PUBLIC FOR table name authorization ID view name

Returnerer antall rader i en tabell ROWCOUNT Returnerer antall rader i en tabell ROWCOUNT tablename

Genererer resultatsett som union av multiple SELECT ALL select command , ORDER BY integer constant ASC DESC SELECT … UNION ALL UNION ALL ... Duplikater blir ikke eliminert

UPDATE STATISTICS 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 DATABASE

Ulike brukere gis ulike passord. 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. Til en database kan det opprettes ulike brukere hver med ulike rettigheter i databasen.

Det finnes tre hoved-typer brukere: Brukere / Privilegier Det finnes tre hoved-typer brukere: Brukere med DBA-privilegier Brukere med RESOURCE-privilegier Brukere med CONNECT-privilegier Bruker-nivåer rangert ovenfra og nedover: - SYSADM - DBA - RESOURCE - CONNECT

SYSADM DBA RESOURCE CONNECT Authority Level SYSADM DBA RESOURCE Bruker-nivåer rangert ovenfra og nedover: - SYSADM - DBA - RESOURCE - CONNECT CONNECT

CONNECT Adgang til databasen. Adgang til å manipulere spesifikke tabeller i følge tilordnede privilegier. CONNECT

Adgang til å opprette tabeller, indekser og clustre. RESOURCE Adgang til å opprette tabeller, indekser og clustre. Alle rettigheter til operasjoner på egenopprettede tabeller. Adgang til å modifisere privilegier til egenopprettede tabeller for gyldige brukere av databasen. RESOURCE

Alle rettigheter til enhver tabell i databasen. DBA Alle rettigheter 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. DBA

Tilordning av autoritet / privilegier GRANT CONNECT TO Nilsen IDENTIFIED BY Katt TO Olsen IDENTIFIED BY Gris TO Hansen IDENTIFIED BY Hest GRANT RESOURCE TO Olsen GRANT DBA TO Hansen GRANT SELECT, UPDATE (Navn, PNr) ON Selger SQL-kommandoen GRANT kan benyttes til å tilordne autoritet / privilegier til ulike brukere.

Database Authority , GRANT RESOURCE TO AuthID DBA , , , , CONNECT TO AuthID IDENTIFIED BY Password GRANT-kommandoen - Syntaks Autoritet

Table Privileges , GRANT ALL SELECT INSERT DELETE INDEX ALTER UPDATE ( ColumnName ) , , ON TableName TO AuthID ViewName PUBLIC GRANT-kommandoen - Syntaks Privilegier

SQL har mange sterke sider, 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 SQL kontra høgnivåspråk

SQL innebygget som 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. SQL kan innebygges som en del av et prosedyre-språk. To ulike metoder benyttes: - Embedded SQL - Application Program Interface (API)

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 Embedded SQL / API for ulike databaser og prosedyre-språk.

Høgnivå-språk - SQL Høgnivåspråk Data-flyt Variabler Blokk-struktur Test Sløyfer Input / Output SQL Database-aksess Høgnivåspråk og SQL

Eksekvering av statementet. 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. Prosessering av et SQL-statement.

Generate Application Plan SQL-prosessering SELECT A,B,C FROM X,Y WHERE A < 5000 AND C = ‘ABC’ Parse statement Database system catalog Validate statement Optimize statement Generate Application Plan Prosessering av et SQL-statement Binary form of SQL statement Execute statement

SQL knyttet opp 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) SQL knyttet opp mot høgnivåspråk-variabler. Høgnivåspråk-variablene er prefikset med kolon ( : ).

Resultat-sett med mer enn en record Database Applikasjon SQL-statement Fetch Resultat-sett Record_1 Record_2 Record_3 ... 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. Cursor

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: %s\n”, cityname); } Embedded SQL eksempel

5 faser ved 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. 5 faser ved generering av embedded SQL-program

5 faser ved generering av embedded SQL-program Embedded SQL source program Precompiler Stripped source program Database request module Compiler BIND Object code DBMS library Application plan 5 faser ved generering av embedded SQL-program Linker Application plan Database Executable program

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 API

SQL API CONNECT (db,user,pswd) SEND (“Update orders set ...”) Application progam DBMS CONNECT (db,user,pswd) SEND (“Update orders set ...”) EXECUTE ( ) STATUS_CHECK ( ) Ok SEND (“Select * from offices ...”) EXECUTE ( ) GETROW ( ) (101, “New York”, ...) SQL API GETROW ( ) (12, “Chicago”, ...) DISCONNECT ( )

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); } SQL API Program-eksempel

SAL funksjonalitet i 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

SAL funksjonalitet i 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

Relaterte SQLTalk kommandoer 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)

Connect / Disconnect SqlDatabase DEMO SqlUser SYSADM Predefinerte variable Default-verdier SqlDatabase DEMO SqlUser SYSADM SqlPassword SYSADM SqlConnect SqlDisconnect Centura-funksjoner

End