DROP SEQUENCE seq; CREATE SEQUENCE seq START WITH 10 INCREMENT BY 5 MINVALUE -100; DROP TABLE besitzer CASCADE CONSTRAINTS; DROP TABLE autos CASCADE CONSTRAINTS; DROP TABLE reparaturen CASCADE CONSTRAINTS; DROP TABLE vorbesitzer CASCADE CONSTRAINTS; DROP TABLE vergehen CASCADE CONSTRAINTS; DROP TABLE strafen CASCADE CONSTRAINTS; DROP SEQUENCE seqVergehen; CREATE TABLE besitzer ( id INTEGER, name VARCHAR2(30) NOT NULL, gebdat DATE NOT NULL, adresse VARCHAR2(30) NOT NULL, CONSTRAINT pkBesitzer PRIMARY KEY (id), CONSTRAINT ucNameAdresse UNIQUE (name, adresse), CONSTRAINT ckGebDat CHECK (TO_CHAR(gebdat, 'YYYY') <= 1999) /* Opel Corsa Lösung (Rolator) */ ); CREATE TABLE autos ( id INTEGER, bezeichnung VARCHAR2(30) NOT NULL, ps INTEGER NOT NULL, id_besitzer INTEGER NOT NULL, /* Kommentar zu FKy */ CONSTRAINT pkAutos3 PRIMARY KEY (id), CONSTRAINT ucBezeichnung3 UNIQUE (bezeichnung), CONSTRAINT fkBesitzer3 FOREIGN KEY (id_besitzer) REFERENCES besitzer(id), CONSTRAINT ckPS3 CHECK (ps >= 20) ); CREATE TABLE reparaturen ( repnr INTEGER, id_autos INTEGER, beschreibung VARCHAR2(30) NOT NULL, kosten INTEGER NOT NULL, datum DATE NOT NULL, CONSTRAINT pkRepnrAutos3 PRIMARY KEY (repnr, id_autos), CONSTRAINT fkAutos3 FOREIGN KEY (id_autos) REFERENCES autos(id), CONSTRAINT ckKosten3 CHECK (kosten >= 10), CONSTRAINT ckBeschreibung3 CHECK (LENGTH(beschreibung) >= 4) ); CREATE TABLE vorbesitzer ( id_besitzer INTEGER, id_autos INTEGER, fromdate DATE, todate DATE, CONSTRAINT pkBesitzerAutosFrom3 PRIMARY KEY (id_autos, fromdate), CONSTRAINT fkVorbesitzerBesitzer3 FOREIGN KEY (id_besitzer) REFERENCES besitzer(id), CONSTRAINT fkVorbesitzerAutos3 FOREIGN KEY (id_autos) REFERENCES autos(id), CONSTRAINT ckFromDateToDate3 CHECK (fromdate < todate), CONSTRAINT ckFromDateSunday3 CHECK (TO_CHAR(fromdate, 'FMDAY') NOT LIKE 'S%'), CONSTRAINT ckToDateSunday3 CHECK (TO_CHAR(todate, 'FMDAY') NOT LIKE 'S%'), CONSTRAINT ckFromDateToDateDifference3 CHECK ((todate IS NULL) OR ((todate - fromdate) >= 7)) ); CREATE TABLE vergehen ( id INTEGER, bezeichnung VARCHAR2(60), schweregrad VARCHAR2(6), bußgeld INTEGER, CONSTRAINT pkVergehenID3 PRIMARY KEY (id), CONSTRAINT ckVergehenBezeichnung3 CHECK (bezeichnung LIKE 'Vergehen: %'), CONSTRAINT ckVergehenSchweregradBußgeld3 CHECK ( (schweregrad LIKE 'leicht' AND (bußgeld BETWEEN 20 AND 40)) OR (schweregrad LIKE 'mittel' AND (bußgeld BETWEEN 100 AND 200)) OR (schweregrad LIKE 'schwer' AND (bußgeld BETWEEN 500 AND 1000)) ) ); CREATE SEQUENCE seqVergehen START WITH 10 INCREMENT BY 5 MINVALUE 0; /*SERT INTO strafen VALUES(id_auto, von, id_vergehen, wann_passirt, wo, wann_gezahlt);*/ CREATE TABLE strafen ( id_auto INTEGER, von DATE, id_vergehen INTEGER, wann_passiert DATE, wo VARCHAR2(100), wann_gezahlt DATE, CONSTRAINT pkAutoVonVergehenWann3 PRIMARY KEY (id_auto, id_vergehen, wann_passiert), CONSTRAINT fkStrafenAutoVon3 FOREIGN KEY (id_auto, von) REFERENCES vorbesitzer(id_autos, fromdate), CONSTRAINT fkStrafenVergehen3 FOREIGN KEY (id_vergehen) REFERENCES vergehen(id), CONSTRAINT ckStrafenWannPG3 CHECK (MONTHS_BETWEEN(wann_gezahlt, wann_passiert) BETWEEN 0 AND 2), CONSTRAINT ckStrafenWo3 CHECK ((wo LIKE '%Straße%') OR (wo LIKE '%Ortsgebiet%')) ); /*INSERT INTO strafen VALUES(111, TO_DATE('31.10.2017', 'DD.MM.YYYY'), 15, TO_DATE('14.11.2017', 'DD.MM.YYYY'), 'Ortsgebiet: Radenthein', TO_DATE('14.11.2017', 'DD.MM.YYYY'));*/ /*INSERT INTO strafen VALUES(111, TO_DATE('31.10.2017', 'DD.MM.YYYY'), 15, TO_DATE('14.11.2017', 'DD.MM.YYYY'), 'Ortsgebiet: Radenthein', TO_DATE('14.11.2017', 'DD.MM.YYYY'));*/ /*INSERT INTO strafen VALUES(111, TO_DATE('31.10.2017', 'DD.MM.YYYY'), 20, TO_DATE('14.11.2017', 'DD.MM.YYYY'), 'Ortsgebiet: Radenthein', TO_DATE('14.11.2017', 'DD.MM.YYYY'));*/ INSERT INTO besitzer VALUES(11, 'Einstein', TO_DATE('11.01.1961', 'DD.MM.YYYY'), 'Favoritenstraße 1'); INSERT INTO besitzer VALUES(22, 'Zweistein', TO_DATE('11.01.1972', 'DD.MM.YYYY'), 'Favoritenstraße 2'); /* INSERT INTO besitzer VALUES(NULL, 'Dreistein', TO_DATE('11.01.1969', 'DD.MM.YYYY'), 'Favoritenstraße 3'); INSERT INTO besitzer VALUES(44, NULL, TO_DATE('11.01.1965', 'DD.MM.YYYY'), 'Favoritenstraße 4'); INSERT INTO besitzer VALUES(55, 'Zweistein', TO_DATE('11.01.1972', 'DD.MM.YYYY'), 'Favoritenstraße 2'); INSERT INTO besitzer VALUES(66, 'Zweistein', TO_DATE('11.01.1972', 'DD.MM.YYYY'), 'Favoritenstraße 5'); INSERT INTO besitzer VALUES(22, 'Siebenstein', TO_DATE('11.01.2000', 'DD.MM.YYYY'), 'Favoritenstraße 7'); */ INSERT INTO autos VALUES(111, 'Opel Astra', 200, 11); INSERT INTO autos VALUES(222, 'Opel Corsa', 150, 11); INSERT INTO autos VALUES(333, 'Opel Movano', 300, 22); /* INSERT INTO autos VALUES(333, 'Opel Movano', 250, 22); INSERT INTO autos VALUES(444, NULL, 100, 22); INSERT INTO autos VALUES(555, 'Opel Movano', 300, 22); INSERT INTO autos VALUES(666, 'VW Amarok', 300, 99); INSERT INTO autos VALUES(777, 'Ford Focus', 19, 22); INSERT INTO autos VALUES(888, 'Ford Ranger', 20, 22); INSERT INTO autos VALUES(999, 'VW T3', 21, 22); */ INSERT INTO reparaturen VALUES(1, 111, 'Erste Rep', 10, TO_DATE('24.10.2017', 'DD.MM.YYYY')); INSERT INTO reparaturen VALUES(1, 222, 'Zweite Rep 1', 10, TO_DATE('24.10.2017', 'DD.MM.YYYY')); INSERT INTO reparaturen VALUES(2, 222, 'Zweite Rep 2', 10, TO_DATE('24.10.2017', 'DD.MM.YYYY')); /* INSERT INTO reparaturen VALUES(1, 111, 'dre', 10, TO_DATE('24.10.2017', 'DD.MM.YYYY')); INSERT INTO reparaturen VALUES(1, 111, 'drei', 9, TO_DATE('24.10.2017', 'DD.MM.YYYY')); INSERT INTO reparaturen VALUES(1, 111, 'Erste Rep 2', 10, TO_DATE('24.10.2017', 'DD.MM.YYYY')); */ INSERT INTO vorbesitzer VALUES(11, 111, TO_DATE('31.10.2017', 'DD.MM.YYYY'), TO_DATE('7.11.2017', 'DD.MM.YYYY')); INSERT INTO vorbesitzer VALUES(11, 111, TO_DATE('7.11.2017', 'DD.MM.YYYY'), TO_DATE('14.11.2017', 'DD.MM.YYYY')); /* INSERT INTO vorbesitzer VALUES(11, 111, TO_DATE('31.10.2017', 'DD.MM.YYYY'), TO_DATE('7.11.2017', 'DD.MM.YYYY')); --Zweimal das gleiche INSERT INTO vorbesitzer VALUES(11, 111, TO_DATE('29.10.2017', 'DD.MM.YYYY'), TO_DATE('7.11.2017', 'DD.MM.YYYY')); --Sonntag anmelden INSERT INTO vorbesitzer VALUES(11, 111, TO_DATE('27.10.2017', 'DD.MM.YYYY'), TO_DATE('5.11.2017', 'DD.MM.YYYY')); --Sonntag abmelden INSERT INTO vorbesitzer VALUES(11, 111, TO_DATE('28.10.2017', 'DD.MM.YYYY'), TO_DATE('6.11.2017', 'DD.MM.YYYY')); --Samstag anmelden INSERT INTO vorbesitzer VALUES(11, 111, TO_DATE('26.10.2017', 'DD.MM.YYYY'), TO_DATE('4.11.2017', 'DD.MM.YYYY')); --Samstag abmelden INSERT INTO vorbesitzer VALUES(11, 111, TO_DATE('31.10.2017', 'DD.MM.YYYY'), TO_DATE('6.11.2017', 'DD.MM.YYYY')); --Dauer zu klein INSERT INTO vorbesitzer VALUES(11, 111, TO_DATE('07.11.2017', 'DD.MM.YYYY'), TO_DATE('31.10.2017', 'DD.MM.YYYY')); --Daten vertauscht */ INSERT INTO vorbesitzer VALUES(11, 222, TO_DATE('31.10.2017', 'DD.MM.YYYY'), TO_DATE('7.11.2017', 'DD.MM.YYYY')); /*INSERT INTO vorbesitzer VALUES(22, 111, TO_DATE('31.10.2017', 'DD.MM.YYYY'), TO_DATE('7.11.2017', 'DD.MM.YYYY'));*/ INSERT INTO vergehen VALUES(seqVergehen.NEXTVAL, 'Vergehen: Geschwindigkeitsüberschreitung', 'leicht', 20); INSERT INTO vergehen VALUES(seqVergehen.NEXTVAL, 'Vergehen: Geschwindigkeitsüberschreitung', 'leicht', 40); INSERT INTO vergehen VALUES(seqVergehen.NEXTVAL, 'Vergehen: Geschwindigkeitsüberschreitung', 'mittel', 100); INSERT INTO vergehen VALUES(seqVergehen.NEXTVAL, 'Vergehen: Geschwindigkeitsüberschreitung', 'mittel', 200); INSERT INTO vergehen VALUES(seqVergehen.NEXTVAL, 'Vergehen: Geschwindigkeitsüberschreitung', 'schwer', 500); /*INSERT INTO vergehen VALUES(seqVergehen.NEXTVAL, 'Vergehen: Geschwindigkeitsüberschreitung', 'schwer', 200);*/ /*INSERT INTO vergehen VALUES(seqVergehen.NEXTVAL, 'Vergehen: Geschwindigkeitsüberschreitung', 'schwex', 1000);*/ INSERT INTO strafen VALUES(111, TO_DATE('31.10.2017', 'DD.MM.YYYY'), 25, TO_DATE('1.5.2017', 'DD.MM.YYYY'), 'Finkenstein Ortsgebiet', TO_DATE('2.6.2017', 'DD.MM.YYYY')); INSERT INTO strafen VALUES(111, TO_DATE('7.11.2017', 'DD.MM.YYYY'), 20, TO_DATE('1.5.2017', 'DD.MM.YYYY'), 'Finkenstein Ortsgebiet', TO_DATE('1.7.2017', 'DD.MM.YYYY')); INSERT INTO strafen VALUES(222, TO_DATE('31.10.2017', 'DD.MM.YYYY'), 15, TO_DATE('1.5.2017', 'DD.MM.YYYY'), 'Faakersee Straße', NULL); COMMIT; SELECT * FROM besitzer; SELECT * FROM autos; SELECT * FROM reparaturen; SELECT * FROM vorbesitzer; SELECT * FROM vergehen; SELECT * FROM autos WHERE ps >= 150 AND ps <= 200; SELECT * FROM autos WHERE ps BETWEEN 150 AND 200; SELECT * FROM autos WHERE ps = 150 OR ps = 200; SELECT * FROM autos WHERE ps IN (150, 200); SELECT todate - fromdate FROM vorbesitzer; SELECT (todate - fromdate)/30,MONTHS_BETWEEN(todate, fromdate) FROM vorbesitzer; SELECT name, TO_CHAR(gebdat, 'DD-MM-YYYY'), TO_CHAR(gebdat, 'DD. MONTH, YYYY, DAY'), TO_CHAR(SYSDATE, 'YYYY') - TO_CHAR(gebdat, 'YYYY') AS "alter" FROM besitzer; SELECT name, gebdat, TO_CHAR(gebdat, 'DAY') as Wochentag FROM besitzer WHERE TO_CHAR(gebdat, 'FMDAY') LIKE '%TA_'; /* WHERE zum filtern von Zeilen. */ SELECT TO_CHAR(TO_DATE('24.12.9999', 'DD.MM.YYYY'), 'FMDAY') FROM besitzer; SELECT besitzer.name, autos.bezeichnung FROM autos INNER JOIN besitzer ON autos.id_besitzer = besitzer.id; SELECT b.NAME, v.FROMDATE, ROUND(MONTHS_BETWEEN(v.TODATE, v.FROMDATE)) "Anzahl Monate", a.BEZEICHNUNG FROM besitzer b INNER JOIN vorbesitzer v ON b.id=v.ID_BESITZER INNER JOIN autos a ON a.ID=v.ID_AUTOS; SELECT b.NAME, s.WANN_PASSIERT, ver.BEZEICHNUNG FROM besitzer b INNER JOIN vorbesitzer v ON v.ID_BESITZER=b.ID INNER JOIN strafen s ON s.ID_AUTO=v.ID_AUTOS AND s.WANN_PASSIERT=v.FROMDATE INNER JOIN vergehen ver ON s.ID_VERGEHEN=ver.ID; SELECT a.bezeichnung, r.beschreibung, r.datum FROM AUTOS a INNER JOIN REPARATUREN r ON