To jest darmowy podgląd

To jest próbka 15 pytań z naszej pełnej kolekcji 105 pytań rekrutacyjnych. Uzyskaj pełny dostęp do wszystkich pytań ze szczegółowymi odpowiedziami i przykładami kodu.

Kup pełny dostęp

Podstawy SQL

Czym jest SQL i co oznacza ten skrót?

SQL to skrót od Structured Query Language (Strukturalny Język Zapytań). Jest to standardowy język programowania przeznaczony do zarządzania danymi przechowywanymi w relacyjnych bazach danych. SQL umożliwia wykonywanie różnych operacji na danych, takich jak:

  • Tworzenie i modyfikowanie struktur bazy danych
  • Wstawianie, aktualizowanie i usuwanie danych
  • Wykonywanie zapytań w celu pobierania informacji
  • Zarządzanie uprawnieniami użytkowników

Źródła:

↑ Powrót na górę

Jakie są główne typy komend SQL (DDL, DML, DCL, TCL)?

DDL (Data Definition Language) - Język Definicji Danych:

  • Służy do tworzenia i modyfikowania struktury bazy danych
  • Komendy: CREATE, ALTER, DROP, TRUNCATE

DML (Data Manipulation Language) - Język Manipulacji Danych:

  • Umożliwia operacje na danych w tabelach
  • Komendy: SELECT, INSERT, UPDATE, DELETE

DCL (Data Control Language) - Język Kontroli Danych:

  • Zarządza uprawnieniami i dostępem do danych
  • Komendy: GRANT, REVOKE

TCL (Transaction Control Language) - Język Kontroli Transakcji:

  • Kontroluje wykonywanie transakcji w bazie danych
  • Komendy: COMMIT, ROLLBACK, SAVEPOINT

Źródła:

↑ Powrót na górę

Czym jest klucz główny i dlaczego jest ważny?

Klucz główny (Primary Key) to kolumna lub kombinacja kolumn, która jednoznacznie identyfikuje każdy rekord w tabeli.

Właściwości klucza głównego:

  • Unikalność - każda wartość musi być unikalna w tabeli
  • Nie może być NULL - musi zawierać wartość
  • Niezmienność - wartość nie powinna się zmieniać po utworzeniu
  • Jeden na tabelę - każda tabela może mieć tylko jeden klucz główny

Znaczenie klucza głównego:

  • Zapewnia integralność danych
  • Umożliwia tworzenie relacji między tabelami (klucze obce)
  • Automatycznie tworzy indeks dla lepszej wydajności
  • Służy do replikacji i synchronizacji danych
  • Niezbędny dla niektórych operacji (np. UPDATE, DELETE w niektórych systemach)

Źródła:

↑ Powrót na górę

Podstawowe zapytania SQL

Napisz zapytanie, które wybierze wszystkie kolumny z tabeli o nazwie "employees".

SELECT * FROM employees;

Znak gwiazdki (*) oznacza wybór wszystkich kolumn z tabeli. Jest to wygodny sposób na pobranie pełnych rekordów, jednak w środowiskach produkcyjnych zaleca się jawne wyspecyfikowanie potrzebnych kolumn dla lepszej wydajności.

Źródła:

↑ Powrót na górę

Jaki jest cel klauzuli WHERE?

Klauzula WHERE służy do filtrowania rekordów w zapytaniach SQL. Pozwala na określenie warunków, które muszą być spełnione, aby rekord został uwzględniony w wynikach zapytania.

SELECT * FROM employees WHERE department = 'IT';
SELECT * FROM employees WHERE salary > 50000;
SELECT * FROM employees WHERE hire_date >= '2020-01-01';

Klauzula WHERE może zawierać operatory porównania (=, >, <, >=, <=, <>), operatory logiczne (AND, OR, NOT) oraz funkcje.

Źródła:

↑ Powrót na górę

Jaka jest różnica między klauzulami WHERE i HAVING?

Aspekt WHERE HAVING
Moment filtrowania Przed grupowaniem Po grupowaniu
Zastosowanie Filtruje pojedyncze wiersze Filtruje grupy
Funkcje agregujące Nie może używać funkcji agregujących Może używać funkcji agregujących
Wydajność Bardziej wydajne Mniej wydajne
-- WHERE - filtruje przed grupowaniem
SELECT department, COUNT(*) 
FROM employees 
WHERE salary > 40000 
GROUP BY department;

-- HAVING - filtruje po grupowaniu
SELECT department, COUNT(*) 
FROM employees 
GROUP BY department 
HAVING COUNT(*) > 5;

-- Kombinacja obu
SELECT department, AVG(salary) 
FROM employees 
WHERE hire_date >= '2020-01-01' 
GROUP BY department 
HAVING AVG(salary) > 60000;

Źródła:

↑ Powrót na górę

Filtrowanie i manipulacja danych w SQL

Jakie są różne operatory porównania dostępne w SQL?

SQL oferuje następujące operatory porównania:

  • = - równość
  • <> lub != - nierówność
  • < - mniejsze niż
  • > - większe niż
  • <= - mniejsze lub równe
  • >= - większe lub równe
  • IS NULL - sprawdza wartości NULL
  • IS NOT NULL - sprawdza wartości różne od NULL
  • BETWEEN - sprawdza zakres wartości
  • IN - sprawdza przynależność do zbioru wartości
  • LIKE - dopasowywanie wzorców tekstowych
  • NOT - negacja (może być używana z innymi operatorami)
-- Przykłady użycia
SELECT * FROM employees WHERE salary > 50000;
SELECT * FROM products WHERE category IN ('Electronics', 'Books');
SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';

Źródła:

↑ Powrót na górę

Jaka jest różnica między operatorami IN i EXISTS?

Operator IN:

  • Sprawdza czy wartość kolumny znajduje się w określonej liście wartości lub wynikach podzapytania
  • Porównuje wartości bezpośrednio
  • Może zwracać NULL jeśli wartość w kolumnie to NULL

Operator EXISTS:

  • Sprawdza czy podzapytanie zwraca co najmniej jeden rekord
  • Nie porównuje wartości, tylko sprawdza istnienie rekordów
  • Zwraca TRUE lub FALSE, nigdy NULL
-- Przykład IN
SELECT * FROM customers 
WHERE country IN ('USA', 'Canada', 'Mexico');

SELECT * FROM customers 
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date > '2024-01-01');

-- Przykład EXISTS
SELECT * FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);

-- NOT EXISTS
SELECT * FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);

Kluczowe różnice:

  • Wydajność: EXISTS często jest szybszy dla dużych zbiorów danych
  • Obsługa NULL: IN może dawać nieoczekiwane rezultaty z NULL, EXISTS nie
  • Korelacja: EXISTS pozwala na korelowane podzapytania

Źródła:

↑ Powrót na górę

Czym są wildcards i jak się ich używa?

Wildcards to znaki specjalne używane w SQL do dopasowywania wzorców tekstowych, głównie z operatorem LIKE.

Podstawowe wildcards:

  1. % (procent) - zastępuje zero lub więcej znaków:
SELECT * FROM customers WHERE customer_name LIKE 'A%';      -- zaczyna się od A
SELECT * FROM customers WHERE customer_name LIKE '%son';    -- kończy się na son
SELECT * FROM customers WHERE customer_name LIKE '%and%';   -- zawiera and
  1. _ (podkreślenie) - zastępuje dokładnie jeden znak:
SELECT * FROM customers WHERE customer_name LIKE 'J_hn';    -- John, Jahn, etc.
SELECT * FROM products WHERE product_code LIKE 'A_C';       -- ABC, AXC, A5C, etc.
  1. [] (nawiasy kwadratowe) - dopasowuje jeden znak z zestawu (SQL Server, Access):
SELECT * FROM customers WHERE customer_name LIKE '[ABC]%';   -- zaczyna się od A, B lub C
SELECT * FROM products WHERE product_code LIKE '[0-9][0-9]'; -- dwie cyfry
  1. [^] lub [!] - dopasowuje znaki NIE z zestawu:
SELECT * FROM customers WHERE customer_name LIKE '[^ABC]%';  -- NIE zaczyna się od A, B lub C

Kombinowanie wildcards:

-- Nazwa z co najmniej 5 znakami, zaczyna się od A
SELECT * FROM customers WHERE customer_name LIKE 'A____%';

-- Email z domeną .com
SELECT * FROM users WHERE email LIKE '%.com';

-- Kod produktu: litera, cyfra, litera
SELECT * FROM products WHERE product_code LIKE '_[0-9]_';

Źródła:

↑ Powrót na górę

Joiny i relacje SQL

Jakie są różne typy JOINów w SQL?

W SQL istnieje kilka typów operatorów JOIN, które pozwalają na łączenie danych z różnych tabel:

  1. INNER JOIN - zwraca tylko te rekordy, które mają dopasowania w obu tabelach
  2. LEFT JOIN (LEFT OUTER JOIN) - zwraca wszystkie rekordy z lewej tabeli oraz dopasowane z prawej
  3. RIGHT JOIN (RIGHT OUTER JOIN) - zwraca wszystkie rekordy z prawej tabeli oraz dopasowane z lewej
  4. FULL OUTER JOIN - zwraca wszystkie rekordy z obu tabel, niezależnie od dopasowań
  5. CROSS JOIN - zwraca iloczyn kartezjański dwóch tabel
  6. SELF JOIN - łączenie tabeli ze sobą samą

Źródła:

↑ Powrót na górę

Kiedy użyłbyś RIGHT JOIN zamiast LEFT JOIN?

RIGHT JOIN używa się rzadko, ponieważ można go zawsze zastąpić LEFT JOIN poprzez zamianę kolejności tabel. Jednak może być przydatny w następujących sytuacjach:

  1. Zachowanie logicznej kolejności tabel - gdy chcemy zachować określoną kolejność tabel w zapytaniu ze względów czytelności
  2. Praca z istniejącym kodem - gdy modyfikujemy istniejące zapytanie i nie chcemy zmieniać kolejności tabel
  3. Specyficzne wymagania biznesowe - gdy logika biznesowa wymaga określonej perspektywy danych
-- Zamiast zmieniać kolejność tabel
SELECT products.name, categories.category_name
FROM products
RIGHT JOIN categories ON products.category_id = categories.id;

-- Można użyć LEFT JOIN z zamienioną kolejnością
SELECT products.name, categories.category_name
FROM categories
LEFT JOIN products ON products.category_id = categories.id;

Źródła:

↑ Powrót na górę

Jak połączyć tabelę ze sobą samą (self-join)?

Self-join to technika łączenia tabeli ze sobą samą przy użyciu aliasów. Jest przydatny przy pracy z hierarchicznymi danymi lub gdy potrzebujemy porównać wiersze w tej samej tabeli.

Przykłady zastosowań:

  1. Struktury hierarchiczne - pracownicy i ich przełożeni
  2. Porównania w obrębie tabeli - znajdowanie duplikatów lub podobnych rekordów
  3. Relacje typu rodzic-dziecko - kategorie i podkategorie
-- Znalezienie pracowników i ich przełożonych
SELECT 
    e1.name AS employee_name,
    e2.name AS manager_name
FROM employees e1
INNER JOIN employees e2 ON e1.manager_id = e2.id;

-- Znajdowanie produktów w tej samej kategorii cenowej
SELECT 
    p1.name AS product1,
    p2.name AS product2,
    p1.price
FROM products p1
INNER JOIN products p2 ON p1.price_range = p2.price_range
WHERE p1.id < p2.id; -- Unikanie duplikatów

Źródła:

↑ Powrót na górę

Funkcje agregujące i grupowanie w SQL

Czym są funkcje agregujące? Wymień najczęściej używane.

Funkcje agregujące to specjalne funkcje SQL, które wykonują obliczenia na zestawie wierszy i zwracają pojedynczą wartość. Służą do podsumowywania i analizowania danych w tabelach.

Najczęściej używane funkcje agregujące:

  • COUNT() - zlicza liczbę wierszy lub wartości nie-NULL w kolumnie
  • SUM() - oblicza sumę wartości numerycznych
  • AVG() - oblicza średnią arytmetyczną wartości numerycznych
  • MAX() - znajduje największą wartość w zbiorze
  • MIN() - znajduje najmniejszą wartość w zbiorze
  • GROUP_CONCAT() / STRING_AGG() - łączy wartości tekstowe z wielu wierszy

Źródła:

↑ Powrót na górę

Jaki jest cel klauzuli HAVING?

Klauzula HAVING służy do filtrowania grup utworzonych przez GROUP BY na podstawie warunków zastosowanych do wyników funkcji agregujących. Jest to odpowiednik WHERE dla zagregowanych danych.

SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;

Różnice między WHERE a HAVING:

  • WHERE filtruje wiersze przed grupowaniem
  • HAVING filtruje grupy po wykonaniu GROUP BY
  • WHERE nie może używać funkcji agregujących
  • HAVING może używać funkcji agregujących

Kolejność wykonywania:

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

Źródła:

↑ Powrót na górę

Jaka jest różnica między COUNT(*) i COUNT(column_name)?

COUNT(*):

  • Zlicza wszystkie wiersze w tabeli lub grupie
  • Uwzględnia wiersze z wartościami NULL
  • Jest zazwyczaj szybsze w wykonaniu

COUNT(column_name):

  • Zlicza tylko wiersze, gdzie określona kolumna ma wartość nie-NULL
  • Ignoruje wartości NULL w danej kolumnie
  • Może być wolniejsze od COUNT(*)
-- Przykład różnic
CREATE TABLE example (
    id INT,
    name VARCHAR(50)
);

INSERT INTO example VALUES 
(1, 'John'), 
(2, NULL), 
(3, 'Jane');

SELECT 
    COUNT(*) as total_rows,           -- Wynik: 3
    COUNT(name) as non_null_names,    -- Wynik: 2
    COUNT(id) as non_null_ids         -- Wynik: 3
FROM example;

Kiedy używać którego:

  • Użyj COUNT(*) gdy chcesz policzyć wszystkie wiersze
  • Użyj COUNT(column_name) gdy chcesz policzyć tylko wiersze z wartościami w konkretnej kolumnie

Źródła:

↑ Powrót na górę

Chcesz więcej pytań?

Uzyskaj dostęp do 800+ pytań z 13 technologii - JavaScript, React, TypeScript, Node.js, SQL i więcej. Natychmiastowy dostęp na 30 dni.

Kup pełny dostęp za 49,99 zł