# Informatyka — zadanie 3.1

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2019-05/zad/3.1
> Wersja Markdown strony zadania (dla asystentów AI). Przy cytowaniu podaj matura.lol i link powyżej.

- arkusz: Informatyka · Matura · maj 2019 (rozszerzona)
- rok: 2019
- poziom: rozszerzona
- typ: closed
- punkty: 1
- działy: Bazy danych

## Treść

Zadanie 3. Test

Oceń prawdziwość podanych zdań. Zaznacz P, jeśli zdanie jest prawdziwe, albo F - jeśli jest fałszywe. W każdym zadaniu punkt uzyskasz tylko za komplet poprawnych odpowiedzi.

Dana jest tabela PRACOWNICY:

| Nr_P | Nazwisko | Imię | Stanowisko | Nr_działu |
| 736 | Smitko | Alan | urzędnik | 20 |
| 7499 | Nowak | Kazimierz | sprzedawca | 30 |
| 7521 | Więcek | Mariusz | sprzedawca | 30 |
| 7566 | Jonas | Kamil | kierownik | 20 |
| 7654 | Martin | Leon | sprzedawca | 30 |
| 7698 | Bracki | Bartosz | kierownik | 30 |
| 7782 | Celerek | Agnieszka | kierownik | 10 |
| 7788 | Skotnik | Natalia | analityk | 20 |
| 7839 | King | Mirosława | prezes | 10 |

Oceń prawdziwość poniższych zdań dotyczących zapytań SQL na tabeli PRACOWNICY.

Wynikiem zapytania: SELECT COUNT(Stanowisko) FROM PRACOWNICY; jest Stanowisko 5.
Wynikiem zapytania: SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko <> "kierownik"; jest 6.
Wynikiem zapytania: SELECT Stanowisko, COUNT(*) FROM PRACOWNICY GROUP BY Stanowisko; jest: urzędnik 1, sprzedawca 3, kierownik 3, analityk 1, prezes 1.
Wynikiem zapytania: SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko LIKE "*nik"; jest 2.

## Rozwiązanie — maturazai.pl (AI)

## Poprawna odpowiedź

**F, P, P, F**

## Sposób 1 - analiza każdego zapytania na tabeli PRACOWNICY

Tabela ma **9 wierszy**. Lista stanowisk:
- urzędnik (1): Smitko
- sprzedawca (3): Nowak, Więcek, Martin
- kierownik (3): Jonas, Bracki, Celerek
- analityk (1): Skotnik
- prezes (1): King

### Stwierdzenie 1: `SELECT COUNT(Stanowisko) FROM PRACOWNICY;` → "Stanowisko 5"

**Analiza:**
- `COUNT(Stanowisko)` zlicza WSZYSTKIE wiersze (z niepustym Stanowisko) - to **9**, nie 5!
- Nazwa kolumny wyniku nie jest "Stanowisko 5", a sam wynik to liczba 9.
- Wartość 5 mogłaby wynikać tylko gdyby ktoś pomylił z `COUNT(DISTINCT Stanowisko)` - wtedy wynik = 5 (bo unikalnych stanowisk jest 5).

**Werdykt: FAŁSZ** ✗

### Stwierdzenie 2: `SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko <> "kierownik";` → 6

**Analiza:**
- WHERE Stanowisko <> "kierownik" → wykluczamy 3 kierowników (Jonas, Bracki, Celerek).
- Pozostaje: 9 - 3 = **6 wierszy**.
- COUNT zlicza pozostałe → wynik = 6 ✓

**Werdykt: PRAWDA** ✓

### Stwierdzenie 3: `SELECT Stanowisko, COUNT(*) FROM PRACOWNICY GROUP BY Stanowisko;` → "urzędnik 1, sprzedawca 3, kierownik 3, analityk 1, prezes 1"

**Analiza GROUP BY:**
| Stanowisko | COUNT(*) |
| urzędnik | 1 |
| sprzedawca | 3 |
| kierownik | 3 |
| analityk | 1 |
| prezes | 1 |

Wynik dokładnie odpowiada opisowi! (kolejność wierszy w GROUP BY bez ORDER BY jest niegwarantowana, ale wartości są poprawne)

**Werdykt: PRAWDA** ✓

### Stwierdzenie 4: `SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko LIKE "*nik";` → 2

**Analiza wzorca LIKE:**
- W standardowym SQL znak `%` to dowolny ciąg (a `*` to NIE jest standardowy SQL - to wildcard z Access/wzorca DOS).
- **W SQL standardowym (MySQL, PostgreSQL):** `LIKE '*nik'` szuka dokładnie napisu "*nik" (z literalną gwiazdką) → 0 wyników!
- **W Access (z * jako wildcardem):** `LIKE "*nik"` ≈ "%nik" w SQL - kończące się na "nik". Pasują: "urzędnik" (1), "analityk"? - NIE (kończy się "yk"), "kierownik" (3 wystąpienia). Łącznie urzędnik (1) + kierownik (3) = **4 wiersze**.

W żadnej interpretacji wynik nie wynosi 2.

**Werdykt: FAŁSZ** ✗

## Sposób 2 - weryfikacja Pythonem

```python
import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('''CREATE TABLE PRACOWNICY (Nr_P INT, Nazwisko TEXT, Imie TEXT, Stanowisko TEXT, Nr_dzialu INT)''')
dane = [(736,'Smitko','Alan','urzędnik',20),
(7499,'Nowak','Kazimierz','sprzedawca',30),
(7521,'Więcek','Mariusz','sprzedawca',30),
(7566,'Jonas','Kamil','kierownik',20),
(7654,'Martin','Leon','sprzedawca',30),
(7698,'Bracki','Bartosz','kierownik',30),
(7782,'Celerek','Agnieszka','kierownik',10),
(7788,'Skotnik','Natalia','analityk',20),
(7839,'King','Mirosława','prezes',10)]
c.executemany('INSERT INTO PRACOWNICY VALUES (?,?,?,?,?)', dane)

print(c.execute('SELECT COUNT(Stanowisko) FROM PRACOWNICY').fetchone())
# (9,) - nie 5
print(c.execute('SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko <> "kierownik"').fetchone())
# (6,)
print(c.execute('SELECT Stanowisko, COUNT(*) FROM PRACOWNICY GROUP BY Stanowisko').fetchall())
# [('analityk',1), ('kierownik',3), ('prezes',1), ('sprzedawca',3), ('urzędnik',1)]
print(c.execute('SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko LIKE "%nik"').fetchone())
# (4,) - przy LIKE %nik (urzędnik 1 + 3 kierownik)

## Reference informatyczny - SQL: COUNT, WHERE, GROUP BY, LIKE

> Reference - SQL agregacja:
> - `COUNT(*)` - liczba wierszy (włącznie z NULL).
> - `COUNT(kolumna)` - liczba wierszy z NIE-NULL wartością w kolumnie.
> - `COUNT(DISTINCT kolumna)` - liczba unikalnych wartości.
> - `GROUP BY` - grupowanie wierszy, agregaty obliczane per grupa.
> - `WHERE` - filtr przed grupowaniem (rzęd na rzędzie).
> - `HAVING` - filtr po grupowaniu (na agregatach).
>
> Reference - SQL LIKE:
> - Standard SQL: `%` = dowolny ciąg, `_` = jeden znak.
> - `LIKE '%nik'` - kończy się na "nik".
> - `LIKE 'nik%'` - zaczyna od "nik".
> - `LIKE '%nik%'` - zawiera "nik".
> - W MS Access: `*` zamiast `%`. W SQLite/MySQL/Postgres `*` to literalna gwiazdka!

## Schemat oceniania CKE

> Klucz CKE (zadanie 3.1, max 1 pkt):
> - **1 pkt** - wszystkie 4 odpowiedzi poprawne (F, P, P, F)
> - **0 pkt** - odpowiedź niepełna lub błędna albo brak

## Dlaczego inne odpowiedzi błędne (analiza pułapek)

| Stw. | Trafna ocena | Typowa pułapka prowadząca do błędnej |
| 1 | F | Mylenie COUNT(kol) z COUNT(DISTINCT kol) - wynik 9 vs 5 |
| 2 | P | - |
| 3 | P | Pomylenie GROUP BY z ORDER BY (kolejność wierszy) |
| 4 | F | Założenie, że `*` to wildcard SQL (jest `%`); też mylenie urzędnik vs kierownik vs analityk |

## Typowe pułapki

- **`COUNT(*)` vs `COUNT(kolumna)` vs `COUNT(DISTINCT kolumna)`** - różne zachowania!
- **Wildcard `*` vs `%`** - `%` to standard SQL, `*` to Access (lub literalna gwiazdka w innych dialektach).
- **`<>` to nie-równe** w SQL (alternatywnie `!=` w niektórych dialektach).
- **GROUP BY bez ORDER BY** - kolejność wierszy w wyniku nie jest gwarantowana (ale wartości są).
- **Polskie litery** w stanowiskach (ż, ć, ą) - kodowanie znaków może mieć znaczenie.

## Złożoność obliczeniowa

- COUNT i WHERE: O(n) - przegląd tabeli (z indeksem szybciej).
- GROUP BY: O(n log n) (sortowanie) lub O(n) z hash-aggregate.
- LIKE z prefiksem (`'nik%'`) może użyć indeksu B-tree → O(log n + k). Z `%` na początku (`%nik`) → pełny skan O(n).

## Odpowiedź

**Odpowiedź:** F

_Rozwiązanie AI z maturazai.pl, weryfikowane z kluczem CKE — źródło nieoficjalne._

## Linki

- [dane JSON](https://matura.lol/api/question/maturazai-informatyka-inf-2019-05/zad/3.1)
- [otwórz w wyszukiwarce](https://matura.lol/?problem=maturazai-informatyka-inf-2019-05%2Fzad%2F3.1)

## Podobne zadania

- [Zadanie 6.3](https://matura.lol/question/informatyka-2020-lipiec-matura-rozszerzona-2/zad/6.3) — Zadanie 6.3. (0-2) Utwórz zestawienie zawierające nazwy województw, w których w badaniu wzięło udział więcej niż 20 osób. Dla każdego z tych województw podaj li
- [Zadanie 3.3](https://matura.lol/question/informatyka-2022-maj-matura-rozszerzona/zad/3.3) — Zadanie 3.3. (0-1) W bazie danych istnieje tabela mandaty(numer, id_osoby, punkty) zawierająca następujące dane: numer id_osoby punkty 1 1 5 2 1 14 3 2 20 4 3 2
- [Zadanie 3.3](https://matura.lol/question/maturazai-informatyka-einp-r12-100-2105/zad/3.3) — Kontekst zadania 3 (Test PF). W bazie danych istnieje tabela produkty(id_produktu, produkt, sztuk, cena), zawierająca następujące dane: | id_produktu | produkt 
- [Zadanie 3.1](https://matura.lol/question/informatyka-2019-maj-matura-rozszerzona/zad/3.1) — Zadanie 3.1. (0-1) Dana jest tabela PRACOWNICY. Nr_P Nazwisko Imię Stanowisko Nr_działu 736 Smitko Alan urzędnik 20 7499 Nowak Kazimierz sprzedawca 30 7521 Więc

_Ostatnia aktualizacja danych: 2026-10-03_
