From 83391d472f1ad9f11df3047e4f0e3b991b0d99cf Mon Sep 17 00:00:00 2001 From: Tomas Krejci Date: Tue, 2 Jun 2026 16:36:52 +0200 Subject: [PATCH] Add first lecture SQL examples --- .gitignore | 4 +- Lecture_1/01-bankovnictvi-import.sql | 148 +++++++++++++++++++++++++++ Lecture_1/01-select.sql | 33 ++++++ 3 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 Lecture_1/01-bankovnictvi-import.sql create mode 100644 Lecture_1/01-select.sql diff --git a/.gitignore b/.gitignore index ceaea36..ed43c52 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,9 @@ web_modules/ # Optional REPL history .node_repl_history +# Editor swap files +.*.kate-swp + # Output of 'npm pack' *.tgz @@ -129,4 +132,3 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* - diff --git a/Lecture_1/01-bankovnictvi-import.sql b/Lecture_1/01-bankovnictvi-import.sql new file mode 100644 index 0000000..ecd2bec --- /dev/null +++ b/Lecture_1/01-bankovnictvi-import.sql @@ -0,0 +1,148 @@ +-- Demo banking schema used by the first lecture. +-- The accounts_clients table models a many-to-many relationship between clients and accounts. +-- TABLES +CREATE TABLE banks ( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + name VARCHAR(100) NOT NULL, + code VARCHAR(10) NOT NULL UNIQUE +); + +CREATE TABLE clients ( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + name VARCHAR(100) NOT NULL, + email VARCHAR(255) NOT NULL UNIQUE, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE accounts ( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + bank_id BIGINT NOT NULL, + account_number VARCHAR(50) NOT NULL UNIQUE, + balance NUMERIC(12,2) DEFAULT 0, + currency VARCHAR(10) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (bank_id) REFERENCES banks(id) +); + +CREATE TABLE accounts_clients ( + client_id BIGINT NOT NULL, + account_id BIGINT NOT NULL, + PRIMARY KEY (client_id, account_id), + FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE, + FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE +); + +CREATE TABLE cards ( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + account_id BIGINT NOT NULL, + client_id BIGINT NOT NULL, + card_number VARCHAR(30) NOT NULL UNIQUE, + expiration DATE NOT NULL, + cvv VARCHAR(4) NOT NULL, + type VARCHAR(20) NOT NULL, + FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE, + FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE +); + + +-- INSERTS +-- Seed data intentionally mixes banks, currencies, shared accounts, and cards for SELECT exercises. +INSERT INTO banks (name, code) VALUES +('Ceska sporitelna', '0800'), +('CSOB', '0300'), +('Komercni banka', '0100'), +('Moneta', '0600'), +('Fio banka', '2010'); + +INSERT INTO clients (name, email) VALUES +('Jan Novak', 'jan.novak1@mail.cz'), +('Petr Svoboda', 'petr.svoboda@mail.cz'), +('Karel Dvorak', 'karel.dvorak@mail.cz'), +('Martin Vesely', 'martin.vesely@mail.cz'), +('Tomas Prochazka', 'tomas.prochazka@mail.cz'), +('Jakub Horak', 'jakub.horak@mail.cz'), +('Filip Cerny', 'filip.cerny@mail.cz'), +('Adam Kriz', 'adam.kriz@mail.cz'), +('Lukas Malek', 'lukas.malek@mail.cz'), +('Ondrej Novak', 'ondrej.novak@mail.cz'), +('David Ruzicka', 'david.ruzicka@mail.cz'), +('Radek Fiala', 'radek.fiala@mail.cz'); + +INSERT INTO accounts (bank_id, account_number, balance, currency) VALUES +(1, '100001/0800', 15000.00, 'CZK'), +(1, '100002/0800', 250.50, 'CZK'), +(1, '100003/0800', 88.50, 'CZK'), +(1, '100004/0800', 3200.00, 'USD'), +(2, '200001/0300', 99999.99, 'CZK'), +(2, '200002/0300', 1200.00, 'EUR'), +(2, '200003/0300', 15000.00, 'USD'), +(3, '300001/0100', 5400.00, 'CZK'), +(3, '300002/0100', 780.00, 'CZK'), +(3, '300003/0100', 780.00, 'USD'), +(4, '400001/0600', 300.00, 'CZK'), +(4, '400002/0600', 45000.00, 'CZK'), +(4, '400003/0600', 19546.00, 'CZK'), +(4, '400004/0600', 0.00, 'USD'), +(5, '500001/2010', 999.00, 'EUR'), +(5, '500002/2010', 123456.78, 'CZK'), +(5, '500003/2010', 250.00, 'USD'); + + + + + +INSERT INTO accounts_clients (client_id, account_id) VALUES +(1, 1), +(1, 2), +(1, 13), +(2, 1), +(2, 3), +(2, 14), +(3, 3), +(3, 4), +(3, 11), +(3, 15), +(4, 4), +(4, 5), +(4, 16), +(5, 5), +(5, 6), +(5, 17), +(6, 6), +(6, 7), +(7, 7), +(7, 8), +(8, 8), +(8, 9), +(9, 9), +(9, 10), +(10, 10), +(10, 12), +(11, 1), +(12, 2), +(12, 3); + + + +INSERT INTO cards (account_id, client_id, card_number, expiration, cvv, type) VALUES +(1, 1, '1111222233334441', '2028-12-31', '123', 'debit'), +(1, 2, '1111222233334442', '2027-11-30', '234', 'credit'), +(2, 1, '1111222233334451', '2026-10-31', '345', 'debit'), +(3, 2, '1111222233334461', '2029-09-30', '456', 'credit'), +(3, 3, '1111222233334462', '2027-08-31', '567', 'debit'), +(4, 3, '1111222233334471', '2028-07-31', '678', 'debit'), +(5, 4, '1111222233334481', '2026-06-30', '789', 'credit'), +(5, 5, '1111222233334482', '2027-05-31', '890', 'debit'), +(6, 6, '1111222233334491', '2028-04-30', '901', 'debit'), +(7, 7, '1111222233334501', '2029-03-31', '012', 'credit'), +(8, 8, '1111222233334511', '2026-02-28', '111', 'debit'), +(9, 9, '1111222233334521', '2027-01-31', '222', 'credit'), +(9, 12, '1111222233334533', '2027-10-31', '555', 'debit'), +(10, 10, '1111222233334531', '2028-12-31', '333', 'debit'), +(10, 11, '1111222233334532', '2029-11-30', '444', 'credit'), +(13, 1, '1111222233334541', '2028-12-31', '111', 'debit'), +(13, 1, '1111222233334542', '2027-11-30', '112', 'credit'), +(14, 2, '1111222233334551', '2029-10-31', '221', 'debit'), +(14, 2, '1111222233334552', '2028-09-30', '222', 'credit'), +(15, 3, '1111222233334561', '2027-08-31', '331', 'debit'), +(15, 3, '1111222233334562', '2026-07-31', '332', 'credit'); diff --git a/Lecture_1/01-select.sql b/Lecture_1/01-select.sql new file mode 100644 index 0000000..1505411 --- /dev/null +++ b/Lecture_1/01-select.sql @@ -0,0 +1,33 @@ +-- First lecture SELECT examples. +-- Run 01-bankovnictvi-import.sql before executing these queries. + +-- This query returns all columns from the accounts table. +SELECT * FROM accounts; + +-- Select only the account number and bank identifier. +SELECT account_number, bank_id FROM accounts; + +-- Use WHERE to filter specific records. +SELECT * FROM accounts WHERE currency = 'CZK'; + +SELECT * FROM accounts WHERE balance > 1000; + +SELECT * FROM accounts WHERE balance < 1000 AND currency = 'CZK'; + +SELECT * FROM accounts WHERE balance > 1000 AND currency = 'CZK'; + +SELECT * +FROM accounts +WHERE ( + currency = 'USD' + OR currency = 'EUR' + ) + and balance < 1000; + +SELECT * FROM accounts WHERE currency IN ('CZK', 'USD'); + +SELECT * FROM accounts WHERE currency NOT IN ('CZK', 'USD'); + +SELECT * FROM clients WHERE email IS NULL; + +SELECT * FROM clients WHERE name LIKE 'Ja%';