Skip to content

Odpowiedzi egzamin - SQL

1. Iloczyn kartezjański: tab1=15, tab2=25, tab3=16. SELECT * FROM tab1, tab2, tab3;

Section titled “1. Iloczyn kartezjański: tab1=15, tab2=25, tab3=16. SELECT * FROM tab1, tab2, tab3;”

Poprawna odpowiedź: 6000 rekordów.

Wyjaśnienie: Przecinek między tabelami bez warunku łączenia daje iloczyn kartezjański, czyli mnożymy liczby rekordów: 15 * 25 * 16 = 6000.

  • a) musi być typem numerycznym
  • b) musi być typem znakowym
  • c) może być typem numerycznym lub znakowym

Wyjaśnienie: Klucz główny może być dowolnego typu zapewniającego unikalność (liczbowy, znakowy, data itp.), nie jest ograniczony do liczb.

3. Czy polecenie (…) stworzy poprawnie (…)

Section titled “3. Czy polecenie (…) stworzy poprawnie (…)”

(treść niepełna)

Wyjaśnienie: W źródle brak konkretnego polecenia, więc nie da się wskazać odpowiedzi. Przy ocenie poprawności CREATE TABLE sprawdza się m.in.: czy typy mają wymagane długości (np. VARCHAR(n)), czy nie ma duplikatów nazw kolumn, czy klucz główny jest zdefiniowany poprawnie.

4. Czy SELECT 123+456 FROM tab; wykona się poprawnie?

Section titled “4. Czy SELECT 123+456 FROM tab; wykona się poprawnie?”

Poprawna odpowiedź: tak, wykona się.

Wyjaśnienie: To poprawne zapytanie ze stałym wyrażeniem. Dla każdego wiersza tabeli tab zwróci wartość 579. Liczba wierszy w wyniku równa się liczbie wierszy w tabeli.

5. Które jest niepoprawne w CREATE TABLE?

Section titled “5. Które jest niepoprawne w CREATE TABLE?”
  • a) imie varchar not null
  • b) imie varchar(5) not null
  • c) imie varchar(50) not null

Wyjaśnienie: W MySQL VARCHAR wymaga podania długości. varchar bez (n) jest błędem składni, dlatego niepoprawna jest opcja a.

  • a) nie powinien być w cudzysłowie
  • b) powinien być w cudzysłowie
  • c) czasami musi być w cudzysłowie

Wyjaśnienie: Alias tabeli to identyfikator i nie ujmuje się go w cudzysłów (cudzysłów oznaczałby napis). Ewentualne znaki specjalne otacza się odwrotnym apostrofem (backtick), a nie cudzysłowem.

7. Które polecenie można wykorzystać do kopiowania tabeli?

Section titled “7. Które polecenie można wykorzystać do kopiowania tabeli?”
  • a) CREATE TABLE
  • b) CREATE VIEW
  • c) DUPLICATE TABLE

Wyjaśnienie: Tabelę kopiuje się przez CREATE TABLE nowa AS SELECT * FROM stara lub CREATE TABLE nowa LIKE stara. DUPLICATE TABLE nie istnieje, a CREATE VIEW tworzy widok, nie kopię.

  • a) musi być tego samego typu co w tabeli nadrzędnej
  • b) nie musi być tego samego typu
  • c) (treść niepełna)

Wyjaśnienie: Kolumna klucza obcego musi być zgodna typem (i rozmiarem) z kolumną, do której się odwołuje, inaczej baza nie pozwoli utworzyć ograniczenia.

9. Kolejność tworzenia tabel przy definiowaniu kluczy obcych

Section titled “9. Kolejność tworzenia tabel przy definiowaniu kluczy obcych”
  • a) uwarunkowana sposobem tworzenia klucza
  • b) najpierw nadrzędna, potem podrzędna
  • c) najpierw podrzędna, potem nadrzędna

Wyjaśnienie: Definiując klucz obcy w CREATE TABLE, tabela nadrzędna (do której się odwołujemy) musi istnieć wcześniej. Uwaga: opcja a też jest broniona, bo jeśli klucz obcy dodaje się później przez ALTER TABLE, kolejność tworzenia tabel nie ma znaczenia.

  • a) może być unique
  • b) nie może być unique
  • c) (treść niepełna)

Wyjaśnienie: Na kolumnie klucza obcego można nałożyć ograniczenie UNIQUE (daje to relację 1:1), a sama kolumna może przyjmować wartość NULL.

(treść niepełna, brak wariantów)

Wyjaśnienie: Poprawne formy to SELECT cena AS c, SELECT cena c (bez słowa AS) oraz SELECT cena AS "moja cena" (cudzysłów dopuszczalny dla aliasu kolumny ze spacją). Niepoprawne byłoby np. SELECT cena AS moja cena (spacja bez cudzysłowu).

12. Co wstawi AUTO_INCREMENT, gdy w tabeli są ręcznie wstawione id 101, 102, 103?

Section titled “12. Co wstawi AUTO_INCREMENT, gdy w tabeli są ręcznie wstawione id 101, 102, 103?”

Poprawna odpowiedź: 104.

Wyjaśnienie: AUTO_INCREMENT wstawia wartość maksymalnego dotychczasowego id powiększoną o 1. Skoro największe id to 103, kolejny rekord dostanie 104 (liczba wierszy nie ma znaczenia, liczy się maksimum).

13. W jakiej kolejności kasować tabele połączone kluczem obcym?

Section titled “13. W jakiej kolejności kasować tabele połączone kluczem obcym?”

Poprawna odpowiedź: najpierw podrzędną (dziecko), potem nadrzędną (rodzic).

Wyjaśnienie: Odwrotnie niż przy tworzeniu. Nie można usunąć tabeli nadrzędnej, dopóki istnieje tabela podrzędna odwołująca się do niej kluczem obcym.

14. Prawda o UNIQUE, NULL, kluczu głównym

Section titled “14. Prawda o UNIQUE, NULL, kluczu głównym”

(treść niepełna, brak wariantów)

Wyjaśnienie kluczowych faktów: UNIQUE dopuszcza wartości NULL (w MySQL nawet wiele NULL-i). Klucz główny nie dopuszcza NULL i tabela ma tylko jeden klucz główny. Ograniczeń UNIQUE może być w tabeli wiele.

(treść niepełna, brak wariantów)

Wyjaśnienie: Typowe błędy w SELECT to: kolumna spoza GROUP BY zmieszana z funkcją agregującą, brak przecinka między kolumnami, użycie aliasu z WHERE (alias działa dopiero w SELECT, HAVING, ORDER BY), zła kolejność klauzul.

(treść niepełna, brak konkretnego zapytania)

Wyjaśnienie: Bez podanego zapytania nie da się wskazać równoważnika. Typowe równoważności: WHERE x IN (1,2) odpowiada WHERE x=1 OR x=2; WHERE x BETWEEN a AND b odpowiada WHERE x>=a AND x<=b.

(treść niepełna)

Wyjaśnienie: Bez treści zapytania nie da się ocenić. Sprawdza się składnię, istnienie kolumn i tabel oraz zgodność typów.

18. Które polecenie poprawnie utworzy klucz obcy

Section titled “18. Które polecenie poprawnie utworzy klucz obcy”

(treść niepełna, brak wariantów)

Wyjaśnienie: Poprawna składnia to FOREIGN KEY (kolumna) REFERENCES tabela_nadrzedna(kolumna), opcjonalnie z CONSTRAINT nazwa na początku oraz ON DELETE lub ON UPDATE.

19. Który fragment jest opcjonalny przy tworzeniu ograniczeń?

Section titled “19. Który fragment jest opcjonalny przy tworzeniu ograniczeń?”

Poprawna odpowiedź: nazwa ograniczenia (słowo CONSTRAINT nazwa).

Wyjaśnienie: Ograniczenie można zdefiniować z nazwą (CONSTRAINT fk_klient FOREIGN KEY ...) lub bez niej (FOREIGN KEY ...). Bez podanej nazwy baza nada ją automatycznie, więc to fragment opcjonalny.

  • a) kolumna musi mieć typ znakowy
  • b) kolumna musi mieć typ numeryczny
  • c) kolumna może być numeryczna (indeks można założyć na różnych typach)

Wyjaśnienie: Indeks można utworzyć na kolumnie dowolnego typu (liczbowego, znakowego, daty itd.). Nie ma wymogu konkretnego typu.

21. Doprowadzenie modelu do kolejnej wyższej postaci normalnej

Section titled “21. Doprowadzenie modelu do kolejnej wyższej postaci normalnej”
  • a) ilość tabel zwykle się zmienia
  • b) ilość tabel rzadko się zmienia
  • c) tabel pojawia się coraz więcej

Wyjaśnienie: Normalizacja zwykle dekomponuje tabele, więc ich liczba się zmienia (najczęściej rośnie). Opcja c (coraz więcej tabel) także dobrze opisuje tendencję, ale a jest bezpieczniejszym, ogólnym stwierdzeniem.

22. Kolumna może być jednocześnie kluczem głównym oraz obcym

Section titled “22. Kolumna może być jednocześnie kluczem głównym oraz obcym”

Poprawna odpowiedź: prawda (true).

Wyjaśnienie: Ta sama kolumna może pełnić obie role, np. w relacji 1:1 lub w tabeli dziedziczącej, gdzie klucz główny jest jednocześnie kluczem obcym do tabeli nadrzędnej.

  • a) musi zawierać klucz główny
  • b) musi zawierać klucz główny, ale tylko dla tabel InnoDB
  • c) może zawierać klucz główny

Wyjaśnienie: W praktyce SQL (MySQL) można utworzyć tabelę bez zdefiniowanego klucza głównego, więc klucz główny jest zalecany, ale nie obowiązkowy.

  • a) zawsze jeden
  • b) więcej niż jeden
  • c) nic

Wyjaśnienie: Funkcja agregująca bez GROUP BY zwraca dokładnie jeden wiersz (nawet dla pustej tabeli wynikiem jest jeden wiersz z wartością NULL).

  • a) avg(Cena+cena)
  • b) avg(cena, cena)
  • c) avg(cena cena)

Wyjaśnienie: AVG przyjmuje jeden argument będący wyrażeniem, więc avg(cena+cena) jest poprawne. Dwa argumenty (b) lub brak operatora (c) to błąd składni.

26. Co wyświetli SELECT AVG(100)+MIN(50)?

Section titled “26. Co wyświetli SELECT AVG(100)+MIN(50)?”

Poprawna odpowiedź: 150.

Wyjaśnienie: AVG(100) ze stałej daje 100, MIN(50) daje 50, suma to 150 (jeden wiersz wyniku).

27. Jakie id wstawi INSERT INTO tab (name) VALUES ('ccc'), gdy w tabeli są id 103 i 1?

Section titled “27. Jakie id wstawi INSERT INTO tab (name) VALUES ('ccc'), gdy w tabeli są id 103 i 1?”

Poprawna odpowiedź: 104.

Wyjaśnienie: AUTO_INCREMENT bierze maksymalne dotychczasowe id (103) i dodaje 1, więc nowy rekord dostanie 104. Liczba istniejących wierszy nie ma znaczenia.

28. AVG(salary) - SUM(salary) dla 10 pracowników o nieujemnych zarobkach

Section titled “28. AVG(salary) - SUM(salary) dla 10 pracowników o nieujemnych zarobkach”
  • a) wynik ujemny
  • b) wynik dodatni
  • c) błąd

Wyjaśnienie: SUM = AVG * 10, więc AVG - SUM = AVG - 10*AVG = -9*AVG. Przy dodatnich zarobkach wynik jest ujemny. (Skrajny przypadek: gdyby wszystkie zarobki wynosiły 0, wynik byłby 0, ale przy realnych dodatnich wartościach jest ujemny.)

29. INSERT, UPDATE, DELETE w odniesieniu do widoków

Section titled “29. INSERT, UPDATE, DELETE w odniesieniu do widoków”
  • a) niemożliwe
  • b) czasami możliwe
  • c) zawsze możliwe

Wyjaśnienie: Operacje DML na widoku są możliwe tylko dla tzw. widoków modyfikowalnych (prosty widok bez agregacji, DISTINCT, GROUP BY, złączeń wielu tabel itp.). Dla widoków złożonych są niemożliwe.