Wersja 3.6
Dokument ten jest podręcznikiem SQL i jest pionierskim dokumentem w tej klasie, jako że jest pierwszym pełnym podręcznikiem SQL dostępnym w sieci. SQL umożliwia użytkownikom dostęp do danych w relacyjnych DBMS-ach (database management systems) takich jak Oracle, Sybase, Informix, Microsoft SQL Server, Access i innych, pozwalając użytkownikom na opis danych, które chcą obejrzeć. SQL pozwala też użytkownikom definiować dane w bazie i manipulować tymi danymi. Ten dokument opisze jak używać SQL i zademonstruje to na przykładach. SQL, którego będziemy używać w tym dokumencie to "ANSI", czyli standardowy SQL - żadnych rozszerzeń konkretnych implementacji DBMS-ów nie będziemy omawiać aż do rozdziału "Niestandardowy SQL". Zalecane jest, żebyś wydrukował sobie ten dokument, aby mieć łatwy dostęp do tekstu i przykładów.
NumerUbezpieczeniaSocjalnego | Imie | Nazwisko | Adres | Miasto | Stan |
---|---|---|---|---|---|
512687458 | Joe | Smith | 83 First Street | Howard | Ohio |
758420012 | Mary | Scott | 842 Vine Ave. | Losantiville | Ohio |
102254896 | Sam | Jones | 33 Elm St. | Paris | New York |
876512563 | Sarah | Ackerman | 440 U.S. 110 | Upton | Michigan |
Zapytanie to wywoła następujący rezultat dla tej tabeli:
Imie | Nazwisko | Adres | Miasto | Stan |
---|---|---|---|---|
Joe | Smith | 83 First Street | Howard | Ohio |
Mary | Scott | 842 Vine Ave. | Losantiville | Ohio |
Sam | Jones | 33 Elm St. | Paris | New York |
Sarah | Ackerman | 440 U.S. 110 | Upton | Michigan |
Aby wyjaśnić, co przed chwilą zrobiłeś, powiem, że zapytałeś o wszystkie dane z tabeli TabelaAdresowPracownikow, a dokładniej, zapytałeś o kolumny "Imie", "Nazwisko", "Adres", "Miasto", "Stan". Zauważ, że nazwy kolumn i nazwy tabel (czyli baz danych) nie mają spacji... Muszą być wprowadzane jako jedno słowo. Zauważ też, że polecenie kończy się średnikiem (;). Ogólna forma polecenia SELECT, odczytująca wszystkie wiersze w tabeli to:
Aby odczytać wszystkie kolumny z tabeli bez wpisywania ich nazw, wykorzystaj:
Każdy DBMS czy oprogramowanie bazodanowe ma inne metody łączenia się z bazą danych i wprowadzania komend SQL; spytaj lokalnego "guru" komputerowego by pomógł ci użyć SQL na danym systemi.
NumerIDPracownika | Pensja | Zyski | Stanowisko |
---|---|---|---|
010 | 75000 | 15000 | Kierownik |
105 | 65000 | 15000 | Kierownik |
152 | 60000 | 15000 | Kierownik |
215 | 60000 | 12500 | Kierownik |
244 | 50000 | 12000 | Personel |
300 | 45000 | 10000 | Personel |
335 | 40000 | 10000 | Personel |
400 | 32000 | 7500 | Ekspedient |
441 | 28000 | 7500 | Ekspedient |
Istnieje sześć operatorów relacyjnych w SQL. Po ich przedstawieniu, omówimy jak się z nich korzysta:
Gdybyś chciał zobaczyć NumerIDPracownika osób zarabiających ponad 50000$, użyj tego:
010 |
105 |
152 |
215 |
244 |
To wyświetli numery ID wszystkich kierowników. Ogólnie, przy kolumnach tekstowych używaj operatorów równości lub nierówności i upewnij się, że tekst jest otaczany znakami apostrofu (').
Operatory AND i OR można łączyć ze sobą, np:
albo wylistować tych zarabiających więcej lub dokładnie 30000$, ale maksymalnie 50000$, użyj:
Aby wylistować wszystkich nie znajdujących się w tym zakresie, spróbuj:
Podobnie, NOT IN listuje wszystkie wiersze, w których nie występują elementy z listy IN.
Najpierw spójrz na te przykładowe tabele:
IDPosiadacza | NazwiskoPosiadacza | ImiePosiadacza |
---|---|---|
01 | Jones | Bill |
02 | Smith | Bob |
15 | Lawson | Patricia |
21 | Akins | Jane |
50 | Fowler | Sam |
IDPosiadacza | ZadanyPrzedmiot |
---|---|
02 | Stół |
02 | Biurko |
21 | Krzesło |
15 | Lustro |
IDSprzedajacego | IDKupujacego | Rzecz |
---|---|---|
01 | 50 | Łóżko |
02 | 15 | Stół |
15 | 02 | Krzesło |
21 | 50 | Lustro |
50 | 01 | Biurko |
01 | 21 | Gabinet |
02 | 21 | Stolik do kawy |
15 | 50 | Krzesło |
01 | 15 | Szkatułka |
02 | 21 | Garnki |
21 | 02 | Biblioteka |
50 | 01 | Doniczka |
Jednak z uwagi na to, że nazwy kolumn były inne w każdej tabeli, nie było to niezbędne.
Powiedzmy, że chcesz wylistować ID i imiona tylko tych osób, które sprzedały antyk. Oczywiści chcesz mieć listę, w której każda osoba jest przedstawiona tylko raz -- nie interesuje cię ile antyków dana osoba sprzedała, tylko sam fakt sprzedania (jeśli interesuje cię liczenie, zobacz niżej rozdział o funkcji agregującej). To oznacza, że będziesz musiał powiedzieć SQL-owi aby wyeliminował duplikujące się wiersze i po prostu wylistował każdą osobę tylko raz. Aby to zrobić, użyj słowa kluczowego DISTINCT.
Najpierw będziemy musieli połączyć się z tabelą PosiadaczeAntyków aby uzyskać dane o imieniu i nazwisku danej osoby. Jednakże, pamiętaj, że skoro kolumna IDSprzedajacego w tabeli Antyki jest obcym kluczem z tabeli PosiadaczeAntykow, sprzedawca jest wylistowany tylko jeśli istnieje wiersz w tej (PosiadaczeAntykow) tabeli, opisujący dany ID. Chcemy też w naszym listingu wyeliminować wielokrotne pojawienia IDSprzedajacego, więc używamy DISTINCT na kolumnie, w której moga pojawić się powtórzenia.
Aby jeszcze skomplikować, będziemy też chcieli mieć listę posortowaną według nazwiska, a następnie według imienia, a na koniec według IDPosiadacza. Dlatego użyjemy klauzuli ORDER BY:
W tym przykładzie, jako że każdy sprzedał jakąś rzecz, uzyskamy listę wszystkich posiadaczy, w alfabetycznym porządku, posortowanych według nazwiska. Dla późniejszych odwołań (i w wypadku gdyby ktoś się pytał), ten typ połączenia jest uważany za kategorię połączeń wewnętrznych (ang. inner joins).
Nazwisko | Zamawiany | przedmiot |
---|---|---|
Smith | Stół | |
Smith | Biurko | |
Akins | Krzesło | |
Lawson | Lustro |
Są tu pewne rzeczy na które warto zwrócić uwagę:
No! Wystarczy narazie na temat złożonych zapytań SELECT. Przejdźmy do innych spraw związanych z SQL.Omówię pięć najważniejszych funkcji: SUM, AVG, MAX, MIN oraz COUNT.
Mając w pamięci tabele z początku tego dokumentu, spójrzmy na trzy przykłady:
Przykład utworzenia zestawienia:
Dodajmy do tabeli Antyki kolumnę umożliwiającą wpisywanie ceny danej Rzeczy:
Dane dla tej kolumny mogą być uzupełniane lub dodawane później (zgodnie z definicją).
Aby wstawić wiersz do tabeli, zrób następujące:
Usuńmy wiersz z naszej bazy danych:
Odświeżmy Cene w wierszu, który nie ma jeszcze ustawionej ceny:
Aby pozbyć się indeksu, napisz:
Lista imion tych z tabeli PosiadaczeAntykow, którzy KUPILI jakąś rzecz:
DOSYĆ ZAPYTAŃ!!! mówisz?...przejdźmy do czegoś całkiem innego...
(zobacz odnośnik do FAQ jeśli chcesz więcej)
______________________________________________________________________
Funkcje znakowe:
ALTER TABLE <<>NAZWA TABELI> ADD|DROP|MODIFY (Właściwości kolumny...zobacz Create Table); -- Pozwala ci dodawać lub kasować kolumnę lub kolumny z tabeli, lub zmieniać właściwości (typy danych, itd.) istniejących kolumn; ta instrukcja może być też używana do zmieniania fizycznych właściwości tabeli (jak tabela jest przechowywana, itd.), ale te definicje są zależne od DBMS-a, więc przeczytaj dokumentację. Te fizyczne właściwości są używane w instrukcji Create Table kiedy tabela jest tworzona. Dodatkowo, poprzez instrukcję Alter Table można dokonać tylko jednej opcji -- czy to ADD, DROP, czy MODIFY.
COMMIT; -- sprawia, że zmiany jakie dokonaliśmy na systemie bazy dnaych pozostaną w nim na stałe.
CREATE [UNIQUE] INDEX
CREATE TABLE
ROLLBACK; --Anuluje wszystkie zmiany na bazie danych od czasu wykonania ostatniego polecenia Commit... uważaj! Niektóre programy używają automatycznego potwierdzania (commiting), więc Rollback może nie działać.
SELECT [DISTINCT|ALL] <<>LISTA KOLUMN, FUNKCJE, STAŁE, ITD.> FROM <<>LISTA TABEL LUB VIEW'ÓW> [WHERE <<>WARUNKI>] [GROUP BY <<>KOLUMNY GRUPUJACE>] [HAVING <<>WARUNEK>] [ORDER BY <<>KOLUMNY PORZADKUJACE> [ASC|DESC]]; --gdzie ASC|DESC pozwala na porządkowanie w porządku rosnącym lub malejącym.
UPDATE <<>NAZWA TABELI> SET <<>NAZWA KOLUMNY> = <<>WARTOŚĆ> [WHERE <<>WARUNEK>]; --jeśli nie zastosuje się klauzuli Where, wszystkie wiersze będą poprawione zgodnie z instrukcją Set.
Autor nie podpisuje się pod tymi site'ami.
Komentarze lub sugestie? Napisz do mnie pod jhoffman@one.net.
A może chcesz spojrzeć na strony Jima Hoffmana, by dowiedzieć się więcej o mnie, lub obejrzeć mój nowy podręcznik algorytmów. Możesz też ściągnąć PDF-ową wersję tego dokumentu (dzięki uprzejmości Matta Kelly'ego z highcroft.com).
Copyright 1996-1998, James Hoffman. Dokument ten może być używany za darmo przez każdego użytkownika internetu, ale nie może być włączany do innych dokumentów, publikowany w żadnej formie, lub reprodukowany masowo w inny sposób.
1998 tłumaczenie na język polski za zgodą autora - Przemek Borys <<>pborys@p-soft.silesia.linux.org.pl> Komentarze odnośnie tłumaczenia mile widziane.