SQL-Beispiele aus dem Miro-Board (04 SQL-Vertiefung)
Dreiwertige Logik: Beispiele
DROP TABLE IF EXISTS t;
CREATE TABLE t
(a INTEGER,
b INTEGER,
c INTEGER
);
INSERT INTO t
VALUES (3, 4, null)
;
SELECT a, b, c,
(a > b AND b > c) AS ergebnis1,
(a > b OR b > c) AS ergebnis2,
(a < b OR b < c) AS ergebnis3,
(c = c) AS ergebnis4,
NOT(c = c) AS ergebnis5,
NOT(c = NULL) AS ergebnis6,
NOT(c IS NULL) AS ergebnis7,
(c IS NOT NULL) AS ergebnis8,
(NOT c IS NULL) AS ergebnis9
FROM t
;
Beispiel aus der Olympia-Aufgabe
/*
** Welche Sportler ('w' und 'm') sind disqualifiziert,
** aber nicht gedopt worden?
name vorname geburtstag land
-------------------------------------
Maier Josef 1982-01-01 GER
*/
SELECT DISTINCT s.name, s.vorname, s.geburtstag, s.land
FROM sportler s JOIN teilnahme t ON s.id = t.s_id
WHERE t.doping IS NOT TRUE AND t.disqualifiziert IS TRUE
-- t.doping IS FALSE reicht nicht!!!
;
Boolesche Operatoren
SELECT (DATE '2001-02-16', DATE '2001-12-21')
OVERLAPS
(DATE '2001-10-30', DATE '2002-10-30');
Outer Join
DROP TABLE IF EXISTS r;
DROP TABLE IF EXISTS s;
CREATE TABLE r
(h_name VARCHAR,
ware VARCHAR
);
CREATE TABLE s
(h_name VARCHAR,
tel INTEGER
);
INSERT INTO r(h_name, ware)
VALUES ('Maier', 'Lampen'),
('Müller', 'Rechner');
INSERT INTO s(h_name, tel)
VALUES ('Maier', 123),
('Huber', 234);
SELECT * FROM r JOIN s ON r.h_name = s.h_name;
SELECT * FROM r LEFT JOIN s ON r.h_name = s.h_name;
SELECT * FROM r RIGHT JOIN s ON r.h_name = s.h_name;
SELECT * FROM r FULL JOIN s ON r.h_name = s.h_name;
SELECT * FROM r JOIN s USING (h_name);
SELECT * FROM r LEFT JOIN s USING (h_name);
SELECT * FROM r RIGHT JOIN s USING (h_name);
SELECT * FROM r FULL JOIN s USING (h_name);
-- sollte vermieden werden
SELECT * FROM r NATURAL JOIN s;
SELECT * FROM r NATURAL LEFT JOIN s;
SELECT * FROM r NATURAL RIGHT JOIN s;
SELECT * FROM r NATURAL FULL JOIN s;
Joinoperationen: Union Join
SELECT r.h_name AS h_name_ware, r.ware, s.h_name AS h_name_tel
FROM r FULL JOIN s ON FALSE -- entspricht r UNION JOIN s
Mengenoperationen
Beispiel
SELECT h_id AS id, h_name AS name, h_ortschaft -- Ma./K., Ma./A., Mü/.K
FROM haendler
WHERE h_name LIKE 'M%'
UNION ALL -- UNION/INTERSECT/EXCEPT ALL/DISTINCT
SELECT h_id, h_name, h_ortschaft -- Ma./A., S./H.
FROM haendler
WHERE h_ortschaft <> 'Königsbrunn'