Podstawowe informacje
SQL (ang. Structured Query Language) to strukturalny język zapytań, który powstał w latach 70. ubiegłego wieku. Używany jest do komunikacji z bazą danych. Na przykład umożliwia pobieranie oraz modyfikowanie danych w niej zawartych. Służy także do tworzenia struktury samej bazy danych oraz umieszczania w niej informacji.
Polecenia (zwane też zapytaniami) SQL dzieli się na cztery grupy:
• definiowanie i zmiana struktur, w których będą przechowywane dane. Najczęściej będą to bazy danych i tabele. Przykładowe polecenia: (CREATE, ALTER, DROP);
• dodawanie, zmiana i usuwanie danych w tabelach. Przykładowe polecenia (INSERT, UPDATE, DELETE);
• wyszukiwanie danych. Polecenie SELECT - będzie to najczęściej pojawiające się zapytanie w tym kursie.
Wielkość liter w poleceniach SQL nie ma znaczenia, jednak zwyczajowo pisze się je dużymi literami. Małe litery są używane do nazw tabel i kolumn.
Typy danych
Silnik bazodanowy wymaga na ogół, by podczas określania organizacji danych (czyli tworzenia tabel) wskazywać z jakimi danymi będzie miał do czynienia. Każda kolumna tabeli pozwala na niezależne od innych kolumn określenie typu danych jakie będą w niej przechowywane.
Ograniczymy się na początek do typów tekstowych i numerycznych.
TEXT, INTEGER, DOUBLE
Typy te wystarczą do wykonania większości ćwiczeń
Tworzenie tabel
Tabele w relacyjnej bazie danych są podstawową strukturą w której przechowywane są dane. Przed wprowadzeniem danych do systemu bazodanowego przeprowadzany jest proces projektowania tabel, związków między nimi, określania struktur pomocniczych (np. indeksy) itp.
Skupimy się na tworzeniu tabel.
Poleceniem SQL, które służy do tworzenia tabel jest:
CREATE TABLE nazwaTabeli (
kolumna1 typ1 [ograniczenia],
kolumna2 typ2 [ograniczenia]
);
Po wykonaniu tego polecenia pojawi się w bazie tabela o nazwie "nazwaTabeli" z dwiema kolumnami o nazwach "kolumna1" i "kolumna2" .
Nie ma ograniczeń na ilość kolumn w tabeli, lecz zwykle mieści się ona w zakresie od 1 do kilkunastu. Wielkość liter w nazwach tabel i kolumn jest bez znaczenia - więc nazwy "NAZWisko" i "Nazwisko" reprezentują tę samą kolumnę lub tabelę. Zwyczajowo polecenia SQL pisze się wielkimi literami, zaś nazwy tabel i kolumn małymi. Starajmy się unikać nazw z spacją. Najlepiej by nazwa rozpoczynała się literą z 26 znakowego zestawu łacińskiego lub znaku "_" a na następnych pozycjach do tego zbioru dołączamy cyfry. Pozostałe znaki mogą się pojawiać ale to zależy od konkretnego silnika bazodanowego i jego interpretera SQL. Przejścia do nowej linii oraz inne nadmiarowe białe znaki (spacje, tabulatory) między poszczególnymi elementami polecenia SQL są opcjonalne i zwykle służą ułatwieniu czytelności.
Ograniczenia, które są opcjonalnym składnikiem (dlatego podano je w nawiasie kwadratowym) mogą być następujące:
NOT NULL - podczas wprowadzania danych do wiersza ta kolumna nie może zawierać pustej wartości - zawsze powinna tu być wartość;
UNIQUE - w tej kolumnie wartości muszą być unikalne - nie może być dwóch wierszy z tą samą wartością w tej kolumnie;
CHECK - sprawdzenie, czy wartość spełnia jakieś wyrażenie (wyrażenie buduje się tak jak do klauzuli WHERE, która będzie omawiana później). Przykładowe ograniczenie:
CHECK (organ in ("serce", "nerka", "jelito")
spowoduje, że kolumnie o nazwie "organ" mogą się pojawić wybrane 3 wartości oraz NULL .
Dwie pozostałe klauzule trudno zaliczyć do ograniczeń, chociaż występują w miejscu gdzie podaje się ograniczenia, więc je tu wymienimy:
PRIMARY KEY - wartość w tej kolumnie będzie identyfikowała jednoznacznie wiersz (więc musi być unikalna). Zwykle kluczem jest kolumna z wartością liczby całkowitej z autoinkrementacją. Gdy podczas wprowadzania danych do tabeli pominiemy to pole, to system wstawi tu kolejną liczbę.
DEFAULT - wartość domyślna, gdy nie podamy wartości podczas wprowadzania danych.
Ograniczenia można łączyć rozdzielając je spacją.
Przykład utworzenia tablicy z ograniczeniami:
CREATE TABLE pacjenci (
pacjent_id INTEGER PRIMARY KEY,
nazwisko TEXT NOT NULL,
imie TEXT NOT NULL,
waga INTEGER DEFAULT 0,
email TEXT NOT NULL UNIQUE,
plec TEXT CHECK (plec in ("K", "M"))
);
Instrukcja SELECT - zaczynamy
Instrukcja SELECT (zapytanie) to najczęściej używane polecenie języka SQL. Umożliwia pobieranie wierszy z tabeli.
SELECT kolumna1, kolumna2
FROM nazwaTabeli;
Zapytanie zawiera listę kolumn (np. kolumna1, kolumna2), które mają być uwzględnione w wyniku końcowym. Klauzula FROM wskazuje tabelę, w której znajdują się podane kolumny (np. nazwaTabeli).
Użycie gwiazdki (*) zamiast nazw kolumn skutkuje wyświetleniem informacji ze wszystkich kolumn w danej tabeli.
SELECT *
FROM nazwaTabeli;
W dalszej części szkolenia przedstawimy kolejne klauzule i słowa kluczowe wykorzystywane w instrukcji SELECT, służące do budowania złożonych zapytań.
Przy pomocy klauzuli SELECT nie zawsze odwołujemy się do tabeli. Polecenie:
SELECT 5 * 4 + 1;
wyświetli wynik 21.
Z kolei zapytanie:
SELECT nazwa, 1.2 * cena
FROM towary;
odwołuje się do hipotetycznej tabeli z kolumnami nazwa i cena. W tym wypadku obok nazwy towaru wyświetlone zostaną ceny znajdujące się w tabeli towary powiększone o 20%. Proszę zwrócić uwagę na separator dziesiętny w postaci kropki.
W ostatnim przykładzie odwołujemy się do trzech kolumn (nazwa, cena, podatek) a wyświetlamy dwie. Zakładając, że w kolumnie cena przechowujemy cenę netto a w osobnej kolumnie mamy stawkę podatku, po poniższym zapytaniu:
SELECT nazwa, cena * (1 + podatek)
FROM towary;
należy się spodziewać nazw i cen brutto.
Operatory
Operatory
Operatorem nazywamy jeden lub kilka znaków, które mają specjalne znaczenie. W SQL mamy kilka grup operatorów. Na początkowym etapie nauki najważniejsze to:
- operatory arytmetyczne (+ - * / %);
- operatory porównania (= > < >= <= <>);
- operatory logiczne (AND OR NOT LIKE IN);
Co ciekawe operatory porównania w SQLite w kilku przypadkach są zdublowane (dwa różne operatory mają taką samą funkcjonalność), np.:
|
= |
== |
operator równości |
|
<> |
!= |
operator różności |
Operatory arytmetyczne
Operatory arytmetyczne to operatory dwuargumentowe występujące w notacji infiksowej, np. operator dodawania w wyrażeniu 6+9. Zachowane jest pierwszeństwo operatorów. Można je spotkać obliczając wyrażenie 5+10*4. Operatory dwuargumentowe mnożenie *, dzielenie / i reszta z dzielenia % są wykonywane przed dodawaniem + i odejmowaniem -. W wątpliwych sytuacjach wprowadzamy nawiasy ().
Operatory porównania
Operatory porównania to również operatory dwuargumentowe występujące w notacji infiksowej, np. operator równości w wyrażeniu a=b (alternatywny zapis a==b).
Operatory logiczne
Operatory logiczne AND (koniunkcja), OR (alternatywa) i NOT (negacja) działają na argumentach reprezentujących wartości logiczne - w wyniku zwracana jest wartość logiczna.
Operator LIKE wzorzec poszukuje wartości zgodnej ze wzorcem. W połączeniu z operatorem LIKE używane są symbole wieloznaczne:
- % reprezentujący dowolny ciąg znaków (uwaga: w MS ACCESS symbol *),
- _ zastępujący pojedynczy znak (uwaga: w MS ACCESS symbol ?).
Poniżej kilka przykładów:
|
SQLite |
MS ACCESS |
PRAWDA |
FAŁSZ |
|
LIKE 'a%' |
LIKE "a*" |
ale |
ela |
|
LIKE '%a' |
LIKE "*a" |
obraza |
atrakcje |
|
LIKE '%pol%' |
LIKE "*pol*" |
Opole |
oponka |
|
LIKE 'tro_' |
LIKE "tro?" |
trop |
tropy |
Operator IN jest skrótem dla wielu warunków OR, np. nazwa IN (wartość1, wartość2, wartość3) - odpowiada zapisowi nazwa = wartość1 OR nazwa = wartość2 OR nazwa = wartość3
Występuje także połączenie operatora NOT i IN, np. nazwa NOT IN (wartość1, wartość2, wartość3) - odpowiada zapisowi nazwa <> wartość1 AND nazwa <> wartość2 AND nazwa <> wartość3.
Filtrujemy wyniki przy pomocy klauzuli WHERE
Klauzula WHERE pozwala na podanie warunku, który muszą spełniać dane do wyświetlenia. Zapytanie:
SELECT *
FROM klienci
WHERE wiek >= 50;
Wyświetli tylko te wiersze w których kolumna wiek zawiera wartość większą bądź równą 50.
Warunek można rozbudowywać łącząc warunki spójnikami logicznymi OR i AND oraz używając nawiasów, czy też zaprzeczenia NOT. Wartości, które są sprawdzane w tabeli w wyniku zapytania nie muszą być wyświetlane:
SELECT nazwisko, imie
FROM klienci
WHERE ((wiek >= 65) OR (wiek <= 18)) AND (plec = 'm');
W przykładzie sprawdzaliśmy pola wiek i plec dość skomplikowanym warunkiem, ale nie zostały one wyświetlone.
