Operator logiczny | Opis |
---|---|
= | równy |
!= lub <> | różny |
< | mniejszy |
> | większy |
⇐ | mniejszy lub równy |
>= | większy lub równy |
Uwaga! “Wartości” NULL nie mogą być porównywane za pomocą operatorów = i !=. Należy tu wykorzystać operatory IS NULL
lub NOT NULL
.
Ogólnie:
SELECT [fieldnames] AS [alias] FROM [tablename] WHERE [criteria] ORDER BY [fieldname TO sort ON] [DESC] LIMIT [offset, maxrows]
Uwaga! Nie można używać AS
z WHERE
.
Pobieranie zawartości pola pornid
z tabeli porn
:
SELECT pornid FROM porn;
Pobieranie zawartości kilku pól tabeli porn
:
SELECT pornid, pornname FROM porn;
Pobieranie zawartości wszystkich pól tabeli porn
:
SELECT * FROM porn;
Pobieranie pierwszych dwóch wierszy, rozpoczynając od rekordu o indeksie 0 pól tabeli porn
:
SELECT pornid, pornname FROM porn LIMIT 0, 2;
Gdy nie określimy początkowego rekordu, domyślnie przyjęte będzie 0, a więc:
SELECT pornid, pornname FROM porn LIMIT 2;
zwróci dokładnie to samo co powyższy przykład.
Jeśli interesują nas pornid
i pornname
wydane w Polsce (niezbyt ciekawa lista, wiem) korzystamy z funkcji WHERE
:
SELECT pornid, pornname FROM porn WHERE porncountry = 'Poland';
Klauzule WHERE
i LIMIT
można łączyć:
SELECT pornid, pornname FROM porn WHERE porncountry = 'Poland' LIMIT 1;
wyświetli tylko pierwszą polską produkcję. Klauzula LIMIT
zawsze na końcu zapytania!
Warunki można również łączyć za pomocą operatorów logicznych AND
i OR
.
SELECT pornnumber, pornid, porncountry FROM porn WHERE (porncountry = 'Poland' OR porncountry = 'Ghana') AND pornnumber < 5;
Nawiasy są niezbędne, bez nich operator AND
zostałby zastosowany wyłącznie do warunku bezpośrednio go poprzedzającego, czyli porncountry = 'Ghana
'.
Do sortowania zwracanych wyników używamy klauzuli ORDER BY
.
SELECT pornnumber, pornid, porncountry FROM porn WHERE pornnumber < 5 ORDER BY pornid;
Gdy sortujemy według pól znakowych, MySQL sortuje je według wartości ASCII, więc wielkie litery będą przed małymi. Z tego powodu, wyniki użycia klauzuli ORDER BY
zależeć mogą od zbioru znaków wybranego podczas kompilacji MySQL-a.
Domyślnie ORDER BY
sortuje wartości rosnąco. Aby posortować malejąco, należy skorzystać z kluczowego słowa DESC
.
SELECT pornid FROM porn ORDER BY pornid DESC;
Pobrane wiersze można również posortować względem wartości kilku pól.
SELECT pornid, pornname, porncountry FROM porn WHERE porncontry = 'Poland' OR porncountry = 'Ghana' ORDER BY porncountry, pornid DESC;
Wykorzystując operatory LIKE
i NOT LIKE
możemy określać wzorce, do których dopasowywane będą łańcuchy znaków.
Znaki specjalne, używane we wzorcach to:
%
- odpowiada dowolnemu łańcuchowi znaków (coś jak * w DOSie),_
- odpowiada dowolnemu znakowi (jak ?).
Jeśli chcemy odszukać wszystkie rekordy, w których wartości pól pornwww
kończą się łańcuchem znaków jameson.com
:
SELECT pornid, pornname, porncountry FROM porn WHERE pornwww LIKE '%jameson.com' ORDER BY pornname;
Uwaga! Wielkość liter w polach typu TEXT
nie ma znaczenia. Jeżeli potrzebujemy rozróżniać owe, musimy skorzystać z pola typu BLOB
.
Przykład poniżej pokazuje wzorzec pasujący do pornid
o wartości “sax”
i do “six”
ale do “siux”
już nie.
SELECT pornid FROM porn WHERE pornid LIKE 's_x';
I na koniec operator NOT LIKE
:
SELECT pornid FROM porn WHERE pornid NOT LIKE 'passion%';
W MySQL mamy grupę funkcji agregujących, które zamiast zwracania wierszy, podsumowują zawarte w nich informacje:
sum()
- suma wartości danego pola ze wszystkich zwróconych wierszy,max()
i min()
- zwraca odpowiednio największą i najmniejsza wartość z wierszy danego pola,avg()
- średnia wartość danego pola,count()
- ilość zwróconych wierszy.Zwracanie najmniejszej i największej wartości pola numerycznego:
SELECT MIN(pornnumber), MAX(pornnumber) FROM porn;
Liczbę zwróconych wierszy można określić dwojako:
count(nazwa_pola)
- zwraca liczbę wierszy, w których określone pole jest różne od NULL
,count(*)
- zwraca liczbę wszystkich wierszy.SELECT COUNT(*) FROM porn WHERE porndate < '2009-11-12';
zwróci liczbę porn wydanych przed tą datą.
Gdy chcemy wyświetlić listę krajów, w których wyprodukowano kiedykolwiek porn, ale bez powtarzających się wpisów korzystamy ze słowa DISTINCT
:
SELECT DISTINCT porncountry FROM porn ORDER BY porncountry;
Jeśli chcemy policzyć ile porn wyprodukowano w każdym kraju piszemy:
SELECT porncountry, COUNT(*) FROM porn GROUP BY porncountry ORDER BY porncountry DESC;
Klauzula GROUP BY
jest tu niezbędna, bez niej MySQL generuje błąd. Musi ona być na końcu zapytania, ale przed ORDER BY
i LIMIT
.
Gdybyśmy chcieli posortować tabelę z naszego ostatniego przykładu względem ilości porn, napotkalibyśmy problem, gdyż w klauzuli ORDER BY
nie możemy odwołać się do funkcji agregującej count(*)
. Z pomocą przychodzą nam nazwy umowne (AS
).
SELECT porncountry, COUNT(*) AS num_porn FROM porn GROUP BY porncountry ORDER BY num_users;
Przypuśćmy, że potrzebujemy listy krajów, w których wyprodukowano więcej niż jeden porn:
SELECT porncountry, COUNT(*) AS num_porn FROM porn WHERE num_porn > 1 GROUP BY porncountry;
Polecenie to wygeneruje błąd, gdyż nie możemy określić pola num_porn
do momentu określenia sposobu grupowania rekordów (czyli do GROUP BY
). Klauzulę WHERE
musimy umieszczać przed GROUP BY
. Rozwiązaniem problemu jest zastosowanie klauzuli HAVING
. Jej zastosowanie jest takie jak WHERE
, lecz umieszczamy ją bezpośrednio za GROUP BY
:
SELECT porncountry, COUNT(*) AS num_porn FROM porn GROUP BY porncountry HAVING num_porn > 1;
A co gdybyśmy chcieli pobrać dane z dwóch tabel? No problem:
SELECT porn.pornid, page FROM porn, porn_log WHERE porn.pornid = porn_log.pornid;
Funkcja zwraca aktualny czas systemowy na komputerze, z serwerem MySQL
mysql> SELECT now();
Output:
+---------------------+ | now() | +---------------------+ | 2009-11-14 15:58:44 | +---------------------+ 1 row in set (0.00 sec)
Funkcje zwracają odpowiednio datę i czas
mysql> SELECT curdate(), curtime();
Output:
+------------+-----------+ | curdate() | curtime() | +------------+-----------+ | 2009-11-14 | 16:04:14 | +------------+-----------+ 1 row in set (0.00 sec)
Funkcja zwraca daną literę ciągu znaków (pierwsza litera to 1, a nie 0 jak w PHP)
mysql> SELECT SUBSTRING('test', 1, 1);
Output:
+-------------------------+ | substring('test', 1, 1) | +-------------------------+ | t | +-------------------------+ 1 row in set (0.00 sec)
Funkcja wyciąga podaną liczbę znaków z prawej strony danej kolumny
mysql> SELECT cust_id, cust_type_cd, city, state, fed_id -> FROM customer -> ORDER BY RIGHT(fed_id, 3);
Output:
+---------+--------------+------------+-------+-------------+ | cust_id | cust_type_cd | city | state | fed_id | +---------+--------------+------------+-------+-------------+ | 1 | I | Lynnfield | MA | 111-11-1111 | | 10 | B | Salem | NH | 04-1111111 | | 2 | I | Woburn | MA | 222-22-2222 | | 11 | B | Wilmington | MA | 04-2222222 | | 3 | I | Quincy | MA | 333-33-3333 | | 12 | B | Salem | NH | 04-3333333 | | 13 | B | Quincy | MA | 04-4444444 | | 4 | I | Waltham | MA | 444-44-4444 | | 5 | I | Salem | NH | 555-55-5555 | | 6 | I | Waltham | MA | 666-66-6666 | | 7 | I | Wilmington | MA | 777-77-7777 | | 8 | I | Salem | NH | 888-88-8888 | | 9 | I | Newton | MA | 999-99-9999 | +---------+--------------+------------+-------+-------------+ 13 rows in set (0.24 sec)