{"id":"informatyka-2019-maj-matura-rozszerzona/zad/3.1","paper_id":"informatyka-2019-maj-matura-rozszerzona","number":"3.1","points":1,"ptype":"true_false","subject":"informatyka","category":"matura","year":2019,"month":"maj","level":"rozszerzona","text":"Zadanie 3.1. (0-1)\nDana jest tabela PRACOWNICY.\nNr_P\nNazwisko\nImię\nStanowisko\nNr_działu\n736\nSmitko\nAlan\nurzędnik\n20\n7499\nNowak\nKazimierz\nsprzedawca\n30\n7521\nWięcek\nMariusz\nsprzedawca\n30\n7566\nJonas\nKamil\nkierownik\n20\n7654\nMartin\nLeon\nsprzedawca\n30\n7698\nBracki\nBartosz\nkierownik\n30\n7782\nCelerek\nAgnieszka\nkierownik\n10\n7788\nSkotnik\nNatalia\nanalityk\n20\n7839\nKing\nMirosława\nprezes\n10\n1.\nWynikiem zapytania\nSELECT COUNT(Stanowisko)\nFROM PRACOWNICY;\njest\nStanowisko 5\nP\nF\n2.\nWynikiem zapytania\nSELECT COUNT(Stanowisko)\nFROM PRACOWNICY\nWHERE Stanowisko <> \"kierownik\";\njest\n6\nP\nF\n3.\nWynikiem zapytania\nSELECT Stanowisko, COUNT(*)\nFROM PRACOWNICY\nGROUP BY Stanowisko;\njest\nurzędnik 1\nsprzedawca 3\nkierownik 3\nanalityk 1\nprezes 1\nP\nF\n4.\nWynikiem zapytania\nSELECT COUNT(Stanowisko)\nFROM PRACOWNICY\nWHERE Stanowisko LIKE \"*nik\";\njest\n2\nP\nF\nMIN_1R","answer":"F","answer_text":"Zadanie 3.1. (0-1)\nWymagania ogólne\nWymagania szczegółowe\nII. Wyszukiwanie, gromadzenie\ni przetwarzanie informacji z różnych źródeł;\nopracowywanie za pomocą komputera:\nrysunków, tekstów, danych liczbowych,\nmotywów, animacji, prezentacji\nmultimedialnych.\n2. Wyszukiwanie, gromadzenie,\nselekcjonowanie, przetwarzanie\ni wykorzystywanie informacji,\nwspółtworzenie zasobów w sieci,\nkorzystanie z różnych źródeł i sposobów\nzdobywania informacji.\nZdający:\n2) stosuje metody wyszukiwania\ni przetwarzania informacji w relacyjnej\nbazie danych (język SQL).\nSchemat punktowania\n1 p. - za wskazanie czterech poprawnych odpowiedzi.\n0 p. - za odpowiedź niepełną lub błędną albo za brak odpowiedzi.\nPoprawna odpowiedź\nF, P, P, F","solution":"## Poprawna odpowiedź\n\n**F, P, P, F**\n\n## Sposób 1 - analiza każdego zapytania na tabeli PRACOWNICY\n\nTabela ma **9 wierszy**. Lista stanowisk:\n- urzędnik (1): Smitko\n- sprzedawca (3): Nowak, Więcek, Martin\n- kierownik (3): Jonas, Bracki, Celerek\n- analityk (1): Skotnik\n- prezes (1): King\n\n### Stwierdzenie 1: `SELECT COUNT(Stanowisko) FROM PRACOWNICY;` → \"Stanowisko 5\"\n\n**Analiza:**\n- `COUNT(Stanowisko)` zlicza WSZYSTKIE wiersze (z niepustym Stanowisko) - to **9**, nie 5!\n- Nazwa kolumny wyniku nie jest \"Stanowisko 5\", a sam wynik to liczba 9.\n- Wartość 5 mogłaby wynikać tylko gdyby ktoś pomylił z `COUNT(DISTINCT Stanowisko)` - wtedy wynik = 5 (bo unikalnych stanowisk jest 5).\n\n**Werdykt: FAŁSZ** ✗\n\n### Stwierdzenie 2: `SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko <> \"kierownik\";` → 6\n\n**Analiza:**\n- WHERE Stanowisko <> \"kierownik\" → wykluczamy 3 kierowników (Jonas, Bracki, Celerek).\n- Pozostaje: 9 - 3 = **6 wierszy**.\n- COUNT zlicza pozostałe → wynik = 6 ✓\n\n**Werdykt: PRAWDA** ✓\n\n### Stwierdzenie 3: `SELECT Stanowisko, COUNT(*) FROM PRACOWNICY GROUP BY Stanowisko;` → \"urzędnik 1, sprzedawca 3, kierownik 3, analityk 1, prezes 1\"\n\n**Analiza GROUP BY:**\n| Stanowisko | COUNT(*) |\n| urzędnik | 1 |\n| sprzedawca | 3 |\n| kierownik | 3 |\n| analityk | 1 |\n| prezes | 1 |\n\nWynik dokładnie odpowiada opisowi! (kolejność wierszy w GROUP BY bez ORDER BY jest niegwarantowana, ale wartości są poprawne)\n\n**Werdykt: PRAWDA** ✓\n\n### Stwierdzenie 4: `SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko LIKE \"*nik\";` → 2\n\n**Analiza wzorca LIKE:**\n- W standardowym SQL znak `%` to dowolny ciąg (a `*` to NIE jest standardowy SQL - to wildcard z Access/wzorca DOS).\n- **W SQL standardowym (MySQL, PostgreSQL):** `LIKE '*nik'` szuka dokładnie napisu \"*nik\" (z literalną gwiazdką) → 0 wyników!\n- **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**.\n\nW żadnej interpretacji wynik nie wynosi 2.\n\n**Werdykt: FAŁSZ** ✗\n\n## Sposób 2 - weryfikacja Pythonem\n\n```python\nimport sqlite3\nconn = sqlite3.connect(':memory:')\nc = conn.cursor()\nc.execute('''CREATE TABLE PRACOWNICY (Nr_P INT, Nazwisko TEXT, Imie TEXT, Stanowisko TEXT, Nr_dzialu INT)''')\ndane = [(736,'Smitko','Alan','urzędnik',20),\n(7499,'Nowak','Kazimierz','sprzedawca',30),\n(7521,'Więcek','Mariusz','sprzedawca',30),\n(7566,'Jonas','Kamil','kierownik',20),\n(7654,'Martin','Leon','sprzedawca',30),\n(7698,'Bracki','Bartosz','kierownik',30),\n(7782,'Celerek','Agnieszka','kierownik',10),\n(7788,'Skotnik','Natalia','analityk',20),\n(7839,'King','Mirosława','prezes',10)]\nc.executemany('INSERT INTO PRACOWNICY VALUES (?,?,?,?,?)', dane)\n\nprint(c.execute('SELECT COUNT(Stanowisko) FROM PRACOWNICY').fetchone())\n# (9,) - nie 5\nprint(c.execute('SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko <> \"kierownik\"').fetchone())\n# (6,)\nprint(c.execute('SELECT Stanowisko, COUNT(*) FROM PRACOWNICY GROUP BY Stanowisko').fetchall())\n# [('analityk',1), ('kierownik',3), ('prezes',1), ('sprzedawca',3), ('urzędnik',1)]\nprint(c.execute('SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko LIKE \"%nik\"').fetchone())\n# (4,) - przy LIKE %nik (urzędnik 1 + 3 kierownik)\n\n## Reference informatyczny - SQL: COUNT, WHERE, GROUP BY, LIKE\n\n> Reference - SQL agregacja:\n> - `COUNT(*)` - liczba wierszy (włącznie z NULL).\n> - `COUNT(kolumna)` - liczba wierszy z NIE-NULL wartością w kolumnie.\n> - `COUNT(DISTINCT kolumna)` - liczba unikalnych wartości.\n> - `GROUP BY` - grupowanie wierszy, agregaty obliczane per grupa.\n> - `WHERE` - filtr przed grupowaniem (rzęd na rzędzie).\n> - `HAVING` - filtr po grupowaniu (na agregatach).\n>\n> Reference - SQL LIKE:\n> - Standard SQL: `%` = dowolny ciąg, `_` = jeden znak.\n> - `LIKE '%nik'` - kończy się na \"nik\".\n> - `LIKE 'nik%'` - zaczyna od \"nik\".\n> - `LIKE '%nik%'` - zawiera \"nik\".\n> - W MS Access: `*` zamiast `%`. W SQLite/MySQL/Postgres `*` to literalna gwiazdka!\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 3.1, max 1 pkt):\n> - **1 pkt** - wszystkie 4 odpowiedzi poprawne (F, P, P, F)\n> - **0 pkt** - odpowiedź niepełna lub błędna albo brak\n\n## Dlaczego inne odpowiedzi błędne (analiza pułapek)\n\n| Stw. | Trafna ocena | Typowa pułapka prowadząca do błędnej |\n| 1 | F | Mylenie COUNT(kol) z COUNT(DISTINCT kol) - wynik 9 vs 5 |\n| 2 | P | - |\n| 3 | P | Pomylenie GROUP BY z ORDER BY (kolejność wierszy) |\n| 4 | F | Założenie, że `*` to wildcard SQL (jest `%`); też mylenie urzędnik vs kierownik vs analityk |\n\n## Typowe pułapki\n\n- **`COUNT(*)` vs `COUNT(kolumna)` vs `COUNT(DISTINCT kolumna)`** - różne zachowania!\n- **Wildcard `*` vs `%`** - `%` to standard SQL, `*` to Access (lub literalna gwiazdka w innych dialektach).\n- **`<>` to nie-równe** w SQL (alternatywnie `!=` w niektórych dialektach).\n- **GROUP BY bez ORDER BY** - kolejność wierszy w wyniku nie jest gwarantowana (ale wartości są).\n- **Polskie litery** w stanowiskach (ż, ć, ą) - kodowanie znaków może mieć znaczenie.\n\n## Złożoność obliczeniowa\n\n- COUNT i WHERE: O(n) - przegląd tabeli (z indeksem szybciej).\n- GROUP BY: O(n log n) (sortowanie) lub O(n) z hash-aggregate.\n- 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).","image":"img/informatyka-2019-maj-matura-rozszerzona/zad-3.1.webp","solution_image":null,"topics":null,"page_from":6,"source":"ocr","answer_source":"maturazai","answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2019 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 3.1. (0-1)<br>Dana jest tabela PRACOWNICY.<br>Nr_P<br>Nazwisko<br>Imię<br>Stanowisko<br>Nr_działu<br>736<br>Smitko<br>Alan<br>urzędnik<br>20<br>7499<br>Nowak<br>Kazimierz<br>sprzedawca<br>30<br>7521<br>Więcek<br>Mariusz<br>sprzedawca<br>30<br>7566<br>Jonas<br>Kamil<br>kierownik<br>20<br>7654<br>Martin<br>Leon<br>sprzedawca<br>30<br>7698<br>Bracki<br>Bartosz<br>kierownik<br>30<br>7782<br>Celerek<br>Agnieszka<br>kierownik<br>10<br>7788<br>Skotnik<br>Natalia<br>analityk<br>20<br>7839<br>King<br>Mirosława<br>prezes<br>10<br>1.<br>Wynikiem zapytania<br>SELECT COUNT(Stanowisko)<br>FROM PRACOWNICY;<br>jest<br>Stanowisko 5<br>P<br>F<br>2.<br>Wynikiem zapytania<br>SELECT COUNT(Stanowisko)<br>FROM PRACOWNICY<br>WHERE Stanowisko &lt;&gt; &quot;kierownik&quot;;<br>jest<br>6<br>P<br>F<br>3.<br>Wynikiem zapytania<br>SELECT Stanowisko, COUNT(*)<br>FROM PRACOWNICY<br>GROUP BY Stanowisko;<br>jest<br>urzędnik 1<br>sprzedawca 3<br>kierownik 3<br>analityk 1<br>prezes 1<br>P<br>F<br>4.<br>Wynikiem zapytania<br>SELECT COUNT(Stanowisko)<br>FROM PRACOWNICY<br>WHERE Stanowisko LIKE &quot;*nik&quot;;<br>jest<br>2<br>P<br>F<br>MIN_1R</p>","answer_text_html":"<p>Zadanie 3.1. (0-1)<br>Wymagania ogólne<br>Wymagania szczegółowe<br>II. Wyszukiwanie, gromadzenie<br>i przetwarzanie informacji z różnych źródeł;<br>opracowywanie za pomocą komputera:<br>rysunków, tekstów, danych liczbowych,<br>motywów, animacji, prezentacji<br>multimedialnych.</p>\n<ol><li>Wyszukiwanie, gromadzenie,</li></ol>\n<p>selekcjonowanie, przetwarzanie<br>i wykorzystywanie informacji,<br>współtworzenie zasobów w sieci,<br>korzystanie z różnych źródeł i sposobów<br>zdobywania informacji.<br>Zdający:</p>\n<ol><li>stosuje metody wyszukiwania</li></ol>\n<p>i przetwarzania informacji w relacyjnej<br>bazie danych (język SQL).<br>Schemat punktowania<br>1 p. - za wskazanie czterech poprawnych odpowiedzi.<br>0 p. - za odpowiedź niepełną lub błędną albo za brak odpowiedzi.<br>Poprawna odpowiedź<br>F, P, P, F</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>F, P, P, F</strong></p>\n<h4>Sposób 1 - analiza każdego zapytania na tabeli PRACOWNICY</h4>\n<p>Tabela ma <strong>9 wierszy</strong>. Lista stanowisk:</p>\n<ul><li>urzędnik (1): Smitko</li><li>sprzedawca (3): Nowak, Więcek, Martin</li><li>kierownik (3): Jonas, Bracki, Celerek</li><li>analityk (1): Skotnik</li><li>prezes (1): King</li></ul>\n<h5>Stwierdzenie 1: <code>SELECT COUNT(Stanowisko) FROM PRACOWNICY;</code> → &quot;Stanowisko 5&quot;</h5>\n<p><strong>Analiza:</strong></p>\n<ul><li><code>COUNT(Stanowisko)</code> zlicza WSZYSTKIE wiersze (z niepustym Stanowisko) - to <strong>9</strong>, nie 5!</li><li>Nazwa kolumny wyniku nie jest &quot;Stanowisko 5&quot;, a sam wynik to liczba 9.</li><li>Wartość 5 mogłaby wynikać tylko gdyby ktoś pomylił z <code>COUNT(DISTINCT Stanowisko)</code> - wtedy wynik = 5 (bo unikalnych stanowisk jest 5).</li></ul>\n<p><strong>Werdykt: FAŁSZ</strong> ✗</p>\n<h5>Stwierdzenie 2: <code>SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko &lt;&gt; &quot;kierownik&quot;;</code> → 6</h5>\n<p><strong>Analiza:</strong></p>\n<ul><li>WHERE Stanowisko &lt;&gt; &quot;kierownik&quot; → wykluczamy 3 kierowników (Jonas, Bracki, Celerek).</li><li>Pozostaje: 9 - 3 = <strong>6 wierszy</strong>.</li><li>COUNT zlicza pozostałe → wynik = 6 ✓</li></ul>\n<p><strong>Werdykt: PRAWDA</strong> ✓</p>\n<h5>Stwierdzenie 3: <code>SELECT Stanowisko, COUNT(*) FROM PRACOWNICY GROUP BY Stanowisko;</code> → &quot;urzędnik 1, sprzedawca 3, kierownik 3, analityk 1, prezes 1&quot;</h5>\n<p><strong>Analiza GROUP BY:</strong><br>| Stanowisko | COUNT(*) |<br>| urzędnik | 1 |<br>| sprzedawca | 3 |<br>| kierownik | 3 |<br>| analityk | 1 |<br>| prezes | 1 |</p>\n<p>Wynik dokładnie odpowiada opisowi! (kolejność wierszy w GROUP BY bez ORDER BY jest niegwarantowana, ale wartości są poprawne)</p>\n<p><strong>Werdykt: PRAWDA</strong> ✓</p>\n<h5>Stwierdzenie 4: <code>SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko LIKE &quot;*nik&quot;;</code> → 2</h5>\n<p><strong>Analiza wzorca LIKE:</strong></p>\n<ul><li>W standardowym SQL znak <code>%</code> to dowolny ciąg (a <code>*</code> to NIE jest standardowy SQL - to wildcard z Access/wzorca DOS).</li><li><strong>W SQL standardowym (MySQL, PostgreSQL):</strong> <code>LIKE &#x27;<em>nik&#x27;</code> szuka dokładnie napisu &quot;</em>nik&quot; (z literalną gwiazdką) → 0 wyników!</li><li><strong>W Access (z * jako wildcardem):</strong> <code>LIKE &quot;*nik&quot;</code> ≈ &quot;%nik&quot; w SQL - kończące się na &quot;nik&quot;. Pasują: &quot;urzędnik&quot; (1), &quot;analityk&quot;? - NIE (kończy się &quot;yk&quot;), &quot;kierownik&quot; (3 wystąpienia). Łącznie urzędnik (1) + kierownik (3) = <strong>4 wiersze</strong>.</li></ul>\n<p>W żadnej interpretacji wynik nie wynosi 2.</p>\n<p><strong>Werdykt: FAŁSZ</strong> ✗</p>\n<h4>Sposób 2 - weryfikacja Pythonem</h4>\n<p>```python<br>import sqlite3<br>conn = sqlite3.connect(&#x27;:memory:&#x27;)<br>c = conn.cursor()<br>c.execute(&#x27;&#x27;&#x27;CREATE TABLE PRACOWNICY (Nr_P INT, Nazwisko TEXT, Imie TEXT, Stanowisko TEXT, Nr_dzialu INT)&#x27;&#x27;&#x27;)<br>dane = [(736,&#x27;Smitko&#x27;,&#x27;Alan&#x27;,&#x27;urzędnik&#x27;,20),<br>(7499,&#x27;Nowak&#x27;,&#x27;Kazimierz&#x27;,&#x27;sprzedawca&#x27;,30),<br>(7521,&#x27;Więcek&#x27;,&#x27;Mariusz&#x27;,&#x27;sprzedawca&#x27;,30),<br>(7566,&#x27;Jonas&#x27;,&#x27;Kamil&#x27;,&#x27;kierownik&#x27;,20),<br>(7654,&#x27;Martin&#x27;,&#x27;Leon&#x27;,&#x27;sprzedawca&#x27;,30),<br>(7698,&#x27;Bracki&#x27;,&#x27;Bartosz&#x27;,&#x27;kierownik&#x27;,30),<br>(7782,&#x27;Celerek&#x27;,&#x27;Agnieszka&#x27;,&#x27;kierownik&#x27;,10),<br>(7788,&#x27;Skotnik&#x27;,&#x27;Natalia&#x27;,&#x27;analityk&#x27;,20),<br>(7839,&#x27;King&#x27;,&#x27;Mirosława&#x27;,&#x27;prezes&#x27;,10)]<br>c.executemany(&#x27;INSERT INTO PRACOWNICY VALUES (?,?,?,?,?)&#x27;, dane)</p>\n<p>print(c.execute(&#x27;SELECT COUNT(Stanowisko) FROM PRACOWNICY&#x27;).fetchone())</p>\n<h3>(9,) - nie 5</h3>\n<p>print(c.execute(&#x27;SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko &lt;&gt; &quot;kierownik&quot;&#x27;).fetchone())</p>\n<h3>(6,)</h3>\n<p>print(c.execute(&#x27;SELECT Stanowisko, COUNT(*) FROM PRACOWNICY GROUP BY Stanowisko&#x27;).fetchall())</p>\n<h3>[(&#x27;analityk&#x27;,1), (&#x27;kierownik&#x27;,3), (&#x27;prezes&#x27;,1), (&#x27;sprzedawca&#x27;,3), (&#x27;urzędnik&#x27;,1)]</h3>\n<p>print(c.execute(&#x27;SELECT COUNT(Stanowisko) FROM PRACOWNICY WHERE Stanowisko LIKE &quot;%nik&quot;&#x27;).fetchone())</p>\n<h3>(4,) - przy LIKE %nik (urzędnik 1 + 3 kierownik)</h3>\n<h4>Reference informatyczny - SQL: COUNT, WHERE, GROUP BY, LIKE</h4>\n<blockquote>Reference - SQL agregacja:<br>- <code>COUNT(*)</code> - liczba wierszy (włącznie z NULL).<br>- <code>COUNT(kolumna)</code> - liczba wierszy z NIE-NULL wartością w kolumnie.<br>- <code>COUNT(DISTINCT kolumna)</code> - liczba unikalnych wartości.<br>- <code>GROUP BY</code> - grupowanie wierszy, agregaty obliczane per grupa.<br>- <code>WHERE</code> - filtr przed grupowaniem (rzęd na rzędzie).<br>- <code>HAVING</code> - filtr po grupowaniu (na agregatach).<br><br>Reference - SQL LIKE:<br>- Standard SQL: <code>%</code> = dowolny ciąg, <code>_</code> = jeden znak.<br>- <code>LIKE &#x27;%nik&#x27;</code> - kończy się na &quot;nik&quot;.<br>- <code>LIKE &#x27;nik%&#x27;</code> - zaczyna od &quot;nik&quot;.<br>- <code>LIKE &#x27;%nik%&#x27;</code> - zawiera &quot;nik&quot;.<br>- W MS Access: <code><em></code> zamiast <code>%</code>. W SQLite/MySQL/Postgres <code></em></code> to literalna gwiazdka!</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 3.1, max 1 pkt):<br>- <strong>1 pkt</strong> - wszystkie 4 odpowiedzi poprawne (F, P, P, F)<br>- <strong>0 pkt</strong> - odpowiedź niepełna lub błędna albo brak</blockquote>\n<h4>Dlaczego inne odpowiedzi błędne (analiza pułapek)</h4>\n<p>| Stw. | Trafna ocena | Typowa pułapka prowadząca do błędnej |<br>| 1 | F | Mylenie COUNT(kol) z COUNT(DISTINCT kol) - wynik 9 vs 5 |<br>| 2 | P | - |<br>| 3 | P | Pomylenie GROUP BY z ORDER BY (kolejność wierszy) |<br>| 4 | F | Założenie, że <code>*</code> to wildcard SQL (jest <code>%</code>); też mylenie urzędnik vs kierownik vs analityk |</p>\n<h4>Typowe pułapki</h4>\n<ul><li><strong><code>COUNT(*)</code> vs <code>COUNT(kolumna)</code> vs <code>COUNT(DISTINCT kolumna)</code></strong> - różne zachowania!</li><li><strong>Wildcard <code><em></code> vs <code>%</code></strong> - <code>%</code> to standard SQL, <code></em></code> to Access (lub literalna gwiazdka w innych dialektach).</li><li><strong><code>&lt;&gt;</code> to nie-równe</strong> w SQL (alternatywnie <code>!=</code> w niektórych dialektach).</li><li><strong>GROUP BY bez ORDER BY</strong> - kolejność wierszy w wyniku nie jest gwarantowana (ale wartości są).</li><li><strong>Polskie litery</strong> w stanowiskach (ż, ć, ą) - kodowanie znaków może mieć znaczenie.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>COUNT i WHERE: O(n) - przegląd tabeli (z indeksem szybciej).</li><li>GROUP BY: O(n log n) (sortowanie) lub O(n) z hash-aggregate.</li><li>LIKE z prefiksem (<code>&#x27;nik%&#x27;</code>) może użyć indeksu B-tree → O(log n + k). Z <code>%</code> na początku (<code>%nik</code>) → pełny skan O(n).</li></ul>"}]}