Встроенные функции и условная логика
Встроенные функции
Строки:
экранирование: дополнителная кавычка '' или \'
quote() +кавычки при выборке текста:
SELECT quote(text_fId) FROM string_tbl; -> 'This string didn\'t work, but it does now'
char() берет номера, и объединяет в строку
char(97,98,99) -> abc
concat() (+ в MS SQL) объединяет строки
UPDATE string_tbl SET text_fld = CONCAT(text_fld, 'but now it is longer');
select concat(first_name, ' ', last_name, ' has been customer since ', date(create_date)) narrative from customer;
length() длина строки
position начало подстроки SELECT POSITION('characters' IN vchar_fld) FROM string_tbl; Первый с 1. 0 если не найдено.
locate как position, но 3 аргумент - старт поиска
insert вставка
replace заменяет
substring находит подстроку
объединение данных из группировки в столбец
SELECT id, GROUP_CONCAT(data) FROM yourtable GROUP BY id
Числа:
ceil(), floor()округление в большую или меньшую сторону к ближайшему целому числу
round() десятичная часть >=0,5 округлено в большую сторону и наоборот ROUND(72.0909,3) - 3 знака оставить
TRUNCATE(72.0909, 1) - простое усечение, оставит 72.0
аргумент может быть <0 TRUNCATE(17, -1) = 10, round(17, -1) = 20
sign() знак числа
abs() абсолютное значение
Даты:
cast() строку формата YYY-MM-DD HH:MM:SS в дату
SELECT HOUR(@dt), MINUTE(@dt), SECOND(@dt), DAY(@dt), WEEK(@dt), MONTH(@dt), QUARTER(@dt), YEAR(@dt);
str_to_date(str, 'format') Формат:
%M | Полное имя месяца (January..December) |
%m | Числовое значение месяца |
%d | Числовое значение дня месяца (00..31) |
%j | День года (001..366) |
%W | Полное имя дня недели (Sunday.Saturday) |
%Y | Значение года (четыре цифры) |
%y | Значение года (две цифры) |
%H | Час дня в 24-часовом формате (00..23) |
%h | Час дня в 12-часовом формате (01..12) |
%i | Минуты в часе (00..59) |
%s | Число секунд (00..59) |
%f | Число микросекунд (000000..999999) |
%p | AM или РМ |
%a | Краткое имя дня недели — Sun, Mon,... |
%b | Краткое имя месяца — Jan,Feb,... |
CURRENT_DATE(), CURRENT_TIME(), CURRENT_TIMESTAMP()
interval
SELECT DATE ADD(CURRENT DATE(), INTERVAL 5 DAY)
последний день месяца
LAST_DAY('2019-09-17')
имя месяца
DAYNAME('2019-09-18')
извлекают элемент даты
EXTRACT(YEAR FROM '2019-09-18 22:19:05')
кол-во полных дней
DATEDIFF('2019-09-03', 2019-06-211)
SELECT
CURRENT_TIME() AS 'CUR_TIME',
ADDTIME(CURRENT_TIME(), 020000) AS 'ADDTIME',
SUBTIME(CURRENT_TIME(), 020000) AS 'SUBTIME';
| CUR_TIME | ADDTIME | SUBTIME |
| 10:12:34 | 12:12:34 | 08:12:34 |
Условная логика
case:
SELECT c.first_name, c.last_name,
CASE
WHEN active = 0 THEN 0
ELSE (select count(*) from rental r where r.customer_id = c.customer_id)
END activity_type
FROM customer c;
преимущество перед if-then в возможности использовать внутри select, insert, update, delete
возвращаемые значения одного типа
Использование case для разделения по столбцам
SELECT
SUM(CASE WHEN monthname(rental_date) = 'May' THEN 1 ELSE 0 END) May_rentals,
SUM(CASE WHEN monthname(rental_date) = 'June' THEN 1 ELSE 0 END) June_rentals,
SUM(CASE WHEN monthname(rental_date) = 'July' THEN 1 ELSE 0 END) July_rentals
FROM rental WHERE rental date BETWEEN 2005-05-01' AND '2005-08-01';
использование case для получения факта участия актера в фильмах статуса G
SELECT a.first_name, a.last_name,
CASE
WHEN EXISTS (SELECT 1 FROM film_actor fa
INNER JOIN film f ON fa.film_id = f.film_id
WHERE fa.actor_id = a.actor_id
AND f.rating = 'G') THEN 'Y' ELSE 'N' END g_actor
FROM actor a WHERE a.last name LIKE 'S%' OR a.first name LIKE 'S%';
условные обновления
UPDATE customer
SET active = CASE
WHEN 90 <= (SELECT datediff(now(), max(rental_date) FROM rental r WHERE r.customer id = customer.customer id))
THEN 0
ELSE 1
END
WHERE active = 1;
Аналитические функции
Постобработка сформированных данных. Использование: функция(столбец) over (дополнительное условие группировки)
Функция | Описание |
RANK | Аналогична функции DENSE_RANK() за исключением того, что в последовательности ранжированных значений есть пробелы, когда две или более строки имеют одинаковый ранг. |
DENSE_RANK | Присваивает ранг каждой строке в своем разделе на основе предложения ORDER BY. Он присваивает одинаковый ранг строкам с одинаковыми значениями. Если две или более строки имеют одинаковый ранг, то в последовательности ранжированных значений не будет пробелов. |
ROW_NUMBER | Назначает последовательное целое число каждой строке в своем разделе |
CUME_DIST | Вычисляет совокупное распределение значения в наборе значений. |
FIRST_VALUE | Возвращает значение указанного выражения относительно первой строки в рамке окна. |
LAG | Возвращает значение N-й строки перед текущей строкой в разделе. Возвращает NULL, если предшествующей строки не существует. |
LAST_VALUE | Возвращает значение указанного выражения относительно последней строки в рамке окна. |
LEAD | Возвращает значение N-й строки после текущей строки в разделе. Возвращает NULL, если никакой последующей строки не существует. |
NTH_VALUE | Возвращает значение аргумента из N-й строки рамки окна |
NTILE | Распределяет строки для каждого раздела окна в указанное количество ранжированных групп. |
PERCENT_RANK | Вычисляет процентильный ранг строки в разделе или наборе результатов |
No Comments