Содержание лабораторной работы

MySQL Создание таблицы

После авторизации на mysql.students.urpc.ru появится главная страница для работы

Слева расположено окно с доступными базами данных.

Чтобы открыть базы данных необходимо нажать на ее название. На данный момент база пустая и необходимо создать таблицу.

Создание таблицы

В окне «Создать таблицу» в поле «Имя» введите имя вашей будущей таблицы.

В поле «Количество столбцов» введите количество столбцов в таблице.

После введенных настроек нажмите «Вперед»

Откроется окно создания таблицы. Первый столбец «Имя», необходимо ввести название полей таблицы.

Например:

Далее необходимо определить тип данных для каждого столбца. Выбрать необходимо из раскрывающегося списка. При наведении на тип данных появляется подсказка, в которой дается характеристика типа данных.

Установите типы данных основываясь на их характеристике.

Например:

Следующий столбец Длина/Значения

При наведении на «?» появляется подсказка. Данная настройка позволяет указать длину поля, то не означает что длина поля будет ограничена введённым числом.

Может использоваться приложениями для отображения целочисленных значений, имеющих ширину, меньшую ширины, указанной для столбца, путем добавления пробелов влево. Например, INT(3) введенное значение «23» будет храниться как «023».

Далее можно установить значение по умолчанию, например Null или указать конкретное значение. Также при наведении на «?» появляется подсказка.

Сравнение. В данном параметре необходимо указать кодировку там, где это необходимо, например для поля «Наименование». Используем: utf8_general_ci.

Данное значение можно указать у самой базы данных и оно применится для каждой таблицы.

Атрибуты. Возможные варианты: Binary, Unsigned, Unsigned Zerofill, on update Current_Timestamp. Данные значения можно оставить незаполненными.

Настройка «Null». Можно указать для конкретного поля возможны ли пустые значения. Если стоит флажок, то может быть пустое значение.

Индекс. Обязательно для любой таблицы нужно определить первичный ключ (Primary key), поэтому в данной таблицы для столбца «Код_товара» установим значение PRIMARY.

Откроется окно настроек первичного ключа.

После всех настроек появится ссылка с помощью которой можно будет отредактировать настройки индекса. Аналогична настройка остальных индексов.


Атрибут AUTO_INCREMENT (A_I) может использоваться для генерации уникального идентификатора для новых строк.


Например:

CREATE TABLE animals (id MEDIUMINT NOT NULL AUTO_INCREMENT,

name CHAR(30) NOT NULL, PRIMARY KEY (id));

INSERT INTO animals (name) VALUES ("dog"),("cat"),("penguin"),

("lax"),("whale");

SELECT * FROM animals;

Что вернет:

id name

1 dog

2 cat

3 penguin

4 lax

5 whale

Параметр «Комментарий» заполняем по желанию.

Параметр «Виртуальность» можно оставить незаполненным.

В параметре «Переместить поле» можно поменять местами поля.

Если необходимо добавить еще поле или несколько полей, необходимо в ячейку «Добавить:» указать количество полей и нажать «Вперед».

Перед сохранением таблицы можно посмотреть код создания таблицы на языке SQL, нажав на кнопку «Предпросмотр SQL».

Чтобы сохранить получившуюся таблицу нажмите «Сохранить».

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

Добавление индекса

Добавить индекс, уникальный или первичный ключ можно в структуре таблицы. Отличие первичных ключей от уникальных состоит в том, что первичный ключ может быть в таблице только один, а уникальных ключей - несколько.

Выделяем нужное поле/поля и нажимаем на нужный вид ключа.

Созданные ключи появятся в разделе с индексами. Их можно удалять и изменять

Наполнение данными таблиц

Если таблица содержит внешние ключи (связана с другой таблицей(ами)), то сначала необходимо настроить связи (инструкция находится в разделе "SQL Создание связей между таблицами")

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

В столбце "Тип" указаны тип данных, чтобы не ошибиться с вводом. Для поля "Количество" можно указать значение NULL поставив галочку.

Если нажать "Предпросмотр SQL", то можно увидеть запрос на создание записи на языке SQL.

Для полей можно указывать функции. Например, log10.

Так же можно указать, что необходимо сделать (вставить запись или отобразить запрос вставки) и что после этого действия должно следовать.

Для того, чтобы продолжить нажмите "Вперед". Появится сообщение об успешном добавлении записи.

Посмотреть существующие записи можно на вкладке "Обзор". В верхней части изображен запрос на вывод данных из таблицы.

Далее идут записи, их отображаемое количество можно ограничивать, по умолчанию показывают 25. Так же можно уставить сортировку по ключу, изменить, скопировать или удалить запись

MySQL Создание связей между таблицами

Для настройки связи добавим еще одну таблицу "Продажи" с полями "Код продажи", "Id_товара" и "Дата продажи". Свяжем таблицы "Товары" и "Продажи".

Откройте структуру таблицы и перейдите в окно "Связи"

Далее необходимо указать столбец для связи из выбранной таблицы, базу данных, с которой будет устанавливаться связь, таблицу и столбец. В данном примере поле id_товара из таблицы "Продажи" связываем с полем "Код_товара" из таблицы "Товары".

Нажмите "Сохранить". В индексах появится новый внешний ключ

Теперь при добавлении данных в таблицу "Продажи" появится подстановка данных из таблицы "Товары"

MySQL Экспорт и импорт данных

Экспорт данных

Откройте таблицу, из которой необходимо экспортировать данные и перейдите на вкладку "Экспорт"

Способ экспорта выбираем "Обычный", для того чтобы настроить параметры экспорта.
Формат "
CSV for MS Excel"

Далее необходимо выбрать количество строк для импорта

Кодировку файла выбрать "windows-1251". Поставить флажок "Поместить названия полей в первой строке"

Нажмите "Вперед" и начнется скачивание файла. Результат будет следующий.

Импорт данных

Откройте таблицу, в которую необходимо импортировать данные и перейдите на вкладку "Импорт"

Выберите файл, данные из которого необходимо перенести в таблицу. Файл должен быть с расширением csv

Например.

Выберите кодировку "windows-1251"

Количество пропускаемых строк, начиная от первой строки: 1 (если в файле есть строка с заголовками столбцов)

Формат файла CSV

Разделитель полей ; (точка с запятой)

Нажмите Вперед для импорта.

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

! Совет: для того, чтобы импортировать таблицу, которая содержит поле с типом данных ДАТА необходимо в исходном файле указать формат записи ГГГГ-ММ-ДД

MySQL Дамп БД

Экспорт базы данных (создание дампа)

Для переноса базы данных необходимо сначала создать ее дамп, то есть разместить содержимое в отдельный sql-файл/
Зайдите в phpMyAdmin, выделите слева базу данных, которую необходимо перенести, и нажмите на кнопку «Экспорт» в верхнем меню.

Выберите метод экспорта: "Обычный"

Формат: SQL

Отметьте из списка те таблицы, которые вам нужно сохранить или кликните по ссылке «Выделить все» и нажмите «Вперед» внизу страницы.

Импорт дампа базы данных

Желательно создать новую базу данных и выполнить в нее импорт дампа.

Для восстановления базы зайдите в интерфейс PHPMyAdmin и выполните следующие действия:

  1. В левой колонке выберите новую базу данных.

  2. Откройте вкладку "Импорт".

  3. Нажмите на кнопку "Выберите файл" и укажите файл дампа, сохраненный на вашем компьютере.

  4. Задайте кодировку файла (обычно она совпадает с кодировкой сайта).

  5. При необходимости измените настройки импорта и нажмите кнопку "Вперед", дождитесь окончания импорта.

MySQL Язык SQL. Запросы

Создание запроса

Для создания запроса в phpmysql необходимо открыть нужную таблицу и перейти на вкладку SQL

Данная вкладка содержит область для ввода запроса, кнопки с основными предложениями языка Select, Insert и др (при нажатии появляется шаблон запроса) и столбцы таблицы

Кнопка формат, позволяет изменить внешний вид запроса

Данная среда дает подсказки при написании запроса, а также справа находится окно с названиями столбцов, которые можно двойным щелчком вставить в запрос

Желательно поставить флажок "Показывать данный запрос снова", чтобы после выполнения запроса можно было вернуться на вкладку запроса к созданному запросу.

После выполнения запроса откроется временная таблица (результат запроса). Окно с текущим запросом можно отобразить с помощью "отобразить поле запроса"

Результат запроса можно либо напечатать, либо сохранить в буфер ответа, экспортировать в файл (csv, sql, и т.д.) или создать представление

Представление сохранит результат запроса в папку "Представления" в вашей БД

Запрос можно создать и открыв саму базу данных и перейти на вкладку SQL

Создание таблицы

Создать таблицу в базе данных позволяет SQL-команда

CREATE TABLE <Имя таблицы> (

<Имя поля1> <Тип данных> [<Опции>],

<Имя поля2> <Тип данных> [<Опции>],

...

) [<Дополнительные опции>];


В параметре <Опции> могут быть указаны следующие значения:

  1. NOT NULL означает, что поле обязательно должно иметь значение при вставке новой записи в таблицу (если не задано значение по умолчанию). Если опция не указана, то поле может быть пустым;

  2. PRIMARY KEY указывает, что поле является первичным ключом таблицы. Записи в таком поле должны быть уникальными. Опция также может быть указана после перечисления всех полей;

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

  4. DEFAULT задает для поля значение по умолчанию, которое будет использовано, если при вставке записи для этого поля не было явно указано значение;

  5. CHARACTER SET определяет кодировку текстового поля;

  6. COLLATE задает тип сортировки текстового поля.

В параметре <Дополнительные опции> могут быть указаны следующие значения:

ENGINE — тип таблицы (например, MyISAM);

DEFAULT CHARSET — кодировка (например, cp1251);

AUTO_INCREMENT — начальное значение для автоматической генерации значения поля.

Для вывода всех типов таблиц, поддерживаемых текущей версией MySQL, предназначена SQL-команда

SHOW ENGINES;

На практике обычно используются два типа таблиц — MyISAM и InnoDB. Тип MyISAM является "родным" типом таблиц и применяется по умолчанию. Хотя версии MySQL под Windows по умолчанию могут устанавливать тип InnoDB.

В отличие от типа MyISAM таблицы типа InnoDB поддерживают транзакции и внешние ключи, но не имеют поддержки полнотекстового поиска. Кроме того, таблицы типа InnoDB работают медленнее таблиц MyISAM, но зато они более надежны.

Для вывода всех кодировок применяется SQL-команда

SHOW CHARACTER SET;

Чтобы получить список всех типов сортировки можно воспользоваться SQL- командой

SHOW COLLATION;


Добавление внешнего ключа

FOREIGN KEY (поле в текущей таблице) REFERENCES Другая_таблица (поле)

Вставка данных в таблицу

Для добавления записей в таблицу используется SQL-команда:

INSERT INTO <Имя таблицы> [(<Поле1>, <Поле2>, ...)]

VALUES ('<Значение1>', '<Значение2>', ...);


Например, добавить две записи в таблицу City можно одним из следующих способов:

INSERT INTO `City` (`id_City`, `City`)

VALUES (NULL, 'Санкт-Петербург');


INSERT INTO `City` (`id_City`, `City`)

VALUES (NULL, 'Москва');


INSERT INTO `City` (`City`)

VALUES ('Санкт-Петербург');


INSERT INTO `City` (`City`)

VALUES ('Москва');


INSERT INTO `City`

SET `id_City`=NULL, `City`='Санкт-Петербург';


INSERT INTO `City`

SET `id_City`=NULL, `City`='Москва';


INSERT INTO `City`

SET `City`='Санкт-Петербург';


INSERT INTO `City`

SET `City`='Москва';


INSERT INTO `City` VALUES

(NULL, 'Санкт-Петербург'),

(NULL, 'Москва');


INSERT INTO `City` VALUES (NULL, 'Санкт-Петербург');


INSERT INTO `City` VALUES (NULL, 'Москва');


Чаще всего на практике используются последние два способа.

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

Если название таблицы содержит пробел или совпадает с одним из ключевых слов MySQL, то название таблицы необходимо заключить в обратные кавычки.

Например:

INSERT INTO `City` VALUES

(NULL, 'Санкт-Петербург'),

(NULL, 'Москва');

Обновление записей

Обновление записи осуществляется следующей SQL-командой:

UPDATE <Имя таблицы>

SET <Поле1>='<Значение>', <Поле2>='<Значение2>', ...

WHERE <Условие>; (1)


В параметре <Условие> могут быть указаны операторы указанные в разделе Операторы MySQL

Если название таблицы содержит пробел или совпадает с одним из ключевых слов MySQL, то название таблицы необходимо заключить в обратные кавычки. Для примера изменим телефон одного из клиентов, например, Иванова:

UPDATE `Customers` SET `Phone`='125-14-46' WHERE `id_Customer`=1;

Господин Иванов у нас числится под номером 1 в таблице Customers. Это условие мы и указали.


Примечания:

Если не указано <Условие>, то будут обновлены все записи в таблице.


Удаление записей из таблицы

Удаление записи осуществляется SQL-командой:

DELETE FROM <Имя таблицы> WHERE <Условие> [ LIMIT <Число> ]; (1)

Конструкцию LIMIT можно использовать для ограничения максимального количества удаляемых записей. В качестве примера удалим клиента Сидорова:

DELETE FROM `Customers` WHERE `Name` LIKE 'Сидоров %' LIMIT 1;

Для очистки определенной таблицы используется SQL-команда:

TRUNCATE TABLE <Имя таблицы>;

Частое обновление и удаление записей приводит к дефрагментации таблицы.

Чтобы освободить неиспользуемое свободное пространство в таблицах типа MyISAM, можно воспользоваться SQL-командой:

OPTIMIZE TABLE <Имя таблицы>;

Если таблица была повреждена, то восстановить таблицу позволяет SQL- команда REPAIR TABLE:

REPAIR TABLE <Имя таблицы>;


Удаление таблицы и базы данных

Удалить таблицу позволяет SQL-команда:

DROP TABLE <Имя таблицы>;


Удалить всю базу данных позволяет SQL-команда:

DROP DATABASE <Имя базы данных>;


Изменение свойств таблицы

В ряде случаев нужно изменить структуру уже созданной таблицы. Для этого используется SQL-команда

ALTER TABLE <Имя таблицы>

<Преобразование>;


В параметре <Преобразование> могут быть указаны следующие инструкции:

  • RENAME <Новое имя таблицы> переименовывает таблицу;

  • ADD <Имя нового поля> <Тип данных> [FIRST | AFTER <Имя поля>] добавляет в таблицу новое поле. Если указана опция FIRST, то поле будет добавлено в самое начало, а если AFTER <Имя поля> — то после указанного поля. По умолчанию новое поле вставляется в конец таблицы. Обратите внимание, в новом поле нужно задать значение по умолчанию или значение NULL должно быть допустимым, так как в таблице уже есть записи;

  • ADD PRIMARY KEY (<Имя поля>) делает указанное поле первичным ключом;

  • DROP PRIMARY KEY удаляет первичный ключ;

  • CHANGE <Имя поля> <Новое имя поля> <Новые параметры поля> изменяет свойства столбца. С помощью этой инструкции поле можно переименовать. Если этого не требуется, то <Новое имя поля> должно содержать то же имя, что и <Имя поля>;

  • MODIFY <Имя поля> <Тип данных> изменяет свойства столбца;

  • DROP <Имя поля> удаляет поле.

Для примера изменим тип данных поля Address в таблице Customers:

ALTER TABLE `Customers` CHANGE `Address` `Address` CHAR(100) NOT NULL;


RENAME TABLE tbl_name TO new_tbl_name

Создание индекса

Существуют следующие виды индексов:

  • первичный ключ;

  • уникальный индекс;

  • обычный индекс;

  • индекс FULLTEXT.

Первичный ключ служит для однозначной идентификации каждой записи в таблице. Для создания индекса используется ключевое слово PRIMARY KEY.

При создании таблицы ключевое слово можно указать после определения параметров поля

CREATE TABLE `City` (

`id_City` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,

`City` CHAR(50) NOT NULL

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

или после перечисления всех полей

CREATE TABLE `City` (

`id_City` INT NOT NULL AUTO_INCREMENT,

`City` CHAR(50) NOT NULL,

PRIMARY KEY (`id_City`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Вторым способом можно создать первичный ключ, состоящий из нескольких полей (надо перечислить их в скобках через запятую):

PRIMARY KEY (`id_Orders`, `id_Tovar`)

Добавить первичный ключ в существующую таблицу позволяет SQL-команда:

ALTER TABLE <Таблица> ADD PRIMARY KEY (<Поле>);

Удалить первичный ключ позволяет SQL-команда:

ALTER TABLE <Таблица> DROP PRIMARY KEY;

В одной таблице не может быть более одного первичного ключа. А вот обычных и уникальных индексов в таблице может быть несколько.

Создать индекс можно при определении структуры таблицы с помощью ключевых слов INDEX и KEY (UNIQUE INDEX и UNIQUE KEY для уникального индекса):

CREATE TABLE `Customers` (

`id_Customer` INT NOT NULL AUTO_INCREMENT,

`Name` CHAR(50) NOT NULL,

`Address` CHAR(255) NOT NULL,

`id_City` INT NOT NULL,

`Phone` CHAR(30),

PRIMARY KEY (`id_Customer`),

KEY MyIndex (`Name`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Индекс может иметь название. Но так как название индекса не указывается в SQL-запросе, то чаще всего названием индекса служит имя поля. Сервер MySQL самостоятельно решает, каким индексом лучше воспользоваться в каждой конкретной ситуации. Знать название индекса необходимо для его удаления из таблицы.

При индексировании текстовых полей следует указать количество символов (до 1000 символов), подлежащих индексации:

KEY MyIndex (Name(10)) (1)

Создать обычный индекс позволяют SQL-команды

CREATE INDEX <Имя индекса> ON <Таблица> (<Поле>(<Количество символов>));

или

ALTER TABLE <Таблица>

ADD INDEX <Имя индекса> (<Поле>(<Количество символов>));

Создать уникальный индекс позволяют SQL-команды

CREATE UNIQUE INDEX <Имя индекса>

ON <Таблица> (<Поле>(<Количество символов>));

или

ALTER TABLE <Таблица>

ADD UNIQUE INDEX <Имя индекса> (<Поле>(<Количество символов>));

Удалить обычный и уникальный индексы позволяют SQL-команды

DROP INDEX <Имя индекса> ON <Таблица>;

или

ALTER TABLE <Таблица> DROP INDEX <Имя индекса>;

Выбор записей (выборка)

Выполнить запрос позволяет SQL-команда

SELECT <Поле1>, <Поле2>, …

FROM <Имя таблицы>

[ WHERE <Условие1> ]

[ GROUP BY <Имя поля1> ] [ HAVING <Условие2> ]

[ ORDER BY <Имя поля2> [DESC]]

[ LIMIT <Начало>, <Количество записей> ]


SQL-команда SELECT ищет все записи в таблице <Имя таблицы>, которые удовлетворяют выражению <Условие1>. Если конструкция WHERE <Условие1> не указана, то будут возвращены все записи из таблицы <Имя таблицы>. Вместо перечисления полей можно указать символ *. В этом случае будут возвращены все поля.


Найденные записи при указанной конструкции ORDER BY <Имя поля2> сортируются по возрастанию. Если в конце указано слово DESC, то записи будут отсортированы в обратном порядке.


Псевдоним можно создать для любого поля для вывода, для этого необходимо указать:

SELECT <Поле1> AS `название`


Если требуется, чтобы при поиске выдавались не все найденные записи, а лишь их часть, то нужно использовать параметр LIMIT. Этот параметр удобен при выводе большого количества записей. Например, есть каталог из 2000 запсей. Вместо того чтобы выводить его за один раз, можно выводить его частями, скажем, по 25 записей за раз. В параметре LIMIT задается два значения <Начало> и <Количество записей>:

SELECT * FROM `City` ORDER BY `City` LIMIT 0, 25;


Кроме того, команда SELECT позволяет использовать следующие функции, называемые агрегатными функциями:

  • COUNT(<Поле>) — количество непустых (то есть не имеющих значение NULL) записей в указанном поле;

  • MIN(<Поле>) — минимальное значение в указанном поле;

  • MAX(<Поле>) — максимальное значение в указанном поле;

  • SUM(<Поле>) — сумма значений в указанном поле;

  • AVG(<Поле>) — средняя величина значений в указанном поле.

Например:

Выведем общее количество заказов:

SELECT COUNT(`id_Orders`) FROM `Orders`;

Этот SQL-запрос выведет 5.


Для получения более подробной информации можно воспользоваться конструкцией GROUP BY.

Например, можно посмотреть среднюю сумму покупок каждого покупателя:

SELECT `id_Customer`, AVG(`Sum`) AS s

FROM `Orders`

GROUP BY `id_Customer`

ORDER BY s;


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


Выбор записей из нескольких таблиц

SQL-команда SELECT позволяет выбирать записи сразу из нескольких таблиц одновременно. Для этого нужно перечислить все таблицы через запятую в конструкции FROM. В конструкции WHERE через запятую указываются пары полей, являющиеся связуемыми для таблиц. Причем в условии и перечислении полей вначале указывается имя таблицы, а затем через точку имя поля.


Для примера выведем таблицу Customers, но вместо индекса города укажем его название:

SELECT `Customers`.`Name`, `Customers`.`Address`, `City`.`City`, `Customers`.`Phone`

FROM `Customers`, `City`

WHERE `Customers`.`id_City`=`City`.`id_City`;


Вместо названия таблицы можно использовать псевдоним. Псевдоним создается через ключевое слово AS после имени таблицы в конструкции FROM. Перепишем предыдущий пример с использованием псевдонимов:

SELECT `c`.`Name`, `c`.`Address`, `ct`.`City`, `c`.`Phone`

FROM `Customers` AS `c`, `City` AS `ct`

WHERE `c`.`id_City`=`ct`.`id_City`;


Результат будет таким же. Кроме того, если поля в таблицах имеют разные названия, то имя таблицы можно не указывать:

SELECT `Name`, `Address`, `City`, `Phone`

FROM `Customers` AS `c`, `City` AS `ct`

WHERE `c`.`id_City`=`ct`.`id_City`;


Связывать таблицы можно также с помощью оператора JOIN. Для примера выведем таблицу Customers, но вместо индекса города укажем его название:

SELECT `Customers`.`Name`, `Customers`.`Address`, `City`.`City`, `Customers`.`Phone`

FROM `Customers` JOIN `City`

WHERE `Customers`.`id_City`=`City`.`id_City`;


Вместо инструкции WHERE можно использовать инструкцию ON. Например:

SELECT `Customers`.`Name`, `Customers`.`Address`, `City`.`City`, `Customers`.`Phone`

FROM `Customers` JOIN `City` ON `Customers`.`id_City`=`City`.`id_City`;


Операторы MySQL

Математические операторы:

+ — сложение:

SELECT 8 + 5;

- — вычитание:

SELECT 10 - 5;

* — умножение:

SELECT 10 * 5;

/ — деление:

SELECT 10 / 5;

/* Выведет: 2.0000 */

DIV — целочисленное деление:

SELECT 10 DIV 5;

/* Выведет: 2 */

SELECT 10 DIV 3;

/* Выведет: 3 */

% — остаток от деления:

SELECT 10 % 2;

/* Выведет: 0 */

SELECT 9 % 2;

/* Выведет: 1 */

MOD — остаток от деления:

SELECT 10 MOD 2;

/* Выведет: 0 */

Вместо операторов % и MOD можно использовать функцию MOD().

SELECT MOD(10, 2);

/* Выведет: 0 */

Следует отметить, что если один из операндов равен NULL, то результат операции также будет равен NULL. В отличие от языков программирования деление на ноль не приводит к генерации сообщения об ошибке. Результатом операции деления на ноль является значение NULL.

Если необходимо сменить знак, то перед операндом следует указать знак – (минус):

SELECT -(-5);

/* Выведет: 5 */


Двоичные операторы:

  1. ~ — двоичная инверсия;

  2. & — двоичное И;

  3. | — двоичное ИЛИ;

  4. ^ — двоичное исключающее ИЛИ;

  5. << — сдвиг влево — сдвиг влево на один или более разрядов с заполнением младших разрядов нулями;

  6. >> — сдвиг вправо — сдвиг вправо на один или более разрядов с заполнением старших разрядов содержимым самого старшего разряда.


Операторы сравнения

Операторы сравнения используются, прежде всего, в конструкциях WHERE и HAVING при создании запросов. Перечислим их:

= — равно;

<=> — эквивалентно;

!= — не равно;

<> — не равно;

< — меньше;

> — больше;

<= — меньше или равно;

>= — больше или равно;

IS NOT NULL — проверка на наличие значения;

IS NULL — проверка поля на отсутствие значения;

BETWEEN <Начало> AND <Конец> — проверяет, является ли значение большим или равным <Начало> и меньшим или равным <Конец>, например, pole BETWEEN 0 AND 100;

IN — содержится в определенном наборе, например, pole IN ('HDD', 'Монитор');

NOT IN — не содержится в определенном наборе, например, pole NOT IN ('HDD','Монитор');

LIKE — соответствие шаблону SQL;

NOT LIKE — несоответствие шаблону SQL;

RLIKE — соответствие регулярному выражению;

REGEXP — соответствие регулярному выражению (синоним RLIKE);

NOT RLIKE — несоответствие регулярному выражению;

NOT REGEXP — несоответствие регулярному выражению (синоним NOT RLIKE).

В шаблоне SQL могут использоваться следующие символы:

% — любое количество символов;

_ — любой одиночный символ.

Можно проверять сразу несколько условий, указав логические операции:

AND — логическое И;

OR — логическое ИЛИ;

XOR — исключающее логическое ИЛИ.

Результатом операции сравнения являются:

0 — ложь;

1 — истина;

NULL.

Исключением является оператор эквивалентности <=>. Он возвращает только два значения: 0 (ложь) и 1 (истина). Этот оператор введен специально дл сравнения значения NULL.

Следует отметить, что по умолчанию сравнение строк происходит без учета регистра. Если указать ключевое слово BINARY, то регистр символов будет учитываться:

SELECT 'TEXT'='text';

/* Выведет: 1 (истина) */

SELECT BINARY 'TEXT'='text';

/* Выведет: 0 (ложь) */

Результат сравнения можно изменить на противоположный с помощью операторов ! и NOT.

SELECT 'TEXT'='text';

/* Выведет: 1 (истина) */

SELECT !('TEXT'='text');

/* Выведет: 0 (ложь) */

SELECT NOT ('TEXT'='text');

/* Выведет: 0 (ложь) */

Логические выражения следует заключать в круглые скобки, так как приоритет оператора отрицания выше приоритета других операторов.


При составлении выражений следует учитывать приоритет выполнения операторов.

Перечислим операторы в порядке убывания приоритета:

1. BINARY, COLLATE.

2. NOT, !.

3. - (унарный минус), ~.

4. *, /, %, MOD, DIV.

5. +, - — сложение, вычитание.

6. <<, >> — двоичные сдвиги.

7. & — двоичное И.

8. | — двоичное ИЛИ.

9. =, <=>, >=, <=, >, <, <>, !=, IS, LIKE, REGEXP, IN.

10. BETWEEN.

11. &&, AND.

12. ||, OR, XOR.

Функции MySQL

Основные функции

Стандартные тригонометрические функции (аргументы должны задаваться в радианах):

SIN() — синус;

COS() — косинус;

TAN() — тангенс;

COT() — котангенс.

Обратные тригонометрические функции (возвращают значение в радианах):

ASIN() — арксинус;

ACOS() — арккосинус;

ATAN() — арктангенс.

Округление чисел:

CEILING() — значение, округленное до ближайшего большего целого:

SELECT CEILING(4.3);

/* Выведет: 5 */

CEIL() — значение, округленное до ближайшего большего целого:

SELECT CEIL(4.3);

/* Выведет: 5 */

FLOOR() — значение, округленное до ближайшего меньшего целого:

SELECT FLOOR(4.6);

/* Выведет: 4 */

ROUND() — значение, округленное до ближайшего меньшего целого для чисел с дробной частью меньше 0.5, или значение, округленное до ближайшего большего целого для чисел с дробной частью больше 0.5. Если дробная часть числа равна 0.5, то округление зависит от версии MySQL.

Начиная с версии 5.0.3, округление производится в большую сторону:

SELECT ROUND(4.49);

/* Выведет: 4 */

SELECT ROUND(4.5);

/* В зависимости от версии MySQL, выведет 4 или 5. */

SELECT ROUND(4.501);

/* Выведет: 5 */

SELECT ROUND(4.51);

/* Выведет: 5 */

TRUNCATE(X, Y) возвращает дробное число X с Y количеством знаков после запятой. Если в качестве значения аргумента Y передать значение 0, то функция вернет число, округленное до меньшего целого:

SELECT TRUNCATE(4.55, 0);

/* Выведет: 4 */

SELECT TRUNCATE(4.55, 1);

/* Выведет: 4.5 */

SELECT TRUNCATE(4.55, 3);

/* Выведет: 4.550 */

Функции для преобразования чисел:

CONV(<Число>, <Исходная система>, <Нужная система>) преобразует число из одной системы счисления в другую:

SELECT CONV(255, 10, 16);

/* Выведет: FF */

SELECT CONV('FF', 16, 10);

/* Выведет: 255 */

BIN(<Число>) преобразует число из десятичной системы счисления в двоичную:

SELECT BIN(17);

/* Выведет: 10001 */

HEX() возвращает значение аргумента в виде шестнадцатеричного числа:

SELECT HEX(255);

/* Выведет: FF */

OCT(<Число>) преобразует число из десятичной системы счисления в восьмеричную:

SELECT OCT(10);

/* Выведет: 12 */

Прочие функции:

ABS() — абсолютное значение:

SELECT ABS(-4.55);

/* Выведет: 4.55 */

EXP() — экспонента;

LOG(X) — натуральный логарифм;

LOG2(X) — логарифм числа по основанию 2:

SELECT LOG2(128);

/* Выведет: 7 */

LOG10(X) — логарифм числа по основанию 10:

SELECT LOG10(100);

/* Выведет: 2 */

LOG(<Основание>, X) — логарифм числа X по основанию <Основание>:

SELECT LOG(2, 128);

/* Выведет: 7 */

SELECT LOG(10, 100);

/* Выведет: 2 */

POW(<Число>, <Степень>) возводит <Число> в <Степень>:

SELECT POW(5, 2);

/* Выведет: 25 */

SQRT() извлекает квадратный корень:

SELECT SQRT(25);

/* Выведет: 5 */

PI() возвращает число π:

SELECT PI();

/* Выведет: 3.141593 */

MOD(X, Y) определяет остаток от деления X на Y:

SELECT MOD(10, 2);

/* Выведет: 0 */

DEGREES() преобразует значение угла из радиан в градусы:

SELECT DEGREES(PI());

/* Выведет: 180 */

RADIANS() преобразует значение угла из градусов в радианы:

SELECT RADIANS(180);

/* Выведет 3.141592653589793 */

SIGN() возвращает -1, если число отрицательное, 1, если число положительное, и 0, если число равно нулю:

SELECT SIGN(-80);

/* Выведет: -1 */

SELECT SIGN(80);

/* Выведет: 1 */

LEAST() служит для определения минимального значения из списка:

SELECT LEAST(2, 1, 3);

/* Выведет: 1 */

GREATEST() позволяет определить максимальное значение из списка:

SELECT GREATEST(2, 1, 3);

/* Выведет: 3 */

FORMAT(<Число>, <Количество знаков после запятой>) форматирует число в строку с заданным количеством знаков после запятой. Позиция запятой отмечается точкой, а каждые три разряда отделяются запятой (это американский стандарт записи чисел):

SELECT FORMAT(56873.8732, 2);

/* Выведет: 56,873.87 */

RAND() возвращает случайное число в диапазоне от 0 до 1. Если в функцию передать параметр, то это настроит генератор на новую последовательность. Следует учитывать, что при передаче одного и того же параметра функция выдает одну и ту же последовательность:

SELECT RAND();

/* Выведет: 0.35286363153985106 */

SELECT RAND();

/* Выведет: 0.7805252687824195 */

SELECT RAND(10);

/* Выведет: 0.6570515219653505 */

SELECT RAND(10);

/* Выведет: 0.6570515219653505 */


Функции даты и времени

Для получения текущей даты и времени используются следующие функции:

NOW(), LOCALTIME() и LOCALTIMESTAMP() возвращают текущие дату и время в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС;

SELECT NOW();

/* Выведет: 2009-09-21 22:35:04 */

SELECT LOCALTIME();

/* Выведет: 2009-09-21 22:35:04 */

SELECT LOCALTIMESTAMP();

/* Выведет: 2009-09-21 22:35:04 */

UTC_TIMESTAMP() выводит текущие дату и время по Гринвичу в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС;

SELECT UTC_TIMESTAMP();

/* Выведет: 2009-09-21 18:36:21 */


SYSDATE() позволяет определить текущие дату и время в формате ГГГГ- ММ-ДД ЧЧ:ММ:СС:

SELECT SYSDATE();

/* Выведет: 2009-09-21 22:36:43 */

В отличие от функции NOW() и ее синонимов SYSDATE() возвращает время, в которое она была вызвана, тогда как NOW() возвращает время начала выполнения запроса;

CURDATE() и CURRENT_DATE() возвращают текущую дату в формате ГГГГ- ММ-ДД:

SELECT CURDATE();

/* Выведет: 2009-09-21 */

SELECT CURRENT_DATE();

/* Выведет: 2009-09-21 */

UTC_DATE() позволяет определить текущую дату по Гринвичу в формате ГГГГ-ММ-ДД:

SELECT UTC_DATE();

/* Выведет: 2009-09-21 */

CURTIME() и CURRENT_TIME() возвращают текущее время в формате ЧЧ:ММ:СС;

SELECT CURTIME();

/* Выведет: 22:38:01 */

SELECT CURRENT_TIME();

/* Выведет: 22:38:01 */

UTC_TIME() сообщает текущее время по Гринвичу в формате ЧЧ:ММ:СС:

SELECT UTC_TIME();

/* Выведет: 18:38:01 */

UNIX_TIMESTAMP() подсчитывает число секунд, прошедших с полуночи

1 января 1970 г.:

SELECT UNIX_TIMESTAMP();

/* Выведет: 1253558203 */


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

DATE() — дата:

SELECT DATE('2009-09-21 22:36:43');

/* Выведет: 2009-09-21 */

YEAR() — год:

SELECT YEAR('2009-09-21 22:36:43');

/* Выведет: 2009 */

MONTH() — месяц:

SELECT MONTH('2009-09-21 22:36:43');

/* Выведет: 9 */

MONTHNAME() — английское название месяца в виде строки:

SELECT MONTHNAME('2009-09-21 22:36:43');

/* Выведет: September */

DAY() и DAYOFMONTH() — номер дня в месяце:

SELECT DAY('2009-09-21 22:36:43');

/* Выведет: 21 */

SELECT DAYOFMONTH('2009-09-21 22:36:43');

/* Выведет: 21 */

TIME() — время:

SELECT TIME('2009-09-21 22:36:43');

/* Выведет: 22:36:43 */

HOUR() — час:

SELECT HOUR('2009-09-21 22:36:43');

/* Выведет: 22 */

MINUTE() — минуты:

SELECT MINUTE('2009-09-21 22:36:43');

/* Выведет: 36 */

SECOND() — секунды:

SELECT SECOND('2009-09-21 22:36:43');

/* Выведет: 43 */

MICROSECOND() — микросекунды:

SELECT MICROSECOND('2009-09-21 22:36:43.123456');

/* Выведет: 123456 */


Вместо перечисленных функций можно использовать функцию EXTRACT().

Функция имеет следующий формат:

EXTRACT(<Тип> FROM <Дата и время>)


Параметр <Тип> может принимать такие значения:

YEAR — год:

SELECT EXTRACT(YEAR FROM '2009-09-21 22:36:43');

/* Выведет: 2009 */

YEAR_MONTH — год и месяц:

SELECT EXTRACT(YEAR_MONTH FROM '2009-09-21 22:36:43');

/* Выведет: 200909 */

MONTH — месяц:

SELECT EXTRACT(MONTH FROM '2009-09-21 22:36:43');

/* Выведет: 9 */

DAY — день:

SELECT EXTRACT(DAY FROM '2009-09-21 22:36:43');

/* Выведет: 21 */

DAY_HOUR — день и час:

SELECT EXTRACT(DAY_HOUR FROM '2009-09-21 22:36:43');

/* Выведет: 2122 */

DAY_MINUTE — день, час и минуты:

SELECT EXTRACT(DAY_MINUTE FROM '2009-09-21 22:36:43');

/* Выведет: 212236 */

DAY_SECOND — день, час, минуты и секунды:

SELECT EXTRACT(DAY_SECOND FROM '2009-09-21 22:36:43');

/* Выведет: 21223643 */

DAY_MICROSECOND — день, час, минуты, секунды и микросекунды:

SELECT EXTRACT(DAY_MICROSECOND FROM '2009-09-21

22:36:43.111111');

/* Выведет: 21223643111111 */

HOUR — час:

SELECT EXTRACT(HOUR FROM '2009-09-21 22:36:43');

/* Выведет: 22 */

HOUR_MINUTE — час и минуты:

SELECT EXTRACT(HOUR_MINUTE FROM '2009-09-21 22:36:43');

/* Выведет: 2236 */

HOUR_SECOND — час, минуты и секунды:

SELECT EXTRACT(HOUR_SECOND FROM '2009-09-21 22:36:43');

/* Выведет: 223643 */

HOUR_MICROSECOND — час, минуты, секунды и микросекунды:

SELECT EXTRACT(HOUR_MICROSECOND FROM '2009-09-21 22:36:43.111111');

/* Выведет: 223643111111 */

MINUTE — минуты:

SELECT EXTRACT(MINUTE FROM '2009-09-21 22:36:43');

/* Выведет: 36 */

MINUTE_SECOND — минуты и секунды:

SELECT EXTRACT(MINUTE_SECOND FROM '2009-09-21 22:36:43');

/* Выведет: 3643 */

MINUTE_MICROSECOND — минуты, секунды и микросекунды:

SELECT EXTRACT(MINUTE_MICROSECOND FROM '2009-09-21

22:36:43.111111');

/* Выведет: 3643111111 */

SECOND — секунды:

SELECT EXTRACT(SECOND FROM '2009-09-21 22:36:43');

/* Выведет: 43 */

SECOND_MICROSECOND — секунды и микросекунды:

SELECT EXTRACT(SECOND_MICROSECOND

FROM '2009-09-21 22:36:43.111111');

/* Выведет: 43111111 */

MICROSECOND — микросекунды:

SELECT EXTRACT(MICROSECOND FROM '2009-09-21 22:36:43.111111');

/* Выведет: 111111 */


С помощью следующих функций можно получить дополнительные сведения о дате:

QUARTER() — порядковый номер квартала в году (от 1 до 4):

SELECT QUARTER('2009-09-21');

/* Выведет: 3 */

WEEKOFYEAR() — порядковый номер недели в году (от 1 до 53):

SELECT WEEKOFYEAR('2009-09-21');

/* Выведет: 39 */

WEEK() — порядковый номер недели в году (от 0 до 53). Неделя начинается с воскресенья:

SELECT WEEK('2009-09-21');

/* Выведет: 38 */

YEARWEEK() — число в формате ГГГГНН, где ГГГГ — год, а НН — порядковый номер недели в году (от 0 до 53). Неделя начинается с воскресенья:

SELECT YEARWEEK('2009-09-21');

/* Выведет: 200938 */

DAYOFYEAR() — порядковый номер дня в году (от 1 до 366):

SELECT DAYOFYEAR('2009-09-21');

/* Выведет: 264 */

MAKEDATE(<Год>, <Номер дня в году>) — дата в формате ГГГГ-ММ-ДД по номеру дня в году:

SELECT MAKEDATE(2009, 264);

/* Выведет: 2009-09-21 */

DAYOFWEEK() — порядковый номер дня недели (1 — для воскресенья, 2 — для понедельника, ..., 7 — для субботы):

SELECT DAYOFWEEK('2009-09-21');

/* Выведет: 2 */

WEEKDAY() — порядковый номер дня недели (0 — для понедельника, 1 — для вторника, ..., 6 — для воскресенья):

SELECT WEEKDAY('2009-09-21');

/* Выведет: 0 */

DAYNAME() — название дня недели на английском языке:

SELECT DAYNAME('2009-09-21');

/* Выведет: Monday */

TO_DAYS(<Дата>) — количество дней, прошедших с нулевого года:

SELECT TO_DAYS('2009-09-21');

/* Выведет: 734036 */

FROM_DAYS(<Количество дней>) — дата в формате ГГГГ-ММ-ДД по количеству дней, прошедших с нулевого года:

SELECT FROM_DAYS(734036);

/* Выведет: 2009-09-21 */

TIME_TO_SEC(<Время>) — количество секунд, прошедших с начала суток:

SELECT TIME_TO_SEC('12:52:35');

/* Выведет: 46355 */

SEC_TO_TIME(<Количество секунд>) — время в формате ЧЧ:ММ:СС по количеству секунд, прошедших с начала суток:

SELECT SEC_TO_TIME(46355);

/* Выведет: 12:52:35 */

Для манипуляции датой и временем можно использовать следующие функции:

ADDDATE(<Дата>, INTERVAL <Интервал> <Тип>) и DATE_ADD(<Дата>, INTERVAL <Интервал> <Тип>) прибавляют к параметру <Дата> временной интервал;

SUBDATE(<Дата>, INTERVAL <Интервал> <Тип>) и DATE_SUB(<Дата>,INTERVAL <Интервал> <Тип>) вычитают из параметра <Дата> временной интервал.

Параметр <Тип> в функциях ADDDATE(), DATE_ADD(), SUBDATE() и DATE_SUB() может принимать следующие значения:

• YEAR — год:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 2 YEAR);

/* Выведет: 2011-09-21 22:36:43 */

• YEAR_MONTH — год и месяц (формат 'ГГ-ММ'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '2-2' YEAR_MONTH);

/* Выведет: 2011-11-21 22:36:43 */

• MONTH — месяц:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 3 MONTH);

/* Выведет: 2009-12-21 22:36:43 */

• DAY — день:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 6 DAY);

/* Выведет: 2009-09-27 22:36:43 */

• DAY_HOUR — день и час (формат 'ДД ЧЧ'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '6 3' DAY_HOUR);

/* Выведет: 2009-09-28 01:36:43 */

• DAY_MINUTE — день, час и минуты (формат 'ДД ЧЧ:ММ'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '6 3:5' DAY_MINUTE);

/* Выведет: 2009-09-28 01:41:43 */

• DAY_SECOND — день, час, минуты и секунды (формат 'ДД ЧЧ:ММ:СС'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '6 3:5:15' DAY_SECOND);

/* Выведет: 2009-09-28 01:41:58 */

• DAY_MICROSECOND — день, час, минуты, секунды и микросекунды (формат 'ДД ЧЧ:ММ:СС.XXXXXX'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '6 3:5:15.10' DAY_MICROSECOND);

/* Выведет: 2009-09-28 01:41:58.100000 */

• HOUR — час:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 3 HOUR); /* Выведет: 2009-09-22 01:36:43 */

• HOUR_MINUTE — час и минуты (формат 'ЧЧ:ММ'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '3:7' HOUR_MINUTE);

/* Выведет: 2009-09-22 01:43:43 */

• HOUR_SECOND — час, минуты и секунды (формат 'ЧЧ:ММ:СС'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '3:7:15' HOUR_SECOND);

/* Выведет: 2009-09-22 01:43:58 */

• HOUR_MICROSECOND — час, минуты, секунды и микросекунды (формат 'ЧЧ:ММ:СС.XXXXXX'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '3:7:15.10' HOUR_MICROSECOND);

/* Выведет: 2009-09-22 01:43:58.100000 */

• MINUTE — минуты:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 8 MINUTE);

/* Выведет: 2009-09-21 22:44:43 */

• MINUTE_SECOND — минуты и секунды (формат 'ММ:СС'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '3:7' MINUTE_SECOND);

/* Выведет: 2009-09-21 22:39:50 */

• MINUTE_MICROSECOND — минуты, секунды и микросекунды (формат 'ММ:СС.XXXXXX'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '3:7.11' MINUTE_MICROSECOND);

/* Выведет: 2009-09-21 22:39:50.110000 */

• SECOND — секунды:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 15 SECOND);

/* Выведет: 2009-09-21 22:36:58 */

• SECOND_MICROSECOND — секунды и микросекунды (формат 'СС.XXXXXX'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '15.123456' SECOND_MICROSECOND);

/* Выведет: 2009-09-21 22:36:58.123456 */

• MICROSECOND — микросекунды:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 123456 MICROSECOND);

/* Выведет: 2009-09-21 22:36:43.123456 */


Кроме того, функции ADDDATE() и SUBDATE() можно применять в сокращенном формате, описанном далее;

□ ADDDATE(<Дата>, <Интервал в днях>) прибавляет к параметру <Дата> временной интервал в днях. Если указать перед интервалом знак -, то интервал вычитается из даты:

SELECT ADDDATE('2009-09-21', 10);

/* Выведет: 2009-10-01 */

SELECT ADDDATE('2009-09-21', -10);

/* Выведет: 2009-09-11 */

□ SUBDATE(<Дата>, <Интервал в днях>) вычитает из параметра <Дата> временной интервал в днях.


Если указать перед интервалом знак -, то интервал прибавляется к дате:

SELECT SUBDATE('2009-09-21', 10);

/* Выведет: 2009-09-11 */

SELECT SUBDATE('2009-09-21', -10);

/* Выведет: 2009-10-01 */

□ ADDTIME(<Дата>, <Время>) прибавляет к параметру <Дата> временной интервал:

SELECT ADDTIME('2009-09-21 22:36:43', '12:52:35');

/* Выведет: 2009-09-22 11:29:18 */

□ SUBTIME(<Дата>, <Время>) вычитает из параметра <Дата> временной интервал:

SELECT SUBTIME('2009-09-21 22:36:43', '12:52:35');

/* Выведет: 2009-09-21 09:44:08 */

□ DATEDIFF(<Конечная дата>, <Начальная дата>) вычисляет количество дней между двумя датами:

SELECT DATEDIFF('2009-09-27', '2009-09-21');

/* Выведет: 6 */

□ TIMEDIFF(<Конечная дата>, <Начальная дата>) вычисляет разницу между двумя временными значениями:

SELECT TIMEDIFF('2009-09-21 22:36:43', '2009-09-21 15:36:43');

/* Выведет: 07:00:00 */

□ PERIOD_ADD(<Дата>, <Количество месяцев>) добавляет заданное <Количество месяцев> к дате, заданной в формате ГГГГММ или ГГММ:

SELECT PERIOD_ADD(200904, 4);

/* Выведет: 200908 */

□ PERIOD_DIFF(<Конечная дата>, <Начальная дата>) вычисляет разницу в

месяцах между двумя временными значениями, заданными в формате

ГГГГММ или ГГММ:

SELECT PERIOD_DIFF(200908, 200904);

/* Выведет: 4 */

□ CONVERT_TZ(<Дата>, <Часовой пояс1>, <Часовой пояс2>) переводит дату из одного часового пояса в другой:

SELECT CONVERT_TZ('2009-09-21 22:36:43', '+00:00', '+4:00');

/* Выведет: 2009-09-22 02:36:43 */


□ LAST_DAY(<Дата>) возвращает дату в формате ГГГГ-ММ-ДД, в которой день выставлен на последний день текущего месяца:

SELECT LAST_DAY('2009-09-21 22:36:43');

/* Выведет: 2009-09-30 */

□ MAKETIME(<Часы>, <Минуты>, <Секунды>) возвращает время в формате ЧЧ:ММ:СС:

SELECT MAKETIME(12, 52, 35);

/* Выведет: 12:52:35 */

□ TIMESTAMP(<Дата>, [<Время>]) возвращает дату в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС:

SELECT TIMESTAMP('2009-09-21');

/* Выведет: 2009-09-21 00:00:00 */

SELECT TIMESTAMP('2009-09-21', '12:52:35');

/* Выведет: 2009-09-21 12:52:35 */


Помимо описанных функций добавить или вычесть интервал времени можно с помощью операторов + и -, за которыми следует ключевое слово INTERVAL, значение и тип интервала. Применимы те же типы интервалов, что и в функциях ADDDATE(), DATE_ADD(), SUBDATE() и DATE_SUB():

SELECT '2009-09-21 22:36:43' + INTERVAL '3:7:15' HOUR_SECOND;

/* Выведет: 2009-09-22 01:43:58 */

SELECT '2009-09-21 22:36:43' - INTERVAL '3:7:15' HOUR_SECOND;

/* Выведет: 2009-09-21 19:29:28 */


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

□ DATE_FORMAT(<Дата>, <Формат>) форматирует дату в соответствии со строкой <Формат>:

SELECT DATE_FORMAT('2009-09-21 22:36:43', '%d.%m.%Y');

/* Выведет: 21.09.2009 */

□ STR_TO_DATE(<Дата>, <Формат>) возвращает дату в форматах ГГГГ-ММ-ДД ЧЧ:ММ:СС или ГГГГ-ММ-ДД по дате, соответствующей строке <Формат>:

SELECT STR_TO_DATE('21.09.2009 12:52:35', '%d.%m.%Y %H:%i:%s');

/* Выведет: 2009-09-21 12:52:35 */

□ TIME_FORMAT(<Время>, <Формат>) форматирует время в соответствии со строкой <Формат>:

SELECT TIME_FORMAT('12:52:35', '%H %i %s');

/* Выведет: 12 52 35 */


□ FROM_UNIXTIME(<Дата>, [<Формат>]) возвращает дату в формате ГГГГ- ММ-ДД ЧЧ:ММ:СС или соответствующую строке <Формат> по количеству секунд, прошедших с полуночи 1 января 1970 г.:

SELECT FROM_UNIXTIME(1239671919);

/* Выведет: 2009-04-14 05:18:39 */

SELECT FROM_UNIXTIME(1239671919, '%d.%m.%Y');

/* Выведет: 14.04.2009 */

□ GET_FORMAT(<Тип времени>, '<Стандарт>') возвращает строку форматирования для пяти стандартов отображения даты и времени. Параметр

<Тип времени> может принимать следующие значения:

• DATETIME — дата и время;

• DATE — дата;

• TIME — время.


Параметр <Стандарт> может принимать такие значения:

• ISO — стандарт ISO;

• EUR — европейский стандарт;

• USA — американский стандарт;

• JIS — японский стандарт;

• INTERNAL — внутренний формат MySQL.


Например:

SELECT GET_FORMAT(DATE, 'EUR');

/* Выведет: %d.%m.%Y */

SELECT DATE_FORMAT('2009-09-21 22:36:43',

GET_FORMAT(DATE, 'EUR'));

/* Выведет: 21.09.2009 */

Параметр <Формат> в функциях форматирования может содержать следующие комбинации символов:

□ %Y — год из 4-х цифр;

□ %y — год из 2-х цифр;

□ %m — номер месяца с предваряющим нулем (от 01 до 12);

□ %c — номер месяца без предваряющего нуля (от 1 до 12);

□ %b — аббревиатура месяца из 3-х букв по-английски;

□ %M — полное название месяца по-английски;


□ %d — номер дня с предваряющим нулем (от 01 до 31);

□ %e — номер дня без предваряющего нуля (от 1 до 31);

□ %w — номер дня недели (0 — для воскресенья и 6 — для субботы);

□ %a — аббревиатура дня недели из 3-х букв по-английски;

□ %W — полное название дня недели по-английски;

□ %H — часы в 24-часовом формате (от 00 до 23);

□ %h — часы в 12-часовом формате (от 01 до 12);

□ %i — минуты (от 00 до 59);

□ %s — секунды (от 00 до 59);

□ %f — микросекунды;

□ %% — знак процента.Для получения текущей даты и времени используются следующие функции:

□ NOW(), LOCALTIME() и LOCALTIMESTAMP() возвращают текущие дату и время в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС;

SELECT NOW();

/* Выведет: 2009-09-21 22:35:04 */

SELECT LOCALTIME();

/* Выведет: 2009-09-21 22:35:04 */

SELECT LOCALTIMESTAMP();

/* Выведет: 2009-09-21 22:35:04 */

□ UTC_TIMESTAMP() выводит текущие дату и время по Гринвичу в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС;

SELECT UTC_TIMESTAMP();

/* Выведет: 2009-09-21 18:36:21 */


□ SYSDATE() позволяет определить текущие дату и время в формате ГГГГ- ММ-ДД ЧЧ:ММ:СС:

SELECT SYSDATE();

/* Выведет: 2009-09-21 22:36:43 */

В отличие от функции NOW() и ее синонимов SYSDATE() возвращает время, в которое она была вызвана, тогда как NOW() возвращает время начала выполнения запроса;

□ CURDATE() и CURRENT_DATE() возвращают текущую дату в формате ГГГГ- ММ-ДД:

SELECT CURDATE();

/* Выведет: 2009-09-21 */

SELECT CURRENT_DATE();

/* Выведет: 2009-09-21 */

□ UTC_DATE() позволяет определить текущую дату по Гринвичу в формате ГГГГ-ММ-ДД:

SELECT UTC_DATE();

/* Выведет: 2009-09-21 */

□ CURTIME() и CURRENT_TIME() возвращают текущее время в формате ЧЧ:ММ:СС;

SELECT CURTIME();

/* Выведет: 22:38:01 */

SELECT CURRENT_TIME();

/* Выведет: 22:38:01 */

□ UTC_TIME() сообщает текущее время по Гринвичу в формате ЧЧ:ММ:СС:

SELECT UTC_TIME();

/* Выведет: 18:38:01 */

□ UNIX_TIMESTAMP() подсчитывает число секунд, прошедших с полуночи

1 января 1970 г.:

SELECT UNIX_TIMESTAMP();

/* Выведет: 1253558203 */


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

□ DATE() — дата:

SELECT DATE('2009-09-21 22:36:43');

/* Выведет: 2009-09-21 */


□ YEAR() — год:

SELECT YEAR('2009-09-21 22:36:43');

/* Выведет: 2009 */

□ MONTH() — месяц:

SELECT MONTH('2009-09-21 22:36:43');

/* Выведет: 9 */

□ MONTHNAME() — английское название месяца в виде строки:

SELECT MONTHNAME('2009-09-21 22:36:43');

/* Выведет: September */

□ DAY() и DAYOFMONTH() — номер дня в месяце:

SELECT DAY('2009-09-21 22:36:43');

/* Выведет: 21 */

SELECT DAYOFMONTH('2009-09-21 22:36:43');

/* Выведет: 21 */

□ TIME() — время:

SELECT TIME('2009-09-21 22:36:43');

/* Выведет: 22:36:43 */

□ HOUR() — час:

SELECT HOUR('2009-09-21 22:36:43');

/* Выведет: 22 */

□ MINUTE() — минуты:

SELECT MINUTE('2009-09-21 22:36:43');

/* Выведет: 36 */

□ SECOND() — секунды:

SELECT SECOND('2009-09-21 22:36:43');

/* Выведет: 43 */

□ MICROSECOND() — микросекунды:

SELECT MICROSECOND('2009-09-21 22:36:43.123456');

/* Выведет: 123456 */


Вместо перечисленных функций можно использовать функцию EXTRACT().

Функция имеет следующий формат:

EXTRACT(<Тип> FROM <Дата и время>)


Параметр <Тип> может принимать такие значения:

□ YEAR — год:

SELECT EXTRACT(YEAR FROM '2009-09-21 22:36:43');

/* Выведет: 2009 */

□ YEAR_MONTH — год и месяц:

SELECT EXTRACT(YEAR_MONTH FROM '2009-09-21 22:36:43');

/* Выведет: 200909 */

□ MONTH — месяц:

SELECT EXTRACT(MONTH FROM '2009-09-21 22:36:43');

/* Выведет: 9 */

□ DAY — день:

SELECT EXTRACT(DAY FROM '2009-09-21 22:36:43');

/* Выведет: 21 */

□ DAY_HOUR — день и час:

SELECT EXTRACT(DAY_HOUR FROM '2009-09-21 22:36:43');

/* Выведет: 2122 */

□ DAY_MINUTE — день, час и минуты:

SELECT EXTRACT(DAY_MINUTE FROM '2009-09-21 22:36:43');

/* Выведет: 212236 */

□ DAY_SECOND — день, час, минуты и секунды:

SELECT EXTRACT(DAY_SECOND FROM '2009-09-21 22:36:43');

/* Выведет: 21223643 */

□ DAY_MICROSECOND — день, час, минуты, секунды и микросекунды:

SELECT EXTRACT(DAY_MICROSECOND FROM '2009-09-21

22:36:43.111111');

/* Выведет: 21223643111111 */

□ HOUR — час:

SELECT EXTRACT(HOUR FROM '2009-09-21 22:36:43');

/* Выведет: 22 */

□ HOUR_MINUTE — час и минуты:

SELECT EXTRACT(HOUR_MINUTE FROM '2009-09-21 22:36:43');

/* Выведет: 2236 */


□ HOUR_SECOND — час, минуты и секунды:

SELECT EXTRACT(HOUR_SECOND FROM '2009-09-21 22:36:43');

/* Выведет: 223643 */

□ HOUR_MICROSECOND — час, минуты, секунды и микросекунды:

SELECT EXTRACT(HOUR_MICROSECOND FROM '2009-09-21 22:36:43.111111');

/* Выведет: 223643111111 */

□ MINUTE — минуты:

SELECT EXTRACT(MINUTE FROM '2009-09-21 22:36:43');

/* Выведет: 36 */

□ MINUTE_SECOND — минуты и секунды:

SELECT EXTRACT(MINUTE_SECOND FROM '2009-09-21 22:36:43');

/* Выведет: 3643 */

□ MINUTE_MICROSECOND — минуты, секунды и микросекунды:

SELECT EXTRACT(MINUTE_MICROSECOND FROM '2009-09-21

22:36:43.111111');

/* Выведет: 3643111111 */

□ SECOND — секунды:

SELECT EXTRACT(SECOND FROM '2009-09-21 22:36:43');

/* Выведет: 43 */

□ SECOND_MICROSECOND — секунды и микросекунды:

SELECT EXTRACT(SECOND_MICROSECOND

FROM '2009-09-21 22:36:43.111111');

/* Выведет: 43111111 */

□ MICROSECOND — микросекунды:

SELECT EXTRACT(MICROSECOND FROM '2009-09-21 22:36:43.111111');

/* Выведет: 111111 */


С помощью следующих функций можно получить дополнительные сведения о дате:

□ QUARTER() — порядковый номер квартала в году (от 1 до 4):

SELECT QUARTER('2009-09-21');

/* Выведет: 3 */

□ WEEKOFYEAR() — порядковый номер недели в году (от 1 до 53):

SELECT WEEKOFYEAR('2009-09-21');

/* Выведет: 39 */


□ WEEK() — порядковый номер недели в году (от 0 до 53). Неделя начинается с воскресенья:

SELECT WEEK('2009-09-21');

/* Выведет: 38 */

□ YEARWEEK() — число в формате ГГГГНН, где ГГГГ — год, а НН — порядковый номер недели в году (от 0 до 53). Неделя начинается с воскресенья:

SELECT YEARWEEK('2009-09-21');

/* Выведет: 200938 */

□ DAYOFYEAR() — порядковый номер дня в году (от 1 до 366):

SELECT DAYOFYEAR('2009-09-21');

/* Выведет: 264 */

□ MAKEDATE(<Год>, <Номер дня в году>) — дата в формате ГГГГ-ММ-ДД по номеру дня в году:

SELECT MAKEDATE(2009, 264);

/* Выведет: 2009-09-21 */

□ DAYOFWEEK() — порядковый номер дня недели (1 — для воскресенья, 2 — для понедельника, ..., 7 — для субботы):

SELECT DAYOFWEEK('2009-09-21');

/* Выведет: 2 */

□ WEEKDAY() — порядковый номер дня недели (0 — для понедельника, 1 — для вторника, ..., 6 — для воскресенья):

SELECT WEEKDAY('2009-09-21');

/* Выведет: 0 */

□ DAYNAME() — название дня недели на английском языке:

SELECT DAYNAME('2009-09-21');

/* Выведет: Monday */

□ TO_DAYS(<Дата>) — количество дней, прошедших с нулевого года:

SELECT TO_DAYS('2009-09-21');

/* Выведет: 734036 */

□ FROM_DAYS(<Количество дней>) — дата в формате ГГГГ-ММ-ДД по количеству дней, прошедших с нулевого года:

SELECT FROM_DAYS(734036);

/* Выведет: 2009-09-21 */


□ TIME_TO_SEC(<Время>) — количество секунд, прошедших с начала суток:

SELECT TIME_TO_SEC('12:52:35');

/* Выведет: 46355 */

□ SEC_TO_TIME(<Количество секунд>) — время в формате ЧЧ:ММ:СС по количеству секунд, прошедших с начала суток:

SELECT SEC_TO_TIME(46355);

/* Выведет: 12:52:35 */

Для манипуляции датой и временем можно использовать следующие функции:

□ ADDDATE(<Дата>, INTERVAL <Интервал> <Тип>) и DATE_ADD(<Дата>,

INTERVAL <Интервал> <Тип>) прибавляют к параметру <Дата> временной интервал;

□ SUBDATE(<Дата>, INTERVAL <Интервал> <Тип>) и DATE_SUB(<Дата>,

INTERVAL <Интервал> <Тип>) вычитают из параметра <Дата> временной интервал.

Параметр <Тип> в функциях ADDDATE(), DATE_ADD(), SUBDATE() и

DATE_SUB() может принимать следующие значения:

• YEAR — год:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 2 YEAR);

/* Выведет: 2011-09-21 22:36:43 */

• YEAR_MONTH — год и месяц (формат 'ГГ-ММ'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '2-2' YEAR_MONTH);

/* Выведет: 2011-11-21 22:36:43 */

• MONTH — месяц:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 3 MONTH);

/* Выведет: 2009-12-21 22:36:43 */

• DAY — день:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 6 DAY);

/* Выведет: 2009-09-27 22:36:43 */

• DAY_HOUR — день и час (формат 'ДД ЧЧ'):

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL '6 3'

DAY_HOUR);

/* Выведет: 2009-09-28 01:36:43 */


• DAY_MINUTE — день, час и минуты (формат 'ДД ЧЧ:ММ'):

SELECT ADDDATE('2009-09-21 22:36:43',

INTERVAL '6 3:5' DAY_MINUTE);

/* Выведет: 2009-09-28 01:41:43 */

• DAY_SECOND — день, час, минуты и секунды (формат 'ДД ЧЧ:ММ:СС'):

SELECT ADDDATE('2009-09-21 22:36:43',

INTERVAL '6 3:5:15' DAY_SECOND);

/* Выведет: 2009-09-28 01:41:58 */

• DAY_MICROSECOND — день, час, минуты, секунды и микросекунды (формат 'ДД ЧЧ:ММ:СС.XXXXXX'):

SELECT ADDDATE('2009-09-21 22:36:43',

INTERVAL '6 3:5:15.10' DAY_MICROSECOND);

/* Выведет: 2009-09-28 01:41:58.100000 */

• HOUR — час:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 3 HOUR);

/* Выведет: 2009-09-22 01:36:43 */

• HOUR_MINUTE — час и минуты (формат 'ЧЧ:ММ'):

SELECT ADDDATE('2009-09-21 22:36:43',

INTERVAL '3:7' HOUR_MINUTE);

/* Выведет: 2009-09-22 01:43:43 */

• HOUR_SECOND — час, минуты и секунды (формат 'ЧЧ:ММ:СС'):

SELECT ADDDATE('2009-09-21 22:36:43',

INTERVAL '3:7:15' HOUR_SECOND);

/* Выведет: 2009-09-22 01:43:58 */

• HOUR_MICROSECOND — час, минуты, секунды и микросекунды (формат 'ЧЧ:ММ:СС.XXXXXX'):

SELECT ADDDATE('2009-09-21 22:36:43',

INTERVAL '3:7:15.10' HOUR_MICROSECOND);

/* Выведет: 2009-09-22 01:43:58.100000 */

• MINUTE — минуты:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 8 MINUTE);

/* Выведет: 2009-09-21 22:44:43 */


• MINUTE_SECOND — минуты и секунды (формат 'ММ:СС'):

SELECT ADDDATE('2009-09-21 22:36:43',

INTERVAL '3:7' MINUTE_SECOND);

/* Выведет: 2009-09-21 22:39:50 */

• MINUTE_MICROSECOND — минуты, секунды и микросекунды (формат 'ММ:СС.XXXXXX'):

SELECT ADDDATE('2009-09-21 22:36:43',

INTERVAL '3:7.11' MINUTE_MICROSECOND);

/* Выведет: 2009-09-21 22:39:50.110000 */

• SECOND — секунды:

SELECT ADDDATE('2009-09-21 22:36:43', INTERVAL 15 SECOND);

/* Выведет: 2009-09-21 22:36:58 */

• SECOND_MICROSECOND — секунды и микросекунды (формат

'СС.XXXXXX'):

SELECT ADDDATE('2009-09-21 22:36:43',

INTERVAL '15.123456' SECOND_MICROSECOND);

/* Выведет: 2009-09-21 22:36:58.123456 */

• MICROSECOND — микросекунды:

SELECT ADDDATE('2009-09-21 22:36:43',

INTERVAL 123456 MICROSECOND);

/* Выведет: 2009-09-21 22:36:43.123456 */


Кроме того, функции ADDDATE() и SUBDATE() можно применять в сокращенном формате, описанном далее;

ADDDATE(<Дата>, <Интервал в днях>) прибавляет к параметру <Дата> временной интервал в днях. Если указать перед интервалом знак -, то интервал вычитается из даты:

SELECT ADDDATE('2009-09-21', 10);

/* Выведет: 2009-10-01 */

SELECT ADDDATE('2009-09-21', -10);

/* Выведет: 2009-09-11 */


SUBDATE(<Дата>, <Интервал в днях>) вычитает из параметра <Дата> временной интервал в днях.


Если указать перед интервалом знак -, то интервал прибавляется к дате:

SELECT SUBDATE('2009-09-21', 10);

/* Выведет: 2009-09-11 */

SELECT SUBDATE('2009-09-21', -10);

/* Выведет: 2009-10-01 */

ADDTIME(<Дата>, <Время>) прибавляет к параметру <Дата> временной интервал:

SELECT ADDTIME('2009-09-21 22:36:43', '12:52:35');

/* Выведет: 2009-09-22 11:29:18 */

SUBTIME(<Дата>, <Время>) вычитает из параметра <Дата> временной интервал:

SELECT SUBTIME('2009-09-21 22:36:43', '12:52:35');

/* Выведет: 2009-09-21 09:44:08 */

DATEDIFF(<Конечная дата>, <Начальная дата>) вычисляет количество дней между двумя датами:

SELECT DATEDIFF('2009-09-27', '2009-09-21');

/* Выведет: 6 */

TIMEDIFF(<Конечная дата>, <Начальная дата>) вычисляет разницу между двумя временными значениями:

SELECT TIMEDIFF('2009-09-21 22:36:43', '2009-09-21 15:36:43');

/* Выведет: 07:00:00 */

PERIOD_ADD(<Дата>, <Количество месяцев>) добавляет заданное <Количество месяцев> к дате, заданной в формате ГГГГММ или ГГММ:

SELECT PERIOD_ADD(200904, 4);

/* Выведет: 200908 */

PERIOD_DIFF(<Конечная дата>, <Начальная дата>) вычисляет разницу в месяцах между двумя временными значениями, заданными в формате ГГГГММ или ГГММ:

SELECT PERIOD_DIFF(200908, 200904);

/* Выведет: 4 */

CONVERT_TZ(<Дата>, <Часовой пояс1>, <Часовой пояс2>) переводит дату из одного часового пояса в другой:

SELECT CONVERT_TZ('2009-09-21 22:36:43', '+00:00', '+4:00');

/* Выведет: 2009-09-22 02:36:43 */


LAST_DAY(<Дата>) возвращает дату в формате ГГГГ-ММ-ДД, в которой день выставлен на последний день текущего месяца:

SELECT LAST_DAY('2009-09-21 22:36:43');

/* Выведет: 2009-09-30 */

MAKETIME(<Часы>, <Минуты>, <Секунды>) возвращает время в формате ЧЧ:ММ:СС:

SELECT MAKETIME(12, 52, 35);

/* Выведет: 12:52:35 */

TIMESTAMP(<Дата>, [<Время>]) возвращает дату в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС:

SELECT TIMESTAMP('2009-09-21');

/* Выведет: 2009-09-21 00:00:00 */

SELECT TIMESTAMP('2009-09-21', '12:52:35');

/* Выведет: 2009-09-21 12:52:35 */

Помимо описанных функций добавить или вычесть интервал времени можно с помощью операторов + и -, за которыми следует ключевое слово INTERVAL, значение и тип интервала. Применимы те же типы интервалов, что и в функциях ADDDATE(), DATE_ADD(), SUBDATE() и DATE_SUB():

SELECT '2009-09-21 22:36:43' + INTERVAL '3:7:15' HOUR_SECOND;

/* Выведет: 2009-09-22 01:43:58 */

SELECT '2009-09-21 22:36:43' - INTERVAL '3:7:15' HOUR_SECOND;

/* Выведет: 2009-09-21 19:29:28 */


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

DATE_FORMAT(<Дата>, <Формат>) форматирует дату в соответствии со строкой <Формат>:

SELECT DATE_FORMAT('2009-09-21 22:36:43', '%d.%m.%Y');

/* Выведет: 21.09.2009 */

STR_TO_DATE(<Дата>, <Формат>) возвращает дату в форматах ГГГГ-ММ-ДД ЧЧ:ММ:СС или ГГГГ-ММ-ДД по дате, соответствующей строке <Формат>:

SELECT STR_TO_DATE('21.09.2009 12:52:35', '%d.%m.%Y %H:%i:%s');

/* Выведет: 2009-09-21 12:52:35 */

TIME_FORMAT(<Время>, <Формат>) форматирует время в соответствии со строкой <Формат>:

SELECT TIME_FORMAT('12:52:35', '%H %i %s');

/* Выведет: 12 52 35 */


FROM_UNIXTIME(<Дата>, [<Формат>]) возвращает дату в формате ГГГГ- ММ-ДД ЧЧ:ММ:СС или соответствующую строке <Формат> по количеству секунд, прошедших с полуночи 1 января 1970 г.:

SELECT FROM_UNIXTIME(1239671919);

/* Выведет: 2009-04-14 05:18:39 */

SELECT FROM_UNIXTIME(1239671919, '%d.%m.%Y');

/* Выведет: 14.04.2009 */


GET_FORMAT(<Тип времени>, '<Стандарт>') возвращает строку форматирования для пяти стандартов отображения даты и времени. Параметр

<Тип времени> может принимать следующие значения:

• DATETIME — дата и время;

• DATE — дата;

• TIME — время.

Параметр <Стандарт> может принимать такие значения:

• ISO — стандарт ISO;

• EUR — европейский стандарт;

• USA — американский стандарт;

• JIS — японский стандарт;

• INTERNAL — внутренний формат MySQL.

Например:

SELECT GET_FORMAT(DATE, 'EUR');

/* Выведет: %d.%m.%Y */

SELECT DATE_FORMAT('2009-09-21 22:36:43',

GET_FORMAT(DATE, 'EUR'));

/* Выведет: 21.09.2009 */

Параметр <Формат> в функциях форматирования может содержать следующие комбинации символов:

%Y — год из 4-х цифр;

%y — год из 2-х цифр;

%m — номер месяца с предваряющим нулем (от 01 до 12);

%c — номер месяца без предваряющего нуля (от 1 до 12);

%b — аббревиатура месяца из 3-х букв по-английски;

%M — полное название месяца по-английски;


%d — номер дня с предваряющим нулем (от 01 до 31);

%e — номер дня без предваряющего нуля (от 1 до 31);

%w — номер дня недели (0 — для воскресенья и 6 — для субботы);

%a — аббревиатура дня недели из 3-х букв по-английски;

%W — полное название дня недели по-английски;

%H — часы в 24-часовом формате (от 00 до 23);

%h — часы в 12-часовом формате (от 01 до 12);

%i — минуты (от 00 до 59);

%s — секунды (от 00 до 59);

%f — микросекунды;

%% — знак процента.

Функции для обработки строк


Основные функции для обработки строк:

CHAR_LENGTH(<Строка>) и CHARACTER_LENGTH(<Строка>) возвращают количество символов в строке. Функции корректно работают с многобайтными кодировками:

SELECT CHAR_LENGTH('String');

/* Выведет: 6 */

SELECT CHARACTER_LENGTH('String');

/* Выведет: 6 */

LENGTH(<Строка>) также позволяет определить количество символов в строке. Однако эта функция некорректно работает с многобайтными кодировками, так как возвращает количество байтов:

SELECT LENGTH('String');

/* Выведет: 6 */

BIT_LENGTH(<Строка>) возвращает длину строки в битах:

SELECT BIT_LENGTH('String');

/* Выведет: 48 */

CONCAT(<Строка1>, <Строка2>, ..., <СтрокаN>) объединяет все параметры в одну строку:

SELECT CONCAT('string1', 'string2', 'string3');

/* Выведет: string1string2string3 */

CONCAT_WS(<Разделитель>, <Строка1>, ..., <СтрокаN>) объединяет все параметры в одну строку через разделитель, заданный в параметре <Разделитель>:

SELECT CONCAT_WS(' - ', 'string1', 'string2', 'string3');

/* Выведет: string1 - string2 - string3 */

TRIM([[<Откуда>] [<Символы для удаления>] FROM] <Строка>) удаляет из начала (и/или конца) строки символы, указанные в параметре <Символы для удаления>. Если параметр не указан, то удаляемыми символами являются пробелы. Необязательный параметр <Откуда> может принимать значения:

• BOTH — символы удаляются из начала и конца строки (по умолчанию);

• LEADING — только из начала строки;

• TRAILING — только из конца строки.

Например:

SELECT CONCAT("'", TRIM(' String '), "'");

/* Выведет: 'String' */

SELECT CONCAT("'", TRIM(LEADING FROM ' String '), "'");

/* Выведет: 'String ' */

SELECT CONCAT("'", TRIM(TRAILING FROM ' String '), "'");

/* Выведет: ' String' */

SELECT CONCAT("'", TRIM(BOTH 'm' FROM 'mmmmStringmmmm'), "'");

/* Выведет: 'String' */

SELECT CONCAT("'", TRIM(TRAILING 'ing' FROM 'Stringing'), "'");

/* Выведет: 'Str' */

SELECT CONCAT("'", TRIM(TRAILING 'gn' FROM 'String'), "'");

/* Выведет: 'String' */

LTRIM(<Строка>) удаляет пробелы в начале строки:

SELECT CONCAT("'", LTRIM(' String '), "'");

/* Выведет: 'String ' */

RTRIM(<Строка>) удаляет пробелы в конце строки:

SELECT CONCAT("'", RTRIM(' String '), "'");

/* Выведет: ' String' */

LOWER(<Строка>) и LCASE(<Строка>) переводят все символы в нижний регистр:

SELECT LOWER('STRING');

/* Выведет: string */

SELECT LCASE('String');

/* Выведет: string */

UPPER(<Строка>) и UCASE(<Строка>) переводят все символы в верхний регистр:

SELECT UPPER('string');

/* Выведет: STRING */

SELECT UCASE('String');

/* Выведет: STRING */

REVERSE(<Строка>) возвращает строку в обратном порядке:

SELECT REVERSE('string');

/* Выведет: gnirts */

LEFT(<Строка>, <Количество символов>) возвращает заданное количество крайних символов слева:

SELECT LEFT('string', 2);

/* Выведет: st */

RIGHT(<Строка>, <Количество символов>) возвращает заданное количество крайних символов справа:

SELECT RIGHT('string', 2);

/* Выведет: ng */

SUBSTRING(<Строка>, <Начальная позиция>, [<Длина>]),

SUBSTR(<Строка>, <Начальная позиция>, [<Длина>]) и MID(<Строка>, <Начальная позиция>, [<Длина>]) позволяют получить подстроку заданной длины, начиная с позиции <Начальная позиция>. Если параметр <Длина> не задан, то возвращаются все символы до конца строки:

SELECT SUBSTRING('string', 2, 2);

/* Выведет: tr */

SELECT SUBSTR('string', 2, 2);

/* Выведет: tr */

SELECT MID('string', 2);

/* Выведет: tring */

Первые две функции имеют альтернативный синтаксис:

SELECT SUBSTRING('string' FROM 2 FOR 3);

/* Выведет: tri */

SELECT SUBSTRING('string' FROM 2);

/* Выведет: tring */

LPAD(<Строка>, <Длина>, <Подстрока>) добавляет подстроку к исходной строке слева, доводя общую длину строки до величины <Длина>:

SELECT LPAD('string', 11, 'mp');

/* Выведет: mpmpmstring */

RPAD(<Строка>, <Длина>, <Подстрока>) добавляет подстроку к исходной строке справа, доводя общую длину строки до величины <Длина>:

SELECT RPAD('string', 10, 'mp');

/* Выведет: stringmpmp */

REPEAT(<Строка>, <Количество повторений>) возвращает строку, содержащую заданное количество повторений исходной строки:

SELECT REPEAT('str', 3);

/* Выведет: strstrstr */

SPACE(<Количество пробелов>) возвращает строку, состоящую из заданного количества пробелов:

SELECT CONCAT("'", SPACE(3), 'String', "'");

/* Выведет: ' String' */

ELT(<Номер из списка>, <Строка1>, ..., <СтрокаN>) позволяет получить одну строку из списка параметров, номер которой задается первым параметром:

SELECT ELT(2, 'string1', 'string2', 'string3');

/* Выведет: string2 */

ASCII(<Строка>) возвращает код ASCII первого символа строки:

SELECT ASCII('String');

/* Выведет: 83 */

ORD(<Строка>) дает возможность узнать код первого символа строки.

Корректно работает с многобайтными кодировками. Если первый символ — однобайтный, вернет то же значение, что и ASCII():

SELECT ORD('String');

/* Выведет: 83 */

CHAR(<ASCII-код1>, <ASCII-код2>, ..., <ASCII-кодN>) возвращает строку, состоящую из последовательности символов, соответствующих ASCII-кодам:

SELECT CHAR(83, 116, 114, 105, 110, 103);

/* Выведет: String */


INSTR(<Строка>, <Подстрока>) или POSITION(<Подстрока> IN <Строка>) ищут подстроку в строке и возвращают позицию ее первого вхождения. Если вхождение не найдено, то возвращается 0:

SELECT INSTR('string', 'st');

/* Выведет: 1 */

SELECT POSITION('st' IN 'string');

/* Выведет: 1 */

SELECT POSITION('pt' IN 'string');

/* Выведет: 0 */

LOCATE(<Подстрока>, <Строка>, [<Начальная позиция>]) возвращает позицию первого вхождения подстроки в строку, начиная с указанной начальной позиции. Если подстрока не найдена, то возвращается 0. Если начальная позиция не указана, то поиск производится с начала строки:

SELECT LOCATE('st', 'string_st');

/* Выведет: 1 */

SELECT LOCATE('st', 'string_st', 3);

/* Выведет: 8 */


FIELD(<Исходная строка>, <Строка1>, ..., <СтрокаN>) позволяет определить номер строки из списка <Строка1>, ..., <СтрокаN>, которая совпадает с исходной строкой:

SELECT FIELD('st', 'string', 'st', 'st2');

/* Выведет: 2 */

FIND_IN_SET(<Исходная строка>, <Список строк через запятую>) возвращает номер строки из списка <Список строк через запятую>, которая совпадает с исходной строкой:

SELECT FIND_IN_SET('st', 'string,st,st2');

/* Выведет: 2 */

REPLACE(<Строка>, <Подстрока для замены>, <Новая подстрока>) производит замену всех вхождений подстроки для замены на новую подстроку и возвращает результат:

SELECT REPLACE('Привет, Петя', 'Петя', 'Вася');

/* Выведет: Привет, Вася */

SUBSTRING_INDEX(<Строка>, <Подстрока>, <Номер вхождения>) находит N-е вхождение подстроки в строку, где N задается параметром <Номер вхождения>, и возвращает часть строки, расположенную слева от подстроки:

SELECT SUBSTRING_INDEX('синий, красный, зеленый', ',', 1);

/* Выведет: синий */

SELECT SUBSTRING_INDEX('синий, красный, зеленый', ',', 2);

/* Выведет: синий, красный */

Если параметр <Номер вхождения> имеет отрицательное значение, то ищется N-е вхождение подстроки с конца строки и возвращается часть строки, расположенная справа от найденной подстроки:

SELECT CONCAT('"', SUBSTRING_INDEX('синий, красный, зеленый',',', -1), '"');

/* Выведет: " зеленый" */

SELECT CONCAT('"', SUBSTRING_INDEX('синий, красный, зеленый', ',', -2), '"');

/* Выведет: " красный, зеленый" */

INSERT(<Строка>, <Начальная позиция>, <Длина>, <Подстрока>) заменяет фрагмент в строке с начальной позиции длиной <Длина> на значение

параметра <Подстрока>:

SELECT INSERT('красный', 6, 2, 'ое');/* Выведет: красное */

SELECT INSERT('красный', 6, 1, 'ое');/* Выведет: красноей */

QUOTE(<Строка>) экранирует все специальные символы в строке:

SELECT QUOTE("Д'Артаньян и три мушкетера");

/* Выведет: Д\'Артаньян и три мушкетера */

UNHEX(<Строка>) переводит строку из шестнадцатеричных цифр в обычную строку. Каждая пара символов в исходной строке воспринимается как шестнадцатеричное число, которое преобразуется в символ:

SELECT UNHEX('537472696E67');

/* Выведет: String */

COMPRESS(<Строка>) архивирует строку. Сжатую строку следует хранить в полях, имеющих бинарный тип данных;

UNCOMPRESS(<Строка>) разархивирует строку, сжатую функцией COMPRESS();

UNCOMPRESSED_LENGTH(<Строка>) позволяет узнать длину строки, которую она будет иметь после разархивирования:

SELECT UNCOMPRESSED_LENGTH(COMPRESS('Строка'));

/* Выведет: 6 */

CHARSET(<Строка>) возвращает название кодировки для строки:

SET NAMES 'cp866';

SELECT CHARSET('Строка');

/* Выведет: cp866 */

COLLATION(<Строка>) возвращает порядок сортировки для строки:

SET NAMES 'cp866';

SELECT COLLATION('Строка');

/* Выведет: cp866_general_ci */

STRCMP(<Строка1>, <Строка2>) сравнивает две строки и возвращает:

• 0 — если строки идентичны;

• -1 — если <Строка1> больше <Строка2>;

• 1 — если <Строка1> меньше <Строка2>.

Например,

SELECT STRCMP('Строка', 'Строка');

/* Выведет: 0 */

SELECT STRCMP('Строка1', 'Строка2');

/* Выведет: -1 */

SELECT STRCMP('Строка2', 'Строка1');

/* Выведет: 1 */

Сравнение строк чувствительно к регистру;

LOAD_FILE(<Путь к файлу>) — возвращает содержимое файла в виде строки. Часто используется для заполнения бинарных полей. В качестве примера создадим текстовый файл с названием test.txt в папке C:\Apache2. Затем запишем в файл строку "Content". Теперь получим содержимое файла с помощью функции LOAD_FILE():

SELECT LOAD_FILE('C:/Apache2/test.txt');

/* Выведет: Content */

Прочие

Также в SQL-запросах можно использовать следующие функции:

IF(<Условие>, <Если Истина>, <Если Ложь>) — функция для логиче- ского выбора. Если <Условие> истинно, то возвращается значение выражения <Если Истина>, в противном случае возвращается значение выражения <Если Ложь>;

SELECT IF(5>6, 'Больше', 'Меньше');

/* Выведет: Меньше */

CASE() — функция для логического выбора. Имеет две формы записи.

Первая форма:

CASE <Переменная или выражение>

WHEN <Значение 1> THEN <Выражение 1>

[WHEN <Значение 2> THEN <Выражение 2>]

[ELSE <Выражение>] END

В зависимости от значения переменной (или выражения) выполняется один из блоков WHEN, в котором указано это значение.

Если ни одно из значений не описано в блоках WHEN, то выполняется блок ELSE:

SELECT CASE 3 + 5 WHEN 8 THEN 'Равно 8'

WHEN 7 THEN 'Равно 7' ELSE 'Не смогли определить' END;

/* Выведет: Равно 8 */

Вторая форма:

CASE WHEN <Условие 1> THEN <Выражение 1>

[WHEN <Условие 2> THEN <Выражение 2>]

[ELSE <Выражение>] END

Например:

SELECT CASE WHEN 5>6 THEN 'Больше' ELSE 'Меньше' END;

/* Выведет: Меньше */

IFNULL(<Выражение1>, <Выражение2>) позволяет заменить значения NULL другими значениями. Если <Выражение1> не равно NULL, то функция возвращает <Выражение1>. В противном случае функция возвращает <Выражение2>:

SELECT IFNULL(5, 3);

/* Выведет: 5 */

SELECT IFNULL(NULL, 3);

/* Выведет: 3 */

NULLIF(<Выражение1>, <Выражение2>) — функция для логического выбора. Если <Выражение1> равно <Выражение2>, возвращается значение NULL, в противном случае возвращается <Выражение1>:

SELECT NULLIF(5, 5);

/* Выведет: NULL */

SELECT NULLIF(5, 3);

/* Выведет: 5 */

INET_ATON(<IP-адрес>) представляет IP-адрес в виде целого числа:

SELECT INET_ATON('127.0.0.1');

/* Выведет: 2130706433 */

INET_NTOA(<IP-адрес в виде числа>) принимает IP-адрес в виде целого числа и возвращает IP-адрес в виде строки, состоящей из четырех цифр, разделенных точкой:

SELECT INET_NTOA(2130706433);

/* Выведет: 127.0.0.1 */

GET_LOCK(<Имя>, <Время ожидания ответа сервера>) устанавливает блокировку с указанным именем. Функция возвращает 1 в случае успешной блокировки и 0, если время ожидания ответа сервера превысило величину, заданную в секундах параметром <Время ожидания ответа сервера>. Если произошла ошибка, то функция возвращает NULL. Блокировка снимается тремя способами:

• с помощью функции RELEASE_LOCK();

• при повторном вызове функции GET_LOCK();

• при разрыве соединения с сервером.

Например:

SELECT GET_LOCK('mylock', 5);

/* Выведет: 1 */

IS_FREE_LOCK(<Имя блокировки>) проверяет, свободна ли блокировка с указанным именем. Функция возвращает 1, если блокировка свободна, и 0, если она занята:

SELECT IS_FREE_LOCK('mylock');

/* Выведет: 0 */

IS_USED_LOCK(<Имя блокировки>) проверяет, установлена ли блокировка с указанным именем. Если блокировка установлена, то возвращается идентификатор соединения клиента, который установил блокировку:

SELECT IS_USED_LOCK('mylock');

/* Выведет: 1 */

SELECT CONNECTION_ID();

/* Выведет: 1 */

Если блокировка не установлена, то возвращается значение NULL;

RELEASE_LOCK(<Имя блокировки>) снимает блокировку с указанным именем. Если блокировка успешно снята, то функция возвращает 1. Если блокировка не может быть снята, то возвращается 0. Если блокировка с указанным именем не существует, то функция возвращает NULL:

SELECT RELEASE_LOCK('mylock');

/* Выведет: 1 */

SELECT IS_USED_LOCK('mylock');

/* Выведет: NULL */

UUID() возвращает универсальный уникальный идентификатор — 128-разрядное уникальное число в виде строки, состоящее из пяти шестнадцатеричных чисел, разделенных символом "-";

SELECT UUID();

/* Выведет: 9884721ded-2010-2ba9-71be-e337690000 */

SELECT UUID();

/* Выведет: a413be1fed-2010-2ba9-71be-e337690000 */

Используемый алгоритм гарантирует глобальную уникальность возвращенного идентификатора;

GROUP_CONCAT() объединяет отдельные значения в одну строку. Функция имеет следующий формат:

GROUP_CONCAT([DISTINCT] <Поле1> [, <ПолеN>]

[ORDER BY <Поле> [ASC | DESC]]

[SEPARATOR <Разделитель>])

http://xoops.ws/modules/instruction/page.php?id=443#pagetext