SELECT, FROM, WHERE, INSERT INTOINSERT, UPDATE, DELETE eller SELECT declarationSELECT erklæring)Table Users {
id integer [pk, increment]
name varchar(100)
email varchar(100) [unique]
created_at timestamp
}
INSERT
--
DML (Data Manipulation Language)
INSERTINSERT uden field definition:
INSERT INTO tableName
VALUES (value1, value2, value3, ...);
INSERT INTO Users
VALUES (null, 'John Doe', 'john@doe.com', CURRENT_TIMESTAMP);
INSERTINSERT med field definition:
INSERT INTO tableName (field2, field3, ...)
VALUES (value2, value3, ...);
INSERT INTO Users (name, email, created_at)
VALUES ('Jane Doe', 'john@doe.com', CURRENT_TIMESTAMP);
INSERTSELECT
--
DQL (Data Query Language)
SELECT (required)FROM (required)JOIN (optional, multiple)WHERE (optional)GROUP BY (optional)HAVING (optional)ORDER BY (optional)LIMIT / OFFSET (optional)SELECT querySELECT u.id, u.name, COUNT(o.id) AS order_count
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.active = true
GROUP BY u.id, u.name
HAVING COUNT(o.id) > 5
ORDER BY order_count DESC
LIMIT 10 OFFSET 0;
SELECTSELECT field1, field2, ...
FROM tableName
SELECT id, name, email
FROM Users;
SELECT * i produktionWHERE clause for filtrering
Bruges til at specificere betingelser for hvilke rækker der skal returneres
Bruger comparison operators som i andre sprog=, !=, <, >, <=, >=
Multiple operators:AND, OR, NOT, samt ||, &&
SELECT field1, field2, ...
FROM tableName
WHERE condition;
SELECT id, name, email
FROM Users
WHERE id = 1;
WHERE + AND + ORSELECT id, name, email
FROM Users
WHERE name = 'John' OR 'Jon' AND id > 5;
AND og ORAND har højere præcedens end OR- E.g. hvis du ønsker `OR` til at have højere præcedens end `AND`
<!-- .element class="fragment" -->
|| og && kan også bruges i stedet for OR og AND i mange SQL dialekter- E.g. PostgreSQL, MySQL, MSSQL
<!-- .element class="fragment" -->
WHERE IS NULLSELECT id, name, email
FROM Users
WHERE email IS NULL;
IS NULL bruges til at tjekke for NULL værdierIS NOT NULL bruges til at tjekke for ikke-NULL værdierWHERE LIKESELECT id, name, email
FROM Users
WHERE name LIKE 'J%' AND email IS NOT NULL;
LIKE operatoren bruges til mønstermatchning i strenge% repræsenterer nul eller flere tegn_ repræsenterer et enkelt tegnSELECT id, name, email
FROM Users
WHERE id IN (1, 2, 3, 4, 5);
IN operatoren bruges til at tjekke om en værdi findes i en liste af værdierOR betingelserWHERE BETWEENSELECT id, name, email
FROM Users
WHERE created_at BETWEEN '2024-01-01' AND '2024-06-30'
OR id BETWEEN 10 AND 20;
BETWEEN operatoren bruges til at filtrere værdier inden for et bestemt intervalWHERE NOTSELECT id, name, email
FROM Users
WHERE NOT (email LIKE '%@ucl.dk');
NOT operatoren bruges til at negere en betingelseSELECT, FROM, eller WHERE clausesTable Orders {
id integer [pk, increment]
user_id integer [ref: > Users.id]
total_amount decimal
created_at timestamp
}
SELECT id, name, email
FROM Users
WHERE id IN (
SELECT user_id
FROM Orders
WHERE total_amount > 100
);
user_ids, som den ydre query bruger til at filtrere Users tabellenuser_id (FK) fra Orders tabellen for at matche med id (PK) i Users tabellenWHERE EXISTSSELECT id, name, email
FROM Users u
WHERE EXISTS (
SELECT 1
FROM Orders o
WHERE o.user_id = u.id
);
EXISTS operatoren bruges til at tjekke om en subquery returnerer nogen rækkerEXISTS til sand (true)Orders tabellenuser_id med idWHERE clauses med forskellige comparison operatorsWHERE clauses kan kombineres med subqueriesWHERE clauses kan bruges inde i subqueriesGROUP BY og HAVINGGROUP BYGROUP BY clause bruges til at gruppere rækker, der har samme værdier i specificerede kolonnerCOUNT(), SUM(), AVG(), MAX(), og MIN()GROUP BYSELECT user_id, COUNT(*) AS order_count
FROM Orders
GROUP BY user_id;
Eksempel return:
| user_id | order_count |
|---|---|
| 1 | 5 |
| 2 | 3 |
| 3 | 8 |
HAVINGHAVING clause bruges til at filtrere grupper efter at de er blevet dannet af GROUP BYWHERE clause, men opererer på grupper i stedet for individuelle rækkerHAVINGSELECT user_id, COUNT(*) AS order_count
FROM Orders
GROUP BY user_id
HAVING COUNT(*) > 5;
Eksempel return:
| user_id | order_count |
|---|---|
| 3 | 8 |
Where
WHERE user_id = 1Having
HAVING COUNT(*) > 5WHERE COUNT(*) > 5?SELECT user_id, COUNT(*) AS order_count
FROM Orders
WHERE COUNT(*) > 5
GROUP BY user_id;
WHERE ikke kan bruges med aggregatfunktioner som COUNT()WHERE clause er anvendt, så de er ikke tilgængelige på det tidspunktHAVING bruges til at filtrere baseret på aggregatfunktioner efter grupperingINNER JOIN: Returnerer kun de rækker, hvor der er et match i begge tabeller
LEFT JOIN (eller LEFT OUTER JOIN): Returnerer alle rækker fra venstre tabel og de matchende rækker fra højre tabel; NULL for ikke-matchende rækker
RIGHT JOIN (eller RIGHT OUTER JOIN): Returnerer alle rækker fra højre tabel og de matchende rækker fra venstre tabel; NULL for ikke-matchende rækker
FULL JOIN (eller FULL OUTER JOIN): Returnerer rækker, når der er et match i en af tabellerne; NULL for ikke-matchende rækker i begge tabeller
INNER JOINSELECT u.id, u.name, o.id AS order_id, o.total_amount
FROM Users u
INNER JOIN Orders o ON u.id = o.user_id;
Users og Orders| id | name | order_id | total_amount |
|---|---|---|---|
| 1 | John Doe | 101 | 250.00 |
| 2 | Jane Doe | 102 | 150.00 |
| 1 | John Doe | 103 | 300.00 |
LEFT JOINSELECT u.id, u.name, o.id AS order_id, o.total_amount
FROM Users u
LEFT JOIN Orders o ON u.id = o.user_id;
| id | name | order_id | total_amount |
|---|---|---|---|
| 1 | John Doe | 101 | 250.00 |
| 2 | Jane Doe | 102 | 150.00 |
| 1 | John Doe | 103 | 300.00 |
| 3 | Alice | NULL | NULL |
RIGHT JOINSELECT u.id, u.name, o.id AS order_id, o.total_amount
FROM Users u
RIGHT JOIN Orders o ON u.id = o.user_id;
| id | name | order_id | total_amount |
|---|---|---|---|
| 1 | John Doe | 101 | 250.00 |
| 2 | Jane Doe | 102 | 150.00 |
| 1 | John Doe | 103 | 300.00 |
| NULL | NULL | 104 | 200.00 |
FULL JOINSELECT u.id, u.name, o.id AS order_id, o.total_amount
FROM Users u
FULL JOIN Orders o ON u.id = o.user_id;
| id | name | order_id | total_amount |
|---|---|---|---|
| 1 | John Doe | 101 | 250.00 |
| 2 | Jane Doe | 102 | 150.00 |
| 1 | John Doe | 103 | 300.00 |
| 3 | Alice | NULL | NULL |
| NULL | NULL | 104 | 200.00 |
UPDATE
UPDATEUPDATE tableName
SET field1 = value1, field2 = value2, ...
WHERE condition;
UPDATE Users
SET email = 'real@mail.com'
WHERE id = 1;
WHERE clauses vi har set tidligere kan bruges med UPDATEWHERE clause, der matcher flere rækkerWHERE clause, medmindre du vil opdatere alle rækker i tabellenDELETE
DELETEDELETE FROM tableName
WHERE condition;
DELETE FROM Users
WHERE id = 1;
WHERE clauses vi har set tidligere kan bruges med DELETEWHERE clause, der matcher flere rækkerWHERE clause, medmindre du vil slette alle rækker i tabellenSELECT kan bruges i VIEWS, STORED PROCEDURES, og FUNCTIONS
INSERT, UPDATE, og DELETE kan også bruges i STORED PROCEDURES og FUNCTION
Vær altid forsigtig med UPDATE og DELETE uden WHERE clauses, da de påvirker alle rækker i tabellen
Husk transactions
Tutorials i SQL CRUD