Większości osób wydaje się, że matura powinna być trudna i czasochłonna, ale wcale tak nie musi być. Na rozszerzonej maturze z informatyki pojawiają się zadania w których należy samodzielnie napisać kod SQL, jednak z pomocą poniższego artykułu okażą się to jedne z najprostszych zadań w arkuszu.
W 2023 na maturze pojawił się nowy typ zadania, polegający na pisaniu kodu SQL na kartce, wykorzystując tabele, które nie są dostępne w programie do zaimportowania. Autorzy prawdopodobnie zakładają, że sami ułożymy kwerendę w SQL-u. Jednak istnieje znacznie łatwiejszy sposób, wystarczy stworzyć odpowiednie tabele i kwerendy w Accessie, a następnie przenieść na arkusz lekko zmodyfikowany kod SQL. Należy jednak pamiętać o tym, że Access używa JET SQL, a w tego typu zadaniach jest wymagany ANSI SQL. W dalszej części artykułu dowiesz się jakie są różnice między tymi dwoma rodzajami SQL, a więc jak zmodyfikować ostateczny kod.
W artykule wykorzystamy poniższe tabele.

Powyższe tabele są naprawdę proste. Jak widać na załączonym obrazku, w tabeli Klienci kluczem jest id_klienta, w tabeli Usługi to id_zamowienia, natomiast w tabeli Pracownicy kluczem jest id_pracownika.
Pierwszą różnicą okazuje się liczba funkcji.
| ANSI SQL | JET SQL |
|---|---|
| COUNT() (policz) | W JET SQL istnieją wszystkie funkcje dostępne w ANSI SQL oraz wiele innych np. iif(). |
| SUM() (suma) | |
| AVG() (średnia) | |
| MIN() (minimum) | |
| MAX() (maksimum) |
Jeśli w twojej kwerendzie znajduje się funkcja spoza powyższej tabeli, przed przepisaniem spróbuj zmodyfikować kwerendę, tak żeby wykorzystywała jedynie powyższe funkcje.
Kolejną różnicą są operatory wykorzystywane w konkretnych działaniach. W obu poniższych przykładach zastosowano ten sam rodzaj kwerendy.
| ANSI SQL | JET SQL |
|---|---|
| W ANSI SQL operator LIKE() obsługuje następujące symbole: _ - dowolny znak, % - dowolne znaki w dowolnej ilości. Przykład użycia - Kwerenda zwracająca imiona posiadające znak a jako drugą literę: SELECT imie FROM klienci WHERE imie LIKE(_a%); | W JET SQL operator LIKE() obsługuje następujące symbole: ? - dowolny znak, * - dowolne znaki w dowolnej ilości. Przykład użycia - Kwerenda zwracająca imiona posiadające znak a jako drugą literę: SELECT imie FROM klienci WHERE imie LIKE(?a*); Jest to ta sama kwerenda, co w przypadku ANSI SQL, co jasno wskazuje na różnice między nimi. |
Jak widać wystarczy prosta zmiana znaków, żeby kwerenda była uznana na arkuszu maturalnym.
W Accesie można zmienić używane symbole na te używane w ANSI SQL. W tym celu należy wejść w opcje, w zakładkę „Projektanci Obiektu” i zaznaczyć opcję „Składnia zgodna z programem SQL SERVER ANSI 92”. Należy jednak uważać, bo wtedy zamiast LIKE Access używa słowa ALIKE. Powyższa kwerenda wygląda wtedy następująco:
SELECT imie FROM klienci WHERE imie ALIKE(_a%);
Poniżej zaznaczono opcję, którą należy zaznaczyć w celu korzystania z operatów ANSI SQL.

Wystarczy kliknąć opcje zaznaczone na powyższym obrazku, żeby utworzony kwerenda wykorzystywała składnię ANSI SQL.
Istnieje różnica również jeśli chodzi o liczenie unikatowych wartości.
| ANSI SQL | JET SQL |
|---|---|
| Wystarczy dodać DISTINCT w funkcji COUNT: SELECT COUNT(DISTINCT funkcja) FROM pracownicy; | W przypadku JET SQL DISTINCT można używać tylko po SELECT, więc żeby uzyskać kwerendę zwracającą to co z lewej, należy użyć kodu w ramach następującego rozwiązania: SELECT COUNT(*) FROM (SELECT DISTINCT funkcja FROM pracownicy); |
Również instrukcje warunkowe wyglądają inaczej w przypadku ANSI SQL oraz JET SQL.
| ANSI SQL | JET SQL |
|---|---|
| W tym przypadku używa się konstrukcji CASE. Przykład użycia: SELECT imie, CASE WHEN imie="Andzelika" THEN 1 ELSE 2 END AS status FROM klienci; | W tym przypadku wykorzystuje się funkcję iif() lub switch(). Przykład użycia: SELECT klienci.imie, IIf(klienci.imie="Andzelika",1,2) AS status FROM klienci; |
W przypadku ANSI SQL możliwe jest wykorzystanie natural join, który nie jest wykorzystywany w ramach samego Accessa.
| ANSI SQL | JET SQL |
|---|---|
| INNER JOIN LEFT JOIN RIGHT JOIN CROSS JOIN (brak relacji) NATURAL JOIN - służy do łączenia dwóch tabel na podstawie kolumn o tej samej nazwie i zgodnych typach danych. | INNER JOIN LEFT JOIN RIGHT JOIN CROSS JOIN (brak relacji) |
Dodatkowo warto pamiętać o tym, że inaczej wygląda składnia funkcji JOIN w poszczególnych rodzajach SQL.
| ANSI SQL | JET SQL |
|---|---|
| Składnia funkcji JOIN w ANSI SQL może wyglądać następująco: SELECT K.imie AS imieK, U.rodzaj, P.imie AS imieP FROM uslugi AS U INNER JOIN klienci AS K on K.id_klienta = U.id_klienta INNER JOIN pracownicy AS P ON P.id_pracownika = U.id_pracownika; Albo tak (cke w kluczu stosuje tę wersję): SELECT K.imie AS imieK, U.rodzaj, P.imie AS imieP FROM (uslugi AS U INNER JOIN klienci AS K ON K.id_klienta = U.id_klienta) INNER JOIN pracownicy AS P ON P.id_pracownika = U.id_pracownika; | W przypadku JET SQL wykorzystuje się opcję z nawiasami: SELECT K.imie, U.rodzaj, P.imie FROM (uslugi AS U INNER JOIN klienci AS K ON K.id_klienta = U.id_klienta) INNER JOIN pracownicy AS P ON P.id_pracownika = U.id_pracownika; |
| ANSI SQL | JET SQL |
|---|---|
| || - konkatenacja zmiennych string w ANSI. Przykład użycia: SELECT imie || ” ” || nazwisko FROM osoby; | & - konkatencja zmiennych string w JET. Przykład użycia: SELECT imie & ” ” & nazwisko FROM osoby; |
| ANSI SQL | JET SQL |
| Komentarze: Jednoliniowe: „--” Wieloliniowe: /* tutaj jest treść komentarza */ | Brak możliwości wstawiania komentarzy. |
| ANSI SQL | JET SQL |
| GROUP BY używamy jedynie na wyświetlanych polach. | GROUP BY musi być użyty na wszystkich polach użytych w zapytaniu (o ile nie są wykorzystywane w funkcjach agregujących), nawet niewyświetlane pola wymagają tej funkcji. Np. HAVING wymaga GROUP BY w Accessie (JET SQL). |
W JET SQL musimy grupować też pole użyte w HAVING inaczej pojawi się błąd taki jak poniżej.

Należy zawsze pamiętać o grupowaniu również pól użytych w HAVING.
Znając różnice między rodzajami SQL, przepisanie kwerendy z accessa do arkusza maturalnego powinno być dla Ciebie łatwe. Oczywiście konieczna jest zdolność stworzenia danego zapytania w Accessie.
Poniżej znajdziesz przykład wykorzystania Microsoft Access w celu utworzenia kodu SQL i przepisania go do arkusza maturalnego.


Utwórzmy nową tabelę Fotoradar i dodajmy do niej opisane w zadaniu pola: IdFotoradaru, Miejscowosc i DozwolonaPredkosc. Dodajemy również pole do tabeli Rejestr.

W nowej tabeli Fotoradar znajdują się pola IdFotoradaru, Miejscowosc i DozwolonaPredkosc.
Następnie ustalamy odpowiednie relacje:

Relacje utworzone pomiędzy tabelami zadania.
Najpierw należy utworzyć nowe zapytanie, dodając do niego tabele Fotoradar i Rejestr. Następnie zmieniamy typ sprzężenia tak, aby uwzględniał wszystkie rekordy z tabeli Fotoradar. Wystarczy wybrać Fotoradar.idFotoradaru oraz dowolne pole z tabeli Rejestr, stosując warunek IS NULL. Na końcu przepisujemy zapytanie SQL na arkusz maturalny, pomijając nawiasy. Jak widać, możliwe jest stworzenie kwerendy SQL nawet bez znajomości składni SQL.
| ANSI SQL | JET SQL |
|---|---|
| SELECT Fotoradar.IdFotoradaru FROM Fotoradar LEFT JOIN Rejestr ON Fotoradar.IdFotoradaru = Rejestr.IdFotoradaru WHERE Rejestr.IdFotoradaru Is Null; | SELECT Fotoradar.idFotoradaru FROM Fotoradar LEFT JOIN Rejestr ON Fotoradar.idFotoradaru = Rejestr.idFotoradaru WHERE (((Rejestr.idFotoradaru) Is Null)); |
Jak najbardziej tak, język SQL pojawia się w zadaniach na maturze. Przede wszystkim w przypadku zadań, które wymagają napisania kodu SQL na arkuszu maturalnym. Jeśli chodzi o polecenia wymagające użycia programu Microsoft Access, korzysta się z wbudowanych funkcji, które opierają się o język SQL.
Plik zawierający kod SQL posiada rozszerzenie .sql (Structured Query Language (SQL)). Jednak należy pamiętać, że w przypadku programu Microsoft Access, mowa o plikach baz danych z rozszerzeniem .mdb lub .accdb.
Uznawany jest za stosunkowo prosty język, jeśli chodzi o zadania maturalne. Potrzebna jest jednak praktyka, dzięki której używanie go okaże się szybkie i wygodne. W tym celu dobrze jest skorzystać z arkuszy maturalnych z lat poprzednich i rozwiązanie wszystkich zawartych z nich zadań.