INSERT | REPLACE | UPDATE | Różne pożyteczne instrukcje
SELECT c.d.
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.
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.
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:
COUNT(wyrażenie): zlicza wiersze dla których
wyrażenie przyjmuje wartość różną od NULL;
AVG(wyrażenie): oblicza średnią wartość wyrażenia dla
uwzględnionych wierszy;
MIN(wyrażenie), MAX(wyrażenie): podają odpowiednio minimalną
i maksymalną wartość wyrażenia dla uwzględnionych wierszy;
SUM(wyrażenie): sumuje wyrażenie
po uwzględnionych wierszach;
STD(wyrażenie) lub STDDEV(wyrażenie):
oblicza standardowe odchylenie wyrażenia;
BIT_OR(wyrażenie), BIT_AND(wyrażenie): alternatywa i odpowiednio
koniunkcja bitów wyrażenia.
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).
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.
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:
ORDER BY,
FROM
instrukcji SELECT.
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.
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
Kilka pożytecznych instrukcji, służących głownie do uzyskiwania informacji o istniejących w systemie bazach danych, tabelach, ich strukturze itp.
SHOW DATABASES [LIKE wzorzec]
SHOW TABLES [FROM baza_danych] [LIKE wzorzec]
SHOW COLUMNS FROM tabela [FROM baza_danych] [LIKE wzorzec]
SHOW INDEX FROM tabela [FROM baza_danych]
SHOW STATUS
SHOW VARIABLES
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.