SQL 3: Opprette tabeller, datainnsetting og utsnitt Læreboka kap. 4 03.11.2008 Kjell Toft Hansen 1
Datainnsetting Legg til en ny leverandor i tabellen leverandor INSERT INTO leverandor (lev_nr, lev_navn, klasse, lev_by) VALUES(21, 'Åseby', 20, 'Oslo'); eller INSERT INTO leverandor VALUES(21, 'Åseby', 20, 'Oslo'); lev_nr lev_navn klasse lev_by 1 Svendsen 20 Lillehammer 2 Jensen 10 Porsgrunn 3 Bø 30 Porsgrunn 4 Christiansen 20 Lillehammer 5 Andersen 30 Arendal 21 Åseby 20 Oslo 03.11.2008 Kjell Toft Hansen 2
Kopiere data fra én tabell til en annen Legg inn dårlige leverandører (leverandører med lavere klassifisering enn 30) i en egen tabell. CREATE TABLE darlig_leverandor AS SELECT * FROM leverandor WHERE klasse < 30; lev_nr lev_navn klasse lev_by 1 Svendsen 20 Lillehammer 2 Jensen 10 Porsgrunn 4 Christiansen 20 Lillehammer 21 Åseby 20 Oslo 03.11.2008 Kjell Toft Hansen 3
Endre verdier Produkt 2 skal skifte til fargen gul og vekten skal økes med 3. UPDATE produkt SET kode = 'gul', vekt = vekt + 3 WHERE prod_nr = 2; prod_nr prod_navn kode vekt prod_by 1 synåler rød 12 Lillehammer 2 binders gul 20 Porsgrunn 3 skruer blå 17 Risør 4 skruer rød 14 Lillehammer 5 knapper blå 12 Porsgrunn 6 spiker rød 19 Lillehammer 03.11.2008 Kjell Toft Hansen 4
Endre verdier Nullstill antall leverte produkt for alle leverandører i Porsgrunn. UPDATE leveranse SET ANTALL = 0 WHERE lev_nr IN ( SELECT lev_nr FROM leverandor WHERE lev_by = 'Porsgrunn' ); lev_nr prod_nr antall 1 1 300 1 2 200 1 3 400 1 4 200 1 5 100 1 6 40 2 1 0 2 2 0 3 2 0 4 2 200 4 4 300 4 5 400 03.11.2008 Kjell Toft Hansen 5
Slette tabell/verdier Slett alle radene i tabellen Leveranse DELETE FROM leveranse; Slett en leverandor i tabellen Leverandor DELETE FROM leverandor WHERE lev_nr = 21; Slett hele tabellen Leveranse DROP TABLE IF EXISTS leveranse; 03.11.2008 Kjell Toft Hansen 6
Opprette tabeller Relasjonsskjema: ANSATT(ans_id, etternavn, fornavn, avd_id*) AVDELING(avd_id, avdnavn, ans_id*) 03.11.2008 Kjell Toft Hansen 7
Opprette tabeller CREATE TABLE tbl_avdeling ( avd_id CHAR(4) NOT NULL, avdnavn VARCHAR(15) NOT NULL, alternativ nøkkel ans_id INT NOT NULL, fremmednøkkel, eksistensavhengighet PRIMARY KEY(avd_id), UNIQUE(avdnavn) tillater nullverdi )TYPE=INNODB; 03.11.2008 Kjell Toft Hansen 8
Opprette tabeller CREATE TABLE tbl_ansatt ( ans_id INT NOT NULL, etternavn VARCHAR(30) NOT NULL, fornavn VARCHAR(25), avd_id CHAR(4) NOT NULL, fremmednøkkel, eksistensavhengighet PRIMARY KEY(ans_id) )TYPE=INNODB; 03.11.2008 Kjell Toft Hansen 9
Opprette tabeller : referanseintegritet ALTER TABLE tbl_ansatt ADD FOREIGN KEY(avd_id)REFERENCES tbl_avdeling(avd_id); Hvis vi ønsker å slette en avdeling fra tabellen Avdeling, får vi ikke lov til det hvis det finnes en ansatt som er registrert i samme avdeling vi kan ikke slette ved en feiltagelse. ALTER TABLE tbl_ansatt ADD FOREIGN KEY(avd_id)REFERENCES tbl_avdeling(avd_id) ON DELETE CASCADE; Hvis vi ønsker å slette en avdeling fra tabellen Avdeling og det finnes ansatte som er registrert i samme avdeling, vil også alle ansatte i denne avdelingen bli slettet svært uheldig. 03.11.2008 Kjell Toft Hansen 10
Opprette tabeller : referanseintegritet ALTER TABLE tbl_avdeling ADD FOREIGN KEY(ans_id)REFERENCES tbl_ansatt(ans_id); Hvis vi ønsker å slette en ansatt fra tabellen Ansatt og den samme ansatte er registrert som leder i tabellen Avdeling, får vi ikke slette den ansatte vi kan ikke slette ved en feiltagelse og får ikke morløse. ALTER TABLE tbl_avdeling ADD FOREIGN KEY(ans_id)REFERENCES tbl_ansatt(ans_id); ON DELETE CASCADE; Hvis vi ønsker å slette en ansatt fra tabellen ansatt og den ansatte er registrert som leder i tabellen Avdeling, vil den ansatte bli slettet og det samme vil avdelingen bli svært uheldig. 03.11.2008 Kjell Toft Hansen 11
Virtuelle tabeller (utsnitt, eng. views) Opprett et utsnitt som inneholder leverandører med lavere klassifisering enn 30 CREATE VIEW darlig_leverandor_utsnitt (lnr, lnavn, kl) AS SELECT lev_nr, lev_navn, klasse FROM leverandor WHERE klasse < 30; SELECT * FROM darlig_leverandor_utsnitt; LEV_NR LEV_NAVN KLASSE ---------- --------------- ---------- 1 Svendsen 20 2 Jensen 10 4 Christiansen 20 21 Åseby 20 03.11.2008 Kjell Toft Hansen 12
Virtuelle tabeller Vi ønsker å se hvilke utsnitt vi har opprettet SELECT VIEW_NAME FROM USER_VIEWS; VIEW_NAME ------------------------------ ANTALL1 ANTALL2 DAARLIGE_LEVERANDORER DAARLIGE_LEVERANDORER2 DARLIG_LEVERANDOR_UTSNITT KAN_LEVERE_HELE_ORDREN KAN_LEVERE_TIL_ORDREN LEV_INFO LEV_VINDU NOEN_FORFATTERE 03.11.2008 Kjell Toft Hansen 13
Virtuelle tabeller med CHECK OPTION Hindre at rader som ikke passer inn i utsnittet blir lagret ved innsetting/endring CREATE VIEW darlig_leverandor_utsnitt2 AS SELECT lev_nr, lev_navn, klasse FROM leverandor WHERE klasse < 30 WITH CHECK OPTION; INSERT INTO darlig_leverandor_utsnitt2 VALUES(9, 'Rød', 50); INSERT INTO darlig_leverandor_utsnitt2 VALUES(9, 'Rød', 50) * FEIL på linje 1: ORA-01402: brudd på WITH CHECK OPTION-skranke for WHERE-ledd i utsnitt 03.11.2008 Kjell Toft Hansen 14
Virtuelle tabeller med CHECK OPTION Hindre at rader som ikke passer inn i utsnittet blir lagret ved innsetting/endring UPDATE darlig_leverandor_utsnitt2 SET klasse = 60 WHERE lev_nr = 1; UPDATE darlig_leverandor_utsnitt2 * FEIL på linje 1: ORA-01402: brudd på WITH CHECK OPTION-skranke for WHERE-ledd i utsnitt 03.11.2008 Kjell Toft Hansen 15