W liście wyboru możemy wstawić informację jakie zostaną zawarte obliczenia na danych liczbowych i stałych.

Możemy użyć następujących operatorów arytmetycznych:

Symbol           Operacja

+                     dodawanie

–                      odejmowanie

/                       dzielenie

*                      mnożenie

Działania arytmetyczne- możemy je wykonywać w dowolnej kolumnie liczbowej. Dodatkowo możemy też wykorzystywać operator dzielenia modulo, oznaczamy go jako %. Daje on nam możliwość otrzymania reszty z dzielenia dwóch liczb całkowitych. Istnieje również możliwość wykonywania działań arytmetycznych na kolumnach zawierających dane typu data.

Wszystkie operatory mogą być stosowane na liście wyboru. Możemy ich używać w dowolnej kombinacji niezależnie do nazwy kolumny czy stałej numerycznej.

Możemy zobaczyć jak będą wyglądały ceny samochodów po podwyżce o 10 %.

select typ_samochodu, cena*1.10

from szczegoly zaplaty

Wynik:

select-mnozenie

 Wybieranie tabel: lista tabel

Lista tabel- obejmuje ona nazwy tabel, perspektyw lub jednych i drugich, zawierające kolumny wymienione na liście wyboru oraz w klauzuli WHERE. Nazwy tabel na liście tabel jak zawsze oddzielamy przecinkami. Klauzule FROM przedstawiamy w następujący sposób:

select lista wyboru

from [kwalifikator] {nazwa tabeli | nazwa perspektywy}

Możemy używać pełnych nazw tabel na liście tabel i perspektyw wraz z nazwami baz danych i właścicieli jako kwalifikatorów.  Korzystać z pełnych nazw powinniśmy w chwili kiedy pojawia się możliwość popełnienia błędu w wyborze właściwej nazwy.

W celu zaoszczędzenia pisania nazwom tabel możemy nadać aliasy. Nadając aliasy na liście tabel, podajemy alias po nazwie tabeli.

select k.id_klienta, k.nazwisko

from klienci k

Litera k poprzedzająca nazwę każdej kolumny na liście wyboru działa jako alternatywa dla pełnej nazwy tabeli.

select klienci.id_klienta, klienci.nazwisko

from klienci

W przypadku zapytania zawierającego jedna tabele nie mamy tu mowy o niejednoznaczności, którą kolumnę wybrać. W takim przypadku użycie nazwy tabeli lub aliasu jako identyfikatora, zależy tylko do użytkownika. Aliasy są najbardziej użyteczne w zapytaniach które składają się z wielu tabel, ponieważ musimy rozróżniać kolumny z wielu tabel.

Wybieranie wierszy: klauzula WHERE

Klauzula WHERE jest częścią zapytania SELECT, w której podajemy warunki wyszukiwania. Dokładnie określa warunki, które wiersze zostaną wyszukane w bazie.

Ogólna postać zapytania:

select lista wyboru

from lista tabel

where warunki wyszukiwania

Podczas konstruowania zapytania SELECT zawierającego klauzule WHERE, system weryfikuje czy zostały spełnione warunki i wybiera odpowiednie wiersze.

Język SQL zawiera masę rozmaitych operatorów i słów kluczowych, służących do definiowania warunków wyszukiwania.

  • operatory porównawcze (=, <, >, itd.)
  • kombinacje i logiczne negacje warunków (AND, OR, NOT)
  • przedziały (BETWEEN i NOT BETWEEN)
  • listy (IN, NOT IN)
  • wartości nieznane (IS NULL i IS NOT NULL)
  • zgodność znakowa (LIKE i NOT LIKE)

Operatory porównawcze

Często zdarza się, że musimy porównać ze sobą jakieś wartości. Musimy się dowiedzieć, co jest „większe” bądź „mniejsze” lub „leży niżej” w sortowaniu alfabetycznym, lub też sprawdzić czy jest „równe” jakieś wartości. W języku SQL zawarte są następujące operatory porównania:

Operator      Znaczenie

=                     równe

>                     większe niż

<                     mniejsze niż

>=                   większe niż lub równe

<=                   mniejsze niż lub równe

!=                    nie równe (lub)

<>                   nie równe

Operatory stosujemy w następujący sposób

where wyrażenie operator porównawczy wyrażenie

Wyrażenie może być nazwą kolumny, stałą, podzapytaniem, funkcją lub dowolną kombinacją wcześniej wymienionych elementów połączonych wyrażeniami arytmetycznymi. Operatory logiczne głownie używane z operatorami  liczbowymi, choć możemy je stosować z danymi typu char lub varchar bądź też datami. Kidy stosujemy wartości typu znakowego lub daty musimy pamiętać aby umieścić je w cudzysłowach. Kiedy porządkujemy wielkie i małe litery oraz znaki specjalne ich kolejność zależy od kolejności znaków określonych przez system bazodanowy.

SELECT typ_samochodu, cena

FROM szczegoly zaplaty

where cena > 500

Wynik:

select-wieksze

Powyższa instrukcja pozwala nam na wyszukanie cen samochodów większych niż 500 PLN.

SELECT nazwisko, imie

FROM klienci

WHERE nazwisko > ‚dykiel’

Wynik:

select-wieksze2

Instrukcja wyszukuje klientów, których nazwiska występują w porządku leksykograficznym po Dykiel.

SELECTnazwisko, miasto, telefon

FROM klienci

WHERE miasto = ‚warszawa’

Wynik:

select-rowne

Zapytanie pozwala nam wyszukać klientów mieszkających w Warszawie oraz ich numery telefonu. Jeżeli chcielibyśmy znaleźć np. wszystkich klientów poza tymi mieszkającymi w Warszawie należy zmienić operator na „nie równe” (!=).

Łączenie warunków z operatorami logicznymi

Jeżeli zdarzy nam się taka sytuacja, że w naszym zapytaniu musimy skorzystać z więcej niż jednego warunku stosujemy wtedy operatory logiczne AND, OR I NOT.

Za pomocą operator AND łączymy dwa lub więcej warunków, wynik zostanie zwrócony kiedy wszystkie warunki zostaną spełnione.

SELECT marka,model,rok produkcji,moc km

FROM samochody

WHERE rok produkcji > ‚2005’

and moc km > ‚400’

Wynik:

select-and

Zapytanie wyszukuje nam samochody wyprodukowane po roku 2005 oraz które posiadają więcej niż 400 koni mechanicznych .

Operator OR również łączy ze sobą dwa lub więcej warunków, lecz wynik jest zwracany w momencie gdy którykolwiek z warunków zostanie spełniony.

SELECT marka, model, rok produkcji, moc km

FROM samochody

WHERE marka = ‚alfa romeo’

or marka = ‚ferrari’

Wynik:

select-or

Za pomocą tego zapytania wyszukujemy wiersze zawierające w kolumnie marka samochody o nazwie ferrari lub alfa romeo.

Operatora logicznego NOT używamy do zaprzeczenia wyrażenia. Kiedy go używamy go z operatorami porównania, umieszczamy go przed wyrażeniami, nie jak przed operatorami porównania.

SELECT nazwisko, miasto

FROM klienci

WHERE not miasto = ‚warszawa’

Zapytanie jest równoznaczne do poniższego zapytania

SELECT nazwisko, miasto

FROM klienci

WHERE miasto != ‚warszawa’

Wynik:

select-rowne2

Priorytety operatorów logicznych.

W przypadku operatorów logicznych jak i arytmetycznych, są one realizowane zgodnie z regułami pierwszeństwa. Kiedy stosujemy w jednej instrukcji jednocześnie oba rodzaje operatorów, wtedy operacje arytmetyczne wykonywane są przed operacjami logicznymi. Jednak kiedy w zapytaniu występuje więcej niż jeden operator logiczny, wtedy najpierw wykonywany jest operator NOT, potem AND, na końcu OR.

sql-hierarchia
Hierarchia wykonywania operatorów logicznych

SELECT *

FROM samochody

WHERE marka = ‚alfa romeo’

or marka = ‚ferrari’

and moc km > ‚400’

Wynik :

select-or-and

Zapytanie wyszukuje wszystkie samochody marki ferrari oraz wszystkie samochody marki alfa romeo które posiadają więcej niż 400 koni mechanicznych. Warunek odnoszący się do ilości koni mechanicznych dotyczy tylko marki alfa romeo, a nie do marki ferrari ponieważ operator AND jest wykonywany przed OR. Dlatego w wyniku otrzymaliśmy wszystkie samochody marki ferrari potem zostały wyszukane wszystkie samochody marki alfa romeo o mocy większej niż 400 koni mechanicznych.

SELECT *

FROM samochody

WHERE (marka = ‚alfa romeo’

or marka = ‚ferrari’)

and moc km > ‚400’

Wynik:

select-or-and2

Po dodaniu nawiasów otrzymaliśmy samochody o moc powyżej 400 koni mechanicznych, zapytanie zostało zrealizowane zgodnie z zasadami pierwszeństwa. Najpierw zostały wyszukane wszystkie samochody marek ferrari i alfa romeo a potem wybrane spośród nich te o mocy większej niż 400 koni mechanicznych.

Przedziały BETWEN I NOT BETWEEN

Kolejnym przydatnym warunkiem wyszukiwania są przedziały. Możemy je realizować na dwa sposoby:

– przy pomocy operatorów >  i <,

-przy pomocy słowa kluczowego BETWEEN.

Klauzuli BETWEEN powinniśmy używać do określenia przedziały domkniętego, kiedy poszukujemy wartości najmniejszej i największej oraz wartości zawartych między nimi.

SELECT marka, model, moc km

FROM samochody

Where moc km between 320 and 550

Wynik:

select-between

Takie zapytanie pozwala nam wyszukać wszystkie samochody w bazie o mocy z przedziału między 320 a 550 koni mechanicznych. Możemy zauważyć, że wynik zawiera samochód o mocy 32o km . W taki sposób możemy zaobserwować czym różni się przedział wyznaczony przez BETWEEN od przedziału określonego za pomocą warunku większy niż- mniejszy niż (><).

SELECT marka, model, moc km

FROM samochody

Where moc km > 320 and moc km < 550

Wynik:

select-and2

Od razu można zauważyć, że to samo zapytanie z użyciem operatorów większy niż i mniejszy niż zwraca nam inne wyniki, ponieważ wyznaczony przedział nie jest przedziałem domkniętym .

Wyrażenia NOT BETWEEN używamy do wyszukania wszystkich wierszy znajdujących się poza zdefiniowanym przedziałem.

SELECT marka, model, moc km

FROM samochody

Where moc km not between 320 and 550

Wynik:

select-not-between

Przy pomocy tego zapytanie udało nam się znaleźć wszystkie samochody o mocy nie mieszczącej się w przedziale od 320 do 550 koni mechanicznych.

Listy IN i NOT IN

Słowa kluczowego IN używamy do wybierania wartości pokrywającej się z którąkolwiek wymienioną na liście wartością. Wszystkie elementy następujące po IN muszą być oddzielone przecinkami oraz zawarte w między nawiasami okrągłymi.

SELECT nazwisko, miasto

FROM klienci

WHERE miasto in (‚warszawa’, ‚kraków’)

Wynik:

select-in

Jeżeli potrzebujemy poznać nazwiska klientów zamieszkujących Kraków oraz Warszawę, wystarczy po operatorze IN w nawiasie wymienić wszystkie miasta które nas interesują.

Operator not in spowoduje wyszukanie klientów, którzy nie spełniają warunków zawartych w zapytaniu.

SELECT nazwisko, miasto

FROM klienci

WHERE miasto not in (‚warszawa’, ‚kraków’)

Wynik:

select-not-in

Takie zapytanie pozwoliło nam wyszukać wszystkich klientów nie zamieszkujących Krakowa i Warszawy.

Wybierania wartości null

Wartość NULL zawiera nieznaną wartość, czyli nie oznacza ona ani zera ani pustego miejsca. Z racji tego, że nul reprezentuje wartość nieznaną nie możemy go porównać z niczym innym, nawet z innymi null. Wartość null nie jest ani większe, ani mniejsze, ani równe jakiejkolwiek wartości, gdyż null jest nieznane. Za to istnieje możliwość wyszukiwania wierszy zawierające wartość null lub not null, do wyszukiwania służy następująca składnia:

WHERE nazwa klumny is (not) null

Taki wzorzec możemy również stosować z innymi operatorami porównania.

SELECT nazwisko, imie, pesel, miasto

FROM klienci

Where miasto = ‚warszawa’

or pesel is null

Wynik:

select-null

Powstaje nam zapytanie które przedstawia klientów zamieszkujących Warszawę oraz pesel o wartości null.

Dopasowywanie wyników: LIKE

Czasami zdarza nam się, że chcemy wyszukać jakąś wartość ale do końca nie posiadamy dokładnej wartości. Np.:

  • Chcemy wyszukać klienta po nazwisku ale dokładnie nie pamiętamy czy nazywa Kowalski czy też Kowalczyk.
  • Potrzebujemy wyszukać numer rejestracyjny samochodu zaczynającego się na KR.

Jeżeli znamy jakiś wzorzec który możemy użyć aby odnaleźć cały wiersz lub jego część. Do takiego wyszukiwania wyników przeznaczone jest słowo kluczowe LIKE. Możemy go używać z polami znakowymi. Z polami zdefiniowanymi jako liczby całkowite, waluty, liczby dziesiętne lub zmiennopozycyjne takie wyszukiwanie nam nie zadziała.  Oto składnia:

Where nazwa kolumny (NOT) LIKE ’wzorzec’ (ESCAPE znak ucieczki)

Wzorzec musi być zawarty w cudzysłowie oraz zawierać jeden lub więcej znaków uniwersalnych. Używamy słowa kluczowego ESCAPE, kiedy wzorzec zawiera jeden ze znaków uniwersalnych, który musimy potraktować jako literał.

W SQL dostępne są dwa znaki uniwersalne, które możemy stosować z LIKE:

% – zastępuje on dowolny napis składający się z zera lub większej liczby znaków

_ – zastępuje jeden dowolny znak

SELECT nazwisko, imie

FROM klienci

WHERE nazwisko like ‚ko%’

Wynik:

select-like

Zapytanie poszukuje nazwisk zaczynających się od liter „ko” i składającego się z dowolnej liczby znaków. Możemy również zauważyć, że znaki uniwersalne umieszczone są wewnątrz cudzysłowów.

SELECT nazwisko, imie

FROM klienci

WHERE nazwisko like ‚%ow%’

Wynik:

select-like2

Czasami zdarza się, że nie wiemy co jest na początku czy na końcu oraz nie wiemy czy na początku jest wielka czy mała litera. Możemy uwzględnić taką możliwość, nie umieszczając pierwszej litery we wzorcu tylko stosujemy same znaki uniwersalne na początku i końcu wzorca. Takie zapytanie pozwala nam wyszukać nazwisko nawet jeżeli nie znamy początkowej jaki i końcowej części nazwiska.

SELECT nazwisko, imie

FROM klienci

WHERE nazwisko like ‚_owalsk_’

Wynik:

select-like3

Jeżeli nie znamy brakujących znaków a znamy ich liczbę możemy zamiast brakującego znaku zastosować znak uniwersalny dla każdego znaku. W tym zapytaniu używamy znaku podkreślenia dla każdej brakującej litery.

Znaków uniwersalnych możemy używać także z NOT LIKE. Kiedy byśmy chcieli znaleźć wszystkie nazwiska które nie zaczynają się na „Ko”.

SELECT nazwisko, imie

FROM klienci

WHERE  nazwisko not LIKE ‚ko%’

Znaków uniwersalnych używamy głownie ze słowem kluczowym LIKE. Bez słowa LIKE będą one traktowane dosłownie i traktowane jako wartość.

Dodaj komentarz