Архив метки: MySQL

Как получить сегодняшнюю дату в MySQL. Руководство для начинающих

Резюме : в этой статье вы узнаете, как запрашивать данные, соответствующие сегодняшней дате в MySQL, с помощью встроенных функций даты.

 

Получение сегодняшней даты в MySQL с использованием встроенных функций даты

Иногда вам может потребоваться запросить данные из таблицы, чтобы получить строки со столбцом даты на сегодняшний день, например:

SELECT

column_list

FROM

table_name

WHERE

expired_date = today;

 

Чтобы получить сегодняшнюю дату, вы используете функцию CURDATE() следующим образом:

mysql> SELECT CURDATE() today;

+------------+

| today      |

+------------+

| 2020-03-12 |

+------------+

1 row in set (0.00 sec)

 

Или вы можете получить часть даты из текущего времени, возвращенного функцией NOW():

mysql> SELECT DATE(NOW()) today;

+------------+

| today      |

+------------+

| 2020-03-12 |

+------------+

1 row in set (0.00 sec)

 

Таким образом, запрос должен измениться на:

SELECT

column_list

FROM

table_name

WHERE

expired_date = CURDATE();

 

Если столбец expired_date содержит часть даты и времени, следует использовать функцию DATE(), чтобы извлечь только часть даты и сравнить ее с текущей датой:

SELECT

column_list

FROM

table_name

WHERE

DATE(expired_date) = CURDATE();

 

Создание вашей хранимой функции MySQL

Если вы часто используете эту функцию CURDATE() в своих запросах и хотите заменить ее на функцию today(), чтобы сделать запросы более читабельными, вы можете создать свою собственную хранимую функцию с именем today() следующим образом:

DELIMITER $$

CREATE FUNCTION today()

RETURNS DATE

BEGIN

RETURN CURDATE();

END$$

DELIMITER ;

 

Теперь вы можете использовать созданную вами функцию today() следующим образом:

mysql> SELECT today();

+------------+

| today()    |

+------------+

| 2020-03-12 |

+------------+

1 row in set (0.00 sec)

 

Как насчет завтра? Это должно быть так просто, как:

mysql> SELECT today() + interval 1 day Tomorrow;

+------------+

| Tomorrow   |

+------------+

| 2017-07-09 |

+------------+

1 row in set (0.00 sec)

 

И вчерашний день также прост:

mysql> SELECT today() - interval 1 day Yesterday;

+------------+

| Yesterday  |

+------------+

| 2017-07-07 |

+------------+

1 row in set (0.00 sec)

 

Из этой статье вы узнали, как получить сегодняшнюю дату в MySQL, используя встроенную функцию даты. Вы также узнали, как разработать свою собственную функцию, используя хранимую функцию в MySQL.



2020-03-12T07:27:51
База данных MySQL

NULL в MySQL. Руководство для начинающих

Описание : в этой статье вы узнаете, как работать со значениями NULL в MySQL. Кроме того, вы изучите некоторые полезные функции для эффективной работы со значениями NULL.

 

Введение в NULL в MySQL

В MySQL значение NULL означает неизвестное. Значение NULL отличается от нуля (0) или пустой строки ».

Значение NULL не равно ни к чему, даже сам по себе. Если вы сравниваете значение NULL с другим значением NULL или любым другим значением, результатом является то, что значение NULL каждого значения NULL неизвестно.

Обычно значение NULL используется для указания того, что данные отсутствуют, неизвестны или неприменимы. Например, номер телефона потенциального клиента может быть NULL и может быть добавлен позже.

Когда вы создаете таблицу, вы можете указать, принимает ли столбец значения NULL или нет, используя ограничение NOT NULL.

Например, следующий оператор создает таблицу leads:

DROP TABLE IF EXISTS leads;



CREATE TABLE leads (

id INT AUTO_INCREMENT PRIMARY KEY,

first_name VARCHAR(50) NOT NULL,

last_name VARCHAR(50) NOT NULL,

source VARCHAR(255) NOT NULL,

email VARCHAR(100),

phone VARCHAR(25)

);

 

В таблице leads столбец id является столбцом первичного ключа, поэтому он не принимает никаких значений NULL.

Столбцы first_name, last_name и source используют ограничение NOT NULL, следовательно, вы не можете вставить любые значения NULL в эти столбцы, в то время как emailи phoneстолбцы принимают значения NULL.

Вы можете использовать NULLзначение в выражении INSERT, чтобы указать, что данные отсутствуют. Например, следующий оператор вставляет строку в таблицу leads. Поскольку номер телефона отсутствует, поэтому используется значениеNULL.

INSERT INTO leads(first_name,last_name,source,email,phone)

VALUE('Andrey','Terminator','Web Search','Andrey.Terminator@andreyex.ru',NULL);

 

Поскольку значение по умолчанию для столбца электронной почты — это NULL, вы можете опустить электронную почту в выражении INSERT следующим образом:

INSERT INTO leads(first_name,last_name,source,phone)

VALUES

('Max','Hard','Cold Calling','(123)-456-789'),

('Lilu','Dalas','Web Search','(987)-654-321');

 

SET NULL в заявлении UPDATE

Чтобы установить значение столбца в NULL, вы используете оператор присваивания ( =). Например, чтобы обновить телефон Lilu Dalas до NULL, вы используете следующую   инструкцию UPDATE:

UPDATE

leads

SET

phone = NULL

WHERE

id = 3;

MySQL ORDER BY NULL

 

Если вы используете предложение ORDER BY для сортировки результирующего набора в порядке возрастания, MySQL считает, что значения NULL ниже, чем другие значения, поэтому NULL сначала он представляет значения.

Следующее утверждение сортирует клиентов по номеру телефона в порядке возрастания.

SELECT

*

FROM

leads

ORDER BY phone;

 

Если вы используете ORDER BY DESC, значения NULL появляются в конце набора результатов. Смотрите следующий пример:

SELECT

*

FROM

leads

ORDER BY phone DESC;

 

Для проверки NULL в запросе вы используете оператор IS NULL или IS NOT NULL в предложении WHERE.

Например, чтобы получить потенциальных клиентов, которые еще не указали номер телефона, вы используете оператора IS NULL следующим образом:

SELECT

*

FROM

leads

WHERE

phone IS NULL;

 

Вы можете использовать оператора IS NOT, чтобы получить все лиды, которые предоставили адреса электронной почты.

SELECT

*

FROM

leads

WHERE

email IS NOT NULL;

 

Даже если значение NULL не равно NULL, два значения NULL равны в предложении GROUP BY.

SELECT

id, first_name, last_name, email, phone

FROM

leads

GROUP BY email;

Запрос возвращает только две строки, потому что строки, столбец электронной почты, у которых NULL сгруппирован в одну.

 

NULL и индекс UNIQUE в MySQL

Когда вы используете ограничение UNIQUE или индекс UNIQUE для столбца, вы можете вставить несколько значений NULL в этот столбец. Это прекрасно, потому что в этом случае MySQL считает, что значения NULL различны.

Давайте проверим этот момент, создав индекс UNIQUE для столбца phone.

CREATE UNIQUE INDEX idx_phone ON leads(phone);

 

Обратите внимание, что если вы используете механизм хранения BDB, MySQL считает, что значения NULL равны, поэтому вы не можете вставить несколько значений NULL в столбец с уникальным ограничением.

 

Функция NULL в MySQL

MySQL предоставляет несколько полезных функций, которые эффективно обрабатывают NULL: IFNULL, COALESCE и NULLIF.

Функция IFNULL принимает два параметра. Функция IFNULL возвращает первый аргумент, если он не NULL, в противном случае она возвращает второй аргумент.

Например, следующий оператор возвращает номер телефона, если это не NULL, иначе он возвращает N/A вместо NULL.

SELECT

id,

first_name,

last_name,

IFNULL(phone, 'N/A') phone

FROM

leads;

 

Функция COALESCE принимает список аргументов и возвращает первый аргумент не-NULL. Например, вы можете использовать функцию COALESCE для отображения контактной информации о потенциальной возможности в зависимости от приоритета информации в следующем порядке: телефон, электронная почта и N/A.

SELECT

id,

first_name,

last_name,

COALESCE(phone, email, 'N/A') contact

FROM

leads;

 

Функция NULLIF принимает два аргумента. Если два аргумента равны, функция NULLIF возвращает NULL. В противном случае она возвращает первый аргумент.

Функция NULLIF полезна, если у вас есть как NULL и пустые строковые значения в столбце. Например, по ошибке вы вставляете в таблицу leads следующую строку :

INSERT INTO leads(first_name,last_name,source,email,phone)

VALUE('Andreyex','Destroyer','Web Search','Andreyex.Destroyer@example.ru','');

 

Телефон представляет собой пустую строку вместо NULL.

Если вы хотите получить контактную информацию о потенциальных клиентах, вы получите пустой телефон вместо электронного письма в виде следующего запроса:

SELECT

id,

first_name,

last_name,

COALESCE(phone, email, 'N/A') contact

FROM

leads;

 

Чтобы исправить это, вы используете функцию NULLIF для сравнения телефона с пустой строкой, если они равны, он возвращает NULL, в противном случае он возвращает номер телефона.

SELECT

id,

first_name,

last_name,

COALESCE(NULLIF(phone, ''), email, 'N/A') contact

FROM

leads;

 

Из этой статьи вы узнали, как работать с NULL в MySQL и как использовать некоторые удобные функции для обработки запросов NULL.



2020-03-01T16:23:29
База данных MySQL

Интервал в MySQL

Описание : в этой статье вы узнаете, как использовать значения интервала MySQL для выполнения арифметики даты и времени.

 

Введение в интервальные значения MySQL

Значения интервала MySQL используются в основном для расчета даты и времени. Чтобы создать значение интервала, вы используете следующее выражение:

INTERVAL expr unit

 

За ним следует ключевое слово INTERVAL expr, определяющее значение интервала и unitуказывающее единицу измерения интервала. Например, чтобы создать 1-дневный интервал, вы используете следующее выражение:

INTERVAL 1 DAY

 

Обратите внимание, что INTERVAL и UNIT без учета регистра, поэтому следующее выражение эквивалентно приведенному выше:

interval 1 day

 

В основном мы используем интервальные значения для арифметики даты и времени, как показано ниже:

date + INTERVAL expr unit

date - INTERVAL expr unit

 

Значения интервалов также используются в различных временных функциях, таких как DATE_ADD, DATE_SUB, TIMESTAMPADD и TIMESTAMPDIFF

MySQL определяет стандартные форматы expr и unit как показано в следующей таблице:
























unitexpr
DAYДни
DAY_HOURДни: Часы
DAY_MICROSECONDДни: Микросекунды
DAY_MINUTEДни: Минуты
DAY_SECONDДни: Секунды
HOURЧасы
HOUR_MICROSECONDЧасы: Микросекунды
HOUR_MINUTEЧасы: Минуты
HOUR_SECONDЧасы: Секунды
MICROSECONDМикросекунд
MINUTEМинуты
MINUTE_MICROSECONDМинуты: Микросекунды
MINUTE_SECONDМинуты: Секунды
MONTHМесяц
QUARTERДекада
SECONDСекунды
SECOND_MICROSECONDСекунды: Микросекунды
WEEKНеделя
YEARГод
YEAR_MONTHГод: Месяц

Примеры интервалов в MySQL

Следующее утверждение добавляет 1 день к January 1st 2020:

SELECT '2020-01-01' + INTERVAL 1 DAY;

+-------------------------------+

| '2020-01-01' + INTERVAL 1 DAY |

+-------------------------------+

| 2020-01-02                    |

+-------------------------------+

1 row in set (0.01 sec)

 

Если значение интервала используется в выражении, которое включает значение DATE или значение интервала DATETIME находится справа от выражения, вы можете использовать отрицательное значение expr, как показано в следующем примере:

SELECT '2020-01-01' + INTERVAL -1 DAY;

+--------------------------------+

| '2020-01-01' + INTERVAL -1 DAY |

+--------------------------------+

| 2019-12-31                     |

+--------------------------------+

1 row in set(0.00sec)

 

Следующий оператор показывает, как использовать DATE_ADD и DATE_SUB, чтобы добавлять/вычитать 1 месяц из значения даты:

SELECT DATE_ADD('2020-01-01', INTERVAL 1 MONTH)1_MONTH_LATER,

DATE_SUB('2020-01-01',INTERVAL 1 MONTH) 1_MONTH_BEFORE;

+---------------+----------------+

| 1_MONTH_LATER | 1_MONTH_BEFORE |

+---------------+----------------+

| 2020-02-01    | 2019-12-01     |

+---------------+----------------+

1 row in set (0.00 sec)

 

Следующий запрос использует функцию TIMESTAMPADD(unit, interval, expression) для добавления 30 минут к значению временной метки:

SELECT TIMESTAMPADD(MINUTE,30,'2020-01-01') 30_MINUTES_LATER;

+---------------------+

| 30_MINUTES_LATER    |

+---------------------+

| 2020-01-01 00:30:00 |

+---------------------+

1 row in set (0.00 sec)

 

Практический пример интервала в MySQL

Давайте создать новую таблицу с именем memberships для демонстрации:

CREATE TABLE memberships (

id INT AUTO_INCREMENT PRIMARY KEY,

email VARCHAR(355) NOT NULL,

plan VARCHAR(255) NOT NULL,

expired_date DATE NOT NULL

);

 

В таблице memberships в столбце expired_date хранится дата окончания членства каждого участника.

Следующий оператор вставляет несколько строк в таблицу memberships.

INSERT INTO memberships(email, plan, expired_date)

VALUES('andreyex@example.ru','Gold','2020-02-13'),

('alex@example.ru','Platinum','2020-02-10'),

('max@example.ru','Silver','2020-02-08');

 

Предположим, сегодня 2020-02-06 вы можете найти участников, срок действия которых истек в течение 7 дней, с помощью следующего запроса:

SELECT

email,

plan,

expired_date,

DATEDIFF(expired_date, '2020-02-06') remaining_days

FROM

memberships

WHERE

'2020-02-06' BETWEEN DATE_SUB(expired_date, INTERVAL 7 DAY) AND expired_date;

 

В этом запросе мы использовали функцию DATE_SUB для вычитания истекшей даты на 7 дней, указанных значением интервала (INTERVAL 7 DAY).

В этой статье вы узнали, как использовать значение интервала MySQL для арифметики даты и времени.

 



2020-02-20T08:58:43
База данных MySQL

MariaDB против MySQL

Следующая таблица иллюстрирует основные различия между MariaDB и MySQL:

MySQL MariaDB
Разработчик Корпорация Oracle MariaDB Corporation AB (Корпорация MariaDB),

Фонд MariaDB (сообщество MariaDB Server)

Протоколы MySQL MySQL + MariaDB
Исходный код Open Source + Проприетарный Открытый источник
Развитие Закрытое Открытое
Сотрудничество Ограниченное Экстенсивное
Подсистема хранилища InnoDB

MyISAM

BLACKHOLE

CSVMEMORY ARCHIVE

MERGE

InnoDB

MyISAM

BLACKHOLE

CSV

MEMORY

ARCHIVE

MERGE

ColumnStore

MyRocks

Aria

SphinxSE

TokuDB

CONNECT

SEQUENCE

Spider

Cassandra

Ограничение CHECK нет да
Выражение DEFAULT нет Да. Кроме того, поддержка значений по умолчанию для столбцов BLOB и TEXT
Виртуальные колонки да да
Динамические столбцы нет да
Роли да да
УДАЛИТЬ … ВЕРНУТЬСЯ да нет
Поддержка GIS да да
Отчет о проделанной работе ALTER TABLE и LOAD DATA заявление INFILE нет да
Устранение таблицы нет да
Управление SQL MySQL Workbench SQLyog (недоступен для Linux)
Мониторинг MySQL Enterprise Monitor MONyog (SQL Diagnostic Manager для MySQL)
Резервирование MySQL Enterprise Backup MariaDB Backup
Выражения общей таблицы SQL (CTE) Да (начиная с версии 8.0) да
Оконные функции в SQL Да (начиная с версии 8.0) да
Поддержка JSON да да
Маскировка данных нет да. (MariaDB MaxScale)
Шифрование MySQL Enterprise Encryption MariaDB Шифрование
Брандмауэр базы данных MySQL Enterprise Firewall MaxScale Firewall
Аудиторская проверка MySQL Enterprise Audit MariaDB Audit
Аналитика нет MariaDB ColumnStore
Разметка MySQL Partitioning MariaDB Перегородки
Маршрутизация MySQL Router MariaDB MaxScale
Копирование MySQL Replication MariaDB Replication

 

Как сбрасывать значения автоинкремента в MySQL

Резюме : в этой статье мы покажем вам различные способы сброса значений автоинкремента столбцов AUTO_INCREMENT в MySQL.

MySQL предоставляет вам полезную функцию под названием автоинкремент . Вы можете присвоить атрибут AUTO_INCREMENT столбцу таблицы, чтобы создать уникальный идентификатор для новой строки. Как правило, вы используете атрибут AUTO_INCREMENT для столбца первичного ключа таблицы.

Всякий раз, когда вы вставляете новую строку в таблицу, MySQL с помощью атрибута AUTO_INCREMENT автоматически присваивает порядковый номер столбцу.

Например, если в таблице восемь строк, и вы вставляете новую строку без указания значения для столбца автоинкремента, MySQL автоматически вставит новую строку id со значением 9.

Иногда вам может понадобиться сбросить значение столбца автоинкремента, чтобы идентификатор первой записи, который вы вставляете в таблицу, начинался с определенного числа, например, 1.

В MySQL вы можете сбросить значения автоинкремента различными способами.

 

Примеры сбрасывания значения автоматического приращения в MySQL

Сначала создайте таблицу с именем   tmp и присвойте  атрибут AUTO_INCREMENT столбцу id первичного ключа.

CREATE TABLE tmp (

id INT NOT NULL AUTO_INCREMENT,

name VARCHAR(45) DEFAULT NULL,

PRIMARY KEY (id)

);

 

Во-вторых, вставьте пример данных в таблицу tmp:

INSERT INTO tmp(name)

VALUES('test 1'),

('test 2'),

('test 3');

 

В- третьих, запрос к таблице tmp для проверки операции вставки:

SELECT

*

FROM

tmp;

 

Как сбрасывать значения автоинкремента в MySQL

 

У нас есть три строки со значениями столбца ID: 1, 2 и 3. Отлично! Пора попрактиковаться в сбросе значения автоинкремента столбца ID.

 

Использование инструкции ALTER TABLE

Вы можете сбросить значение автоинкремента с помощью оператора ALTER TABLE. Синтаксис оператора ALTER TABLE  для сброса значения автоинкремента выглядит следующим образом:

ALTER TABLE table_name AUTO_INCREMENT = value;

 

Вы указываете имя таблицы после оператора ALTER TABLE и имя value, которое вы хотите сбросить в выражении AUTO_INCREMENT=value.

Обратите внимание, что значение value должно быть больше или равно текущему максимальному значению столбца автоинкремента.

Давайте удалим последнюю запись в таблице tmp с id значением 3:

DELETE FROM tmp

WHERE

ID = 3;

 

Если вы вставите новую строку, MySQL назначит 4  столбцу id новой строки. Однако вы можете сбросить число, сгенерированное MySQL, на 3, используя следующую инструкцию ALTER TABLE:

ALTER TABLE tmp AUTO_INCREMENT = 3;

 

Теперь давайте попробуем вставим новую строку в таблицу tmp и запросить данные из нее, чтобы увидеть эффект:

INSERT INTO tmp(name)

VALUES ('MySQL example 3');



SELECT

*

FROM

tmp;

 

Как сбрасывать значения автоинкремента в MySQL

 

У нас есть три строки с последним значением автоинкремента, равным 3 вместо 4, что мы и ожидали.

 

Использование оператора TRUNCATE TABLE

Оператор TRUNCATE TABLE удаляет все данные из таблицы и сбрасывает значение автоинкремента на ноль.

Следующее иллюстрирует синтаксис оператора TRUNCATE TABLE:

TRUNCATE TABLE table_name;

 

Используя оператор TRUNCATE TABLE, вы удаляете все данные из таблицы навсегда и сбрасываете значение автоинкремента на ноль.

 

Использование операторов DROP TABLE и CREATE TABLE

Вы можете использовать пару операторов: DROP TABLE и CREATE TABLE, чтобы сбросить столбец автоинкремента. Обратите внимание, что этот метод удаляет все данные из таблицы навсегда.

Как и оператор TRUNCATE TABLE, эти операторы удаляют таблицу и воссоздают ее, поэтому значение автоинкремента сбрасывается на ноль.

DROP TABLE table_name;

CREATE TABLE table_name(...);

 

В этой статье вы узнали, как различными способами сбросить значение автоинкремента в MySQL. Первый способ предпочтительнее, потому что он самый простой и не имеет побочных эффектов.



2020-02-06T13:01:54
База данных MySQL

Как выбрать N-ую самую высокую запись в MySQL

Резюме : в этой статье вы узнаете, как выбрать n- ю самую высокую запись в таблице базы данных, используя различные приемы.

Легко выбрать самую высокую или самую низкую запись в таблице базы данных с помощью функции MAX или MIN. Тем не менее, немного сложно выбрать n- ую самую высокую запись. Например, получить второй самый дорогой продукт из таблицы продуктов.

Чтобы выбрать n- ую наивысшую запись, вам необходимо выполнить следующие шаги:

Сначала вы получаете n самых высоких записей и сортируете их в порядке возрастания.  N- я высокая запись является последней записью в наборе результатов.

Затем вы сортируете набор результатов в порядке убывания и получаете первый.

Ниже приведен запрос для получения n- ых самых высоких записей в порядке возрастания:

SELECT

*

FROM

my_table_name

ORDER BY my_column_name ASC

LIMIT N;

 

Запрос для получения n- й наивысшей записи выглядит следующим образом:

SELECT

*

FROM

(SELECT

*

FROM

my_table_name

ORDER BY my_column_name ASC

LIMIT N) AS tbl

ORDER BY my_column_name DESC

LIMIT 1;

 

К счастью, MySQL предоставляет нам предложение LIMIT, которое ограничивает количество строк в возвращаемом наборе результатов. Вы можете переписать запрос выше как следующий запрос:

SELECT

*

FROM

my_table_name

ORDER BY my_column_name DESC

LIMIT n - 1, 1;

 

Запрос возвращает первую строку после n-1 строк, поэтому вы получите n- ю самую высокую запись.

 

Пример, как получить n-ую самую высокую запись

Например, если вы хотите получить второй самый дорогой продукт (n = 2) в таблице my_products, вы используете следующий запрос:

SELECT

productCode, productName, buyPrice

FROM

my_products

ORDER BY buyPrice DESC

LIMIT 1 , 1;

 

 

Вот результат:

Как выбрать N-ую самую высокую запись в MySQL

 

Второй способ получить n-ую самую высокую запись — это использование подзапрос в MySQL:

SELECT *

FROM my_table_name ASa

WHERE n - 1 = (

SELECT COUNT(primary_key_column)

FROMmy_productsb

WHERE  b.my_column_name > a. my_column_name)

 

Используя первый метод, вы можете получить тот же результат, чтобы получить второй самый дорогой продукт, используйте следующий запрос:

SELECT

productCode, productName, buyPrice

FROM

my_products a

WHERE

1 = (SELECT

COUNT(productCode)

FROM

my_products b

WHERE

b.buyPrice > a.buyPrice);

 

В этой статье мы показали, как выбрать n- ую запись в таблице базы данных с помощью предложения LIMIT в MySQL.



2020-01-29T10:56:40
База данных MySQL