SQL jest językiem obsługi baz danych implementowanym przez praktycznie wszystkie systemy zarządzania bazami danych (SZBD) przeznaczone dla wielu użytkowników, częściowo ze względu na fakt, iż uzyskał on akceptację ANSI (Amerykańskiego Narodowego Instytutu Normalizacji) oraz ISO (Międzynarodowej Organizacji Normalizacyjnej) jako standardowy język zapytań dla relacyjnych baz danych.
Język SQL został opracowany przez korporację IBM w laboratorium badawczym w San Jose, we wczesnych latach 70. Prototyp SQL-a, zaprezentowany na konferencji ACM w 1974 roku nosił początkowo miano SEQUEL (Strukturalny Angielski Język Zapytań; ang. Structured English Query Language). Nazwa ta została później skrócona do SQL.
Znacznie ulepszona wersja SQL pojawiła się w 1989 roku pod nazwą SQL-89. Znaczna większość stosowanych dziś relacyjnych systemów SZBD obsługuje przynajmniej tę wersję języka.
W 1992 roku istniejący standard poddano kolejnemu unowocześnieniu (SQL-92), dzięki czemu SQL zyskał szereg nowych możliwości. Ponieważ SQL-92 jest rozszerzeniem SQL-89, starsze systemy zarządzania bazami danych mogły po niewielkich modyfikacjach pracować w nowym standardzie.
Aż do października 1996, producenci oprogramowania SZBD mogli przedstawiać swoje produkty instytutowi NIST (Narodowy Instytut Standardów i Technologii) w celu określenia ich zgodności ze standardami SQL. Proces testowania i certyfikacji stanowił silny bodziec do trzymania się obowiązujących norm -wynikiem standard SQL:1999. W 2003 przedstawiono SQL:2003 - nowy standard języka SQL. Został on opublikowany w Sigmod Record Vol. 33 No. 1 Marzec 2004. Jest to w zasadzie poprawione SQL:1999 z wyjątkiem części SQL/XML oraz kilku dodatkowych właściwości.
W takiej czy innej postaci, SQL jest niezwykle przydatnym narzędziem. Można go stosować do modyfikowania i wczytywania danych oraz do tworzenia i obsługi struktur bazodanowych. Nie jest to jednak język samodzielny. Pisząc aplikację obsługującą twoją bazę danych trzeba osadzać polecenia SQL w innym języku programowania.
Mówienie o zapytaniach przed utworzeniem bazy i wprowadzeniem do niej przykładowych danych może wydawać się dziwne, ale większość poleceń SQL-a wykorzystywanych do modyfikowania tabel wymaga wpierw odszukania danych, które należy podać modyfikacjom. Załóżmy więc, że dysponujemy gotową bazą danych, wypełnioną odpowiednimi informacjami.
SQL ma tylko jedno polecenie służące do odszukiwania danych: SELECT. Wbrew pozorom fakt ten nie stanowi ograniczenia. SELECT umożliwia wybieranie kolumn oraz wierszy, łączenie tabel, grupowanie danych i przeprowadzanie na nich prostych obliczeń. Pojedyncze wyrażenie SELECT wystarczy do wykonania dowolnej kombinacji działań algebry relacyjnej.
Oto podstawowa składnia polecenia SELECT:
SELECT kolumna1, kolumna2, ...
FROM tabela1, tabela2, ...
WHERE kryteria_wyboru
Klauzula SELECT określa kolumny, które chcemy ujrzeć w tabeli wynikowej. W klauzuli FROM podajemy nazwy tabel, które mają zostać przeszukane. Klauzula WHERE jest opcjonalna i zawiera kryteria, które mają być spełnione przez wszystkie zwracane wiersze.
Wyświetlanie wszystkich kolumn
Aby wyświetlić wszystkie kolumny z danej tabeli w kolejności, w której zostały one zdefiniowane, można skorzystać z gwiazdki (*). Eliminuje to konieczność wpisywania kolejnych nazw kolumn w wyrażeniu SELECT. Załóżmy, że chcemy wyświetlić wszystkich dostawców, u których nasza księgarnia zamawia książki. Wpisz:
SELECT *
FROM dostawcy
Wyświetlanie wybranych kolumn
Większość zapytań SQL-owych polega na wybraniu niektórych kolumny z analizowanych tabel i wyświetleniu ich w odpowiedniej kolejności. Należy w tym celu wypisać nazwy interesujących nas kolumn po słowie kluczowym SELECT w kolejności, w jakiej chcemy je ujrzeć na wydruku. Przyjrzyjmy się zapytaniu wybierającemu numery telefonów i nazwy dostawców z naszej przykładowej bazy danych:
SELECT TelefonDost, NazwaDost
FROM Dostawcy
Usuwanie duplikatów
Unikatowe wartości kluczy podstawowych uniemożliwiają wprowadzenie dwóch identycznych wierszy do danej tabeli bazowej. Jeśli jednak wybierasz z analizowanej tabeli tylko niektóre kolumny, może się zdarzyć, że tabela wynikowa będzie zawierać duplikaty.
Aby usunąć duplikaty z tabeli wynikowej, należy po słowie kluczowym SELECT dopisać DISTINCT:
SELECT DISTINCT NumerKli, NumerKartyKred
FROM Zamówienia
Operacja rzutowania
Wybierając z tabeli interesujące nas kolumny, żądamy od SZBD dokonania operacji rzutowania. Rzutowanie polega na wyodrębnieniu wartości wskazanych kolumn ze wszystkich wierszy w tabeli. Ponieważ system zarządzania nie musi analizować wybieranych wartości, rzutowanie należy do operacji szybkich.
Mówiąc o rzutowaniu należy zwrócić uwagę na pewien problem: SZBD wybierze z podsuniętej mu tabeli żądane kolumny nie zwracając uwagi czy wybór ten jest logiczny, czy nie. Przyjrzyj się następującemu zapytaniu:
SELECT NumerZam, Suma
FROM ZamówioneKsiążki
Sortowanie tabeli wynikowej
O ile nie zdecydujesz inaczej, wiersze w tabeli wynikowej będą miały taką samą kolejność jak w tabeli źródłowej. Jeśli chcesz zmienić porządek wierszy, musisz dodać klauzulę ORDER BY do wyrażenia SELECT.
Dopisanie klauzuli ORDER BY spowoduje posortowanie tabeli wynikowej w kolejności alfabetycznej:
SELECT *
FROM Wydawcy
ORDER BY NazwaWydawcy
Po słowach kluczowych ORDER BY następuje nazwa kolumny lub kolumn, względem których ma zostać posortowana tabela wynikowa. Jeśli podasz nazwę więcej niż jednej kolumny, wówczas pierwsza kolumna zostanie wzięta pod uwagę przy sortowaniu zewnętrznym, następna - przy sortowaniu wewnętrznym pierwszego stopnia itp.
Weźmy dla przykładu następujące wyrażenie:
SELECT NazwiskoKli, KodPocztowyKli
FROM Klienci
ORDER BY NazwiskoKli, KodPocztowyKli
Wynik został posortowany według nazwisk klientów, a wewnętrznie - według numerów kodów pocztowych.
Jeśli odwrócimy kolejność kolumn, według których nasza tabela ma zostać posortowana:
SELECT NazwiskoKli, KodPocztowyKli
FROM Klienci
ORDER BY KodPocztowyKli, NazwiskoKli
ASC, DESC!!!!
Otrzymamy listę posortowaną według numerów kodów pocztowych, a wewnętrznie - według nazwisk klientów.
Podobnie jak w przypadku kolumn, można ograniczać zawartość zwracanej tabeli przez wyrażenie SELECT do interesujących nas wierszy. Kryteria wyboru wierszy wpisujemy w klauzuli WHERE. Wyrażenie logiczne następujące po WHERE określane jest mianem predykatu. Jeśli dany wiersz spełnia kryteria wyboru (innymi słowy, wartość logiczna predykatu dla zawartych w tym wierszu danych jest równa 1), wówczas zostaje on włączony do tabeli wynikowej. Poniższe operatory porównania są wykorzystywane w wyrażeniach i warunkach do porównywania dwóch wyrażeń. Wynikiem działania operatorów porównania jest zawsze wartość logiczna (TRUE lub FALSE).
Operator |
Opis |
Przykład |
( ) |
Zmienia normalną kolejność wykonywania działań |
... NOT (A=1 OR B=1) |
= |
Sprawdza, czy dwa wyrażenia są równe |
... WHERE PLACA = 1000 |
!=, ^=, <> |
Sprawdza, czy dwa wyrażenia są różne |
... WHERE PLACA != 1000 |
> |
Większe niż |
... WHERE PLACA > 1000 |
< |
Mniejsze niż |
... WHERE PLACA < 1000 |
>= |
Większe lub równe niż |
... WHERE PLACA >= 1000 |
<= |
Mniejsze lub równe niż |
... WHERE PLACA <= 1000 |
Wpisując z obu stron wyrażenia nazwy kolumn należy pamiętać, że predykat stosuje się oddzielnie do każdego wiersza tabeli. Można więc porównywać wartości przechowywane w dwóch różnych kolumnach tego samego wiersza, ale nie można w ten sposób porównywać wartości tej samej kolumny w dwóch różnych wierszach.
SZBD opiera ocenę wartości logicznej na typie porównywanych danych
Dane liczbowe - na zwykłej kolejności liczb
Dane tekstowe - na kolejności alfabetycznej
Dane daty, godziny - na kolejności chronologicznej.
Do konstrukcji złożonych warunków służą operatory logiczne. Wykonują one obliczenia na wartościach typu logicznego (w szczególności będących wynikiem obliczania warunków).
Operator |
Opis |
Przykład |
( ) |
Zmienia normalną kolejność wykonywania działań |
SELECT ... WHERE x = y AND (a = b OR p = q) |
NOT |
Zaprzeczenie wyrażenia logicznego |
...WHERE NOT (zawod IS NULL) ...WHERE NOT (A=1) |
AND |
Logiczne 'i'. Wynik jest równy TRUE, jeśli wartości obu operandów są równe TRUE |
... WHERE A = 1 AND B = 2 |
OR |
Logiczne 'lub'. Wynik jest równy TRUE, jeśli wartość przynajmniej jednego operandu jest równa TRUE |
... WHERE A = 1 OR B = 3 |
Poniższe tabele przedstawiają wynik działania operatora AND i OR dla różnych wartości:
AND |
true |
false |
null |
|
OR |
true |
false |
null |
True |
true |
false |
null |
|
True |
true |
true |
true |
False |
false |
false |
false |
|
False |
true |
false |
null |
Null |
null |
false |
null |
|
Null |
true |
null |
null |
Jeśli utworzymy wyrażenie zawierające więcej niż jeden operator logiczny, system zarządzania będzie musiał zdecydować, w jakiej kolejności należy analizować poszczególne wyrażenia proste. O ile nie zarządzimy inaczej, SZBD zastosuje się do tzw. hierarchii operatorów. Zgodnie z tą hierarchą, najpierw ustalone są wartości logiczne wyrażeń prostych, a następnie bierze się pod uwagę operatory. Tam gdzie znajduje się więcej niż jeden operator logiczny tego samego typu, analiza postępuje od lewej do prawej. System zarządzania przyznaje wyższy priorytet wyrażeniom znajdującym się wewnątrz nawiasów.
SQL udostępnia szereg operatorów specjalnych, ułatwiających konstruowanie wyrażeń logicznych. Operatory te to między innymi BETWEEN, LIKE, IN , ALL, ANY, EXISTS oraz IS NULL.
ANY |
Porównuje wartość z każdą wartością ze zbioru po prawej stronie. Musi być poprzedzony jednym z operatorów: =, !=, >, <, <=, >=. Zwraca TRUE, jeśli przynajmniej jeden z elementów spełnia podany warunek. |
... WHERE PLACA = ANY (SELECT PLACA FROM PRAC WHERE WYDZIAL=30) |
IN |
Równy dowolnemu elementowi. Synonim do " = ANY" |
... WHERE ZAWOD IN ('URZEDNIK', 'INFORMATYK') ... WHERE PLACA IN (SELECT PLACA FROM PRAC WHERE WYDZIAL=30) |
ALL |
Porównuje wartość z każdą wartością ze zbioru po prawej stronie. Musi być poprzedzony jednym z operatorów: =, !=, >, <, <=, >=. Zwraca TRUE, jeśli każdy z elementów spełnia podany warunek. |
...WHERE (PLACA, PREMIA) >= ALL ((14900, 300), (3000, 0)) |
BETWEEN x AND y |
większy lub równy x i mniejszy lub równy y. |
... WHERE A BETWEEN 1 AND 9 |
EXISTS |
Zwraca TRUE jeśli zapytanie zwraca przynajmniej jeden wiersz. |
... WHERE EXISTS (SELECT PLACA FROM PRAC WHERE WYDZIAL= 30) |
LIKE |
spełnia podany wzorzec. Litera '%' jest używana do zapisywania dowolnego ciągu znaków (0 lub więcej), który nie jest równy NULL. Litera '_' zastępuje dowolną pojedynczą literę. |
... WHERE STAN LIKE 'T%' |
IS NULL |
jest równe NULL. |
... WHERE ZAWOD IS NULL |
Obliczenia i grupowanie.
Wprawdzie SQL nie jest samodzielnym językiem programowania ale można za jego pomocą prowadzić proste obliczenia i operacje agregujące. SQL potrafi prowadzić proste operacje arytmetyczne na wartościach kolumn i na stałych (jeśli używamy osadzonego SQL-a, możemy korzystać ze zmiennych języka bazowego). Przykładowo jeśli tabela zawiera pola ilość, cena_jednostkowa_netto , stawka_vatu to możemy przy pomocy polecenia SELECT uzyskać nową kolumnę będącą wartością brutto.
SELECT ilość, cena_jednostkowa_netto , stawka_vatu, (ilość*cena_jednostkowa_netto)*(1+stawka_vatu/100) as wartość_brutto
FROM ZAKUPY
Jeżeli kolumnie wyliczeniowej nie nadamy nazwy to kolumna ta otrzyma domyślną nazwę najczęściej wygenerowaną z formuły wyliczającej.
Operatory arytmetyczne
Standardowo SQL rozpoznaje podstawowe operatory arytmetyczne:
mnożenie *
dzielenie /
dodawanie +
odejmowanie -
dzielenie modulo - % (MS SQL Server)
Powyższe uporządkowanie związane jest z hierarchią operatorów. Najwyższy priorytet mają mnożenie i dzielenie, zaś najniższy dodawanie i odejmowanie. Jeśli dane wyrażenie zawiera kilka operatorów o tym samym priorytecie, wówczas będą one analizowane od lewej do prawej.
Standardowe Typy Danych Liczbowych w Sql.
INTEGER (skrót INT): liczba całkowita (dodatnia lub ujemna). Ilość bitów poświęconych na przechowanie takiej liczy zależy od implementacji. ( standard w komp. typu desktop to 16-32 bity)
SMALLINT: krótka liczba całkowita - zazwyczaj o połowę krótsza od zwykłej liczby całkowitej.
NUMERIC: stałoprzecinkowa liczba rzeczywista. Przykład NUMERIC(6,2) 3456,73
DECIMAL: stałoprzecinkowa liczba rzeczywista, podobna do typu NUERIC ale w przypadku DECIMAL system zarządzania może przechowywać więcej cyfr po przecinku niż zostało to ustalone i może to poprawiać dokładność obliczeń.
REAL: zmiennoprzecinkowa liczba o „ pojedynczej precyzji”
DOUBLE PRECISION (DOUBLE): zmiennoprzecinkowa liczba o „ podwójnej precyzji”
FLOAT: zmiennoprzecinkowa liczba o wybieralnej precyzji
Typy Danych Liczbowych W Ms Sql Sever 2005
Liczby całkowite.
Istnieją cztery rodzaje danych typu całkowitego (integer), które mogą przechowywać dokładne, skalarne wartości : bigint, int, smallint, tinyint. Różnica pomiędzy typami tych danych całkowitych występuje w ilości przestrzeni pamięci, której wymagają, oraz w zakresie wartości jakie mogą przechowywać. Poniższa tabela pokazuje typy danych i ich zakresy.
Typ danych |
Długość (w bajtach) |
Zakres |
tinyint |
1 |
0-255 |
smallint |
2 |
-32767 do +32767 |
int |
4 |
- + 2147483657 |
bigint |
8 |
- + 2^63 |
Przybliżone i dokładne liczbowe typy danych
MS SQL Server zezwala na dwa typy przybliżonych danych (float i real), jak i na dwa dokładne typy danych liczbowych (decimal i numeric).
Przybliżonymi typami danych są float i real. Liczby przechowywane za pomocą tych typów danych zapisywane są w postaci pary : mantysy i wykładnika. Algorytm, używany do określania takiej pary może okazać się mało precyzyjny dla liczb z górnego zakresu precyzji. Liczby zmiennoprzecinkowe i rzeczywiste są przydatne do danych naukowych i statystycznych, dla których absolutna dokładność nie jest niezbędna ale potrzebny jest zakres wartości od bardzo małych do bardzo dużych.
Liczby rzeczywiste mają precyzję 7 cyfr i wymagają 4 bajtów. Jeżeli zadeklarowany będzie typ float o precyzji mniejszej niż 7, to tak naprawdę zostanie utworzony kolumna typu rzeczywistego (real).
Przykład
Liczby 23487,23 45,98763 można przechować w kolumnie typu real, ale 8,4557987 już nie.
Typy float mogą mieć dokładność od 1 do 38. Domyślna precyzja dla typu float to 15 cyfr.
( na danych typy float, real nie można wykonywać dzielenia modulo; generalnie unikamy typów float, real gdyż wyniki obliczeń mogą być zaskakujące)
Dokładne typy danych liczbowych to decimal i numeric. Dokładność jest utrzymywana do najmniej znaczącej cyfry. Jeżeli deklarujemy dokładny typ danych numerycznych, należy określić dwa składniki : precyzję i skalę. Jeśli nie zostaną określone to przyjmowane są wartości domyślne 18 i 0.
Funkcje Matematyczne (W Ms Sql Sever 2005)
Oto niektóre dostępne funkcje matematyczne:
ABS(X) Moduł z X.
CEILING(X) Zaokrąglenie w górę (do całkowitej) X-a.
FLOOR(X) Zaokrąglenie w dół (do całkowitej) X-a.
EXP() funkcja wykładnicza o podstawie E
POWER(X,Y) Zwraca X do potęgi Y.
ROUND(X,Y) Zaokrągla X do Y miejsc po przecinku
SIGN(X) -1 gdy X<0, +1 gdy X>0, 0 gdy X=0
SQRT(X) Pierwiastek kwadratowy z X.
LOG() funkcja logarytm naturalny
LOG10() funkcja logarytm dziesiętny
COS, SIN, COT, TAN() funkcje trygonometryczne
ACOS, ASIN, ATAN() funkcje cyklometryczne
PI() liczba Pi
RAND() losowa liczba z przedziału [0,1]
Typy DANYCH TEKSTOWYCH
CHARACTER (skrót CHAR): łańcuch tekstowy o stałej długości. Deklarując ten typ należy wskazać długość łańcucha (w MS SQL maksymalnie 8000 znaków brakujące znaki zastępowane są spacjami). ---- CHAR(25)
CHARACTER VARYING (skrót VARCHAR) : ): łańcuch tekstowy o zmiennej długości. Deklarując ten typ należy wskazać dopuszczalną długość łańcucha. ----- VARCHAR(25)
Funkcje znakowe
Składnia |
Przeznaczenie |
Przykład |
CHR(n) |
Zwraca znak o podanym kodzie |
CHR(65) Wynik: "A" |
LOWER(string) |
Zamienia wszystkie litery w podanym stringu na małe. |
LOWER('PAN JAN NOWAK') Wynik: "pan jan nowak" |
LTRIM(string ) |
Zwraca dane bez spacji na początku |
LTRIM(' Ostatnie słowo') Wynik: ”Ostatnie słowo" |
REPLACE(string1, string2 , string3 ) |
Zastępuje wszelkie wystąpienia łańcucha string2 w łańcuchu string1 przez string3 |
REPLACE('Jack & Jue', 'J', Bl') Wynik: "Black & Blue" |
RTRIM(string) |
Zwraca dane bez spacji na końcu |
RTRIM('Ostatnie słowo `) Wynik: "Ostatnie słowo” |
SOUNDEX(string) |
Zwraca ciąg znaków reprezentujący wymowę słów wchodzących w skład string. Funkcja SOUNDEX może być użyta do porównywania słów zapisywanych w różny sposób, ale wymawianych tak samo. |
SELECT nazwisko FROM bibl WHERE SOUNDEX(nazwisko) = SOUNDEX('Mickiewicz'); |
SUBSTRING(string, m , n) |
Zwraca podciąg z ciągu znaków string zaczynający się na znaku m i o długości n. Jeśli n nie jest podane, to zwracany jest podciąg od znaku m do ostatniego w string. Pierwszy znak w ciągu ma numer 1. |
SUBSTR('ABCDE',2, 3) Wynik: "BCD" |
UPPER(string) |
Zamienia wszystkie znaki z ciągu string na duże litery. |
UPPER('Jan Nowak') Wynik: "JAN NOWAK" |
ASCII(string) |
Zwraca kod ASCII pierwszej litery w podanym ciągu znaków |
ASCII('A') Wynik: 65 |
|| + |
Funkcja dwu argumentowa dodawania łańcuchów, konkatencja |
|