PG WORKSHOP

CRUD-operationer

Insert

Indsætter række(r) i én tabel. F.eks.:

INSERT INTO mytbl (col1, col2) VALUES (val1, val2);
INSERT INTO mytbl (col1, col2) SELECT (val1, val2) FROM xxx;

Select

Udtrækker data (på tabelform). F.eks.:

SELECT col1, col2 FROM mytable ORDER BY col1;
SELECT col1, col2 FROM mytable1 JOIN mytable2 ON (mytable1.col1 = mytable2.col2) ORDER BY col1;

Update

Opdaterer eksisterende data. F.eks.:

UPDATE mytable SET col2=val2 WHERE col1=1;
UPDATE mytable SET col2=table2.col2 FROM table2 WHERE mytable.id = table2.id;

Delete

Sletter rækker fra en tabel. F.eks.:

DELETE FROM mytable WHERE col1=1;

Øvelse

  • Fra pgAdmin - træstrukturen (gem jeres kommandoer i et SQL-vindue til senere brug):
    • Opret jeres eget private "legeplads" schema i databasen
    • Opret en simpel tabel til personer i jeres eget schema
  • Fra SQL vinduet
    • Indsæt nogle af os i tabellen
    • Udtræk (udvalgte) data
    • Opdater (udvalgte) data
    • Slet (udvalgte) data

Avancerede selectmuligheder

PostgreSQL funktioner kan angives i SELECT-listen. Eksempler:

SELECT
  ogc_fid,
  leder,
  COALESCE(aabentid, 'Åbningstid ikke registreret') AS aabentid,
  substring (leder, 1, strpos(leder, ' ')) AS fornavn_paa_leder,
  CASE
    WHEN ejerforhold = 'Kommunal' THEN 'Ja'
    ELSE 'Nej'
  END AS kommunal_klub
FROM
  buf.klubber;

Distinct kan bruges til at finde entydige værdier:

SELECT DISTINCT p_ordning FROM  trafik.p_pladser

Man behøver ikke en FROM clause (forskel ift. Oracle)

SELECT 'Handicap parkering'::text AS p_ordning, 'Gratis'::TEXT AS pris UNION
SELECT 'El-Bil plads',                          'Gratis' UNION
SELECT 'Grøn betalingszone',                    'Billig' UNION
SELECT 'Blå betalingszone',                     'Mellempris' UNION
SELECT 'Motorcykel parkering',                  'Ukendt' UNION
SELECT 'Taxiholdeplads',                        'Gratis' UNION
SELECT '2-timers restriktion',                  'Gratis' UNION
SELECT 'Turistbus plads',                       'Gratis' UNION
SELECT 'Rød betalingszone',                     'Dyr' UNION
SELECT 'Ambassade parkering',                   'Gratis' UNION
SELECT 'Besøgsplads',                           'Gratis' UNION
SELECT 'Delebil parkering',                     'Gratis' UNION
SELECT 'Privat ordning',                        'Gratis'

Eksempel på Propercase (initcap funktionen):

SELECT
  test.input, initcap(test.input) AS output
FROM
  (
  SELECT 'eleverne var rigtig dygtige' UNION
  SELECT 'CHRISTIAN FISCHER' UNION
  SELECT 'martin bjærge'
  ) test
input Output
eleverne var rigtig dygtige Eleverne Var Rigtig Dygtige
martin bjerge Martin Bjerge
CHRISTIAN FISCHER Christian Fischer

Eksempel på over() funktionen - viser de 2 bedste tider marathonløbere. NB: bemærk også datatypen interval:

SELECT * FROM
(
  SELECT navn, tid, rank() OVER (PARTITION BY navn ORDER BY tid) AS rank FROM
    (
      SELECT 'Martin Bjærge Jensen'::text AS navn, '4:27:00'::interval AS tid UNION
      SELECT 'Wilson Kipsang', '2:03:23' UNION
      SELECT 'Wilson Kipsang', '2:05:45' UNION
      SELECT 'Wilson Kipsang', '2:15:21' UNION
      SELECT 'Martin Bjærge Jensen', '5:02:00' UNION
      SELECT 'Martin Bjærge Jensen', '5:27:32'UNION
      SELECT 'Dorthe Skovshoved Rasmussen ', '2:29:34'
  ) resultater
) ranking
WHERE rank<=2
navn tid rank
Dorthe Skovshoved Rasmussen 02:29:34 1
Martin Bjærge Jensen 04:27:00 1
Martin Bjærge Jensen 05:02:00 2
Wilson Kipsang 02:03:23 1
Wilson Kipsang 02:05:45 2