1 1 Budowa wyrażeń w SQL: Wyrażenia języka SQL występują w instrukcji SELECT, oraz służą do formułowania warunków podawanych w klauzuli WHERE instrukcji takich, jak DELETE czy UPDATE. Kolejność (priorytet) operacji nie jest jawnie podana w dokumentacji MySQL, lecz wydaje się być zgodna z ogólnie przyjętymi konwencjami. W razie wątpliwości stosujemy grupowanie za pomocą nawiasów okrągłych.
2 2 Wyrażenia logiczne : Każda wartość różna od zera i NULL odpowiada w wyrażeniu logicznym prawdzie; a więc NULL i zero reprezentują wartość „fałsz”. Złożone wyrażenia logiczne, zbudowane za pomocą operatorów logicznych, zwracają jedynkę jako reprezentację wartości prawdziwej, a zero jako reprezentację fałszu. Operatory logiczne NOT : logiczna negacja, MySQL dopuszcza jako alternatywną notację wykrzyknik ( ! ) OR : logiczna alternatywa, MySQL dopuszcza alternatywną notację ( || ) AND : logiczna koniunkcja, alternatywna notacja MySQL ( &&) XOR : logiczna suma modulo 2 (alternatywa wykluczająca)
3 3 Wyrażenia arytmetyczne : Proste operatory arytmetyczne to dodawanie ( + ), odejmowanie ( - ), mnożenie ( * ) i dzielenie ( / ). Wynikiem dzielenia przez zero jest NULL ). Ponadto w MySQL dostępny jest bogaty zestaw funkcji matematycznych (wykładnicze, logarytmiczne, trygonometryczne itp.), gdzie w wypadku błędu (nielegalnego argumentu) zwracana jest wartość NULL.
4 4 Wyrażenia warunkowe : IFNULL(A,B) jeśli wartością A jest NULL zwraca B, w przeciwnym wypadku zwraca A. IF(A,B,C) : jeśli wartością logiczną A jest prawda (tzn. nie zero i nie NULL ) zwraca B, w przeciwnym wypadku zwraca C. Wartość A traktowana jest jako całkowitoliczbowa -- aby więc stosować taką konstrukcję dla warunku zależnego od wartości zmiennoprzecinkowej, należy w miejscu A użyć operacji porównania.
5 5 CASE wartość WHEN [wartość_porównywana] THEN wynik [WHEN [wartość_porównywana] THEN wynik...] [ELSE wynik ] END zwraca wynik gdy wartość = wartość_porównywana, w przeciwnym przypadku zwraca wynik po ELSE lub NULL gdy nie zapisano części ELSE. SELECT CASE count(*) WHEN 1 THEN 'a' WHEN 2 THEN 'b' WHEN 3 THEN 'c' ELSE 'Zły wariant‘ END FROM biuro2;
6 6 CASE WHEN [warunek] THEN wynik [WHEN [warunek] THEN wynik...] [ELSE wynik ] END zwraca wynik gdy pierwszy warunek jest prawdziwy, potem kolejny. W przeciwnym przypadku zwraca wynik po ELSE lub NULL gdy nie zapisano części ELSE. SELECT CASE WHEN count(*)>3 THEN 'a' WHEN count(*)>5 THEN 'b' ELSE 'Zły wariant' END FROM biuro2;
7 7 Porównania : W budowie wyrażeń logicznych przydają się oczywiście porównania. Operatory porównania można stosować również do wyrażeń napisowych. Wynik porównania wyrażeń napisowych zależeć będzie od tego, czy w ich budowie występują wartości zadeklarowane jako BINARY (co znosi utożsamienie małych i wielkich liter). Jeżeli wartością któregokolwiek z argumentów porównania jest NULL, porównanie zwraca jako wynik NULL (oczywiście za wyjątkiem funkcji IS NULL.)
8 8 równość oznacza się pojedynczym znakiem równości: = nierówność można oznaczyć: bądź : != 'mniejszy lub równy': = 'większy niż' i 'mniejszy niż‘ odpowiednio > oraz < ISNULL(A) zwraca jedynkę, jeżeli wartością A jest NULL, w przeciwnym wypadku zwraca zero A [NOT] BETWEEN B AND C wyrażenie równoważne A>=B AND A
9 9 GREATEST(v1, v2,...) : zwraca największy argument mysql> SELECT GREATEST(2,0); -> 2 mysql> SELECT GREATEST(34.0,3.0,5.0,767.0); -> 767.0 mysql> SELECT GREATEST('B','A','C'); -> 'C' LEAST(v1, v2,...) : zwraca najmniejszy argument mysql> SELECT LEAST(2,0); -> 0 mysql> SELECT LEAST(34.0,3.0,5.0,767.0); -> 3.0 mysql> SELECT LEAST('B','A','C'); -> 'A'
10 10 Porównania napisów : wyrażenie IN (wartość1,...) : zwraca 1 jeżeli wyrażenie jest równe którejkolwiek wartości z listy podanej w nawiasach, w przeciwnym wypadku zwraca 0. Wartość wyrażenia może być numeryczna, a jej typ narzuca sposób porównania. wyrażenie NOT IN (wartość1,...) : równoważne NOT (wyrażenie IN (wartość1,...)). mysql> SELECT 2 IN (0,3,5,7); -> 0 mysql> SELECT 'wefwf' IN ('wee','wefwf','weg'); -> 1
11 11 wyrażenie1 LIKE wyrażenie2 : porównanie wzorców, w których budowie można korzystać z metaznaków % (oznaczającego dowolną liczbę - w tym zero - dowolnych znaków), oraz _ (oznaczającego dowolny pojedynczy znak). Aby we wzorcu umieścić któryś z metaznaków jako znak dosłowny, należy go poprzedzić znakiem \. wyrażenie1 NOT LIKE wyrażenie2 : równoważne NOT (wyrażenie1 LIKE wyrażenie2).
12 12 mysql> SELECT 'David!' LIKE 'David_'; -> 1 mysql> SELECT 'David!' LIKE '%D%v%'; -> 1 mysql> SELECT 'David!' LIKE 'David\_'; -> 0 mysql> SELECT 'David_' LIKE 'David\_'; -> 1 mysql> SELECT 'abc' LIKE 'ABC'; -> 1 mysql> SELECT 'abc' LIKE BINARY 'ABC'; -> 0
13 13 STRCMP(napis1, napis2) - zwraca 0 jeżeli napisy są jednakowe, -1 jeżeli pierwszy argument jest wcześniejszy według obowiązującego porządku sortowania, a w przeciwnym wypadku +1. mysql> SELECT STRCMP('napis', 'napis2'); +----------------------------+ | STRCMP('napis1', 'napis2') | +----------------------------+ | -1 | +----------------------------+ mysql> SELECT STRCMP('napis', 'napis'); +--------------------------+ | STRCMP('napis', 'napis') | +--------------------------+ | 0 | +--------------------------+ mysql> SELECT STRCMP('napis2', 'napis'); +---------------------------+ | STRCMP('napis2', 'napis') | +---------------------------+ | 1 | +---------------------------+
14 14 wyrażenie1 REGEXP wyrażenie2 : porównanie wzorców zbudowanych zgodnie ze składnią wyrażeń regularnych. Znaki \ w wartościach napisowych MySQL mających służyć za wyrażenia regularne muszą być podwojone (\\) aby były interpretowane według składni wyrażeń regularnych. MySQL dopuszcza jako równoważną notację wyrażenie1 RLIKE wyrażenie2. wyrażenie1 NOT REGEXP wyrażenie2 : równoważne NOT (wyrażenie1 REGEXP wyrażenie2).
15 15 Nazwy zaczynające się na 'b' : mysql> SELECT personelnr, nazwisko FROM personel WHERE nazwisko REGEXP '^b'; +------------+----------+ | personelnr | nazwisko | +------------+----------+ | SB20 | Bober | | SB23 | Biały | | SL32 | Brzęczyk | +------------+----------+
16 16 Nazwy zaczynające się od małej litery: mysql> SELECT nazwisko FROM personel WHERE nazwisko REGEXP BINARY '^b'; Empty set (0.03 sec)
17 17 Nazwy kończące się na 'ka' : mysql> SELECT personelnr, nazwisko FROM personel WHERE nazwisko REGEXP 'ka$'; +------------+-----------+ | personelnr | nazwisko | +------------+-----------+ | SB22 | Kowalska | | SB30 | Michalska | | SL31 | Lisicka | +------------+-----------+
18 18 Nazwy zawierające 'w' : SELECT personelnr, nazwisko FROM personel WHERE nazwisko REGEXP 'w'; mysql> SELECT personelnr, nazwisko FROM personel WHERE nazwisko REGEXP 'w'; +------------+------------+ | personelnr | nazwisko | +------------+------------+ | SB21 | Frankowski | | SB22 | Kowalska | | SB31 | Piotrowski | | SL20 | Nowak | | SL21 | Kowalski | | SL30 | Wiśniewski | +------------+------------+
19 19 Dopasowanie sekwencji składającej się z zero lub więcej znaków ( a* ): mysql> SELECT 'Ban' REGEXP '^Ba*n'; -> 1 mysql> SELECT 'Baaan' REGEXP '^Ba*n'; -> 1 mysql> SELECT 'Bn' REGEXP '^Ba*n'; -> 1 Dopasowanie sekwencji składającej się z jednego lub więcej znaków ( a+ ): mysql> SELECT 'Ban' REGEXP '^Ba+n'; -> 1 mysql> SELECT 'Bn' REGEXP '^Ba+n'; -> 0
20 20 Funkcje operujące na liczbach: ABS() mysql> SELECT ABS(2); -> 2 mysql> SELECT ABS(-32); -> 32 ACOS() mysql> SELECT ACOS(1); -> 0 mysql> SELECT ACOS(1.0001); -> NULL podobnie ASIN()
21 21 ATAN() mysql> SELECT ATAN(2); -> 1.1071487177941 mysql> SELECT ATAN(-2); -> -1.1071487177941 CEIL() synonim CEILING() mysql> SELECT CEILING(1.23); -> 2 mysql> SELECT CEILING(-1.23); -> -1 CONV(N,from_base,to_base) mysql> SELECT CONV('a',16,2); -> '1010' mysql> SELECT CONV('6E',18,8); -> '172' mysql> SELECT CONV(-17,10,-18); -> '-H'
22 22 COS() mysql> SELECT COS(PI()); -> -1 podobnie SIN() COT() mysql> SELECT COT(12); -> -1.5726734063977 mysql> SELECT COT(0); -> NULL podobnie TAN() DEGREES() mysql> SELECT DEGREES(PI()); -> 180 mysql> SELECT DEGREES(PI() / 2); -> 90
23 23 EXP() mysql> SELECT EXP(2); -> 7.3890560989307 mysql> SELECT EXP(-2); -> 0.13533528323661 mysql> SELECT EXP(0); -> 1 FLOOR() mysql> SELECT FLOOR(1.23); -> 1 mysql> SELECT FLOOR(-1.23); -> -2 LN() synonim LOG() mysql> SELECT LN(2); -> 0.69314718055995 mysql> SELECT LN(-2); -> NULL
24 24 LOG10() mysql> SELECT LOG10(2); -> 0.30102999566398 mysql> SELECT LOG10(100); -> 2 LOG2() mysql> SELECT LOG2(65536); -> 16 LOG(B,X) logarytm z X o pdstawie B mysql> SELECT LOG(2,65536); -> 16 mysql> SELECT LOG(10,100); -> 2
25 25 MOD(N,M), N % M, N MOD M – zwraca resztę z dzielenia N przez M mysql> SELECT MOD(234, 10); -> 4 mysql> SELECT 253 % 7; -> 1 mysql> SELECT MOD(29,9); -> 2 mysql> SELECT 29 MOD 9; -> 2 mysql> SELECT MOD(34.5,3); -> 1.5 PI() – w obliczeniach dostępna pełna podwójna precyzja mysql> SELECT PI(); -> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793116
26 26 POW() synonim POWER() mysql> SELECT POW(2,2); -> 4 mysql> SELECT POW(2,-2); -> 0.25 RADIANS() – zamienia stopnie na radiany mysql> SELECT RADIANS(90); -> 1.5707963267949 RAND() – zwraca losową liczbę zmiennoprzecinkową z zakresu 0 SELECT RAND(); -> 0.9233482386203 mysql> SELECT RAND(); -> 0.63553050033332 mysql> SELECT RAND(); -> 0.70100469486881
27 27 ROUND(X), ROUND(X,D) mysql> SELECT ROUND(-1.23); -> -1 mysql> SELECT ROUND(-1.58); -> -2 mysql> SELECT ROUND(1.58); -> 2 mysql> SELECT ROUND(1.298, 1); -> 1.3 mysql> SELECT ROUND(1.298, 0); -> 1 mysql> SELECT ROUND(23.298, -1); -> 20
28 28 SIGN() – zwraca -1, 0, lub 1 mysql> SELECT SIGN(-32); -> -1 mysql> SELECT SIGN(0); -> 0 mysql> SELECT SIGN(234); -> 1 SQRT() mysql> SELECT SQRT(4); -> 2 mysql> SELECT SQRT(20); -> 4.4721359549996 mysql> SELECT SQRT(-16); -> NULL
29 29 TRUNCATE() – zwraca wartość X okrojoną do N miejsc po przecinku mysql> SELECT TRUNCATE(1.223,1); -> 1.2 mysql> SELECT TRUNCATE(1.999,1); -> 1.9 mysql> SELECT TRUNCATE(1.999,0); -> 1 mysql> SELECT TRUNCATE(-1.999,1); -> -1.9 mysql> SELECT TRUNCATE(122,-2); -> 100 mysql> SELECT TRUNCATE(10.28*100,0); -> 1028
30 30 Funkcje operujące na napisach : CONCAT(X,Y,...) - zwraca złączenie napisów podanych jako argumenty. SELECT CONCAT(kod,' ',miasto,' ',ulica) AS adres FROM nieruchomosc mysql> SELECT CONCAT(kod,' ',miasto,' ',ulica) AS adres -> FROM nieruchomosc; +---------------------------+ | adres | +---------------------------+ | 15-900 Białystok Nowa 5 | | 15-900 Białystok Mała 2 | | 15-900 Białystok Leśna 6 | | 15-900 Białystok Dobra 18 | | 19-200 Grajewo Długa 33 | | 18-400 Łomża Akacjowa 6 | +---------------------------+
31 31 Podaj informacje o nieruchomościach oferowanych do wynajęcia przez właścicieli zarejestrowanych w danym biurze: SELECT wlascicielnr, nieruchomoscnr, CONCAT(kod,' ',miasto,' ',ulica) AS adres, typ, czynsz FROM nieruchomosc WHERE biuronr = 'B003'; mysql> SELECT wlascicielnr AS wlasc, nieruchomoscnr AS nr, CONCAT(kod, ' ', miasto, ' ', ulica) AS adres, typ, czynsz -> FROM nieruchomosc -> WHERE biuronr = 'B003'; +-------+-----+---------------------------+------------+--------+ | wlasc | nr | adres | typ | czynsz | +-------+-----+---------------------------+------------+--------+ | CO93 | B16 | 15-900 Białystok Nowa 5 | mieszkanie | 495 | | CO93 | B17 | 15-900 Białystok Mała 2 | mieszkanie | 412 | | CO40 | B18 | 15-900 Białystok Leśna 6 | mieszkanie | 385 | | CO87 | B21 | 15-900 Białystok Dobra 18 | dom | 660 | +-------+-----+---------------------------+------------+--------+
32 32 Podaj numery, adresy, typy i wysokość czynszu dla wszystkich nieruchomości z Białegostoku, wynik uporządkuj według czynszu: SELECT nieruchomoscnr AS nr, CONCAT(kod,' ', miasto,' ',ulica) AS adres, typ, czynsz FROM nieruchomosc WHERE miasto='Białystok'; mysql> SELECT nieruchomoscnr AS nr, CONCAT(kod,' ',miasto, ' ',ulica) AS adres, typ, czynsz -> FROM nieruchomosc -> WHERE miasto='Białystok'; +-----+----------------------------+------------+--------+ | nr | adres | typ | czynsz | +-----+----------------------------+------------+--------+ | B16 | 15-900 Białystok Nowa 5 | mieszkanie | 495 | | B17 | 15-900 Białystok Mała 2 | mieszkanie | 412 | | B18 | 15-900 Białystok Leśna 6 | mieszkanie | 385 | | B21 | 15-900 Białystok Dobra 18 | dom | 660 | +-----+----------------------------+------------+--------+
33 33 HEX(N_or_S) : zamienia zapis szesnastkowy na liczbę bądź odwrotnie: mysql> SELECT HEX(255); -> 'FF' mysql> SELECT 0x616263; -> 'abc' mysql> SELECT HEX('abc'); -> 616263 LENGTH(S) : zwraca długość napisu (w znakach). Synonimy: OCTET_LENGTH(S), CHAR_LENGTH(S), CHARACTER_LENGTH(S).
34 34 LOCATE(A, B) : jeżeli napis A stanowi część napisu B, zwraca pozycję początku pierwszego wystąpienia A w B. W przeciwnym wypadku zwraca zero. Synonimem jest POSITION(B IN A). LOCATE(A,B,C) : jeżeli napis A jest częścią napisu B występującą w pozycji dalszej niż (liczba całkowita) C, zwraca pozycję tego wystąpienia. LEFT(napis,długość) : zwraca napis składający się z długość początkowych znaków napisu. MID(napis,pozycja,długość) : zwraca napis składający się z długość znaków napisu od pozycji pozycja i o długości długość. Synonim SUBSTRING(napis,pozycja,długość)
35 35 RIGHT(napis,długość) : podobnie jak LEFT, lecz zwraca końcówkę napisu. Synonimem jest SUBSTRING(napis FROM długość). REPEAT(napis,liczba) : powtarza napis ilość razy liczba REPLACE(A,B,C) : zwraca napis utworzony z napisu A poprzez zastąpienie wszystkich wystąpień pod-napisu B napisem C. REVERSE(napis) : zwraca napis z odwrotną kolejnością znaków.
36 36 SUBSTRING(A,B,C) : zwraca napis składający się z C znaków napisu A, począwszy od znaku w pozycji B. Akceptowana jest również składnia SUBSTRING(A FROM B FOR C). TRIM([[ BOTH | LEADING |TRAILING ] [ A ] FROM ] B) : zwraca napis uzyskany z napisu B poprzez usunięcie wystąpień pod-napisu A z początku ( LEADING ), końca ( TRAILING ) lub obu końców ( BOTH ). Domyślnie stosuje opcję BOTH, i jeżeli A nie podano usuwa spacje. mysql> SELECT TRIM(' bar '); -> 'bar' mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx'); -> 'barxxx' mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx'); -> 'bar' mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz'); -> 'barx'
37 37 Funkcje dotyczące daty i godziny : Funkcje operujące na wartościach oznaczających daty i godziny są zbyt liczne, aby tu je wszystkie wymienić. Ograniczymy się więc na razie do kilku najbardziej użytecznych; jak zwykle, pełny opis dostępny jest w dokumentacji MySQL. CURDATE() lub CURRENT_DATE : zwraca bieżącą datę w postaci YYYY-MM-DD (rok-miesiąc-dzień), lub YYYYMMDD, w pierwszym wypadku jako napis, w drugim jako liczbę całkowitą (jeżeli kontekst wymaga konwersji do typu całkowitoliczbowego). CURTIME() lub CURRENT_TIME : zwraca bieżącą godzinę w postaci HH:MM:SS (godzina:minuta:sekunda), lub HHMMSS -- zależnie od kontekstu, podobnie jak poprzednia funkcja.
38 38 NOW() lub SYSDATE() lub CURRENT_TIMESTAMP : zwraca bieżącą datę i godzinę w postaci napisu YYYY-MM-DD HH:MM:SS lub liczby całkowitej YYYYMMDDHHMMSS, jeśli kontekst wymaga wartości całkowitoliczbowej. DATE_FORMAT(data, format) : konwertuje datę na napis którego format można kontrolować za pomocą napisu formatującego (tabela dalej). TIME_FORMAT(czas, format) : funkcja analogiczna do powyższej, lecz akceptująca jedynie specyfikatory formatu dotyczące godziny, minuty i sekundy.
39 39 mysql> SELECT DATE_FORMAT('2016-05-14 08:23:00','%W %M %Y'); +------------------------------------------------+ | DATE_FORMAT('2016-05-14 08:23:00', '%W %M %Y') | +------------------------------------------------+ | Saturday May 2016 | +------------------------------------------------+ mysql> SELECT DATE_FORMAT('2016-05-14 08:23:00','%H:%i:%s'); +------------------------------------------------+ | DATE_FORMAT('2016-05-14 08:23:00', '%H:%i:%s') | +------------------------------------------------+ | 08:23:00 | +------------------------------------------------+ mysql>SELECT DATE_FORMAT('2016-05-14 08:23:00','%D %y %a %d %m %b %j'); +-----------------------------------------------------------+ | DATE_FORMAT('2016-05-14 08:23:00','%D %y %a %d %m %b %j') | +-----------------------------------------------------------+ | 14th 16 Sat 14 05 May 135 | +-----------------------------------------------------------+ DATE_FORMAT(data, format)
40 40 mysql>SELECT DATE_FORMAT('2016-05-14 08:23:00','%H %k %I %r %T %S %w'); +-----------------------------------------------------------+ | DATE_FORMAT('2016-05-14 08:23:00','%H %k %I %r %T %S %w') | +-----------------------------------------------------------+ | 08 8 08 08:23:00 AM 08:23:00 00 6 | +-----------------------------------------------------------+ mysql> SELECT DATE_FORMAT('2016-05-14', '%X %V'); +------------------------------------+ | DATE_FORMAT('2016-05-14', '%X %V') | +------------------------------------+ | 2016 19 | +------------------------------------+ mysql> SELECT DATE_FORMAT('2016-05-14', '%d'); +---------------------------------+ | DATE_FORMAT('2016-05-14', '%d') | +---------------------------------+ | 14 | +---------------------------------+
41 41 formatopis %a skróty nazw dni tygodnia (Sun..Sat) %b skróty nazw dni miesiąca (Jan..Dec) %c miesiąc liczbowo (0..12) %D dni miesiąca z angielskimi przyrostkami (0th, 1st, 2nd, 3rd, …) %d dni miesiąca, liczbowo (00..31) %e dni miesiąca, liczbowo (0..31) %f mikrosekundy (000000..999999) %H godzina (00..23) %h godzina (01..12) %I godzina (01..12) %i minuty, liczbowo (00..59) %j dzień roku (001..366) %k godzina (0..23) %l godzina (1..12) %M nazwa miesiąca (January..December) %m miesiąc, liczbowo (00..12) %pAM lub PM
42 42 formatopis %r czas, 12-godzinny (hh:mm:ss według AM lub PM) %S sekundy (00..59) %s sekundy (00..59) %T czas, 24-godzinny (hh:mm:ss) %U tydzień (00..53), gdzie Sunday jest pierwszym dniem tygodnia %u tydzień (00..53), gdzie Monday jest pierwszym dniem tygodnia %V tydzień (01..53), gdzie Sunday jest pierwszym dniem tygodnia ; używane z %X %v tydzień (01..53), gdzie Monday jest pierwszym dniem tygodnia ; używane z %x %W nazwa dnia tygodnia (Sunday..Saturday) %w dzień tygodnia (0=Sunday..6=Saturday) %X tydzień roku, gdzie Sunday jest pierwszym dniem tygodnia, liczbowo, 4 cyfry ; używane z %V %x tydzień roku, gdzie Monday jest pierwszym dniem tygodnia, liczbowo, 4 cyfry ; używane z %v %Y rok, liczbowo, 4 cyfry %y rok, liczbowo ( 2 cyfry ) % dosłowny “%” znak
43 43 TO_DAYS(data) : zamienia datę na liczbę całkowitą oznaczającą liczbę dni od początku roku 0. Funkcja ta (oraz następna) przydają się do obliczania liczby dni jakie upłynęły między dwiema datami. FROM_DAYS(liczba) : zamienia liczbę całkowitą, interpretowaną jako liczba dni od początku roku 0, na datę (napis postaci YYYY-MM-DD ). mysql> SELECT TO_DAYS('2016-05-14'); +-----------------------+ | TO_DAYS('2016-05-14') | +-----------------------+ | 736463 | +-----------------------+ mysql> SELECT FROM_DAYS(736465); +-------------------+ | FROM_DAYS(736465) | +-------------------+ | 2016-05-16 | +-------------------+
44 44 Funkcje dotyczące dat: ADDDATE(data,liczba_dni)- dodaje do daty określoną liczbę dni mysql> SELECT ADDDATE('2016-05-14',31); +--------------------------+ | ADDDATE('2016-05-14',31) | +--------------------------+ | 2016-06-14 | +--------------------------+
45 45 - dodaje do daty przedział czasowy określony wyrażeniem wyr oraz przypisaną mu jednostką (tabela dalej) mysql> SELECT ADDDATE('2016-05-14',INTERVAL 2 MONTH); +----------------------------------------+ | ADDDATE('2016-05-14',INTERVAL 2 MONTH) | +----------------------------------------+ | 2016-07-14 | +----------------------------------------+ ADDDATE(data,INTERVAL wyr jednostka)
46 46 jednostkaOczekiwane wyrażenie MICROSECONDMICROSECONDS SECONDSECONDS MINUTEMINUTES HOURHOURS DAYDAYS WEEKWEEKS MONTHMONTHS QUARTERQUARTERS YEARYEARS SECOND_MICROSECOND'SECONDS.MICROSECONDS' MINUTE_MICROSECOND'MINUTES.MICROSECONDS' MINUTE_SECOND'MINUTES:SECONDS' HOUR_MICROSECOND'HOURS.MICROSECONDS' HOUR_SECOND'HOURS:MINUTES:SECONDS' HOUR_MINUTE'HOURS:MINUTES' DAY_MICROSECOND'DAYS.MICROSECONDS' DAY_SECOND'DAYS HOURS:MINUTES:SECONDS' DAY_MINUTE'DAYS HOURS:MINUTES' DAY_HOUR'DAYS HOURS' YEAR_MONTH'YEARS-MONTHS'
47 47 - synonim ADDDATE(data,INTERVAL wyr jednostka) mysql> SELECT DATE_ADD( '2016-05-14 08:23:00',INTERVAL '-1 10' DAY_HOUR); +------------------------------------------------------------+ | DATE_ADD('2016-05-14 08:23:00', INTERVAL '-1 10' DAY_HOUR) | +------------------------------------------------------------+ | 2016-05-13 18:23:00 | +------------------------------------------------------------+ DATE_ADD(data,INTERVAL wyr jednostka)
48 48 mysql> SELECT INTERVAL 1 DAY + CURDATE(); +----------------------------+ | INTERVAL 1 DAY + CURDATE() | +----------------------------+ | 2016-05-15 | +----------------------------+ mysql> SELECT INTERVAL 1 DAY + NOW(); +------------------------+ | INTERVAL 1 DAY + NOW() | +------------------------+ | 2016-05-15 08:38:49 | +------------------------+ INTERVAL wyr jednostka
49 49 mysql> SELECT ADDTIME(NOW(),'1 1:1:1'); +--------------------------+ | ADDTIME(NOW(),'1 1:1:1') | +--------------------------+ | 2016-05-15 09:49:24 | +--------------------------+ mysql> SELECT ADDTIME('2015-12-31 23:59:59.999999','1 1:1:1.000002'); +--------------------------------------------------------+ | ADDTIME('2015-12-31 23:59:59.999999','1 1:1:1.000002') | +--------------------------------------------------------+ | 2016-01-02 01:01:01.000001 | +--------------------------------------------------------+ mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998'); +-----------------------------------------------+ | ADDTIME('01:00:00.999999', '02:00:00.999998') | +-----------------------------------------------+ | 03:00:01.999997 | +-----------------------------------------------+ ADDTIME(wyr1,wyr2) - do wyr1 (czas) dodaje wyr2 (czas, data-czas)
50 50 synonim SUBDATE(data,INTERVAL wyr jedn) mysql> SELECT DATE_SUB('2016-03-01', INTERVAL 31 DAY); +-----------------------------------------+ | DATE_SUB('2016-03-01', INTERVAL 31 DAY) | +-----------------------------------------+ | 2016-01-30 | +-----------------------------------------+ mysql> SELECT DATE_SUB('2015-03-01', INTERVAL 31 DAY); +-----------------------------------------+ | DATE_SUB('2015-03-01', INTERVAL 31 DAY) | +-----------------------------------------+ | 2015-01-29 | +-----------------------------------------+ DATE_SUB(data,INTERVAL wyr jedn)
51 51 mysql> SELECT DATE_SUB('2016-01-19', INTERVAL 2 MONTH); +------------------------------------------+ | DATE_SUB('2016-01-19', INTERVAL 2 MONTH) | +------------------------------------------+ | 2015-11-19 | +------------------------------------------+ mysql> SELECT DATE_SUB('2016-05-14', INTERVAL 2 QUARTER); +--------------------------------------------+ | DATE_SUB('2016-05-14', INTERVAL 2 QUARTER) | +--------------------------------------------+ | 2015-11-14 | +--------------------------------------------+ mysql> SELECT DATE_SUB('2016-31-02', INTERVAL 31 DAY); +-----------------------------------------+ | DATE_SUB('2016-31-02', INTERVAL 31 DAY) | +-----------------------------------------+ | NULL | +-----------------------------------------+
52 52 – różnica od wyr1 do wyr2 w dniach mysql> SELECT DATEDIFF('2016-05-14','2015-05-05'); +-------------------------------------+ | DATEDIFF('2016-05-14','2015-05-05') | +-------------------------------------+ | 375 | +-------------------------------------+ mysql> SELECT DATEDIFF('2016-05-14','2016-06-05'); +-------------------------------------+ | DATEDIFF('2016-05-14','2016-06-05') | +-------------------------------------+ | -22 | +-------------------------------------+ DATEDIFF(wyr1,wyr2)
53 53 Funkcje dodatkowe: DAY(data) synonim DAYOFMONTH(data) DAYNAME(data) DAYOFWEEK(data) (1 = Sunday, 2 = Monday, …, 7 = Saturday) DAYOFYEAR(data) mysql> SELECT DAY('2016-05-14'); +-------------------+ | DAY('2016-05-14') | +-------------------+ | 14 | +-------------------+ mysql> SELECT DAYNAME('2016-05-14'); +-----------------------+ | DAYNAME('2016-05-14') | +-----------------------+ | Saturday | +-----------------------+
54 54 mysql> SELECT DAYOFWEEK( '2016-05-14' ); +-------------------------+ | DAYOFWEEK('2016-05-14') | +-------------------------+ | 7 | +-------------------------+ mysql> SELECT DAYOFYEAR( '2016-05-14' ); +-------------------------+ | DAYOFYEAR('2016-05-14') | +-------------------------+ | 135 | +-------------------------+
55 55 EXTRACT(jednostka FROM data) - tabela str 41 mysql> SELECT EXTRACT(YEAR FROM '2016-05-14'); +---------------------------------+ | EXTRACT(YEAR FROM '2016-05-14') | +---------------------------------+ | 2016 | +---------------------------------+ mysql> SELECT EXTRACT(YEAR_MONTH FROM '2016-05-14 09:02:03'); +------------------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2016-05-14 09:02:03') | +------------------------------------------------+ | 201605 | +------------------------------------------------+ mysql> SELECT EXTRACT(DAY_MINUTE FROM '2016-05-14 09:07:38'); +------------------------------------------------+ | EXTRACT(DAY_MINUTE FROM '2016-05-14 09:07:38') | +------------------------------------------------+ | 140907 | +------------------------------------------------+
56 56 HOUR(czas) MINUTE(czas) SECOND(czas) mysql> SELECT HOUR('10:25:43'); -> 10 mysql> SELECT MINUTE('10:25:43'); -> 25 LAST_DAY(data) – ostatni dzień miesiąca z daty SELECT LAST_DAY('2016-02-05'); -> '2016-02-29' mysql> SELECT LAST_DAY('2015-02-05'); -> '2012-02-28'
57 57 MAKEDATE(rok,dzień_roku) - tworzy datę mysql> SELECT MAKEDATE(2016,31), MAKEDATE(2016,32); +-------------------+-------------------+ | MAKEDATE(2016,31) | MAKEDATE(2016,32) | +-------------------+-------------------+ | 2016-01-31 | 2016-02-01 | +-------------------+-------------------+ mysql> SELECT MAKEDATE(2016,365), MAKEDATE(2015,365); +--------------------+--------------------+ | MAKEDATE(2016,365) | MAKEDATE(2015,365) | +--------------------+--------------------+ | 2015-12-30 | 2012-12-31 | +--------------------+--------------------+
58 58 MONTH(data)MONTHNAME(data) QUARTER(data)YEAR(data) mysql> SELECT MONTH('2016-05-14'); -> 5 mysql> SELECT MONTHNAME('2016-05-14'); +-------------------------+ | MONTHNAME('2016-05-14') | +-------------------------+ | May | +-------------------------+ mysql> SELECT QUARTER ('2016-05-14'); -> 2 mysql> SELECT YEAR('2016-05-14'); -> 2016
59 59 mysql> SELECT WEEKDAY('2016-05-14'); +-----------------------+ | WEEKDAY('2016-05-14') | +-----------------------+ | 5 | +-----------------------+ mysql> SELECT WEEKOFYEAR('2016-05-14'); +--------------------------+ | WEEKOFYEAR('2016-05-14') | +--------------------------+ | 19 | +--------------------------+ WEEKDAY(data) (0 = Monday, 1 = Tuesday, … 6 = Sunday) WEEKOFYEAR(data) odpowiednik polecenia WEEK(data,3)
60 60 TrybPierwszy dzień tygodniaZakres1 tygodniem jest tydzień... 0Sunday0-53z niedzielą w tym roku 1Monday0-53z więcej niż 3 dniami w tym roku 2Sunday1-53z niedzielą w tym roku 3Monday1-53z więcej niż 3 dniami w tym roku 4Sunday0-53z więcej niż 3 dniami w tym roku 5Monday0-53z poniedziałkiem w tym roku 6Sunday1-53z więcej niż 3 dniami w tym roku 7Monday1-53z poniedziałkiem w tym roku WEEK(data[,tryb]) mysql> SELECT WEEK('2016-05-14'); -> 19 mysql> SELECT WEEK('2016-05-14',0); -> 19 mysql> SELECT WEEK('2016-05-14',1); -> 19 mysql> SELECT WEEK('2015-05-14'); -> 19 mysql> SELECT WEEK('2015-05-14',0); -> 19 mysql> SELECT WEEK('2015-05-14',1); -> 20
61 61 Ćwiczenie 1 Podaj liczbę wizyt w nieruchomościach w kolejnych dniach poprzedniego miesiąca kalendarzowego: SELECT FROM WHERE ; +-------------+--------+
62 62 Ćwiczenie 2 Podaj informacje o wynajęciach nieruchomości, których termin końcowy upłynie w następnym miesiącu: SELECT FROM WHERE ; +-------------+--------+
63 63 Ćwiczenie 3 Podaj liczbę umów najmu zawartych w biurach w Łomży na okres krótszy niż jeden rok: SELECT FROM WHERE ; +-------------+--------+
64 64 Ćwiczenie 4 Podaj liczbę umów najmu zawartych w biurach w Białymstoku na okres krótszy niż jeden rok: SELECT FROM WHERE ; +-------------+--------+
65 65 Ćwiczenie 5 Podaj którzy klienci nie wizytowali nieruchomości w ciągu ostatniego kwartału kalendarzowego: SELECT FROM WHERE ; +-------------+--------+
66 66 Ćwiczenie 6 Podaj którzy klienci wizytowali nieruchomości w ciągu ostatniego kwartału kalendarzowego: SELECT FROM WHERE ; +-------------+--------+
67 67 Ćwiczenie 7 Podaj ile było wynajęć nieruchomości dla każdego typu w ciągu ostatniego roku kalendarzowego w kolejności malejącej: SELECT FROM WHERE ; +-------------+--------+