| |
| zapytanie (ID: 21) | opis |
(SELECT column1 FROM table1 WHERE column2=10 AND column3=11 ORDER BY column1 ASC LIMIT 10)
UNION
(SELECT column1 FROM table2 WHERE column2=12 AND column3=13 ORDER BY column1 DESC LIMIT 20)
UNION
(SELECT column1 FROM table3 WHERE column2=14 AND column3=15 ORDER BY column1 DESC LIMIT 30);
| Zapytanie zwraca rekordy z trzech tabel 'table1', 'table2' oraz 'table3'. Jako pierwsze w kolejności zwrócone będą rekordy z tabeli 'table1' - jako, iż to ona znajduje się na początku. Zwrócone rekordy będą sortowane częściami - tak jak w wybranych SELECTach - czyli rekordy z pierwszego SELECTa będą posortowane po 'column1' rosnąco, potem rekordy z drugiego SELECTa będą sortowane po 'column1' malejąco itd. Podobnie działą tutaj LIMIT - ogranicza on ilość zwracanych rekordów w poszczególnych SELECTach.
W trakcie używania zapytań z 'UNION' należy pamiętać aby:
- Nazwy kolumn z pierwszego SELECTa są używane jako indeksy wszystkich zwracanych rekordów.
- Odpowiednie kolumny z danych SELECTów powinny mieć ten sam rodzaj pola - czyli.np powinny być rodzaju SMALLINT - co nie znaczy, że muszą - MySQL potrafi automatycznie dokonać konwersji rodzaju danych.
- Liczba kolumn do pobrania w poszczególnych SELECTach musi się zgadzać - czyli musi być taka sama w każdym zapytaniu w nawiasie.
- Aby sortować wszystkie rekordy zwracane przez całe zapytanie tudzież stosować ograniczenia zwracanych danych (LIMIT) należy te klauzule wpisywać poza nawiasami stosowanymi do rozdzielania SELECTów.
- Stosując UNION zwracane są niepowtarzające się rekordy - czyli UNION działa podobnie do DISTINCT.
|
(SELECT column1 FROM table1 WHERE column2=10 AND column3=11 ORDER BY column1 ASC LIMIT 10)
UNION ALL
(SELECT column1 FROM table2 WHERE column2=12 AND column3=13 ORDER BY column1 DESC LIMIT 20);
| Zapytanie jak wyżej, tyle, że łączy wyniki z dwóch tabel i - co najistotniejsze - dzięki użyciu 'UNION ALL' zwracane są wszystkie rekordy - nawet te powtarzające się w obydwu tabelach. Przeciwieństwem 'UNION ALL' jest 'UNION DISTINCT' bądź po prostu 'UNION'.
|
(SELECT column1 FROM table1 WHERE column2=10 AND column3=11)
UNION ALL
(SELECT column1 FROM table2 WHERE column2=12 AND column3=13)
ORDER BY column1 ASC LIMIT 10;
| Zapytanie jak wyżej, z tą różnicą, iż zwracane rekordy z obydwu tabel są najpierw łączone ze sobą a później sortowane po 'column1' rosnąco a następnie wybierane jest pierwsze 10 rekordów. Jest to przykład sortowania globalnego danych zwracanych przez łączenia UNION oraz ich limitowania.
|
(SELECT column1 FROM table1 WHERE column2=10)
UNION ALL
(SELECT column1 FROM table1 WHERE column3=11)
ORDER BY column1 ASC; | Przykład na to, iż za pomocą UNION możemy pobrać dane z tej samej tabeli każdym kolejnym SELECTem. Przydatne w niektórych przypadkach. |
| |
| zapytanie (ID: 19) | opis |
SELECT table1.*,table2.* FROM table1,table2 WHERE table1.id = table2.id;
| Zwraca odpowiadające rekordy z tabel 'table1' oraz 'table2' dokonując dopasowania według kolumn o indeksie 'id'. Jeśli w taeli 'table2' nie znajdziemy odpowiednika (rekordu z odpowiadającą wartością kolumny 'id') to wiersz zostanie pominięty (czyli nie zostaną zwrócone żadne dane dla tego wiersza z tabeli 'table1' oraz 'table2').
|
SELECT table1.*,IF(table2.id,table2.wybrana_kolumna,0) AS dane_wybranej_kolumny
FROM table1,table2 WHERE table1.id=table2.id; | Zapytanie jak wyżej, z tym, że jeśli w tabeli 'table2' nie znajdziemy rekordu odpowiadającego wartością 'id' rekordowi w tabeli 'table1' to zwracamy wartości rekordu z 'table1' oraz wartość 0 o indeksie 'wybrana_kolumna'. Jest to przykład zastosowania konstrukcji warunkowej IF w zapytaniach MySQL. |
| |
| zapytanie (ID: 17) | opis |
SELECT DISTINCT(column) AS wartosc FROM table ORDER BY wartosc DESC;
| Pobiera listę wartości kolumny 'column'. Czyli gdy jakaś wartość się w kolumnie powtarza to zwraca ją tylko raz.
|
| SELECT column1,column2 FROM table GROUP BY column1 ORDER BY column2 DESC; | Podobnie jak wyżej, ale do każdej wartości z listy wartści przypisujemy odpowiadającą jej wartość z kolumny 'column2' i całość wyników sortujemy właśnie według column2.
Z tym zapytaniem należy jednak uważać - jest ono przeznaczone dla tych, którzy zdają sobie sprawę z tego, iż przypisana wartość 'column2' jest wybierana z wiersza pierwszej wartości 'column1'. |
| |
| zapytanie (ID: 13) | opis |
SELECT MAX(column) AS maksymalna_wartosc FROM table;
| Pobiera maksymalną wartość kolumny 'column' z tabeli 'table'.
|
SELECT column FROM table ORDER BY column DESC LIMIT 1;
| Jak wyżej, ale robi to nie używając do tego gotowej funkcji MySQLa, lecz sortując wszystkie rekordy danej tabeli malejąco a następnie zwracając pierwszy nich (czyli ten największy).
|
SELECT MIN(column) AS minimalna_wartosc FROM table;
| Analogicznie jak przykład pierwszy w tej grupie, lecz pobiera minimalną wartość.
|
| SELECT column FROM table ORDER BY column ASC LIMIT 1; | Analogicznie jak przykład drugi w tej grupie, lecz pobiera minimalną wartość. |
| |
| zapytanie (ID: 11) | opis |
SELECT SUM(column) AS suma_wartosci_kolumny FROM table;
| Pobiera ze wszystkich rekordów tabeli 'table' sumę wartości umieszczonych w kolumnie 'column'.
|
| SELECT SUM(column) AS suma FROM table GROUP BY column2 ORDER BY suma DESC; | Pobiera sumę wartości umieszczonych w kolumnie 'column' - jednakże zwraca sumy obliczone dla rekordów, w których wartości kolumn 'column2' są takie same na koniec sortując zwracane wartości według obliczonych sum malejąco. |
| |
| zapytanie (ID: 9) | opis |
SELECT t1.*,t2.*,t3.column FROM table1 t1,table2 t2, table3 t3;
| Pobiera wszystkie rekordy i kolumny z tabeli 'table1', wszystkie rekordy i kolumny z tabeli 'table2' oraz zawartość kolumny 'column' wszystkich rekordów tabeli 'table3'.
Ten przykład ukazuje w jaki sposób używać aliasów do nazw tabel.
|
| SELECT t1.*,t2.*,t3.column AS wartosc FROM table1 AS t1,table2 AS t2, table3 AS t3; | Przykład jak powyżej, z tą różnicą, iż aliasy nazw tael definiujemy metodą książkową (istotnie powinniśmy używać klauzuli AS) oraz zawartość kolumny 'column' tabeli 'table3' zwracamy z indeksem o wartości 'wartosc'. |
| |
| zapytanie (ID: 2) | opis |
| SHOW TABLE STATUS WHERE name='table'; | Pobiera informacje na temat tabeli 'table' takie jak liczba wierszy zajętość dyskowa, kodowanie itd. |
| |
| zapytanie (ID: 1) | opis |
| SELECT COUNT(*) AS liczba_wierszy FROM table; | Pobiera liczbę wszystkich wierszy z tabeli 'table'. |