Introduktion til programmering Databaser Uge 38 L. Ingemann: SQL databaser på nettet, kap -4. Kompendium L. Ingemann: SQL databaser på nettet, kap 6-0, Kompendium
Sidste gang Databaser Relationelle databaser Modellering ER-diagrammer Et abstrakt beskrivelsesværktøj der er uafhængigt af databasetypen. Normalisering Undgå at samme oplysning står flere steder Undgå afhængigheder indenfor samme tabel Sørge for at hver tabel har en primær nøgle
Plan Tema: ER SQL SQL Repræsentationsproblemer Hvad kan man udtrykke og hvad kan man ikke udtrykke? Mulige løsninger Datadefinition, tabeller Søgning Øvelse Enkelt tabel Flere tabeller
Hvad er SQL? Standardiseret sprog til manipulation af databaser IBM Sequel, 977 Structured English Query Language Standard i 986 som SQL ANSI/8
Hvad er SQL? En de facto standard for interaktion med relationelle databaser Næsten alle DBMS understøtter ANSI SQL og en række udvidelser der er produktspecifikke
SQL DDL - data definition Definition af database strukturen. CREATE Oprettelse og ændring af tabeller og datatyper. ALTER DML - data manipulation indsætte, slette, søge. INSERT, DELETE, SELECT
Relationer Består af et prædikat (tabelnavnet) plus en række argumenter (kolonnerne) Relation: OwnedBy(kæledyrsId,PersonId) Medlemmer: {Ownedby(,4), OwnedBy(,4)} Relation: Person(PersonId,navn) Medlemmer: {Person(,Peter), Person(,Karl)} Hver position kan have et navn (KæledyrsId, PersonId, navn) Formaliseret i første ordens prædikatslogik (FOPL)
Databaser skal indgå i organisationens kommunikation Luhmann: en organisation eksisterer (kun) som kommunikation En kommunikation skal kunne avle den næste kommunikation
Meningsfulde relationer Hvis en tabel kan parafraseres ved en en eller flere simple sætninger med primærnøglen som subjekt og tabelnavnet som verbum og kolonnenavnene som sætningsled eller kolonne navnene som del af prædikatet kan vi afgøre hvad databasen repræsenterer i virkeligheden Ejer(personId, kæledyrsid) personid ejer kæledyrsid Person(cpr,navn,adresse,ægtefælle) Cpr hedder navn Cpr bor på adresse Cpr er gift med ægtefælle Hvis vi ikke kan omdanne tabellen til sætninger, kan vi ikke tale om dens indhold. Tabellen kan derfor ikke gå videre i organisationens kommunikation (Luhmann)
Et meget hyppigt fænomen Digitale medier er led i en kommunikationskæde der også involverer de naturlige sprog Der er forskel på hvad man kan udtrykke i digitale medier og naturlige sprog Digitale medier er typisk mere restriktive men tilbyder nye muligheder på grund af disse restriktioner.
Udtryksbegrænsninger Medlemmerne af en relation skal være af samme længde Bor(personId,adresseId) Bor(personId,adresseId, startid, sluttid) Hver række i tabellen skal have samme længde som overskriften Man kan ikke lave relationer af relationer Ved(Peter,Bor(Karl,Vestergade 0)) Et felt kan ikke indeholde en tabel
Problemer Der er to fænomener i vores sprog vi ikke kan udtrykke i relationslogikken hvis vi opfatter en række i tabellen som en påstand om virkeligheden Fast længde En persondatabase Voksne kan have en ægtefælle, børn kan ikke Mulige løsninger: Vælg det maximale antal felter og lad nogle af dem stå tomme Lav to tabeller, en for voksne og en for børn Ingen relationer af relationer Bilernes sammenstød i juni forårsagede at den ene fører døde Forårsager((StødeSammen(Bil,Bil), Død(Fører)) er ikke tilladt
Reification: Represent events as objects. Events may have a variable number of roles The soup cooked. Peter cooked the soup. But: relations with different length are different relations. Cook (TheSoup) Cook (Peter, TheSoup) If a predicat represents one relation it must have constant arity. Cook(TheSoup, TheSoup), Cook(Peter, TheSoup) We need to talk about predicates: The cooking of the soup took three hours: Duration(Cook(TheSoup), 3 hours). Syntax error! Therefore events should not be represented as a predicate. A row in a table should not be interpreted as a proposition about the world. In stead relations are about an event and its participants. A row in a table is interpreted as asserting a grammatical relation between an event and its participants IsA(e, Cooking) Object(TheSoup, e) IsA(e, Cooking) Object(TheSoup,e) Agent(Peter, e) IsA(e3, Cooking) Object(TheSoup,e3) Agent(Peter, e3) Duration(3 hours, e3). IsA betyder: er medlem af en klasse eller er en delmængde af en klasse.
Reification. A literary example. Everything that can be talked about is represented as objects, including events There is a limited set (about 0) of predicates that represent the relation between events and their participants, or between events, or between events and intervals of time. Predicates: Agent, Object, Opposes, Helper. Objects: Persons, props, events, locations. Frodo destroys the ring helped by Sam Sauron claims the ring Frodos destruction of the ring prevents Sauron s claiming the ring
A database schema
Another example. Airplane timetables Traditional version: as many tables as types of sentences SK3067 flies from Tirstrup to Copenhagen: Flies(SK3067, Tirstrup, Copenhagen). SK3067 flies to Copenhagen at 7.0 Flies (SK3067, Copenhagen, 7.0). SAS flies SK3067 from Tirstrup at 7.0: Flies3 (SAS, SK3067, Tirstrup, 7.0). Reified version ISA(SK3067, flight) Agent(SAS, SK3067) Name( SK3067 SK3067) Source(Tirstrup, SK3067) Destination(Copenhagen, SK3067) Starttime(7.0, SK3067) Endtime(7.55, SK3067) Has(Seat, SK3067) Number(Seat) = 45. Can be implemented by 9 database schemas, each with two fields
Reification. The airplane example Relations: Source, Destination, Starttime, Endtime, Agent Entities: Events, Time, Locations, Companies
Database Each role defines a binary table Agent Source Destination Tirstrup SK306 Copaenhage SK306 SAS SK3067 7 Copenhag DF987 n 7 Aalborg DF987 Maersk DF9876 en 6 6 xxxx xxxx xxxx xxxx xxxx xxxx IsA claim00 destroy0 ring00 claim destroy ring agent Sauron Fnrodo xxxx claim00 destroy0 xxxx object ring00 ring00 xxxx claim00 destroy0 xxx
ER SQL: Kæledyrseksemplet Eksempel fra sidste gang Hvordan laver man et ER-diagram om til en SQL-database?
Lave en tabel over personer CREATE TABLE persons( ) id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR( 30 ) NOT NULL, PRIMARY KEY ( id ) ID name
Indsæt nogle poster INSERT INTO persons (name) VALUES ( Peter ),( Alexander ); ID 8 9 name Alexander Peter
Lave en tabel over arter CREATE TABLE species ( ) id MEDIUMINT NOT NULL AUTO_INCREMENT, kind CHAR( 30 ) NOT NULL, PRIMARY KEY ( id )
Indsæt nogle poster INSERT INTO species(kind) VALUES ( kat ),( hund ); ID kind kat hund
Lav en tabel over kæledyr CREATE TABLE pets( ID MEDIUMINT NOT NULL AUTO_INCREMENT, PRIMARY KEY ( id ), name CHAR( 30 ) NOT NULL, sex CHAR( ), born DATE, death DATE, species INTEGER REFERENCES species( id ) ) ID name sex born death species
Indsæt nogle poster INSERT INTO pets ( ID, name, sex, born, death, species) VALUES ( king, m, 985-09-4, 00-03-0, ), ( mette, f, 004-03-07, NULL, ); ID name sex borrn death species king m 985-09-4 00-03-0 mette f 004-03-07 0000-00-00
Indsæt flere poster INSERT INTO pets (name, sex, born, death,species) VALUES ( 'rasmus', 'm', 00-03 -0, NULL, ), ( 'anton', 'm', 005-07 -, NULL, ), ( 'bisse', 'f', 00-07 -0, NULL, )
Lav en tabel over ejerskab CREATE TABLE ownedby( ) idpets integer NOT NULL REFERENCES pets( id ), idpers integer NOT NULL REFERENCES persons( id ), PRIMARY KEY ( idpets, idpers ) idpets idpers
Indsæt nogle poster INSERT INTO ownedby ( idpets, idpers ) VALUES ( 8, ), ( 9, ); idpers 8 9 idpets
Datamanipulation Indsætte: INSERT Søge: SELECT Slette: DELETE Opdatere: UPDATE
Indsætte INSERT INTO TABEL ( KOLONNE,,KOLONNEn) VALUES ( value, valuen), ( value, valuen), ( value, valuen)
Søgning i én tabel SELECT name FROM persons Persons ID 8 9 name Alexander Peter name Alexander Peter
Søgning med betingelse SELECT name, sex FROM pets WHERE death = '0000-00-00' Navn og køn på alle nulevende kæledyr ID name sex borrn death species king m 985-09-4 00-03-0 mette f 004-03-07 0000-00-00 3 rasmus m 00-07- 0000-00-00 4 anton m 005-07- 0000-00-00 5 bisse f 005-07-0 0000-00-00
Andre søgninger Navn og køn på alle kæledyr født efter 000 SELECT name, sex FROM pets WHERE born > 000-00-00 SELECT * FROM pets WHERE sex = 'f' AND species = alle hunkatte ID name sex borrn death species king m 985-09-4 00-03-0 mette f 004-03-07 0000-00-00 3 rasmus m 00-07- 0000-00-00 4 anton m 005-07- 0000-00-00 5 bisse f 005-07-0 0000-00-00
Operatorer til WHERE = lig med <>,!= ikke lig med <= mindre end eller lig med >= større end eller lig med < mindre end > større end IS NULL, IS NOT NULL AND, OR IN (, ) NOT IN (, ) BETWEEN... AND...
Søgning på tekster Søgning på tekststrenge med jokertegn % (nul eller flere bogstaver) og _ (eet bogstav) Eks: finde alle der starter med b SELECT (etc) WHERE name LIKE b% Eks: finde alle med ss i navnet SELECT (etc) WHERE name LIKE %ss%
Eksempel Find alle, hvor navnet starter med b, efterfulgt af et tilfældigt bogstav, efterfulgt af s, resten ligegyldigt SELECT name, sex FROM pets WHERE name LIKE 'b_s%' Finder bisse
Slette DELETE FROM tabel WHERE betingelse DELETE FROM pets WHERE NAME = mette
Opdatering UPDATE pets SET sex = 'f'where name = 'mette' UPDATE tabelnavn SET kolonne = expr kolonne = expr... WHERE betingelser
Søgning i tabeller For at søge i eller flere tabeller, skal de først sættes sammen (joines) til en tabel SELECT kolonner FROM tabel, tabel,...where betingelse
Eksempel id SELECT * FROM persons, species Cross join eller cartesisk produkt Cross join producerer en tabel der ikke i sig selv påstår sande ting om virkeligheden name Peter Alexander id name id kind Peter kat id kind Alexander kat kat Peter hund hund Alexander hund
Meningsfuldhed Ved cross join laver vi først alle de mulige påstande om verden uanset om de er sande eller falske. En ren kombinatorik. Persons X Species: alle rækker i Persons kombineret med alle rækker i Species Dernæst fisker vi de sande påstande ud ved en WHERE konstruktion Meningsløshed meningsfuldhed
Inner join/equi join Returnerer en tabel, indeholdende rækker der opfylder en betingelse Først igen et meningsløst resultat SELECT * FROM persons, species WHERE persons.id = species.id SELECT * FROM persons INNER JOIN species ON persons.id = species.id Returnerer alle personer og arter som har samme ID id name id kind Peter Alexander Peter kat kat hund id name Peter id kind kat Alexander hund Alexander hund SELECT * FROM persons, species WHERE persons.id = species.id
Skabelse af mening Kun en fornuftig formulering af wheredelen giver et resultat der repræsenterer en tolkbar påstand
Meningsfuldt inner join Alle kæledyr med deres artsbetegnelse SELECT * FROM pets INNER JOIN species ON pets.species = species.id Den resulterende tabel udsiger sande påstande om verden: kind kolonnen indeholder artsbetegnelsen på kæledyret ID name sex born death species id kind king m 985-09-4 00-03-0 kat 3 rasmus m 00-07- 0000-00-00 hund 4 anton m 005-07- 0000-00-00 hund 5 bisse f 005-07-0 0000-00-00 hund
OUTER JOIN Returnerer en tabel, indeholdende alle poster fra den ene, og de poster fra den anden der opfylder en betingelse LEFT, RIGHT SELECT * FROM pets LEFT JOIN species ON pets.species = species.id Giver samme resultat fordi alle pets har en species.
Eksempel Navn og art for alle levende dyr SELECT pets.name, species.kind FROM pets, species WHERE pets.death = '0000-00-00'AND pets.species = species.id name kind rasmus anton bisse hund hund hund
Eksempel Dyrets navn, art og ejer. SELECT pets.name, species.kind, persons.name FROM pets, ownedby, species, persons WHERE pets.id = ownedby.idpets AND persons.id = ownedby.idpers AND pets.species=species.id Ownedby bruges som mellemregning til at lave det nødvendige krydsprodukt name kind name rasmus hund Alexander king anton bisse kat hund hund Peter Peter Alexander
Hvordan gør den det? Pets Den laver først en CROSS JOIN af alle tabeller der er nævnt i FROM. En stor tabel med kolonner og 4 X X X 4 rækker = 64 rækker Af disse 64 rækker fjerne den dem der ikke tilfredsstiller WHERE betingelsen Af den resterende tabel udvælger den de kolonner der er omtalt i SELECT delen, altså pets.name, species.kind, persons.name Ownedby Species Persons ID 3 Name king rasmus Sex m m born deat h spe cies Idpets 3 4 Idpers ID 3 kind kat hund ID 3 name Peter Alexander 4 anton m 5 5 bisse f pets, ownedby, species, persons
ALTER Ændrer i definitionerne ALTER TABLE pets ADD COLUMN sex CHAR() ALTER TABLE pets DROP COLUMN death ALTER TABLE pets RENAME COLUMN birth TO born ALTER TABLE persons RENAME TO owners ALTER TABLE persons ADD PRIMARY KEY (id)
Database definitioner
Databasens indhold
Søgning ved formularudfyldning
Skrivning af SQL
Resultatet vises
Fejlretning Alle personer med efternavnet andersen
Fejlretning #054 - Unknown column 'andersen'in 'where clause' #054: nummeret på fejlen. Kan slås op i hjælpefunktionen. Giver sjældent hjælp Ræsonner selv Den tror at andersen er navnet på en kolonne og kan ikke finde denne kolonne Måske er det kun kolonnenavne man kan skrive uden anførselstegn, mens værdier skal i anførselstegn? Test hypotesen SELECT * FROM Person WHERE lastname LIKE 'andersen'
Ja det var rigtigt Det er svært at huske alle konventioner Der vil altid komme fejl Derfor: I stedet for at huske på alt, blive gode til at gætte på årsagen til fejl og at teste hypotesen
Øvelse (gruppe) Tag en mindre del af det diagram I lavede i øvelse, byg en sql-database og formuler en SELECT-ordre som kan udtrække nogle af de data, som forekommer i det originale dokument eller som på anden made er relevant for databasen.