Przejdź do głównej treści

34 najważniejsze pytania i odpowiedzi na rozmowie o MySQL w 2026 roku

Opanuj MySQL z tym przewodnikiem po pytaniach rekrutacyjnych, z przykładami z praktyki i eksperckimi wskazówkami, które pomogą ci zabłysnąć na kolejnej rozmowie o pracę związanej z bazami danych!
Zaktualizowano 2 cze 2026  · 15 min Czytać

Zauważyłeś, że MySQL pojawia się niemal w każdym ogłoszeniu o pracę związanym z bazami danych? Jest ku temu dobry powód — MySQL napędza praktycznie wszystko: od twoich ulubionych platform społecznościowych po aplikacje, z których korzystasz na co dzień.

Przygotowałem ten przewodnik, aby pomóc ci zmierzyć się z pytaniami na rozmowie o MySQL. Omówię wszystko — od podstaw, które powinien znać junior, po bardziej złożone kwestie wymagane na stanowiskach seniorskich. Podzielę się też wskazówkami, jak pokazać się jako pewny siebie kandydat podczas kolejnych rozmów o pracę związanych z danymi. 

Czym jest MySQL?

MySQL to otwartoźródłowy system RDBMS (relacyjny system zarządzania bazą danych) oparty na SQL, który organizuje dane w uporządkowane tabele. Został opracowany przez Oracle Corporation.

Zajął miejsce najpopularniejszego DBMS w 2024 roku. Jednak ankieta Stack Overflow Developer Survey z 2025 roku pokazała, że PostgreSQL po raz pierwszy wyprzedził MySQL i stał się najczęściej używaną bazą danych wśród profesjonalnych deweloperów.

Żeby było jasne: MySQL nadal jest ogromnie popularny — osiągnął 40,5% użycia wśród deweloperów w 2025 roku — i wciąż zasila niezliczone aplikacje webowe, systemy CMS i narzędzia korporacyjne. A jeśli pracujesz z aplikacjami webowymi lub stosujesz LAMP, MySQL to umiejętność z najwyższej półki.

Wykres przedstawiający najpopularniejsze systemy baz danych w 2024 roku; MySQL jest najpopularniejszy, następnie PostgreSQL.

W 2024 roku MySQL był najpopularniejszym na świecie otwartoźródłowym DBMS z wynikiem 1061. Źródło: Statista.

Podstawowe pytania na rozmowie o MySQL

Na wstępnym etapie rozmowy rekruter może zadać pytania bazowe, aby ocenić twoje rozumienie podstawowych pojęć dotyczących baz danych i MySQL. 

1. Czym jest baza danych i czym różni się od DBMS? 

Baza danych to kontener do przechowywania danych, do których możemy mieć dostęp, modyfikować je i analizować. Na przykład platformy społecznościowe przechowują w bazach dane o tym, kto polubił nasze posty.

DBMS (Database Management System) to oprogramowanie, które pozwala nam wchodzić w interakcję z tymi danymi i nimi zarządzać, np. tworząc użytkowników i kontrolując ich dostęp. MySQL to jedna z najpopularniejszych opcji DBMS. Inne przykłady to PostgreSQL, MongoDB i Microsoft SQL Server.

2. Czym MySQL różni się od innych relacyjnych systemów zarządzania bazami danych?

MySQL to otwartoźródłowy relacyjny system zarządzania bazą danych (RDBMS), który używa SQL do zarządzania danymi. Słynie z łatwości użycia, szybkości i kompatybilności z aplikacjami webowymi. 

Oto jak MySQL różni się od innych RDBMS:

  • Prostota i wydajność: MySQL jest często chwalony za prostotę i zoptymalizowaną wydajność, co czyni go częstym wyborem wśród deweloperów webowych i startupów.
  • Zaawansowane funkcje: Choć MySQL świetnie wypada pod względem łatwości użycia, może brakować mu niektórych zaawansowanych funkcji dostępnych w innych RDBMS, jak PostgreSQL, np. bardziej rozbudowanego wsparcia dla transakcji ACID, zaawansowanego indeksowania czy szerszego zestawu typów danych.
  • Silniki składowania: MySQL pozwala wybierać różne silniki składowania (np. InnoDB, MyISAM) dla tabel, co daje elastyczność w zależności od zastosowania.

MySQL jest idealny w scenariuszach wymagających szybkości i skalowalności, ale w przypadku bardziej złożonych lub korporacyjnych funkcji lepszym wyborem może być PostgreSQL.

3. Jakie są główne typy danych dostępne w MySQL?

MySQL obsługuje różne typy danych, kategoryzowane jako:

  • Numeryczne: INT, DECIMAL, FLOAT, DOUBLE itd.

  • Tekstowe: CHAR, VARCHAR, TEXT, BLOB.

  • Data/czas: DATE, DATETIME, TIMESTAMP, TIME.

  • JSON: Do przechowywania obiektów JSON.

4. Jaka jest różnica między typami danych INT i DECIMAL? 

INT przechowuje liczby całkowite bez części dziesiętnej. Używamy go, gdy nie potrzebujemy ułamków. Z kolei DECIMAL może przechowywać wartości finansowe i nadaje się do precyzyjnych obliczeń z miejscami po przecinku. 

5. Czym różni się DATE od DATETIME w MySQL? 

Funkcja DATE w MySQL przechowuje datę w formacie rok, miesiąc, dzień: 

YYYY-MM-DD

Natomiast DATETIME przechowuje datę wraz z czasem i wygląda tak: 

YYYY-MM-DD HH:MM:SS 

6. Czym jest klucz obcy i jak go używać w bazach danych? 

Klucz obcy to pole w jednej tabeli, które odwołuje się do klucza głównego w innej tabeli. 

Na przykład w tabeli customers, która przechowuje informacje o klientach, każdy klient ma unikalne customer_id — w innej tabeli o nazwie transactions (przechowującej rekordy zakupów) używamy customer_id jako klucza obcego. customer_id w tabeli transactions połączy każdy zakup z konkretnym klientem z tabeli customers .

Tak to wygląda w SQL:

CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);
CREATE TABLE transactions (
    transaction_id INT PRIMARY KEY,
    customer_id INT,
    amount DECIMAL(10,2),
    date DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

7. Jakie są różnice między INNER JOIN, LEFT JOIN, RIGHT JOIN i FULL JOIN?

Złączenia łączą wiersze z dwóch lub więcej tabel na podstawie powiązanych kolumn. Oto różnice:

  • INNER JOIN: Zwraca wiersze, dla których istnieje dopasowanie w obu tabelach.

  • LEFT JOIN: Zwraca wszystkie wiersze z lewej tabeli i pasujące z prawej. Jeśli nie ma dopasowania, dla kolumn prawej tabeli zwraca NULL.

  • RIGHT JOIN: Podobnie jak LEFT JOIN, zwraca wszystkie wiersze z prawej tabeli i pasujące z lewej.

  • FULL JOIN: Łączy wyniki LEFT JOIN i RIGHT JOIN, uwzględniając niepasujące wiersze z obu tabel. Uwaga: MySQL nie wspiera natywnie składni FULL JOIN. Aby uzyskać taki sam efekt, użyj UNION z LEFT JOIN i RIGHT JOIN

8. Jaka jest różnica między DELETE, TRUNCATE i DROP w MySQL?

Polecenia DELETE, TRUNCATE i DROP mogą brzmieć podobnie, ale zachowują się inaczej:

DELETE: Usuwa wiersze z tabeli na podstawie warunku. Może zostać wycofane, jeśli jest wewnątrz transakcji. Przykład:

DELETE FROM employees WHERE department_id = 5;

TRUNCATE: Usuwa wszystkie wiersze z tabeli, ale pozostawia jej strukturę. Jest szybsze niż DELETE i nie można go wycofać. Przykład:

TRUNCATE TABLE employees;

DROP: Całkowicie usuwa strukturę tabeli i dane, wraz z zależnościami, takimi jak indeksy. Przykład:

DROP TABLE employees;

9. Jak tworzysz i modyfikujesz tabelę w MySQL? Podaj przykłady.

Do tworzenia tabel używasz instrukcji CREATE TABLE, a do modyfikacji zwykle ALTER TABLE. Oto przykłady:

Utworzenie tabeli:

CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50));

Modyfikacja — dodanie kolumny:

ALTER TABLE employees ADD COLUMN salary DECIMAL(10, 2);

10. Czym jest tabela tymczasowa w SQL? 

Tabela tymczasowa istnieje tylko w trakcie bieżącej sesji z bazą. Po jej zamknięciu tabela jest usuwana. Ten typ tabeli może tymczasowo przechowywać wyniki pośrednie. Możesz użyć jej do testowania, filtrowania lub przygotowania danych przed wstawieniem ich do tabeli trwałej.

Oto przykład:

CREATE TEMPORARY TABLE temp_employees (
    id INT,
    name VARCHAR(50)
);
INSERT INTO temp_employees VALUES (1, 'John Doe');
SELECT * FROM temp_employees;

11. Czym jest podzapytanie w MySQL? Wyjaśnij na przykładzie. 

Podzapytanie (znane też jako zapytanie zagnieżdżone) jest umieszczone wewnątrz innego zapytania. Rozbija złożone operacje bazodanowe na bardziej przystępne kroki. Na przykład możesz użyć podzapytania, aby znaleźć pracowników zarabiających powyżej średniej: 

SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
);

Rozbijmy to na kroki:

  1. Wewnętrzne zapytanie SELECT AVG(salary) FROM employees najpierw liczy średnią pensję.

  2. Zewnętrzne zapytanie używa tej średniej, aby znaleźć pracowników zarabiających powyżej niej. 

12. Jak użyć instrukcji INSERT w MySQL, aby dodać dane do tabeli? Czy masz dobre praktyki z tym związane? 

Używamy instrukcji INSERT, aby dodać dane do tabeli. Podstawowa składnia to:

INSERT INTO table_name (column1, column2, ...) 
VALUES (value1, value2, ...); 

Oto kilka dobrych praktyk przy korzystaniu z instrukcji INSERT

  1. Jawnie wypisuj kolumny. To zwiększa czytelność kodu i zapobiega błędom przy zmianach struktury tabeli w przyszłości.

  2. Kolumny AUTO_INCREMENT, takie jak ID, pomijaj w INSERT. MySQL obsłuży je automatycznie, zapobiegając duplikatom ID. 

  3. Stosuj spójne cudzysłowy dla łańcuchów. Osobiście wolę pojedyncze, ale oba zadziałają.

  4. Jeśli wstawiasz wiele wierszy, zrób to jedną instrukcją — będzie wydajniej.

13. Jakie znaczenie ma atrybut AUTO_INCREMENT w MySQL?

Atrybut AUTO_INCREMENT w MySQL generuje unikalne, sekwencyjne liczby dla kolumny — zwykle klucza głównego tabeli.

Oto przykład tworzenia tabeli z kolumną AUTO_INCREMENT:

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    department VARCHAR(50)
);

A tak wstawiasz do niej wiersze:

INSERT INTO employees (name, department) VALUES ('John Doe', 'Sales');
INSERT INTO employees (name, department) VALUES ('Jane Smith', 'Marketing');

14. Czym jest widok (view) w MySQL? 

Widok to zapisane zapytanie działające jak wirtualna tabela. Dzięki niemu możemy nadać nazwę złożonemu zapytaniu i używać go jak tabeli w kolejnych zapytaniach. Nie trzeba za każdym razem przepisywać całego zapytania.

Aby uprościć zapytania o szczegóły pracowników wraz z nazwami działów, możesz utworzyć widok:

CREATE VIEW employee_details AS
SELECT 
    e.id,
    e.name,
    d.department_name,
    e.salary
FROM 
    employees e
JOIN 
    departments d ON e.department_id = d.department_id;

Teraz możesz odpytywać widok employee_details tak jak tabelę:

SELECT * FROM employee_details;

Nie możemy jednak używać widoków do wstawiania i aktualizowania danych. Większość z nich obsługuje tryb tylko do odczytu i ogranicza użytkownikom dostęp do bazy, zwiększając bezpieczeństwo danych. Widoki mogą też czasem spowalniać zapytania, ponieważ za każdym razem wykonują bazowe zapytanie.

Średnio zaawansowane pytania na rozmowie o MySQL

W tej sekcji omówimy zagadnienia na poziomie średnio zaawansowanym. Te pytania służą głównie sprawdzeniu twojej wiedzy o typach danych i strukturze MySQL.

15. Czym są tabele wersjonowane przez system i jak działają? 

Tabele wersjonowane przez system przechowują pełną historię zmian dokonanych w tabeli. Ponieważ zachowują poprzednie wersje każdego wiersza, możemy ich używać do audytu i odzyskiwania danych. 

Działają poprzez dodanie dwóch dodatkowych kolumn — StartTime i EndTime — które rejestrują, kiedy dany wiersz jest ważny. Gdy wstawiamy, aktualizujemy lub usuwamy dane, te znaczniki czasu są aktualizowane:

  • Insert: Dodawany jest nowy wiersz z StartTime ustawionym na bieżący czas oraz EndTime równym 9999-12-31 23:59:59 — maksymalnej wartości DATETIME w MySQL, używanej jako znacznik „wiersz jest obecnie aktywny”.

  • Update: W oryginalnym wierszu EndTime jest aktualizowany do bieżącego czasu, aby oznaczyć, że nie jest już ważny. Następnie tworzony jest nowy wiersz z uaktualnionymi danymi, z StartTime ustawionym na bieżący czas i EndTime „na zawsze”.

  • Delete: EndTime istniejącego wiersza jest aktualizowany do bieżącego czasu, co oznacza, że wiersz nie jest już ważny.

Korzystając z klauzuli SQL FOR SYSTEM_TIME, możesz odpytywać tabelę, aby zobaczyć jej stan w konkretnym momencie lub w przedziale czasu. Na przykład:

  • FOR SYSTEM_TIME AS OF '2024-01-01': Pobiera stan tabeli z 1 stycznia 2024 r.

  • FOR SYSTEM_TIME BETWEEN '2024-01-01' AND '2024-12-31': Pokazuje wszystkie wiersze ważne w tym przedziale dat.

16. Czym są transakcje w MySQL i jak ich używać?

Transakcje to zestaw operacji wykonywanych jako jedna całość. Zapewniają integralność danych, umożliwiając powodzenie lub porażkę wszystkich operacji łącznie.

Oto przykład użycia:

START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 2;
COMMIT; -- Zapisuje zmiany na stałe
-- albo
ROLLBACK; -- Cofnięcie zmian

17. Czym jest domyślne ograniczenie (default constraint) w MySQL? Jak ustawić domyślną wartość dla kolumny?

Domyślne ograniczenie w MySQL przypisuje domyślną wartość kolumnie, gdy podczas operacji INSERT nie podano wartości explicite. To gwarantuje poprawność kolumny nawet wtedy, gdy użytkownik ją pominie przy wprowadzaniu danych.

Tak utworzysz tabelę z wartością domyślną:

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    status VARCHAR(10) DEFAULT 'active'
);

Następnie możesz wstawić wiersz bez podawania status:

INSERT INTO employees (name) VALUES ('John Doe');

Takie podejście zmniejsza ryzyko wartości NULL lub niepoprawnych danych w krytycznych kolumnach i upraszcza zapytania, bo nie trzeba jawnie obsługiwać przypadków domyślnych.

Pole

Typ

Null

Klucz

Domyślne

Dodatkowe

id

INT

NO

PRI

NULL

AUTO_INCREMENT

name

VARCHAR(50)

YES

 

NULL

 

status

VARCHAR(10)

YES

 

active

 

To polecenie jest przydatne, ponieważ:

  • Pomaga deweloperom zrozumieć schemat tabeli przed pisaniem zapytań.
  • Może służyć do debugowania, zwłaszcza przy pracy z nieznanymi bazami.
  • Szybko identyfikuje ograniczenia, takie jak klucze główne czy wartości domyślne.

18. Jaka jest różnica między CHAR i VARCHAR w MySQL?

Oba przechowują dane tekstowe, ale inaczej zarządzają miejscem:

  • CHAR(n) zawsze przechowuje dokładnie n znaków, dopełniając spacjami, jeśli wartość jest krótsza. To długość stała, co bywa nieco szybsze dla kolumn, w których wszystkie wartości mają ten sam rozmiar, jak kody krajów czy statusy.

  • VARCHAR(n) przechowuje tylko faktycznie wprowadzone znaki, do maksymalnie n. Zużywa mniej miejsca dla danych o zmiennej długości, ale ma niewielki narzut na śledzenie długości.

CREATE TABLE example (
    country_code CHAR(2),      -- Always 2 chars, e.g. 'US', 'UK'
    email VARCHAR(255)         -- Variable length up to 255 chars
);

Zasada kciuka: używaj CHAR dla wartości o stałej długości, VARCHAR dla pozostałych.

19. Jak używać funkcji tekstowych w SQL do pracy z tekstem? 

Różne funkcje tekstowe w SQL pracują na imionach i innych danych tekstowych. Na przykład:

  • Funkcja LENGTH() pokazuje liczbę znaków w imieniu. 

  • UPPER() i LOWER() zamieniają tekst odpowiednio na wielkie lub małe litery. 

  • CONCAT() łączy imię i nazwisko w jednej kolumnie. 

  • SUBSTRING() wyciąga konkretne fragmenty tekstu. Na przykład możemy go użyć, aby wydzielić miesiąc z daty urodzenia. 

Przykładowe zapytanie:

SELECT 
    UPPER(first_name) AS upper_name,
    CONCAT(first_name, ' ', last_name) AS full_name,
    SUBSTRING(birthdate, 6, 2) AS birth_month,
    TRIM(last_name) AS trimmed_last_name,
    REPLACE(first_name, 'a', '@') AS replaced_name
FROM employees;

To zapytanie:

  • Zamienia imiona na wielkie litery.

  • Łączy imię i nazwisko w pełne imię i nazwisko.

  • Wyciąga miesiąc urodzenia z kolumny birthdate.

  • Przycina spacje w nazwiskach.

  • Zamienia wszystkie wystąpienia „a” na „@” w imionach.

20. Jak zaktualizować konkretny wiersz w bazie danych za pomocą SQL?

Użyj instrukcji UPDATE oraz klauzuli WHERE, aby wskazać rekord do zmiany. 

Na przykład, jeśli chcesz zaktualizować gatunek filmu „Inception” z 2010 roku na „Sci-fi”, możesz użyć następującego zapytania: 

UPDATE movies
SET genre = 'Sci-Fi'
WHERE movie_title = 'Inception' AND year = 2010;

Tutaj UPDATE movies wskazuje tabelę do aktualizacji, a klauzula WHERE celuje w wiersz, w którym tytuł to „Inception”, a rok to „2010”. 

Zaawansowane pytania na rozmowie o MySQL

Zaawansowane pytania sprawdzają twoją umiejętność radzenia sobie ze złożonymi scenariuszami w MySQL i dają rekruterowi pogląd na twoje decyzje techniczne. 

21. Czym jest wyzwalacz (trigger) w MySQL? Jak go zaimplementować? 

W MySQL wyzwalacz to zestaw działań uruchamianych przy zdarzeniu w bazie. Można je skonfigurować do wykonania przed lub po zdarzeniach takich jak INSERT, UPDATE czy DELETE

Załóżmy na przykład, że istnieje tabela orders, do której dodawane są nowe zamówienia. Możemy utworzyć wyzwalacz, który loguje każde nowe zamówienie do tabeli order_history:

CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
    INSERT INTO order_history (order_id, action, timestamp)
    VALUES (NEW.order_id, 'inserted', NOW());
END;

Po uruchomieniu wyzwalacza tabela order_history jest aktualizowana automatycznie:

history_id

order_id

action

timestamp

1

1

inserted

2024-12-24 10:00:00

2

2

inserted

2024-12-24 11:00:00

22. Dlaczego dodanie indeksu przyspiesza zapytania SQL? 

Jeśli nie ma indeksu, baza musi skanować każdy wiersz, aby znaleźć konkretny rekord. Indeks działa jak spis treści, pozwalając bazie szybko dotrzeć do odpowiednich wierszy. Dodanie indeksu skraca zatem czas wyszukiwania i przyspiesza zapytania. 

Indeksy są zwykle implementowane za pomocą struktur danych, takich jak drzewa B-tree lub tablice mieszające (hash), co umożliwia wydajne wyszukiwania, odwołania i skany zakresów.

Oto przykład tworzenia indeksu:

-- Bez indeksu:
SELECT * FROM employees WHERE last_name = 'Smith';
-- Dodanie indeksu na kolumnie last_name:
CREATE INDEX idx_last_name ON employees(last_name);
-- Z indeksem baza może szybko zlokalizować wiersze z 'Smith' w kolumnie last_name.

Indeksy mają też wady, na przykład:

  • Wolniejsze operacje zapisu: INSERT, UPDATE i DELETE działają wolniej, ponieważ indeks musi być aktualizowany przy każdej zmianie danych.

  • Koszt pamięci: Indeksy wymagają dodatkowej przestrzeni dyskowej.

23. Jakiego typu danych użyć dla wagi i ceny produktu w tabeli SQL i dlaczego? 

Dla wagi zazwyczaj bezpieczniejszy jest DECIMAL. Choć FLOAT i REAL też przechowują wartości dziesiętne, używają arytmetyki zmiennoprzecinkowej, co może wprowadzać drobne błędy zaokrągleń.

W przypadku wag produktów, gdzie liczy się dokładność (np. obliczenia wysyłki, stany magazynowe), DECIMAL(8, 3) daje precyzyjną kontrolę z 3 miejscami po przecinku i bez niespodzianek związanych z zaokrągleniami. FLOAT jest akceptowalny tylko wtedy, gdy niewielki margines błędu jest w porządku.

24. Jak znaleźć zduplikowane wiersze w SQL za pomocą funkcji okna? 

Oto jak możesz znaleźć duplikaty z użyciem funkcji okna ROW_NUMBER():

WITH DuplicateCheck AS (
    SELECT product_name, 
           category,
           ROW_NUMBER() OVER(
               PARTITION BY product_name, category 
               ORDER BY id
           ) AS row_num
    FROM sales
)
SELECT *
FROM DuplicateCheck
WHERE row_num > 1;

Jak to działa:

1. ROW_NUMBER() przypisuje numer do każdego wiersza w wyniku. 

2. PARTITION BY grupuje wiersze po product_name i category

3. W obrębie każdej grupy wiersze są numerowane od 1. 

4. Każde row_num większe niż 1 oznacza duplikat. 

Na przykład, jeśli mamy takie rekordy:

  • Product A, Category X, row_num = 1
  • Product A, Category X, row_num = 2 (duplikat)
  • Product B, Category Y, row_num = 1

Zapytanie pokaże drugi wiersz, ponieważ jego row_num jest większe niż 1.

25. Jak utworzyć i używać procedury składowanej z parametrami w MySQL? Wyjaśnij na przykładzie. 

Możemy zapisywać i ponownie wykorzystywać złożone zapytania za pomocą procedur składowanych, aby operacje na bazie były bardziej wydajne i łatwiejsze w utrzymaniu. Zobaczmy, jak tworzyć i używać ich z parametrami na praktycznym przykładzie.

Załóżmy, że mamy bazę studentów i chcemy utworzyć procedurę do filtrowania studentów po wieku. Oto jak to zrobić:

Najpierw utwórzmy prostą procedurę składowaną, która przyjmuje parametr wieku:

CREATE PROCEDURE get_student_info(IN age INT)
BEGIN
    SELECT * FROM student WHERE student.age = age;
END;

Aby użyć tej procedury, po prostu ją CALL z wybranym wiekiem:

CALL get_student_info(21);

Możemy uczynić procedury bardziej rozbudowanymi, używając parametrów wyjściowych. Na przykład stwórzmy procedurę zliczającą studentów w określonym wieku:

CREATE PROCEDURE count_students_by_age(IN age INT, OUT student_count INT)
BEGIN
    SELECT COUNT(*) INTO student_count FROM students WHERE students.age = age;
END;

Aby pobrać wynik z tej procedury:

SET @count = 0;
CALL count_students_by_age(21, @count);
SELECT @count AS total_students;

26. Dlaczego integralność referencyjna jest ważna w bazie danych? 

Integralność referencyjna utrzymuje poprawne relacje między tabelami. Gdy tworzymy klucz obcy, zapewnia on, że wartości w jednej tabeli odpowiadają unikalnym wartościom w tabeli referencyjnej.

Praktyczny przykład: zarządzasz bazą e-commerce. Masz tabelę Customers i tabelę Orders. Każde zamówienie musi należeć do rzeczywistego klienta. Integralność referencyjna, zaimplementowana przez klucze obce, wymusza tę relację, zapewniając, że:

  • Nie możesz utworzyć zamówienia dla nieistniejącego klienta.
  • Nie możesz usunąć klienta z istniejącymi zamówieniami (chyba że jawnie zdefiniujesz, co ma się stać z tymi zamówieniami).
  • Nie możesz zaktualizować ID klienta, jeśli ma on istniejące zamówienia.

Gdy tworzysz ograniczenie klucza obcego w ten sposób:

ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);

Baza automatycznie egzekwuje te reguły:

  • Każdy CustomerID w tabeli Orders musi istnieć w tabeli Customers.

  • Próby naruszenia tych zasad (np. wstawienie nieprawidłowego CustomerID) zostaną odrzucone.

To zapobiega niespójnościom danych, które mogłyby powodować poważne problemy, takie jak zamówienia niepowiązane z rzeczywistymi klientami lub raporty z brakującymi informacjami o klientach. 

Pytania o MySQL dla administratorów baz danych

Jeśli aplikujesz konkretnie na stanowisko administratora bazy danych, oto pytania, które rekruterzy mogą zadać.

27. Dlaczego duża aplikacja używa shardingu bazy danych? Wymień też wyzwania. 

Duża aplikacja używa shardingu, aby podzielić ogromne zbiory danych na wiele serwerów. Każdy shard zawiera mniejszą część danych. Ponieważ rozkłada obciążenie, nie ma potrzeby używania bardzo wydajnego sprzętu. Wzrost szybkości i skalowalności to plusy, ale są też wyzwania: 

  • Niektóre zapytania, jak złączenia, mogą nie działać, co komplikuje zarządzanie danymi. 
  • Gdy dane rosną, shardy mogą się przeciążać, tworząc hotspoty spowalniające wydajność. 

28. Wyjaśnij rolę redo logów w odzyskiwaniu MySQL po awarii. 

Za każdym razem, gdy dane w MySQL są modyfikowane, muszą trafić na dysk. Bezpośredni zapis do plików danych jest jednak wolny i ryzykowny. Dlatego zanim MySQL zmodyfikuje jakiekolwiek pliki danych, najpierw zapisuje, co zrobi, w redo logu. To bezpieczniejsze niż losowe aktualizowanie plików danych.

Załóżmy więc, że aktualizujesz adres klienta:

  1. MySQL najpierw zapisuje tę zmianę w redo logu.
  2. Następnie potwierdza twoją transakcję jako zatwierdzoną (committed).
  3. Z czasem stosuje zmianę do właściwych plików danych.

Odzyskiwanie po awarii jest kluczowe, jeśli MySQL zawiesi się po kroku 1 lub 2, ale przed krokiem 3. Po restarcie MySQL zagląda do redo logów i kończy niedokończoną pracę, odtwarzając zmiany zapisane w redo logach. To gwarantuje, że zatwierdzone transakcje nie zostaną utracone, nawet jeśli awaria nastąpi w nieodpowiednim momencie.

29. Jakie są różne silniki składowania dostępne w MySQL i czym się różnią?

MySQL obsługuje wiele silników składowania — każdy zoptymalizowany pod inne zastosowania. Oto porównanie najczęstszych:

Silnik składowania Kluczowe cechy Najlepszy do
InnoDB Domyślny silnik. Zgodność z ACID, blokady na poziomie wiersza, transakcje i klucze obce. E-commerce, systemy finansowe, wszystko, co wymaga integralności danych.
MyISAM Szybki odczyt, blokady na poziomie tabeli. Brak transakcji i kluczy obcych. Aplikacje z przewagą odczytów, gdzie szybkość ważniejsza niż integralność.
Memory Dane w RAM. Bardzo szybkie, ale tracone przy restarcie. Cache, sesje, dane tymczasowe.
CSV Przechowuje dane jako zwykłe pliki CSV. Bez indeksowania. Wymiana danych między aplikacjami lub proste przechowywanie płaskich plików.
Archive Wysoka kompresja. Tylko INSERT i SELECT. Brak indeksów. Dane logów lub historyczne rzadko odpytywane.
NDB (Clustered) Składowanie rozproszone, wysoka dostępność, odporność na awarie, wsparcie transakcji. Aplikacje rozproszone na dużą skalę, wymagające pracy w czasie rzeczywistym.

30. Jak ustawić domyślny silnik składowania w MySQL? 

Najpierw sprawdź bieżący domyślny silnik składowania:

SHOW ENGINES;

Jako domyślny polecany jest InnoDB, ponieważ wspiera takie kluczowe funkcje jak:

  • Transakcje zgodne z ACID
  • Ograniczenia kluczy obcych
  • Odzyskiwanie po awarii
  • Blokady na poziomie wiersza

Aby tymczasowo zmienić domyślny silnik w bieżącej sesji, możesz użyć:

SET default_storage_engine = 'InnoDB';

Aby zmienić go na stałe, zmodyfikuj plik konfiguracyjny MySQL, dodając tę linię w sekcji [mysqld]:

default-storage-engine = InnoDB

31. Jak naprawić uszkodzone tabele w MySQL? 

Najpierw możesz sprawdzić wszystkie bazy poleceniem: 

mysqlcheck --check --all-databases -u root -p

Przeskanuje ono wszystkie tabele i zgłosi ewentualne uszkodzenia. Następnie możesz uruchomić poniższe polecenie, aby naprawić tabelę: 

mysqlcheck --repair database_name table_name -u root -p

Naprawy mogą prowadzić do utraty danych w przypadku poważnych uszkodzeń, dlatego pamiętaj o kopii zapasowej.

Pytania scenariuszowe i problemowe na rozmowie o MySQL

Te pytania oceniają twoje doświadczenie ze złożonymi, rzeczywistymi scenariuszami i umiejętność rozwiązywania problemów.

32. Opisz scenariusz, w którym użyłeś podzapytań w MySQL.

Oto, jak możesz odpowiedzieć na takie pytanie:

Zarządzałem bazą sklepu e-commerce w mojej ostatniej pracy, gdzie musiałem przygotować raport o produktach. Celem było znalezienie produktów generujących ponadprzeciętną sprzedaż, co wymagało użycia podzapytań do przeprowadzenia wieloetapowej analizy.

Oto zapytanie SQL, które opracowałem, aby to osiągnąć:

SELECT 
    p.product_id,
    p.product_name,
    s.sales_amount
FROM products p
JOIN sales s ON p.product_id = s.product_id
WHERE s.sales_amount > (
    SELECT AVG(sales_amount)
    FROM sales
)
ORDER BY s.sales_amount DESC;

Najpierw ustaliłem punkt odniesienia, licząc średnią kwotę sprzedaży dla wszystkich produktów. Wykorzystałem do tego podzapytanie w klauzuli WHERE, które wyliczało AVG(sales_amount) z tabeli sales. To podzapytanie działało jako dynamiczny próg, względem którego można było mierzyć wyniki każdego produktu.

Główne zapytanie złączało tabele products i sales, aby pobrać odpowiednie szczegóły produktów, a klauzula WHERE odfiltrowywała produkty o sprzedaży poniżej wyliczonej średniej. 

Dzięki takiej strukturze mogłem zidentyfikować najlepiej sprzedające się produkty w jednym zapytaniu zamiast uruchamiać wiele osobnych kwerend.

33. Czy możesz wyjaśnić sytuację, w której użyłeś złączeń SQL do połączenia danych z wielu tabel? 

Przykładowa odpowiedź na powyższe pytanie:

Ostatnio pracowałem nad projektem, w którym mieliśmy dwie główne tabele — jedną z danymi sprzedaży produktów i drugą ze szczegółami produktów. Moim zadaniem było stworzenie raportu pokazującego sprzedaż, nazwę produktu, kategorię i cenę.

Aby połączyć odpowiednie dane, użyłem INNER JOIN na wspólnej kolumnie product_id, łącząc transakcje sprzedaży ze szczegółami produktów:

SELECT 
    s.sales_date,
    p.product_name,
    p.category,
    s.quantity_sold,
    p.price
FROM 
    sales s
INNER JOIN 
    products p
ON 
    s.product_id = p.product_id;

Raport dał jasny obraz trendów sprzedaży, pomagając interesariuszom określić, które kategorie produktów radzą sobie dobrze, a które wymagają uwagi.

34. Czy masz doświadczenie z wyzwalaczami? Opisz, jak ich używałeś.

Oto przykładowa odpowiedź na to pytanie:

Tak, mam duże doświadczenie z wyzwalaczami. W ostatniej roli zaimplementowałem wyzwalacz AFTER UPDATE do audytu zmian cen. 

Przejdę przez konkretną implementację: utworzyłem wyzwalacz, który automatycznie zapisuje historię cen, gdy zmienia się cena produktu. Oto skrypt SQL, który przygotowałem:

CREATE TRIGGER tr_AuditPriceChanges
AFTER UPDATE ON Products
FOR EACH ROW
BEGIN
    -- Only log if the price actually changed
    IF OLD.UnitPrice <> NEW.UnitPrice THEN
        INSERT INTO PriceAudit (
            ProductID,
            OldPrice,
            NewPrice,
            ChangedBy,
            ChangeDate,
            PercentageChange
        )
        VALUES (
            NEW.ProductID,
            OLD.UnitPrice,
            NEW.UnitPrice,
            CURRENT_USER(),
            NOW(),
            ROUND(((NEW.UnitPrice - OLD.UnitPrice) / OLD.UnitPrice * 100), 2)
        );
    END IF;
END;

Co sprawiło, że to rozwiązanie było szczególnie skuteczne:

  1. Uruchamia się tylko, gdy cena faktycznie się zmieni.
  2. Rejestruje użytkownika dokonującego zmiany za pomocą SYSTEM_USER.
  3. Oblicza procentową zmianę na potrzeby raportowania.
  4. Uwzględnia klauzulę WHERE filtrującą brak zmian wynikających z aktualizacji innych kolumn.

Dodałem też obsługę błędów i logowanie, gdy zauważyliśmy przypadki brzegowe z cenami NULL.

Wskazówki przed rozmową o MySQL

Jeśli dopiero zaczynasz karierę, oto kilka wskazówek, które pomogą ci świetnie wypaść na rozmowie:

Opanuj podstawy MySQL: Poznaj fundamenty baz danych, takie jak indeksowanie, transakcje i optymalizator zapytań. Zrozum, jak MySQL przetwarza zapytania i zarządza składowaniem danych. Dzięki temu napiszesz wydajne zapytania i lepiej wyjaśnisz swoje rozwiązania podczas rozmowy.

Zdobywaj praktykę: Zainstaluj MySQL na swoim komputerze i ćwicz regularnie. Twórz testowe bazy, pisz różne typy zapytań i próbuj je optymalizować. Prawdziwa praktyka to najlepszy sposób, aby zrozumieć, jak wszystko działa, i nabrać pewności przed rozmową.

Aby odświeżyć wiedzę, sprawdź zasoby DataCamp: 

Poznaj narzędzia i integracje MySQL: Zapoznaj się z MySQL Workbench lub innymi narzędziami do zarządzania bazami i podstawowego monitoringu. Możesz też sprawdzić, jak MySQL współpracuje z Pythonem i odpowiednimi frameworkami, aby pokazać, że potrafisz pracować w realnym środowisku developerskim.

Podsumowanie

I gotowe! Omówiłem 34 najważniejsze pytania na rozmowie o MySQL, które pomogą ci zdobyć kolejną pracę. Niezależnie od tego, czy aplikujesz na stanowisko juniorskie, czy zaawansowanego administratora danych, musisz solidnie znać podstawy MySQL, optymalizację zapytań i zarządzanie bazą, aby się wyróżnić. 

Aby poszerzyć wiedzę o innych systemach zarządzania bazami danych, sprawdź kursy SQL DataCamp.

Tematy

Poznaj SQL na tych kursach!

course

Data Manipulation in SQL

4 godz.
324.1K
Opanuj złożone zapytania SQL potrzebne do odpowiadania na różne pytania data science i przygotuj solidne zbiory danych do analizy w PostgreSQL.
Zobacz szczegółyRight Arrow
Rozpocznij kurs
Zobacz więcejRight Arrow