Wykład 9

INSERT | REPLACE | UPDATE | Różne pożyteczne instrukcje

Instrukcja SELECT c.d.

Złączenia tabel

Instrukcja SELECT o postaci

SELECT wyrażenie1, wyrażenie2, ... FROM tabela1, tabela2, ...

zwraca tabelę o kolumnach zawierających wartości podanych wyrażeń, obliczone dla iloczynu kartezjańskiego (pełnego złączenia) podanych tabel. W budowie wyrażeń można korzystać z nazw kolumn z tych tabel, jeżeli jednak nazwy kolumn powtarzają się w różnych tabelach, to trzeba pamiętać o uwzględnieniu nazwy tabeli w odwołaniu do kolumny -- tj. tabela.kolumna.

Oczywiście najczęściej bardziej przydatne są zapytania wykorzystujące równozłączenia tabel, a nie iloczyny kartezjańskie. Dokonuje się tego za pomocą odpowiednio dobranego warunku w klauzuli WHERE:

SELECT wyrażenie1, wyrażenie2, ... FROM tabela1, tabela2, ... WHERE warunek

Notacje tabela1, tabela2 i tabela1 JOIN tabela2 są równoważne.

Warunek w klauzuli WHERE powinien być wyrażeniem logicznym dotyczącym kolumn złączanych tabel, dyktuje on które wiersze iloczynu kartezjańskiego zostaną uwzględnione w złączeniu. Zauważmy, że możliwe jest zbudowanie warunku o wiele ogólniejszego aniżeli prosta równość wartości w określonych kolumnach -- konstrukcja ta jest zatem nieco ogólniejsza niż równozłączenie w sensie algebry relacyjnej.

Inny sposób złączenia tabel to złączenie zewnętrzne. MySQL implementuje dwie postacie zapisu lewostronnego złączenia zewnętrznego:

tabela1 LEFT [OUTER] JOIN tabela2 ON warunek

gdzie warunek po słowie kluczowym ON może być dowolnym wyrażeniem logicznym zbudowanym z wykorzystaniem nazw kolumn złączanych tabel, oraz

tabela1 LEFT [OUTER] JOIN tabela2 USING (kolumna1, kolumna2, ...)

Lista nazw kolumn po słowie kluczowym USING musi zawierać kolumny występujące w obu złączanych tabelach pod tymi samymi nazwami. Inaczej mówiąc, notacja powyższa jest równoważna zapisowi

tabela1 LEFT [OUTER] JOIN tabela2 ON tabela1.kolumna1=tabela2.kolumna1 AND tabela1.kolumna2=tabela2.kolumna2 ...

Słowo kluczowe OUTER jest opcjonalne i nie ma wpływu na efekt złączenia. Przypominam, że definicja (lewostronnego) złączenia zewnętrznego oznacza, że jeżeli w ,,prawej'' tabeli brak wiersza ,,pasującego'' do pewnego wiersza tabeli ,,lewej'' (tzn. spełniającego warunek złączenia), to stworzony zostanie wiersz zawierający wartość NULL we wszystkich kolumnach pochodzących z tabeli ,,prawej''.

Dodatkowo istnieje jeszcze operacja naturalnego złączenia lewostronnego:

tabela1 NATURAL LEFT [OUTER] JOIN tabela2

będąca po prostu skrótowym zapisem złączenia z klauzulą USING zawierającą jako argument listę nazw wszystkich kolumn powtarzających się w obu złączanych tabelach.

Dokumentacja składni złączeń w MySQL znajduje się tutaj.

Sortowanie wyników

Do uzyskania tabeli wynikowej instrukcji SELECT w postaci posortowanej ze względu na wartości w którejś z kolumn służy klauzula ORDER BY:

SELECT wyrażenie1, wyrażenie2, ... FROM złączenie ... WHERE warunek ORDER BY kolumna [ ASC | DESC ]

Domyślnym porządkiem jest porządek rosnący (opcja ASC) według wartości numerycznych lub porządku sortowania wartości napisowych. Do uzyskania sortowania w porządku malejącym służy opcja DESC.

Funkcje agregujące i klauzula GROUP BY

Klauzula GROUP BY w połączeniu z tzw. funkcjami agregującymi służy do uzyskania sum, średnich itp. po wierszach z tabeli (lub złączenia) spełniających warunek, formułowany jako wyrażenie analogicznie do wyrażeń używanych w klauzuli WHERE, lecz podawany w tym przypadku po słowie kluczowym HAVING:

SELECT wyrażenie1, wyrażenie2, ... FROM złączenie [ WHERE warunek ] GROUP BY kolumna_gr HAVING warunek_grupowania [ ORDER BY kolumna_sort ]

Zasygnalizowano tutaj właściwą kolejność wystąpienia klauzul: klauzula WHERE (o ile się pojawia) musi poprzedzać GROUP BY, która z kolei może wystąpić jedynie przed ORDER BY.

W MySQL istnieją następujące funkcje agregujące, które można wykorzystać w budowie wyrażeń w instrukcji SELECT z klauzulą GROUP BY:

Aliasy nazw kolumn i wyrażeń

Jako argumenty klauzul ORDER BY i GROUP BY nie mogą być użyte wyrażenia złożone. Można tu użyć jedynie nazw kolumn, lub -- jeżeli chcemy grupować lub sortować według wartości wyrażeń złożonych -- aliasy tych wyrażeń. Do stworzenia aliasu dla wyrażenia podanego w instrukcji SELECT stosuje się słowo kluczowe AS, w sposób następujący:

SELECT wyrażenie1, wyrażenie2 AS alias FROM złączenie ORDER BY alias

Alias nadany wyrażeniu staje się nazwą odpowiedniej kolumny tabeli wynikowej (zamiast dosłownej postaci tego wyrażenia).

Wyprowadzanie wyników zapytania do pliku

Istnieje możliwość zapisania tabeli wynikowej instrukcji SELECT do pliku tekstowego, który później można wykorzystać w instrukcji LOAD DATA INFILE (lub oczywiście w inny sposób, np. do wprowadzenia danych do innego DBMS lub obróbki znanymi już narzędziami).

SELECT ... INTO OUTFILE 'nazwa_pliku' FIELDS TERMINATED BY '\t' ESCAPED BY '\\' LINES TERMINATED BY '\n' FROM ...

Podobnie jak w LOAD DATA INFILE opcje dotyczące formatu pliku są zbyteczne, jeśli akceptujemy wartości domyślne (linijka=rekord, pola przedzielone kodem tabulacji).

Podanie nazwy już istniejącego pliku spowoduje błąd. Zaleca się podawanie nazwy pliku wynikowego w postaci pełnej ścieżki.

Ogólna postać instrukcji INSERT

Możemy obecnie podać ogólną postać instrukcji INSERT, powodującej wstawienie do tabeli (na ogół) wielu wierszy, utworzonych na podstawie danych pobranych z innej tabeli przy użyciu instrukcji SELECT:

INSERT INTO tabela (kolumna1, kolumna2, ...) SELECT ...

Efektem będzie wstawienie do tabeli wierszy zwróconych przez instrukcję SELECT, z przyporządkowaniem wartości odpowiednim kolumnom zgodnie z kolejnością zwracanych kolumn. Instrukcja SELECT użyta w tym kontekście może być całkiem ogólnej postaci, z następującymi zastrzeżeniami:

Instrukcja REPLACE

Instrukcja REPLACE działa dokładnie tak samo, jak instrukcja INSERT, z jednym wyjątkiem: jeżeli w tabeli istnieje już wiersz o wartości klucza głównego lub indeksu UNIQUE takiej samej, jak dla wiersza wstawianego, wiersz taki zostanie usunięty przed wstawieniem nowego. Instrukcja INSERT w takiej sytuacji pomija wstawienie nowego wiersza (i generuje ostrzeżenie). Składnia:

REPLACE INTO tabela (kolumna1, kolumna2, ...) VALUES (wyrażenie1, wyrażenie2, ...)

dla instrukcji wstawiającej (ew. zastępującej) pojedynczy wiersz, oraz

REPLACE INTO tabela (kolumna1, kolumna2, ...) SELECT ...

dla instrukcji wstawiającej (w ogólności) wiele wierszy.

Zastrzeżenia dotyczące występującej tu instrukcji SELECT są identyczne, jak w przypadku poprzednim.

Instrukcja UPDATE

Instrukcja UPDATE służy do zmiany wartości występujących w poszczególnych kolumnach dla (w ogólności) wielu wierszy, wybranych za pomocą wyrażenia podanego w klauzuli WHERE. Wartości są zmieniane w kolejności podanej, o czym należy pamiętać w sytuacji, gdy w wyrażeniu wstawianym do pewnej kolumny występuje nazwa kolumny w której wartość już zmieniono. Składnia:

UPDATE tabela SET kolumna1=wyrażenie1, kolumna2=wyrażenie2, ... WHERE warunek

Różne pożyteczne instrukcje

Kilka pożytecznych instrukcji, służących głownie do uzyskiwania informacji o istniejących w systemie bazach danych, tabelach, ich strukturze itp.

Wzorce nazw mogące wystąpić w tych instrukcjach są napisami zbudowanymi z ew. użyciem metaznaków '%' i '_'. SHOW STATUS podaje pewne (czasami przydatne dla administratora) dane o stanie serwera, a SHOW VARIABLES zwraca tabelę zmiennych systemowych MySQL, zależnych od instalacji i opcji z jakimi uruchomiono serwer.


Strona główna | Dalej | Początek

Powered by Caudium Webserver  Strona ta była oglądana  razy



Mon Jan 4 1999  Robert J. Budzyński   <Robert.Budzynski@fuw.edu.pl>