1) Modyfikatory SELECT (tuż po słowie SELECT)
1.1 DISTINCT
usuwa duplikaty wyników (unikalne wiersze / unikalne kombinacje kolumn).
SELECT DISTINCT email FROM users;
1.2 ALL (domyślne) – nie wpisujemy, ale jest
zwraca wszystkie wiersze (z duplikatami).
SELECT ALL email FROM users;
2) Co może być na liście SELECT (kolumny i wyrażenia)
2.1 Nazwy kolumn
wybór konkretnych kolumn.
SELECT id, name FROM users;
2.2 Gwiazdka *
wybór wszystkich kolumn z tabeli.
SELECT * FROM users;
2.3 Stałe (literały) jako kolumny wyniku
można zwrócić stały tekst/liczbę jako kolumnę – takie dodanie dodatkowej stałej kolumny.
SELECT 'PL' AS kraj, 1 AS wersja FROM users;
2.4 Wyrażenia arytmetyczne + – * / %
obliczenia na liczbach/kolumnach.
SELECT price_net * 1.23 AS price_gross FROM products;
2.5 Nawiasy (kolejność działań)
wymuszenie kolejności działań w obliczeniach.
SELECT (a + b) * c AS wynik FROM t;
2.6 Alias kolumny: AS
nadaje nazwę wynikowej kolumnie.
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
3) Funkcje tekstowe (częste w SELECT)
3.1 CONCAT(a, b, …)
skleja tekst w jedną wartość.
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
3.2 CONCAT_WS(sep, …)
skleja tekst z separatorem (np. “ – ”).
SELECT CONCAT_WS(' - ', id, email) AS opis FROM users;
3.3 LENGTH(str) / CHAR_LENGTH(str)
długość tekstu (LENGTH – w bajtach, CHAR_LENGTH – w znakach).
SELECT CHAR_LENGTH(name) AS ile_znakow FROM users;
3.4 LOWER(str) / UPPER(str)
zmienia litery na małe/duże.
SELECT LOWER(email) AS email_lower FROM users;
3.5 TRIM(str) + LTRIM/RTRIM
usuwa spacje z początku/końca.
SELECT TRIM(name) AS name_clean FROM users;
3.6 SUBSTRING(str, pos, len) (alias: SUBSTR)
wycina fragment tekstu.
SELECT SUBSTRING(email, 1, 5) AS prefix FROM users;
3.7 REPLACE(str, from, to)
zamienia fragment tekstu na inny.
SELECT REPLACE(phone, ' ', '') AS phone_no_spaces FROM users;
4) Funkcje liczbowe (w tym ROUND)
4.1 ROUND(x, d)
zaokrągla liczbę do d miejsc po przecinku (lub do całości, gdy brak d).
SELECT ROUND(price, 2) AS price_2dp FROM products;
4.2 CEIL(x) / CEILING(x)
zaokrągla w górę do najbliższej liczby całkowitej.
SELECT CEIL(price) AS price_up FROM products;
4.3 FLOOR(x)
zaokrągla w dół.
SELECT FLOOR(price) AS price_down FROM products;
4.4 ABS(x)
wartość bezwzględna.
SELECT ABS(balance) AS balance_abs FROM accounts;
4.5 MOD(a, b) (lub operator %)
reszta z dzielenia.
SELECT MOD(id, 2) AS parzystosc FROM users;
5) Daty i czas (mogą występować w SELECT)
5.1 NOW() / CURRENT_TIMESTAMP
aktualna data i czas serwera bazy.
SELECT NOW() AS teraz FROM users;
5.2 CURDATE() / CURRENT_DATE
aktualna data serwera bazy.
SELECT CURDATE() AS dzis FROM users;
5.3 DATE(x) / TIME(x)
wyciąga samą datę lub sam czas z typu datetime/timestamp.
SELECT DATE(created_at) AS data_utworzenia FROM orders;
5.4 DATE_FORMAT(date, format)
formatuje datę do tekstu (np. YYYY-MM-DD).
SELECT DATE_FORMAT(created_at, '%Y-%m-%d') AS data FROM orders;
6) NULL i wartości zastępcze
6.1 COALESCE(a, b, …)
zwraca pierwszą wartość, która nie jest NULL.
SELECT COALESCE(nickname, first_name) AS display_name FROM users;
6.2 IFNULL(a, b)
jeśli a jest NULL, zwróć b.
SELECT IFNULL(phone, 'brak') AS phone FROM users;
6.3 NULLIF(a, b)
jeśli a = b, zwraca NULL, w przeciwnym razie a.
SELECT NULLIF(status, '') AS status_null_if_empty FROM t;
7) Warunkowe (logika w SELECT)
7.1 CASE WHEN … THEN … ELSE … END
warunek wielowariantowy zwracający wartość.
SELECT
CASE
WHEN age >= 18 THEN 'adult'
ELSE 'minor'
END AS typ
FROM users;
7.2 IF(condition, a, b)
prosty warunek (jeżeli warunek prawdziwy → a, inaczej → b).
SELECT IF(active = 1, 'TAK', 'NIE') AS aktywny FROM users;
Mini-przykład łączący kilka elementów (SELECT przed FROM):
SELECT DISTINCT
CONCAT_WS(' ', UPPER(first_name), last_name) AS full_name,
ROUND(salary, 2) AS salary_2dp,
IFNULL(phone, 'brak') AS phone,
DATE_FORMAT(created_at, '%Y-%m-%d') AS created_date
FROM employees;
baza do ćwiczeń – pobierz plik txt
1) Z tabeli users zwróć unikalne e-maile.
SELECT DISTINCT email FROM users;
2) Z users zwróć kolumny id oraz email.
SELECT id, email FROM users;
3) Z users zwróć wszystkie kolumny.
SELECT * FROM users;
4) Z users zwróć pełne imię i nazwisko (CONCAT) jako full_name.
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
5) Z users zwróć „ID – email” używając CONCAT_WS jako opis.
SELECT CONCAT_WS(' - ', id, email) AS opis FROM users;
6) Z users zwróć email zapisany małymi literami jako email_lower.
SELECT LOWER(email) AS email_lower FROM users;
7) Z users zwróć nazwisko wielkimi literami jako last_upper.
SELECT UPPER(last_name) AS last_upper FROM users;
8) Z users zwróć imię po TRIM jako first_clean (usuń spacje z początku/końca).
SELECT TRIM(first_name) AS first_clean FROM users;
9) Z users zwróć nazwisko po TRIM jako last_clean.
SELECT TRIM(last_name) AS last_clean FROM users;
10) Z users zwróć długość imienia w znakach (CHAR_LENGTH) jako len_first.
SELECT CHAR_LENGTH(first_name) AS len_first FROM users;
11) Z users zwróć pierwsze 3 znaki emaila jako email_3 (SUBSTRING).
SELECT SUBSTRING(email, 1, 3) AS email_3 FROM users;
12) Z users zwróć pierwsze 5 znaków nazwiska jako last_5.
SELECT SUBSTRING(last_name, 1, 5) AS last_5 FROM users;
13) Z users zwróć telefon bez spacji (REPLACE) jako phone_no_spaces.
SELECT REPLACE(phone, ' ', '') AS phone_no_spaces FROM users;
14) Z users zwróć display_name: COALESCE(nickname, first_name).
SELECT COALESCE(nickname, first_name) AS display_name FROM users;
15) Z users zwróć phone albo tekst 'brak’ (IFNULL).
SELECT IFNULL(phone, 'brak') AS phone_or_brak FROM users;
16) Z users zwróć typ wieku (CASE): >=18 'adult’, inaczej 'minor’, a jeśli age IS NULL to 'unknown’.
SELECT
CASE
WHEN age IS NULL THEN 'unknown'
WHEN age >= 18 THEN 'adult'
ELSE 'minor'
END AS age_type
FROM users;
17) Z users zwróć aktywny: IF(active=1,’TAK’,’NIE’) jako aktywny.
SELECT IF(active = 1, 'TAK', 'NIE') AS aktywny FROM users;
18) Z users zwróć kolumnę „konto”: CONCAT(first_name,’.’,last_name) (bez spacji) jako login_like.
SELECT CONCAT(TRIM(first_name), '.', TRIM(last_name)) AS login_like FROM users;
19) Z users zwróć stałą kolumnę 'uzytkownik’ jako typ oraz email.
SELECT 'uzytkownik' AS typ, email FROM users;
20) Z users zwróć stałą liczbę 1 jako jeden oraz id.
SELECT 1 AS jeden, id FROM users;
21) Z products policz cenę brutto: price_net*(1+vat_rate) jako price_gross.
SELECT price_net * (1 + vat_rate) AS price_gross FROM products;
22) Z products zwróć cenę brutto zaokrągloną do 2 miejsc (ROUND) jako gross_2dp.
SELECT ROUND(price_net * (1 + vat_rate), 2) AS gross_2dp FROM products;
23) Z products zwróć price_net zaokrąglone do całości (ROUND(price_net)).
SELECT ROUND(price_net) AS net_rounded FROM products;
24) Z products zwróć sufit ceny netto (CEIL) jako net_ceil.
SELECT CEIL(price_net) AS net_ceil FROM products;
25) Z products zwróć podłogę ceny netto (FLOOR) jako net_floor.
SELECT FLOOR(price_net) AS net_floor FROM products;
26) Z products zwróć różnicę: CEIL(price_net) – FLOOR(price_net) jako spread.
SELECT CEIL(price_net) - FLOOR(price_net) AS spread FROM products;
27) Z products zwróć nazwę i cenę netto oraz cenę brutto (2 miejsca).
SELECT name, price_net, ROUND(price_net * (1 + vat_rate), 2) AS price_gross FROM products;
28) Z products zwróć stałą kolumnę 'produkt’ jako typ i name.
SELECT 'produkt' AS typ, name FROM products;
29) Z products zwróć długość nazwy produktu jako name_len.
SELECT CHAR_LENGTH(name) AS name_len FROM products;
30) Z products zwróć pierwsze 4 litery nazwy jako name_4.
SELECT SUBSTRING(name, 1, 4) AS name_4 FROM products;
31) Z accounts zwróć saldo i jego wartość bezwzględną (ABS) jako balance_abs.
SELECT balance, ABS(balance) AS balance_abs FROM accounts;
32) Z accounts zwróć informację tekstową IF: czy saldo jest ujemne (’minus’) czy nie (’ok’).
SELECT IF(balance < 0, 'minus', 'ok') AS saldo_typ FROM accounts;
33) Z accounts zwróć saldo zaokrąglone do 0 miejsc (ROUND).
SELECT ROUND(balance) AS balance_round FROM accounts;
34) Z accounts zwróć stałą 'konto’ jako typ oraz balance.
SELECT 'konto' AS typ, balance FROM accounts;
35) Z accounts zwróć kolumnę „opis”: CONCAT_WS(’ | ’, user_id, balance).
SELECT CONCAT_WS(' | ', user_id, balance) AS opis FROM accounts;
36) Z orders zwróć created_at oraz samą datę DATE(created_at) jako data.
SELECT created_at, DATE(created_at) AS data FROM orders;
37) Z orders zwróć created_at oraz sam czas TIME(created_at) jako czas.
SELECT created_at, TIME(created_at) AS czas FROM orders;
38) Z orders zwróć datę w formacie YYYY-MM-DD (DATE_FORMAT) jako data_fmt.
SELECT DATE_FORMAT(created_at, '%Y-%m-%d') AS data_fmt FROM orders;
39) Z orders zwróć datę i czas jako tekst: DATE_FORMAT(created_at,’%Y-%m-%d %H:%i’) jako dt.
SELECT DATE_FORMAT(created_at, '%Y-%m-%d %H:%i') AS dt FROM orders;
40) Z orders zwróć total zaokrąglony do 2 miejsc (ROUND) jako total_2dp.
SELECT ROUND(total, 2) AS total_2dp FROM orders;
41) Z employees zwróć mini-przykład z notatki (DISTINCT + CONCAT_WS + ROUND + IFNULL + DATE_FORMAT).
SELECT DISTINCT
CONCAT_WS(' ', UPPER(first_name), last_name) AS full_name,
ROUND(salary, 2) AS salary_2dp,
IFNULL(phone, 'brak') AS phone,
DATE_FORMAT(created_at, '%Y-%m-%d') AS created_date
FROM employees;
42) Z employees zwróć salary i salary po CEIL oraz FLOOR.
SELECT salary, CEIL(salary) AS salary_ceil, FLOOR(salary) AS salary_floor FROM employees;
43) Z employees zwróć nazwisko wielkimi literami i imię małymi.
SELECT UPPER(last_name) AS last_upper, LOWER(first_name) AS first_lower FROM employees;
44) Z employees zwróć opis: CONCAT_WS(’ / ’, id, first_name, last_name, ROUND(salary,2)).
SELECT CONCAT_WS(' / ', id, first_name, last_name, ROUND(salary, 2)) AS opis FROM employees;
45) Z employees zwróć: czy telefon jest podany? (IF(phone IS NULL,’NIE’,’TAK’)) jako ma_telefon.
SELECT IF(phone IS NULL, 'NIE', 'TAK') AS ma_telefon FROM employees;
46) Z t zwróć wynik (a+b)*c jako wynik.
SELECT (a + b) * c AS wynik FROM t;
47) Z t zwróć status, ale pusty string zamień na NULL (NULLIF).
SELECT NULLIF(status, '') AS status_null_if_empty FROM t;
48) Z t zwróć informację: IF(status=”, 'pusty’, status) jako status_opis.
SELECT IF(status = '', 'pusty', status) AS status_opis FROM t;
49) Z t zwróć id oraz id modulo 2 jako mod2 (MOD).
SELECT id, MOD(id, 2) AS mod2 FROM t;
50) Z t zwróć tekst „parzysty/nieparzysty” zależnie od MOD(id,2) (CASE).
SELECT
CASE
WHEN MOD(id, 2) = 0 THEN 'parzysty'
ELSE 'nieparzysty'
END AS parzystosc
FROM t;