Informator
górski
Powitanie zimy - film! [zobacz]

MySQL

Przydatne zapytania MySQL dla programistów Na tej stronie zamieszczam regularnie zapytania MySQL, które w mojej opinii mogą być przydatne początkującym programistom używającym jako bazy danych MySQL'a.
Zapytania posiadające podobne zastosowanie są grupowane (znajdują się w różnych tabelach), dzięki czemu łatwiej je porównać.

Przydatne zapytania MySQL
 
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'.

Nawigator
[powrót do góry strony]

Dodaj swój komentarz
Aby dodać komentarz wystarczy podać jego treść - pozostałe pola nie są obowiązkowe. Zaznaczenie zapamiętania nicka i adresu e-mail spowoduje, iż w każdej chwili gdy wrócisz do tej strony i będziesz chciał(a) wpisać kolejny komentarz pola nick oraz e-mail zostaną automatycznie wypełnione:
 
Nick:    E-mail:

Zapamiętaj mój nick i email    Ukryj mój adres email

Wasze komentarze
 ukryj komentarze 
::br3t3sso (br3t3s@o2.pl) 2008-06-04 10:28:00
FAjnie byłoby jakyś pokazał kilka przykładów na podzapytania i
tworzenie widoków.
::Fixer2008-05-04 10:35:00
przydało by się też zapytanie powodujące np zwiększenie licznika (typ
int w mysql) pożyteczne np w przypadku gdy chcemy zrobićlicznik pobrać
pliku, wyświetleń bannera itd...

UPDATE tabela SET kolumna = kolumna + 1;
::tom2007-05-10 00:53:00
przydalby sie jakis przyklad z HAVING
::docent (docent.net@gmail.com) 2007-02-20 16:41:00
xXx: proszę bardzo - zapytanie ID#19
::xXx2007-02-19 17:34:00
Wrzuciłbyś coś z zapytań warunkowych (IF...)
 ukryj komentarze 

Nawigator
[powrót do góry strony]