Часть III.

Справочник

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

Глава №15.

Справочник по SQL

MySQL SQL

ALTER/MODIFY

ALTER [IGNORE] TABLE table ADD [COLUMN] create_clause

ALTER [IGNORE] TABLE table ADD INDEX [name] (column, . . .)

ALTER [IGNORE] TABLE table ADD UNIQUE [name] (column, . . .)

ALTER [IGNORE] TABLE table ALTER [COLUMN] column SET DEFAULT value

ALTER [IGNORE] TABLE table ALTER [COLUMN] column DROP DEFAULT

ALTER [IGNORE] TABLE table CHANGE [COLUMN] column create..clause

ALTER [IGNORE] TABLE table DROP [COLUMN] column

ALTER [IGNORE] TABLE table DROP FOREIGN KEY key

ALTER [IGNORE] TABLE table DROP INDEX key

ALTER [IGNORE] TABLE table DROP PRIMARY KEY

ALTER [IGNORE] TABLE table MODIFY [COLUMN] create_clause

ALTER [IGNORE] TABLE table RENAME [AS] new_name

Оператор ALTER охватывает широкий набор действий, которые изменяют структуру таблицы. Этот оператор используется для добавления, изменения или удаления столбцов существующей таблицы, а также для удаления индексов. Несколько операторов ALTER могут быть объединены в одно предложение с помощью запятых:

ALTER TABLE mytable DROP myoldcolumn, ADD mynewcolumn INT

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

Как указывалось выше, есть несколько разных, зачастую противоположных действий, выполняемых ALTER:

ADD [COLUMN] create,clause

Добавляет новый столбец в таблицу. Выражение create_clause имеет тот же вид, что и используемое в операторе CREATE (см. ниже). Таблица должна существовать и не иметь столбца с тем же именем, что у добавляемого столбца. (Ключевое слово COLUMN необязательно и не имеет эффекта.)

ADD INDEX [ name] (column , ...)

Создает индекс из указанных столбцов. В индексе могут быть скомбинированы до 15 столбцов. Указывать имя для индекса необязательно. Если не задано имя, индекс будет назван по имени первого столбца в списке (с числовым суффиксом _2, _3 и т. д., если это необходимо для уникальности).

ADD UNIQUE [name] (column, ...)

Идентично ADD INDEX за исключением того, что индексированные поля гарантированно уникальны. То есть, если пользователь попытается добавить значение, уже существующее в уникальном индексе, будет выдано сообщение об ошибке.

ALTER [COLUMN] column SET DEFAULT value

ALTER [COLUMN] column DROP DEFAULT

Создает, изменяет или удаляет значение по умолчанию для столбца. Если используется фраза SET DEFAULT , значение по умолчанию для указанного столбца изменяется на новое (даже если до этого не существовало значений по умолчанию). При использовании DROP DEFAULT, существующее значение по умолчанию удаляется. При этом любые существующие записи, созданные с помощью этого значения, остаются неизмененными. (Ключевое слово COLUMN необязательно и не имеет эффекта.)

CHANGE [COLUMN] new_column_name create_clause

MODIFY [COLUMN] create__clause

Изменяет определение столбца. Предложение используется для изменения типа данных столбца с минимально возможным воздействием на данные. Выражение create_clause то же, что и в операторе CREATE. Оно включает имя столбца и поэтому, используя это предложение, вы изменяете имя столбца. (Например, ALTER TABLE mytable CHANGE name newname CHAR(30) .) Предложение MODIFY аналогично CHANGE, но новый столбец имеет то же имя, что и старый. Ключевое слово COLUMN необязательно и не имеет эффекта. Следующие преобразования типов данных выполняются автоматически:

Целых чисел к числам с плавающей запятой, и наоборот (например, BIGINT к DOUBLE).

Меньших числовых значений к большим (например, INTEGER к BIGINT).

Больших числовых значений к меньшим (например, DOUBLE к FLOAT). Если значение выходит за пределы нового типа, используется максимально возможное значение нового типа данных (или наименьшее из отрицательных).

DROP [COLUMN] column

Удаляет столбец из таблицы. Это предложение удалит из таблицы столбец и все его содержимое. Единственный способ восстановить данные, уничтоженные таким способом, - использовать резервную копию. Все ссылки в индексах на этот столбец будут удалены. Все индексы, где этот столбец был единственным, будут также уничтожены. (Ключевое слово COLUMN необязательно и не имеет эффекта.)

DROP INDEX key

Удаляет индекс из таблицы. Это предложение полностью сотрет индеке из таблицы. Предложение не затронет данные самой таблицы, только данные индекса. Поэтому индекс, удаленный таким способом, может быть воссоздан с помощью оператора ALTER TABLE ... ADD INDEX.

DROP PRIMARY KEY

Аналог DROP INDEX . Ищет специальный индекс, называемый первичным ключом (Primary Key). Если в таблице первичный ключ не найден, будет удален первый уникальный индекс.

RENAME [AS] new_table

Изменяет имя таблицы. Эта операция не влияет на данные или индексы внутри таблицы. Если предложение применяется одно, без других ALTER TABLE операторов, MySQL не создает временную таблицу, как в случае других операторов, а просто выполняет быстрое переименование табличных файлов на уровне Unix.

Операция FOREIGN KEY (внешний ключ) в настоящий момент не поддерживается в MySQL. Хотя синтаксис команды описан, никаких действий с внешним ключом произвести не удастся.

Чтобы применить любое из действий ALTER TABLE , у вас должны быть права SELECT, INSERT, DELETE, UPDATE, CREATE и DROP на изменяемую табли-ЦУ.

Примеры

# Добавить поле 'address2' к таблице 'people' и. задать ему тип данных

# 'VARCHAR' с максимальной длиной 200 символов.

ALTER TABLE people ADD COLUMN address2 VARCHAR(100)

# Добавить два новых индекса к таблице 'hr', обычный индекс для поля

# 'salary'

# и уникальный индекс для поля 'id'. Также продолжить выполнение, если

# найдены

# дублируемые значения при создании индекса 'id_idx' (очень опасно!).

ALTER TABLE hr ADD INDEX salary_idx ( salary )

ALTER IGNORE TABLE hr ADD UNIQUE id_idx ( id )

# Изменить значение по умолчанию для поля 'price' в таблице 'sprockets'

# на $19.95.

ALTER TABLE sprockets ALTER price SET DEFAULT '$19.95'

# Удалить значение по умолчанию для поля 'middle_name' в таблице 'names'.

ALTER TABLE names ALTER middle_name DROP DEFAULT

# Изменить тип данных для поля 'profits' с начального значения (которым,

# возможно, было INTEGER) на BIGINT.

ALTER TABLE finanaces CHANGE COLUMN profits profits BIGINT

# Удалить поле 'secret_stuff' из таблицы 'not_private_anymore'

ALTER TABLE not_private_anymore DROP secret_stuff

# удалить индекс с именем 'id_index' также как и первичный ключ

# из таблицы 'cars'.

ALTER TABLE cars DROP INDEX id_index, DROP PRIMARY KEY

# Переименовать таблицу 'rates_current' на 'rates_1997'

ALTER TABLE rates_current RENAME AS rates_1997

CREATE

CREATE DATABASE dbname

CREATE TABLE name ( field_name field__type, ... )

CREATE INDEX name ON table ( column, ...)

CREATE FUNCTION name RETURNS values SONAME library

Создает новые элементы базы данных (или полностью новую базу). Предложение используется для создания баз данных, таблиц и функций, определяемых пользователем (UDFs).

Команда CREATE INDEX поддерживается для совместимости с другими реализациями SQL. В старых версиях SQL эта команда ничего не выполняла. В версии 3.22 это предложение эквивалентно ALTER TABLE ADD INDEX. Чтобы выполнить CREATE INDEX , вы должны иметь право INDEX для этой таблицы.

CREATE DATABASE создает полностью пустую базу данных. Это эквивалент утилите mysqladmin . Так же как и при запуске mysqladmin, вы должны иметь права администратора MySQL (обычно root или mysql) для выполнения этой команды.

CREATE FUNCTION позволяет предложениям MySQL получать доступ к прекомпилированным выполняемым функциям. Эти функции могут выполнять практически любые операции, так как они проектируются пользователем. Возвращаемое значение может быть STRING для символьных данных; REAL для чисел с плавающей запятой или INTEGER для целых чисел. MySQL преобразует возвращаемое значение С-функций к указанному типу. Библиотека, содержащая функцию, должна быть стандартной разделяемой библиотекой, которую MySQL может динамически присоединить к серверу.

CREATE TABLE определяет структуру таблицы в базе данных. Этим оператором создаются все таблицы MySQL. Предложение состоит из имени таблицы, за которым идет любое количество определений полей. Синтаксис определения полей включает в себя имя поля, за ним его тип, за ним любой модификатор (например: name char(30) not null ). MySQL поддерживает следующие типы данных, представленные в таблице 15-1.

Таблица 15-1. Типы данных

Тип

Размер (в байтах)

Комментарии

TINYIN'I ( length)/ INT1( length)

1

Целое с диапазоном значений от 0 до 255 без знака и от -128 до 127 со знаком.

SMALLINT ( length)/

2

Целое с диапазоном значений от

INT2( length)


0 до 65535 без знака и от -32768 до 32767 со знаком.

MEDIUMINT ( length)/

3

Целое с диапазоном значений от

INT3( length)/


0 до 16777215 без знака и от

MIDDLEINT ( length)


-8388608 до 8388607 со знаком.

INT (length)/

4

Целое с диапазоном значений от

INTEGER ( length)/


0 до 4294967295 без знака и от

INT4( length)


-2147483648 до 8388607 со знаком.

BIGINT (length)/

8

Целое с диапазоном значений от

INT8( length)


0 до 184467447370955165 без зна-



ка и от -9223372036854775808



до 9223372036854775807 со зна-



ком.

FLOAT/FLOAT (4)/ FLOAT

4

Число с плавающей запятой

(length, decimal )/ FLO-


с максимальным значением

AT4( length, decimal )


+/-3.402823466Е38 и минималь-



ным (не нулевым) значением



+/-1.175494351Е-38.

DOUBLEPRECISION

8

Число с плавающей запятой

(length, decimal )/


с максимальным значением

DOUBLE ( length, decimal )/


+/-1.7976931348623157Е308 и

REAL (length, decimal )/


минимальным (не нулевым) значе-

FLOAT8( length, decimal )/


нием +/-2.2250738585072014Е-308.

FLOAT (8)



DECIMAL ( length, decimal )/

length

Число с плавающей запятой с ди-

NUMERIC ( length, decimal )


апазоном значений как у типа DOUBLE, которое хранится как поле CHAR . DECIMAL и NUMERIC всегда расцениваются как поля CHAR , которые содержат цифровое значение.

TIMESTAMP (length)

4

Значение timestamp, которое обновляется каждый раз, когда изменяется запись. Также можно приписать значение вручную. При приписывании значения NULL в поле запишется текущее время. Поле длины (необязательное) определяет внешний формат записи. Длина 14 (значение по умолчанию) выводит строку типа ' YYYYMMDDHHMMSS' , 12 flacT'YYMMDDHHMMSS',' 8- 'YYYYMMDD', и 6 выдаст 'YYMMDD'.

DATE

3

Значение даты, которое хранит год, месяц и день. Значения всегда выводятся в формате 'YYYY-MM-DD', но могут быть введены в любом из следующих форматов: 'YY-MM-DD', 'YYYY-MM-DD', 'YYMMDD' или 'YYYYMMDDHHMMSS' (часть, хранящая время, игнорируется).

TIME

3

Значение времени, хранящее часы, минуты и секунды. Значения всегда выводятся в формате 'НН: MM: SS', но могут быть введены в любом из следующих форматов: 'НН: MM: SS', 'HHMMSS', 'ННММ' (секунды равны '00'), или 'НН' (минуты и секунды обнуляются).

DATETIME

8

Сохраняет и дату и время. Значения вводятся и выводятся в формате 'YYYY-MM-DD HH: MM: SS'.

YEAR

1

Значение, сохраняющее год. Может быть введено либо в формате 'YYYY', либо 'YY', будет выведено либо как двухзначный, либо как четырехзначный год, в зависимости от формата ввода. Двухзначный год может находиться в диапазоне между 1970 и 2069 включительно. Этот тип данных в настоящее время поддерживает года с 1901 по 2155.

CHAR (length) /ШЬЮ (length-)

length

Строка фиксированной длины. Любой текст меньшей длины будет дополнен пробелами в конце строки. Все конечные пробелы, вставленные либо MySQL, либо пользователем, удаляются при выводе значения. MySQL по умолчанию считает текст не чувствительным к регистру (см. модификатор BINARY ниже). Тип BINARY эквивалентен CHAR с модификатором BINARY .

CHAR (length) VARYING/ VARCHAR (length)/ VARBINARY ( length)

length

Текстовая строка переменной длины (нечувствительная к регистру) с установленной максимальной длиной. Максимальная длина должна лежать в диапазоне между 1 и 255 символами. Все концевые пробелы удаляются при сохранении данных этого типа. Тип VARBINARY эквивалентен VARCHAR с BINARY модификатором.

TINYTEXT

length+1

Текстовое поле (нечувствительно к регистру) с максимальной длиной в 255 символов.

TINYBLOB

length+1

Двоичное поле (чувствительно к регистру) с максимальной длиной в 255 символов. Двоичные данные чувствительны к регистру.

TEXT/LONG VARCHAR

length+2

Текстовое поле с максимальной длиной в 64 Кбайт текста.

BLOB/LONG VARBINARY

length+2

Двоичное поле с максимальным размером в 64 Кбайт данных.

MEDIUMTEXT

length+3

Текстовое поле с максимальной длиной в 16 Мбайт текста.

MEDIUMBLOB

length+3

Двоичное поле с максимальным размером в 16 Мбайт данных.

LONGTEXT

length+4

Текстовое поле с максимальной длиной в 4 Гбайт текста.

LONGBLOB

length+4

Двоичное поле с максимальным размером в 4 Гбайт данных.

ENUM

1,2

Поле, которое может содержать одно значение из предварительно заданного набора (например ENUM ("apples", "oranges", "bananas")). Данные могут быть введены как одно из текстовых значений набора либо как число, соответствующее одному из элементов набора (номер первого элемента 1). В поле всегда может быть внесено значение NULL. Набор (коллекция) может содержать до 65535 разных элементов. Если в наборе меньше 256 элементов, поле займет только один байт (иначе его размер равен двум байтам).

SET

1—8

Поле может содержать любое количество предварительно заданных значений (например SET ("rock," "pop," "country," "western")). Данные могут быть заданы как список разделенных запятыми значений либо как двоичное битовое представление значений (например 12, т. е. 1100 в двоичном виде, относится к "country, western" в предыдущем примере). В одном наборе может быть до 64 элементов.

В дополнение к основным типам могут использоваться некоторые модификаторы.

decimal

Максимальное количество цифр справа от запятой в числе с плавающей запятой. Любое значение с более длинной дробной частью будет округлено. Например, для поля price FLOAT(5,2) значение 4.34 будет показано как 4.34, значение 234.27 будет показано как 234.3 (для соответствия общей максимальной длине), значение 3.331 будет выглядеть как 3.33 (для соответствия максимальной длине дробной части).

length

Количество символов для числовых значений, показываемое пользователю. Включает десятичные запятые, знаки и индикаторы экспонент. Например, поле peanuts INT(4) имеет допустимый диапазон от -999 до 9999. MySQL сохранит значение, выходящие за пределы заданного диапазона, пока оно не выйдет за пределы максимального размера для своего типа. Если вы сохраните значение вне заданного диапазона, MySQL выдаст предупреждение, но будет функционировать нормально.

При использовании с типом TIMESTAMP модификатор length определяет формат, используемый для timestamp.

При использовании с символьными (текстовыми) типами length определяет количество символов. Для символьных типов с фиксированной длиной length это точное число символов, используемое для хранения данных. Для текстовых типов с переменной длиной length это максимально возможная длина строки.

Атрибут length является необязательным для всех типов, кроме DECIMAL/NUMERIC , CHAR и VARCHAR .

Поскольку тип DECIMAL/NUMERIC хранится как символьная строка, он ограничен максимальной длиной точно так же, как и поле CHAR. Поэтому ввод чисел больше указанного диапазона вызовет такую же ошибку, что и при вводе слишком длинной строки в поле CHAR.

precision

Этот атрибут доступен для типа FLOAT в целях совместимости с системой ODBC. Значение этого атрибута, равное 4, указывает на обычное вещественное число (то же, что и FLOAT без атрибута точности), а значение 8 определяет число с плавающей запятой двойной точности (то же, что поле DOUBLE).

AUTO_INCREMENT

Атрибут позволяет автоматически обновлять числовое поле. Это удобно для создания уникальных идентификаторов для записей в таблице. Данные могут быть записаны и прочитаны из такого поля, как из обычного, но при вводе значения NULL или 0 существующее значение автоматически увеличивается на единицу. Текущее значение поля AUTO_INCREMENT может быть получено с помощью функции LAST_INSERT_ID (см. SELECT ниже).

BINARY

Атрибут используется с типами CHAR и VARCHAR- для указания на двоичные данные в текстовой строке. Единственным эффектом этого атрибута будет чувствительность к регистру при сортировке данных. По умолчанию MySQL игнорирует регистр при сортировке текста.

DEFAULT value

Атрибут приписывает полю значение по умолчанию. Это значение будет присвоено полю в случае, если во вводимой в таблицу записи это поле пустое. Если значение по умолчанию не определено и нет ограничения NOT NULL , то будет записано значение NULL. В случае NOT NULL MySQL запишет значение на основе типа поля.

NOT NULL

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

NULL

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

PRIMARY KEY

Атрибут автоматически делает поле первичным ключом таблицы. Таблица может иметь только один первичный ключ (см. ниже). Любое поле, являющееся первичным ключом, должно иметь атрибут NOT NULL.

REFERENCES table [(column, . . . )] [MATCH FULL | MATCH PARTIAL] [ON

DELETE option] [ON UPDATE option]

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

UNSIGNED

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

ZEROFILL

Атрибут используется с целочисленными типами для добавления нулей перед числом, пока не будет достигнута длина, максимальная для типа. Например, поле counter INT(5) ZEROFILL покажет число 132 как 00132.

Indexes

MySQL поддерживает концепцию индексирования таблиц, как описано в главе 2, «Проектирование баз данных». Индексы создаются посредством особых «типов», включенных в определение таблицы.

KEY/INDEX [name] (column, [column2, . . . ])

Создает обычный индекс для всех столбцов с именами. (KEY и INDEX в этом контексте будут синонимами.) Индексу может быть дано имя (не обязательно). Если имя не указано, будет приписано имя, основанное на имени первого столбца, и, если это необходимо для поддержания уникальности, к имени будет добавлена цифра. Если в индекс входит более одного столбца, то все столбцы слева будут объединены в подгруппы и проиндексированы. Обратите внимание на следующее определение индекса: INDEX idxl ( name, rank, serial );

При создании этого индекса будут проиндексированы следующие группы столбцов:

PRIMARY KEY

Создает первичный ключ. Первичный ключ — это особый ключ, который может быть только один для каждой таблицы. По сути, первичный ключ- это уникальный (UNIQUE) ключ с именем «PRIMARY». Несмотря на привилегированный статус, он функционирует как любой другой уникальный ключ.

UNIQUE [nаmе] (column, [column2, . , . ])

Создает особый индекс, все входящие значения которого должны быть уникальными (и соответственно они уникальны в индексированных полях). Попытка ввести существующее значение в уникальный индекс вызовет ошибку. Следующая команда создает уникальный индекс поля «nicknames»:

UNIQUE (nicknames);

В существующей реализации индексирования в MySQL значение NULL не допускается ни в одном из полей, входящих в индекс.

При индексировании текстовых полей (CHAR, VARCHAR и их синонимы) возможно индексирование только первой части всего поля. Например, следующая команда создаст индекс числового поля 'id' вместе с первыми 20 символами текстового поля 'address':

INDEX adds ( id, address(20) );

При выполнении любого поиска в поле 'address' для сравнения будут использованы только первые 20 символов до тех пор, пока не встретится более одного совпадения. Поэтому можно получить большой выигрыш в производительности, если использовать для индексирования только некоторое количество символов текстового поля, которые, по вашему мнению, дадут уникальные значения.

Поля, входящие в индекс, должны быть определены с атрибутом NOT NULL (см. выше). При создании индекса отдельной командой MySQL сгенерирует ошибку, если NOT NULL не указан. Однако при определении первичного ключа добавлением атрибута PRIMARY KEY к описанию таблицы, атрибут NOT NULL будет добавлен автоматически (без предупреждения), если он не указан явно.

В добавление к описанным выше MySQL содержит следующие специальные «типы»:

Эти ключевые слова не выполняют никаких действий. Они существуют для более легкого чтения SQL-кода, экспортированного из других баз данных. Также некоторая отсутствующая пока функциональность может быть добавлена в следующие версии MySQL.

У вас должны быть право CREATE для базы данных, где используется предложение CREATE TABLE .

Примеры

# Создать новую пустую базу данных 'employees'

CREATE DATABASE employees;

# Создать простую таблицу

CREATE TABLE empjata ( id INT, name CHAR(50) );

# Создать функцию make_coffee (которая хранится в библиотеке myfuncs.so

# и возвращает строковое значение).

CREATE FUNCTION make_coffee RETURNS string SONAME "myfuncs.so";

DELETE

DELETE FROM table [WHERE clause]

Удаляет запись из таблицы. При использовании без предложения WHERE будет полностью удалена вся таблица, а затем будет создана новая пустая таблица. С использованием WHERE будут удалены записи, отвечающие условиям выражения. Предложение DELETE возвращает пользователю количество удаленных записей.

Как сказано выше, при использовании без выражения WHERE, будет удалена вся таблица. Этот эффективный метод значительно быстрее, чем удаление каждой записи по отдельности. При использовании этого метода MySQL вернет пользователю значение 0, так как нет способа узнать количество удаленных записей. В существующей реализации этот метод просто удаляет все файлы, относящиеся к таблице, кроме файла с ее определением. Поэтому этот метод удобен для обнуления таблиц с серьезно поврежденными данными (которые невозможно восстановить). Вы потеряете данные, но структура таблицы будет сохранена.

Для использования следующего выражения у вас должно быть право DELETE для БД.

Примеры

# Удалить все данные из таблицы 'olddata1 (но не саму таблицу).

DELETE FROM olddata

# Удалить все записи из таблицы 'sales', где поле 'year' равно '1995'.

DELETE FROM sales WHERE year=1995

DESCRIBE

DESC

DESCRIBE table [column] DESC table [column]

Выдает информацию о таблице или столбце. Хотя операция работает как описано, ее функциональные возможности (и многие другие) доступны в операторе SHOW. Оператор DESC поддерживается исключительно для совместимости с Oracle SQL. Имя столбца (не обязательное) может содержать знаки подстановки SQL, в этом случае будет выдана информация о всех подходящих столбцах.

Пример

# Описать таблицу 'messy'

DESCRIBE messy

# Показать информацию о всех столбцах таблицы 'big1 начинающихся с 'mу_'.

# Помните что ' ' является также знаком подстановки и следует избегать,

# его буквального употребления.

DESC big my\_%

DROP

DROP DATABASE name

DROP INDEX name

DROP TABLE [IF EXISTS] name[, name2, ...]

DROP ФУНКЦИЯ name

Удаляет базу данных, таблицу, индекс или функцию из системы MySQL. .

DROP DATABASE

Удаляет всю базу и все файлы, связанные с ней. Пользователю возвращается количество удаленных файлов. Так как большинство таблиц представлено тремя файлами, обычно возвращаемое значение равно числу таблиц, умноженному на три. Эквивалент выполнению утилиты mysqladmin drop. Для выполнения команды, так же как и при запуске утилиты mysqladmin, у вас должны быть права администратора MySQL (обычно root или mysql).

DROP INDEX

Команда поддерживается для совместимости с другими реализациями SQL. В старых версиях SQL эта команда ничего не выполняет. В версии 3.22 это предложение эквивалентно ALTER TABLE . . DROP INDEX. Для выполнения DROP INDEX вы должны иметь право SELECT, INSERT, DELETE, UPDATE, CREATE и DROP для этой таблицы.

DROP TABLE

Полностью стирает таблицу. В текущей реализации MySQL просто удаляет связанные с таблицей файлы. В версии 3.22, вы можете указать IF EXISTS , чтобы MySQL не возвращала ошибку при попытке удалить несуществующую таблицу. Для выполнения этой операции необходимо право DELETE на таблицу.

DROP FUNCTION

Удалит пользовательскую процедуру из выполняемого процесса MySQL. При этом файл библиотеки, содержащий процедуру, не удаляется. Вы всегда можете добавить эту функцию снова с помощью CREATE FUNCTION . В текущей реализации DROP FUNCTION просто удаляет пользовательскую функцию из таблицы функций БД MySQL, следящей за всеми активированными функциями.

Для выполнения этой операции необходимо право DROP на таблицу.

DROP - это, возможно, самое опасное из выражений SQL. Если вы имеете право на выполнение команд DROP, вы можете полностью стереть таблицу или даже целую базу данных. Это произойдет без предупреждения или запроса на подтверждение. Единственный способ отменить DROP - восстановление базы из резервной копии. Мораль отсюда такова: (1) всегда сохраняйте резервную копию базы (backup); (2) если в чем-то не уверены, - не используйте DROP; и (3) всегда сохраняйте резервную копию базы данных.

Примеры

# Полностью стереть с лица Земли БД 'important_data'.

DROP DATABASE important_data

# Удалить таблицы 'oh_no', 'help_me' и 'dont_do_it'

DROP TABLE oh_no, help_me, dont_do_it

#Удалить индекс с именем 'my_index' DROP INDEX my_index

# Удалить из работающего сервера БД функцию 'myfunc'. Она может быть

# добавлена обратно в любой момент с помощью CREATE FUNCTION.

DROP ФУНКЦИЯ myfunc

EXPLAIN

EXPLAIN SELECT statement

Выводит информацию о структуре и порядке выполнения запроса SELECT. Это может быть полезно для определения эффективности использования ключей.

Пример

EXPLAIN SELECT customer.name, product.name FROM customer, product,

purchases

WHERE purchases.customer=customer.id AND purchases.product=product.id

FLUSH

FLUSH option[, option...]

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

HOSTS

Обнуляет таблицу в кэше, хранящую информацию об именах клиентских хостов. Этот параметр следует использовать, если клиент поменял IP-адрес или есть ошибки, касающиеся установки связи с хостом.

LOGS

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

PRIVILEGES

Перезагружает все внутренние таблицы разрешений MySQL. Это делается для вступления в силу любых изменений, сделанных в этих таблицах.

STATUS

Обнуляет все переменные, которые следят за состоянием сервера.

TABLES

Закрывает все открытые таблицы и сбрасывает все кэшированные данные на диск.

GRANT

GRANT privilege [ (column, ...) ] [, privilege [( column, ...) ] ...]

ON {table} TO user [IDENTIFIED BY 'password']

[, user [IDENTIFIED BY 'password'] ...] [WITH GRANT OPTION]

До версии MySQL 3.22.11 оператор GRANT распознавался, но не выполнялся. В текущих версиях функциональность присутствует. Этот оператор дает пользователю (или пользователям) права доступа. Возможно предоставление прав доступа на базу данных, таблицу или на отдельный столбец. Параметр table может быть указан как имя таблицы в текущей базе; как '*', и тогда будут предоставлены права на все таблицы текущей базы; как '*. *' - права на все таблицы во всех имеющихся базах; или как 'database. *', что будет иметь эффект для всех таблиц указанной базы данных.

В настоящий момент поддерживаются следующие права:

ALL PRIVILEDGES/ALL

Все права доступа.

ALTER

Изменение структуры таблиц.

CREATE

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

DELETE

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

DROP

Удаление таблиц целиком.

FILE

Создание и удаление целых БД, а также управление файлами журналов.

INDEX

Создание и удаление индексов в таблицах.

INSERT

Ввод данных в таблицы.

PROCESS

Завершение потоков.

REFERENCES (Справочник)

Пока не реализовано.

RELOAD

Обновление различных внутренних таблиц (см. оператор FLUSH).

SELECT

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

SHUTDOWN

Выключение (Shut down) сервера базы данных.

UPDATE

Модификация записей внутри таблиц.

USAGE

Нет никаких прав.

Переменная user имеет вид user@hostname (пользователь@имя хоста). И user, и hostname могут включать в себя знаки подстановки SQL. При их использовании должно быть заключено в кавычки либо полностью имя, либо только часть с подстановочными знаками (например, joe@"%. com" и «joe@%.com» одинаково правильны). Использование user без hostname равносильно использованию user@«%».

Если у вас есть право GRANT, вы можете указать необязательный параметр INDENTIFIED BY . Если описываемого пользователя не существует, он будет создан вместе с указанным паролем. Иначе будет изменен пароль существующего пользователя.

Право GRANT задается с помощью спецификатора WITH GRANT OPTION . После его выполнения пользователь сможет предоставить любое из имеющихся у него прав другому пользователю.

INSERT

INSERT [DELAYED | LOW_PRIORITY ] [INTO] table [ (column, ...) ] VALUES ( values )

[, ( values )... ]

INSERT [LOW_PRIORITY] [INTO] table [ (column, ...) ] SELECT ...

INSERT [LOW_PRIORITY] [INTO] table SET column=value, column=value,...

Записывает данные в таблицу. Первый вариант оператора просто вставит указанные значения в указанные столбцы. Поля, значения которых не определены, получат значение по умолчанию либо NULL. Второй вариант вставляет в таблицу результат запроса SELECT. Третий вариант является альтернативной формой первого, с более явным указанием того, каким полям какое, значение придать. Если INSERT первого вида написан со спецификатором DELAYED, все входящие запросы SELECT имеют приоритет перед оператором INSERT, он будет ждать окончания их действия перед добавлением данных. Таким же образом использование спецификатора LOW_PRIORITY с любой из форм INSERT приведет к тому, что добавление записей будет отложено до окончания всех других операций клиента.

Невозможно применить выражение ORDER BY вместе с запросом SELECT, используемым внутри оператора INSERT. Также вы не можете добавлять данные в таблицы, из которых осуществляется выборка. Начиная с версии 3.22.5 MySQL позволяет вставлять более одной записи в таблицу за один раз. Это делается путем добавления дополнительного списка значений, разделенных запятыми.

У вас должно быть право INSERT для использования этого оператора.

Примеры

# Вставить запись в таблицу 'people'

INSERT INTO people ( name, rank, serial_number )

VALUES ( 'Bob Smith', 'Captain', 12345 );

# Скопировать все записи, которые старше определенной даты, из таблицы

# 'data' в таблицу 'old_data'. Обычно за этим следует удаление старых

# записей из 'data'.

INSERT INTO old_data ( id, date, field ) SELECT ( id, date, field) FROM data WHERE date < 87459300;

# Вставить З новые записи в таблицу 'people'.

INSERT INTO people (name, rank, serial_number ) VALUES ( 'Tim OVReilly', 'General', 1), ('Andy Oram', 'Major', 4342), ('Randy Yarger', 'Private', 9943);

KILL

KILL thread_id

Завершает указанный поток. ID потоков можно выяснить с помощью оператора SHOW PROCESSES . Завершение потоков, которые принадлежат не вам, а другим пользователям, требует права process .

Пример

# Завершить поток 3 KILL 3

LOAD

LOAD DATA [LOCAL] INFILE file [REPLACE|IGNORE] INTO TABLE table [delimiters] [(columns)]

Читает текстовый файл и вставляет данные в таблицу. Такой метод ввода данных гораздо быстрее, чем использование многих операторов INSERT. Хотя эта команда может быть вызвана с любого клиента, как и все остальные операторы SQL, считается, что указанный в предложении файл находится на сервере. Если путь к файлу полностью не указан, MySQL ищет его в том же каталоге, где расположена база данных. В версии MySQL3.22, при наличии спецификатора LOCAL, файл будет прочитан из локальной файловой системы клиентской машины.

Без указанных разделителей (delimiters) оператор LOAD DATA INFILE будет считать, что текстовые поля в файле разделены символом табуляции, особые символы набраны через обратную косую черту (так называемый бэкслэш - «\»), и строки заканчиваются символом конца строки.

Также можно указать собственные разделители с помощью следующих ключевых слов:

FIELDS TERMINATED BY 'с'

Определяет символ, используемый для разделения полей. Чтобы указать специальные символы, можно использовать стандартные управляющие коды языка С. Значение может содержать более одного символа. Например, FIELDS TERMINATED BY ', ' означает файл, разделенный запятыми, a FIELDS TERMINATED BY '\t' обозначает разделения табуляцией. Разделение табуляцией является значением по умолчанию.

FIELDS ENCLOSED BY 'с'

Определяет символ для объединения символьной строки. Например, FIELD ENCLOSED BY '' будет означать, что строка, содержащая "this, value", "this", "value" , будет записана в базу как три поля: "this,value", "this", и "value". По умолчанию считается, что в файле не используются кавычки.

FIELDS ESCAPED BY 'с'

Определяет символ, указывающий на то, что символ, следующий за ним, является простым, даже если обычно он считался бы управляющим. Например, FIELDS ESCAPED BY ' приведет к тому, что строка "First, Second",Third, Fourth" будет прочитана как три поля: "First", "Second,Third" и "Fourth" . Исключением являются символы нуля. Например, если FIELDS ESCAPED BY имеет значение обратной косой черты, то \0 указывает на ASCII NULL (символ с номером 0), и \N указывает на значение null в MySQL. Символ обратной косой черты является значением по умолчанию для этого параметра. Обратите внимание, что MySQL рассматривает его как спецсимвол. И если вам необходимо использовать его в этом выражении, следует отделить его еще одной обратной косой чертой: FIELDS ESCAPED BY '\\' .

LINES TERMINATED BY 'C'

Определяет символ для указания на начало новой строки. Значением могут быть несколько символов. Например, при LINES TERMINATED BY '.', файл, состоящий из а, b, с, d, e, f, g, h, k. , будет прочитан как три отдельные записи, с тремя полями в каждой. По умолчанию используется символ новой строки. Это означает, что по умолчанию MySQL считает каждую строку отдельной записью.

Ключевое слово FIELDS следует использовать только для всего выражения. Например:

LOAD DATA INFILE data.txt FIELDS TERMINATED BY ','ESCAPED BY '\\'.

По умолчанию, если прочитанное из файла значение совпадает с уже имеющимся и является при этом частью уникального ключа, будет выдана ошибка. Если в выражении есть ключевое слово REPLACE, значение из файла заменит имеющееся в таблице. Ключевое слово IGNORE приведет к игнорированию нового значения и сохранению старого.

Найденное в файле слово NULL считается указанием на пустое значение, если только оно не выделено символами, указанными в команде

FIELDS ENCLOSED BY .

Использование одного символа для разных разделителей может смутить MySQL. Например, FIELDS TERMINATED BY ',' ENCLOSED BY ', ' приведет к непредсказуемому поведению.

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

Для выполнения этого оператора вы должны обладать правами SELECT и INSERT.

Пример

# Загрузить данные из файла 'mydata.txt' в таблицу 'mydata'. Считается,

# что поля отделены табуляцией и не заключены в кавычки.

LOAD DATA INFILE 'mydata.txf INTO TABLE mydata

#Загрузить данные из 'newdata.txt'. Найти два поля выделенных запятыми и

# вставить

# их значения в поля 'field"!' и 'field2' в таблице 'newtable'.

LOAD DATA INFILE 'newdata.txt' INTO TABLE newtable FIELDS TERMINATED BY

( field"!, -field2 )

LOCK

LOCK TABLES name [AS alias] READ|WRITE [, name2 [AS alias] READ|WRITE, ...]

Блокирует таблицу для ее использования отдельным потоком. В основном эта команда используется для эмуляции транзакций, как это описано в главе 7 «Другие СУБД среднего масштаба». Если поток создал блокировку READ, все остальные потоки могут читать из таблицы, но записывать в таблицу может только один, контролирующий поток. При создании блокировки WRITE ни один из остальных потоков не может ни читать, ни изменять таблицу.

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

Пример

# Заблокировать на запись таблицы 'table1' и 'table3'. Заблокировать

# любой доступ к таблице

# 'table2'. Также для таблицы 'table3'создать псевдоним 't3' для текущего

# потока.

LOCK TABLES table1 READ, table2 WRITE, tables AS t3 READ

OPTIMIZE

OPTIMIZE TABLE name

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

Пример

OPTIMIZE TABLE mytable

REPLACE

REPLACE INTO table [(column, ...)] VALUES (value, ....)

REPLACE INTO table [(column, ...)] SELECT select_clause

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

Примеры

# Вставить запись в таблицу 'people'.

REPLACE INTO people ( name, rank, senal_number ) VALUES ( 'Bob Smith', 'Captain', 12345 )

# Скопировать все записи, которые старше определенной даты, из

# таблицы 'data' в таблицу 'old_data'. Обычно за этим следует удаление

# старых записей из 'data'

REPLACE INTO old_data ( id, date, field )

SELECT ( id, date, field) FROM data WHERE date < 87459300

REVOKE

REVOKE privilege [(column, ...)] [, privilege [(column, ...) ,..] ON table FROM user

Отзывает права у пользователя. Значения privilege, table и user те же, что в операторе GRANT. У вас должно быть право GRANT для выполнения этого оператора.

SELECT

SELECT [STRAIGHTJOIN] [DISTINCT|ALL] value[, value2...]

[INTO OUTFILE 'filename' delimiters] FROM table[, table2...] [clause]

Выбирает данные из таблицы. Оператор SELECT является основным методом чтения данных из таблиц баз данных.

Если вы укажете несколько таблиц, MySQL автоматически объединит таблицы таким образом, что вы сможете сравнить значения в них. В случае если MySQL недостаточно эффективно выполняет соединение, вы можете указать предикат (ключевое слово) STRAIGHT_JOIN и заставить сервер объединить таблицы в порядке, заданном в запросе. Если указано ключевое слово DISTINCT, будет показана только одна запись из каждой группы одинаковых записей возвращаемого набора. Ключевое слово ALL, напротив, выдаст все возвращенные записи. По умолчанию действует ALL.

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

Aliases

Любые сложные имена столбцов или функций можно упростить, создав для них псевдонимы (alias). Внутри оператора SELECT к значению можно всегда обратиться по его псевдониму с любого места. (Например, SELECT DATE_FORMAT(date, "%W, %M %d %Y") as nice_date FROM calendar .)

Column names

Имена столбцов могут быть определены как column, table.column или database, table.column . Длинные формы необходимы только для того, чтобы отличать столбцы с одинаковыми именами, но их можно использовать в любое время (например, SELECT name FROM people; SELECT mydata.people.name FROM people ).

Functions

MySQL предлагает богатый выбор встроенных функций (см. ниже). Также всегда можно с помощью команды CREATE FUNCTION добавить пользовательские функции (например, SELECT COS(angle) FROM triangle).

По умолчанию MySQL возвращает все результаты запроса пользователю, сделавшему этот запрос. Однако возможно и перенаправление результатов запроса в файл. Таким образом, можно сбросить содержимое таблицы (или выбранную из нее часть) в файл, который будет прочитан человеком либо отформатирован для легкой загрузки в другую СУБД.

Спецификатор INTO OUTFILE 'filename' delimiters выполняет перенаправление. При его наличии результат запроса SELECT будет помещен в файл, указанный в filename. Формат этого файла определяется аргументами delimiters , которые практически те же, что у оператора LOAD DATA INFILE , но со следующими дополнениями:

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

Список используемых таблиц может быть указан следующими способами:

Table1, Таblе2, Таblе3, . . .

Это самый простой метод. Таблицы соединяются так, как MySQL сочтет наиболее эффективным. Этот способ может быть также записан в виде: Table1 JOIN Table2 JOIN Таblе3..... , можно использовать ключевое слово CROSS, но оно не имеет эффекта (например, Table1 CROSS JOIN Table2 ). В объединенную таблицу войдут только те записи, которые отвечают условиям обоих столбцов. Например, запрос SELECT * FROM people, homes WHERE people. id=homes. owner создавал бы объединенную таблицу, содержащую записи из таблицы people , у которых значение поля id совпадает с полем owner в таблице homes.

Как и значениям, именам таблиц тоже можно дать псевдонимы (например, SELECT tl.name, t2. address FROM long_table_name t1, longer_table_name t2).

Tablel STRAIGHT_JOIN Table2

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

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

Table 1 LEFT [OUTER] JOIN Table2 ОN clause

Сравнивает правую таблицу с выражением. Для каждой не соответствующей ему записи при соединении с левой таблицей будет использована запись, состоящая из значений NULL. В предыдущем примере SELECT * FROM people, homes LEFT JOIN people, homes ON people. id=homes. owner объединенная таблица содержала бы все записи, совпадающие в обеих таблицах, а также все записи таблицы people, которым нет соответствия в таблице homes; для соответствующих полей таблицы homes использовались бы значения NULL. Ключевое слово OUTER необязательно и не имеет эффекта.

Tablel LEFT [OUTER] JOIN Table2 USING (column[, column2. . . ])

Объединяет указанные столбцы, только если они есть в обеих таблицах (например, SELECT * FROM old LEFT OUTER JOIN new USING (id) ).

Tablel NATURAL LEFT [OUTER] JOIN Table2

Объединяет только те столбцы, которые существуют в обеих таблицах. Тот же эффект дает использование предыдущего способа с указанием всех столбцов, имеющихся в той и другой таблице. (Например, SELECT rich_people.salary, poor_people.salary FROM rich_people NATURAL LEFT JOIN poorjeople .)

{oj Tablel LEFT OUTER JOIN Table2 ON clause }

Это аналог выражения Table 1 LEFT JOIN Table2 ON clause, и поддерживается только для совместимости с ODBC («oj»заменяет «Outer Join»).

Если выражение не задано, SELECT вернет все данные из выбранных таблиц (таблицы).

Предложение отбора может содержать любые из следующих подфраз:

WHERE statement

Команда WHERE - это самый обычный способ выборки данных в SQL. Обычно фраза является сравнением какого-либо типа, но также может содержать любые из указанных ниже функций, кроме агрегатных. Также могут быть использованы имена, такие как имена столбцов и псевдонимы, числовые константы и строки. Поддерживаются следующие операторы:

()

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

+

Сложение двух числовых значений.

-

Вычитание двух числовых значений. *

Умножение двух числовых значений.

/

Деление двух числовых значений.

%

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

Осуществляет побитовое ИЛИ (OR) двух целочисленных значений.

&

Осуществляет побитовое И (AND) двух целочисленных значений.

<<

Осуществляет побитовый левый сдвиг целочисленного значения.

>>

Осуществляет побитовый правый сдвиг целочисленного значения.

NOT или !

Выполняет логическое НЕ (возвращает 1, если значение было 0, и наоборот).

OR или ||

Выполняет логическое ИЛИ (возвращает 1, если любой из аргу-мещов не равен 0, иначе возвращает 1).

AND или &&

Выполняет логическое И (вернет 0, если хоть один из аргументов равен 0, иначе вернет 1).

=

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

<> или !=

Выбирает запись, если значения не совпадают.

<=

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

<

Выбирает запись, если левое значение меньше правого.

>=

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

>

Выбирает записи, в которых значение слева от операнда больше правого.

value BETWEEN value1 AND value2

Выбирает записи, если value находится в диапазоне между valuel и value2 или равно одному из них.

value IN (valuel,value2,... )

Выбирает записи, если value находится среди указанных значений.

value NOT IN (value1, value2,.., )

Выбирает записи, если value не находится среди указанных значений.

valuel LIKE value2

Сравнивает value1и value2 и выбирает записи, где они совпадают. Значение справа может содержать знак подстановки ' %', которому удовлетворяет любое число символов (включая 0) и знак '_', заменяющий ровно один символ. Это, возможно, самое употребительное в SQL сравнение. Чаще всего используется сравнение поля с некоторым символом и знаком подстановки (например, SELECT name FROM people WHERE name LIKE 'B%' ).

valuel NOT LIKE value2

Сравнивает valuel и value2 и выбирает записи, где они не совпадают. Команда идентична NOT (valuel LIKE value2).

valuel REGEXP/RLIKE value2

Сравнивает valuel и value2, используя расширенный синтаксис регулярных выражений, и выбирает записи, если они совпадают. Значение справа может содержать полные подстановочные выражения и конструкции Unix (например, SELECT name FROM people WHERE name RLIKE '^B. *').

valuel NOT REGEXP value2

Сравнивает valuel и value2, используя расширенный синтаксис регулярных выражений, и выбирает записи, если они не совпадают. Команда идентична NOT (valuel REXEXP value2).

Предложение WHERE вернет все полученные в выражении значения, которые отличаются от 0 или NULL (т. е. все, что не является логически ложным). Поэтому SELECT age FROM people WHERE age>10 вернет только те записи, где возраст больше 10.

GROUP BY column[, column2,...]

Группирует вместе записи по значению данных в определенных столбцах, что позволяет выполнять агрегатные функции над столбцами columns (например, SELECT name, MAX(age) FROM people GROUP BY name ).

HAVING clause

Аналог выражения WHERE, но выполняется над уже полученными из базы данными. С помощью HAVING хорошо выполняются агрегатные функции над относительно небольшими наборами данных, -уже выбранными из больших таблиц. В этом случае будет идти работа не с целой таблицей, а только с выбранными данными (например, SELECT name, MAX(age) FROM people GROUP BY name HAVING MAX(age)>80 ).

ORDER BY column [ASC |DESC][, column2 [ASC |DESC], . . . ]

Сортирует возвращаемые данные по заданному столбцу (или столбцам). Если указать DESC, данные будут отсортированы по убыванию, иначе применяется сортировка по возрастанию. Сортировку по возрастанию можно задать и явным образом, указав ASC (например,

SELECT name, age FROM people ORDER BY age DESC ).

LIMIT [ start, ] rows

Возвращает только указанное количество записей. Значение start (необязательное) определяет на количество записей, которые надо пропустить перед выборкой данных. Нумерация записей начинается с нуля. (Например, SELECT url FROM links LIMIT 5,10 возвращает адреса URL с 5 по 14.)

PROCEDURE name

В mSQL и ранних версиях MySQL команда ничего не выполняет. Она поддерживалась для облегчения импорта данных из других SQL-серверов. Начиная с версии MySQL 3.22 эта фраза позволяет указать процедуру, модифицирующую результаты запроса перед их возвратом клиенту.

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

Далее приведены все встроенные в MySQL функции:

ABS(number)

Возвращает абсолютное значение числа number (например, ABS (-10) возвращает 10).

АCOS(number)

Возвращает арккосинус числа number в радианах (например, ACOS (0) возвращает 1.570796).

ASCII(char)

Возвращает ASCII код данного символа (например, ASCII (' h') вернет 104).

ASIN(number)

Возвращает арксинус числа number в радианах (например, ASIN (0) вернет 0.000000).

ATAN(number)

Возвращает арктангенс числа number в радианах (например, ATAN (1) вернет 0.785398).

ATAN2(X, Y)

Возвращает арктангенс точки (X, Y) (например, ATAN (-3,3) возвращает-0.785398).

СHAR(num1[,num2,. . .])

Возвращает строку, полученную в результате преобразования каждого из чисел в знак, соответствующий числовому ASCII коду (например, CHAR (122) возвращает'z').

CONCAT(string 1, string2 [, strings,. . . ])

Возвращает строку, сформированную соединением всех аргументов (конкатенация) (например, CONCAT('Hi',' ','Mom','!') вернет «Hi Mom!»).

CONV( number, basel, base2 )

Возвращает значение числа number, переведенного из системы счисления basel в base2. Число должно быть целочисленным (может быть задано собственно числом либо строкой). Система счисления задается любым целым числом от 2 до 36 (например, CONV (8,10,2) возвращает 1000 (число 8 в десятичной системе, приведенное к двоичному виду)).

BIN( decimal)

Возвращает двоичное значение указанного десятичного числа decimal. Это эквивалент функции CONV (decimal, 10,2) (например, BIN(8) вернет 1000).

BIT_COUNT( number)

Возвращает число битов, установленных в 1 в двоичном представлении числа (например, BIT_COUNT (17) возвращает 2).

CEILING( number)

Возвращает наименьшее целое число, которое больше или равняется указанному числу number (например, CEILING (5.67) возвратит 6).

COS( radians )

Возвращает косинус заданного в радианах числа number (например, COS(O) вернет 1. 000000).

СОТ( radians)

Возвращает котангенс числа number, заданного в радианах (например, СОТ(1) вернет 0.642093).

CURDATE()/CURRENT_DATE()

Возвращает текущую дату. При использовании в числовом контексте возвращается число вида YYYYMMDD , иначе вернется строка вида'YYYY-MM-DD' (например, CURDATE() может вернуть «1998-08-24»).

CURTIME()/CURRENT_TIME()

Возвращает текущее время. При использовании в числовом контексте возвращается число вида HHMMSS, иначе возвращается строка вида НН: ММ: SS (например, CURRENT_TIME() может вернуть 13:02:43).

DATABASE()

Возвращает имя текущей базы данных (например, DATABASE() может вернуть «mydata»).

DATE_ADD(date, INTERVAL amount type )/ADDOATE(date, INTERVAL amount type )

Возвращает дату, сформированную добавлением заданного количества времени к указанной дате. Добавляемое время может быть представлено одним из следующих типов: SECOND, MINUTE, HOUR, DAY, MONTH, YEAR, MINUTE_SECOND (как «минутьпсекунды»), HOUR_MINUTE (как «часы:минуты»), DAY_HOUR (как «дни часы»), YEAR_MONTH (как «годы-месяцы»), HOUR_SECOND (как «часы:минуты:секунды»), DAY_MINUTE (как «дни часы:минуты») и DAY_SECOND (как «дни часы:минуты:секунды»). За исключением указанных выше типов, amount должно быть целым значением. (Например, DATE_ADD("1998-08-24 13:00:00", INTERVAL 2 MONTH) вернет «1998-10-24 13:00:00».)

DATE_FORMAT( date, format )

Возвращает дату в указанном формате. Строка формата печатается в том виде, в каком задана, с выполнением следующих подстановок:


Сокращенное название дня недели (Sun, Mon и т. д.).

%b

Сокращенное название месяца (Jan, Feb и т. д.).

%D

День месяца с порядковым индексом (1-й, 2-й, 3-й и т. д.).

%d

День месяца.


24-часовый час (всегда две цифры, например 01).

%h/%I

12-часовый час (всегда две цифры, например 09).

%i

Минуты.

%j

День года.

%k

24-часовый час (одна или две цифры, например 1).

%1

12-часовый час (одна или две цифры, например 9).


День месяца.

%m

Номер месяца (1 - это январь).


AM или РМ.

%r

12-часовое полное время (включая АМ/РМ).

%S

Секунды (всегда две цифры, например 04).

%s

Секунды (одна или две цифры, например 4).


24-часовое полное время.

%U

Неделя года (новая неделя начинается с воскресенья).

%W

Название дня недели.

%w

Номер дня недели (0 - это воскресенье).

%Y

Четырехзначный год.


Год, две цифры.

%%

Символ « % ».

DATE_SUB( date, INTERVAL amount type )/SUBDATE( date, INTERVAL amount type )

Возвращает дату, сформированную вычитанием указанного количества времени из указанной даты. Используются те же самые типы, что и в команде DATE_ADD (например, SUBDATE(" 1999-05-20 11:04:23", INTERVAL 2 DAY) возвращает «1999-05-18 11:04:23»).

DAYNAME( date,)

Возвращает название дня недели для указанной даты (например,

DAYNAME(' 1998-08-22')

возвращает «Saturday»).

DAYOFMONTH( date)

Возвращает значение дня месяца для указанной даты (например, DAYOFMONTHC1998-08-22') возвращает 22).

DAYOFWEEK( ctete)/WEEKDAY( date)

Возвращает номер дня недели (1 - это воскресенье) для указанной даты (например, DAY_ OF_WEEK('1998-08-22') возвращает 7).

DAYOFYEAR( date)

Возвращает день года для указанной даты (например, DAYOFYEAR ('1983-02-15') возвращает 46).

DEGREES( radians )

Возвращает данный аргумент, конвертированный из радианов в градусы (например, DEGREES(2 *PI()) возвращает 360.000000).

ELT(number, string1, string2, . . . )

Возвращает string?, если number равно 1, string2, если number равно 2, и т. д. Если число number не соответствует ни одной строке, возвращается NULL (например, ELT(3, "once", "twice", "thrice", "fourth") возвращает «thrice»).

ENCRYPT( string[, salt])

Шифрует, ставит пароль на данную строку. Если указана база для шифрования salt, она используется при генерации пароля (например, ENCRYPT('mypass', 'За') может вернуть «3afi4004idgv»).

ЕХР(power)

Возвращает число е, возведенное в указанную степень (например, ЕХР(1) возвращает 2.718282).

FIELD( string, string1, string2, . . . )

Возвращает позицию аргумента (начиная со stringl) в списке аргументов, который совпадает со string. Вернет 0, если совпадений нет (например, FIELD( 'abe', 'деогде', 'John', 'abe', 'bill') возвращает 3).

FINO_IN_SET( string, set)

Возвращает позицию string в наборе set. Аргумент set — это набор строк, разделенных запятыми (например, FIND_IN_SET ('abe', 'деогде, John, abe, bill') возвращает 3).

FLOOR( number)

Возвращает наибольшее целое число, которое меньше или равно number (например, FLOOR (5.67) возвращает 5).

FORMAT( number, decimals )

Аккуратно форматирует заданное число, используя заданную длину дробной части (например, FORMAT(4432.99134,2) возвращает «4,432.99»).

FROM_DAYS( days)

Возвращает дату, заданную числом дней (где день 1 - это первое января первого года) (например, FROM_DAYS(728749) вернет «1995-04-02»).

FROM_UNIXTIME( seconds [, format])

Возвращает дату (GMT), соответствующую указанному числу секунд, прошедших с начала отсчета (1-е января 1970 г. GMT). Если определен формат (с использованием тех же параметров, что и в команде DATE_FORMAT ), возвращаемое время форматируется соответствующим образом (например, FROM_UNIXTIME(903981584) возвращает «1998-08-24 18:00:02»)-

GET_LOCK( name, seconds )

Создает определяемую пользователем блокировку, которая ждет заданное количество секунд до таймаута. Ее можно использовать в клиентском приложении для выполнения блокирования в программах, которые используют одинаковые имена блокировок. Если блокировка прошла успешно, возвращается 1. Если время ожидания истекло, вернется 0. При остальных ошибках вернется значение NULL. Возможна только одна активная блокировка для одной сессии. Повторный запуск GET_LOCK() удалит любую предыдущую блокировку без предупреждения (например, GET_ LOCK("mylock", 10) может вернуть 1 в течение 10 секунд).

GREATEST (num 1, num2[, numЗ, . . . ])

Возвращает наибольший из всех имеющихся аргументов (например, GREATEST(5, 6, 68,1,4) возвращает 68).

НЕХ(decimal )

Возвращает шестнадцатеричное значение указанного десятичного числа. Эквивалент функции CONV(decimal, 10,16) (например, НЕХ(90) возвращает «За»).

HOUR(time)

Возвращает час из указанной даты (например, HOUR('15:33:30') возвращает 15).

IF(test, value1, value2 )

Если test истинно, возвращает valuel, иначе возвращает value2. Значение test должно быть целочисленным, поэтому числа с плавающей запятой следует использовать после преобразования их к типу integer (например, IF(1>0, "true", "false") возвращает true).

IFNULL( value, value2 )

Возвращает value, если оно не равно null, иначе возвращает value2 (например, IFNULL(NULL, "bar") возвращает «bar»).

INSERT( string, position, length, new )

Возвращает строку, созданную путем замены некоторых символов из строки string на символы new. Будет заменено количество символов, указанное в length, начиная с позиции position (например, INSERT( 'help', 3,1, ' can jum') возвращает «he can jump»).

INSTR( string, substring )

Идентично функции LOCATE, за исключением того, что .аргументы идут в обратном порядке (например, INSTR( 'makebelieve', 'lie') возвращает 7).

ISNULL( expression )

Возвращает 1, если выражение в expression равно NULL, иначе возвращает 0 (например, ISNULL(3) вернет 0).

INTERVAL( А, В, С, D, . . . )

Возвращает 0, если А - это наименьшее значение, 1 - если А находится между В и С, 2- если А находится между С и D, и т. д. Все значения, кроме А, должны идти по порядку (например, INTERVAL (5,2,4,6,8) возвращает 2 (так как 5 находился во втором интервале между 4 и 6).

LAST_INSERT_ID()

Возвращает последнее значение поля AUTO_INCREMENT , которое было создано автоматически (например, LAST_INSERT_ID() может вернуть 4).

LCASE( string )/LOWER( string)

Возвращает строку string, где все символы переведены в нижний регистр (например, LCASE(' ВоВ') возвращает «bob»).

LEAST(num1, num2[, num3, . . . ])

Возвращает наименьший из всех имеющихся аргументов (например, LEAST(5,6,68,1,4) возвращает 1).

LEFT( string, length )

Возвращает количество символов length из строки string, начиная с начала строки (например, LEFTC 12345", 3) возвращает «123»).

LENGTH (string)/OCTET_LENGTH( string )/CHAR_LENGTH( string)/ CHARACTER_LENGTH( string)

Возвращает длину строки string (например, CHAR_LENGTH( 'Hi Mom! ' ) возвращает 7). В многобайтных наборах символов один символ может занимать более одного байта (например, в Unicode и некоторых азиатских наборах символов). В этих случаях строковые функции MySQL должны правильно считать число символов, а не байтов. Однако в версиях до 3.23 эта функция не работала и возвращала число байт.

LOCATE( substring, string [, number ])/POSITION( substring, string )

Возвращает позицию подстроки substring в строке string. Возвращает 0, если substring не найдена. Если в LOCATE задан третий числовой аргумент, поиск подстроки начнется только с позиции, указанной этим аргументом (например, LOCATE(' SQL', ' MySQL') вернет 3).

LOG(number)

Возвращает натуральный логарифм числа number (например, LOG(2) возвращает 0.693147).

LOG10(number)

Возвращает обычный (десятичный) логарифм числа (например, LOG10(1000) возвращает 3.000000).

LPAD( string, length, padding )

Возвращает заданную строку string с дополнением padding к началу строки. Дополнение будет повторяться, пока новая строка не достигнет длины, указанной в length, (например, LPAD(' -Merry X-Mas',18, 'Но') возвращает «НоНоНо Merry X-Mas»).

LTRIM( string)

Возвращает строку string с удалением всех начальных пробелов (например, LTRIM(' Oops') возвращает «Oops»).

MID( string, position, length )/SUBSTRING( string, position, length )/

SUBSTRING( string FROM position FOR length )

Возвращает подстроку из количества символов, указанного в length, взятых из строки string, начиная с позиции position (например, SUBSTRING(' 12345', 2,3) возвращает «234»).

MINUTE( time)

Возвращает количество минут указанного времени (например, MI-NUTE('15:33:30') возвращает 33).

МOD(num1, пит2)

Возвращает модуль числа пит1, деленного на число пит2. Функция аналогична оператору % (например, MOD(11,3) возвращает 2).

MONTH (date)

Возвращает номер месяца (1 в случае января) для указанной даты (например, MONTH(' 1998-08-22') возвращает 8).

MONTHNAME( date)

Возвращает название месяца для указанной даты (например, MONTHNAME('1998-08- 22') возвращает «August»).

NOW()/SYSDATE()/CURRENT_TIMESTAMP()

Возвращает текущую дату и время. В числовом контексте возвращается число вида YYYYMMDDHHMMSS , в ином случае вернется строка вида 'YYYY-MM-DD HH:MM:SS' (например, SYSDATE() может вернуть «1998-08-24 12:55:32»).

OCT( decimal)

Возвращает восьмеричное значение заданного десятичного числа. Функция эквивалентна функции CONV(deciinal, 10,8) (например, ОСТ(8) возвращает 10).

PASSWORD( string)

Возвращает зашифрованную версию заданной строки. (Например, PASSWD( 'mypass') может вернуть «3afi4004idgv».)

PERIOD_ADD( date, months )

Возвращает дату, сформированную путем добавления указанного числа месяцев к заданной дате (которая должна быть в формате YYMM или YYYYMM) (например, PERIOD_ADD(9808,14) возвращает 199910).

PERIOD_DIFF( date1, date2 )

Возвращает количество месяцев между указанными датами (которые должны быть указаны в формате YYMM или YYYYMM) (например, PERIOD_DIFF(199901,8901) вернет 120).

PI()

Возвращает число к: 3.141593.

POW(num1, num2)/POWER( num1, num2]

Возвращает значение числа пит 1, возведенного в степень пит2- (например, POWER(3,2) возвращает 9.000000).

QUARTER( date)

Возвращает номер квартала указанной даты (1 - это январь-март) (например, QUARTER(' 1998-08-22') возвращает 3).

RADIANS( degrees)

Возвращает значение заданного аргумента, переведенное из градусов в радианы (например, RADIANS(-90) возвращает -1.570796).

RAND ([seed])

Возвращает случайную десятичную дробь от 0 до 1. Если задан аргумент, он используется как источник (seed) для генератора случайных чисел (например, RAND(3) может вернуть 0.435434).

RELEASE_LOCK( name)

Удаляет блокировку, созданную функцией GET_LOCK . Вернет 1, если снятие блокировки было успешным; 0, если блокировку не удалось снять, поскольку она не принадлежит текущему потоку; и NULL, если блокировки нет (например, RELEASE_LOCK("mylock") ).

REPEAT( string, number )

Возвращает строку, полученную путем повторения заданной строки некоторое число раз (указано в number). Вернет пустую строку, если number меньше или равно нулю (например, REPEAT( 'ma', 4) возвращает 'mamamama').

REPLACE( string, old, new )

Возвращает строку, в которой все вхождения подстроки old заменяются на подстроку new (например, REPLACE('black jack','ack1,'oke') возвращает «bloke joke»).

REVERSE( string)

Возвращает символы строки string в обратном порядке (например, REVERSE('my bologna') возвращает «angolobym»).

RIGHT( string, length )/SUBSTRING( string FROM length)

Возвращает количество символов из string, указанное в length, начиная с конца строки (например, SUBSTRING( «12345» FROM 3) возвращает «345»).

ROUND( number [.decimal ])

Округляет дробную часть числа number до указанного количества цифр. Если аргумент decimal не указан, число округляется до целого (например, ROUND(5.67,1) возвращает 5.7).

RPAD( string, length, padding )

Возвращает строку string с дополнением padding к концу строки. Дополнение будет повторяться, пока новая строка не достигнет длины, указанной в length (например, RPAD( 'Yo', 5, '! ') возвращает «Yo!!!»).

RTRIM( string)

Возвращает строку string с удалением всех концевых пробелов (например, RTRIM( 'Oops ') вернет «Oops»).

SECOND( time)

Возвращает секунды из указанного времени (например, SE-COND('15:33:30') возвращает 30).

SEC_TO_TIME( seconds )

Возвращает число часов, минут и секунд в заданном количестве секунд. При использовании в числовом контексте возвращает число в формате HHMMSS, иначе вернет строку вида HH:MM:SS (например, SEC_TO_TIME(3666) возвращает «01:01:06»).

SING( number)

Возвращает -1, если число number отрицательное, 0, если это ноль, и 1, если оно положительное (например, SIGN(4) возвращает 1).

SIN( radians)

Возвращает синус числа, заданного в радианах (например, SIN(2*РI()) возвращает0. 000000).

SOUNDEX(stdng)

Возвращает код Soundex, связанный со строкой (например, SOUNDEX(' Jello') возвращает «J400»).

SPACE(number)

Возвращает строку из пробелов, число которых указанно в number (например, SPACE( 5) возвращает<>).

SQRT(number)

Возвращает квадратный корень числа number (например, SQRT(16) возвращает 4.000000).

STRCMP( string1, string2 )

Возвращает 0, если строки совпадают, -1 если бы string1 при сортировке оказалась раньше строки string2; или 1, если string! была бы при сортировке после string2 (например, STRCMP( 'bob', 'bobbie') возвращает —1).

SUBSTRING_INDEX( string, character, number )

Считает количество указанных символов character в строке string до тех пор, пока не досчитает до заданного числа number. Если это число было отрицательным, вернется все, что слева от символа, на котором остановился счетчик, а если число положительное, то функция вернет все, что находится справа от него. (Например, SUBSTRINGJENDEXC 1,2, 3,4,5', ',',-3) возвращает «1,2,3».)

SUBSTRING( string,position )

Возвращает строку string, начиная с символа указанного в position (например, SUBSTRING(«123456», 3) возвращает «3456»).

TAN(radians )

Возвращает тангенс числа, заданного в радианах (например, TAN(0) возвращает 0.000000).

TIME_FORMAT( time, format)

Форматирует заданное время в указанный формат. Формат тот же, что и в команде DATE FORMAT , описанной выше.

TIME_TO_SEC( time)

Возвращает количество секунд в аргументе time (например, ТIМЕ_ТО_ 8ЕС(' 01:01:06') возвращает 3666).

TO_DAYS(date)

Возвращает количество дней, прошедшее до указанной даты (день 1 - это 1-е января 1-го года). Дата может быть значением типа DATE, DATETIME, TIMESTAMP или числом в формате YYMMDD либо YYYYMMDD (например, TO_DAYS( 19950402) возвращает 728749).

TRIM([BOTH|LEADING|TRAILING] [ remove ] [FROM] string)

Возвращает строку string с удаленными концевыми и начальными пробелами. Вы можете указать, какие пробелы хотите удалить (концевые, начальные или и те и другие). Также вместо пробела можно указать другой символ (например, TRIM( both ' ' from ' --look here—') возвращает «look here»).

TRUNCATE( number, decimals )

Возвращает number с дробной частью, усеченной до указанного количества цифр. (Например, TRUNCATE(3.33333333,2) возвращает 3.33.)

UCASE( string)/UPPER( string)

Возвращает string, где все символы переведены в верхний регистр (например, UPPER ('Scooby') возвращает «SCOOBY»).

UNIX_TIMESTAMP([ date])

Возвращает число секунд, прошедшее с начала отсчета (1 января 1970 г. GMT) до заданной даты (GMT). Если дата не указана, возвращает число секунд, прошедшее до текущей даты (например, UNIX_TI-MESTAMPC1998-08-24 18:00:02') возвращает 903981584).

USER()/SYSTEM_USER()/SESSION_USER()

Возвращает имя текущего пользователя (например, SYSTEM_USER() может вернуть «ryarger»).

VERSION()

Возвращает версию самого сервера MySQL (например, VERSION() может вернуть «3.22. 5c-alpha»).

WEEK(date)

Возвращает порядковый номер недели года из указанной даты (например, WEEK( '1998-12-29') возвращает 52).

YEAR (date)

Возвращает год из указанной даты (например, YEAR('1998-12-29') возвращает 1998).

Далее идут агрегатные функции, выполняемые над набором данных. Обычно этот метод используется для выполнения некоторого действия над всем набором возвращаемых данных. Например, функция SELECT

AVG(height) FROM kids возвращала бы среднее от значений поля ' height' в таблице kids.

AVG( expression )

Возвращает среднее значение из значений в expression (например, SELECT AVG(score) FROM tests ).

BIT_AND( expression )

Возвращает результат побитового И, агрегирующего все значения в expression (например, SELECT BIT_AND(flags) FROM options ).

BIT_OR( expression )

Возвращает побитовое ИЛИ, агрегирующее все значения значения в expression (например, SELECT BIT_ OR(flags) FROM options ).

COUNT( expression )

Возвращает количество раз, когда значение expression было не нулевым. COUNT(*) вернет число записей с какими-либо данными во всей таблице (например, SELECT COUNT( *) FROM folders ).

MAX( expression )

Возвращает наибольшее из значений в expression (например, SELECT MAX (elevation) FROM mountains ).

MIN( expression )

Возвращает наименьшее из значений в expression (например, SELECT MIN(level) FROM toxic_waste ).

STD( expression )/STDDEV( expression )

Возвращает среднеквадратичное отклонение значения в expression (например, SELECT STDDEV(points) FROM data ).

SUM(expression )

Возвращает сумму значений в expression (например, SELECT SUM(calories) FROM daily_diet ).

Примеры

# Найти все имена (пате)в таблице 'people', у которых поле 'state'

# равно 'Ml'.

SELECT name FROM people WHERE state-'MI'

# Показать все данные из таблицы 'mytable'. SELECT * FROM mytaPle

SET

SET OPTION SQL_OPTION=va.Zue

Устанавливает настройки для текущей сессии. Определенные этим оператором параметры действуют только для текущего соединения и исчезают при его закрытии. В настоящее время поддерживаются следующие настройки:

CHARACTER SET charselname или DEFAULT

Изменяет набор символов, используемый MySQL. Сейчас поддерживается только один альтернативный набор символов cp1251_koi8, который относится к русскому языку. Указав DEFAULT, вы вернете обычную таблицу символов.

LAST_INSERT_ID= number

Устанавливает значение, возвращаемое функцией LAST_INSERT_ID() .

SQL_BIG_SELECTS=0 или 1

Определяет реакцию системы при обнаружении длинного запроса SELECT. Если установить 1, MySQL прервет запрос, выдав ошибку с предупреждением о том, что запрос, возможно, потребует слишком много времени на обработку. MySQL решает, что запрос является слишком длинным, если придется обрабатывать больше записей, чем указано в системной переменной max_join_size . По умолчанию значение равно 0, что разрешает любые запросы.

SQL_BIG_TABLES=0 или 1

Определяет работу с временными таблицами (создаваемыми обычно при обработке больших наборов данных). Если это значение равно 1, временные таблицы хранятся на диске, что будет медленнее работы с оперативной памятью, но может предотвратить ошибки в системах с небольшим объемом памяти. Значение по умолчанию -О, все временные таблицы хранятся RAM.

SQL_LOG_OFF=0 или 1

При установке параметра в 1 выключается стандартная журнализа-ция-текущей сессии. Журнализация ISAM и журнал обновлений базы не выключаются. У вас должны быть права PROCESS LIST для использования этой установки. По умолчанию значение равно 0, что разрешает обычную журнализацию. В главе 4 «MySQL», описаны разные схемы журнализации MySQL.

SQL_SELECT_LIMIT= number

Максимальное количество записей, возвращаемое запросом SELECT. Спецификатор LIMIT отменяет это значение. По умолчанию возвращаются все записи.

SQL_UPDATE_LOG=0 или 1

Выключает журнализацию обновления базы данных для текущей сессии при значении, равном 0. Не влияет на стандартную журнализацию или на журнализацию ISAM. У вас должны быть права

PROCESS LIST для использования этой установки. По умолчанию значение равно 1, что разрешает обычную журнализацию.

TIMESTAMP= value или DEFAULT

Устанавливает время, использованное для сессии. Это время записывается в журнал обновлений и применяется при восстановлении данных из журнала. Установка DEFAULT вернет системное время.

Пример

# Выключить журнализацию текущей сессии.

SET OPTION SQL_LOG_OFF=1

SHOW

SHOW DATABASES [LIKE clause]

SHOW KEYS FROM table [FROM database]

SHOW INDEX FROM table [FROM database]

SHOW TABLES [FROM database] [LIKE clause]

SHOW COLUMNS FROM table [FROM database] [LIKE clause]

SHOW FIELDS FROM table [FROM database] [LIKE clause]

SHOW STATUS

SHOW TABLE STATUS [FROM database] [LIKE clause]

SHOW VARIABLES [LIKE clause]

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

Примеры

# Показать все доступные БД. SHOW DATABASES

# Показать информацию об индексах таблицы 'bigdata'

SHOW KEYS FROM bigdata

# Показать информацию об индексах в таблице 'bigdata' в БД 'mydata'

SHOW INDEX FROM bigdata FROM mydata

# Показать все доступные таблицы из БД 'mydata', начинающиеся с

# буквы 'z'

SHOW TABLES FROM mydata LIKE 'z%'

If Выдать информацию обо всех столбцах таблицы 'skates'

SHOW COLUMNS FROM stakes

# Выдать информацию обо всех столбцах таблицы 'people', с именами

# кончающимися на '_name'

SHOW FIELDS FROM people LIKE '%\_name'

# Показать информацию о состоянии сервера SHOW STATUS

# Показать системные переменные SHOW VARIABLES

UNLOCK

UNLOCK TABLES

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

Пример

# Unlock all tables UNLOCK TABLES

UPDATE

UPDATE table SET column=value, . . . [WHERE clause]

Изменяет данные в таблице. Выражение используется для изменения имеющихся данных без модификации структуры самой таблицы. Можно использовать имя столбца как источник значения value при установке нового значения. Например, UPDATE health SET miles_ran=miles_ran+5 добавит 5 к текущему значению поля miles_ran. Возвращает число измененных записей.

Для выполнения выражения необходимы права UPDATE .

Пример

# Изменить имя 'John Deo' на 'John Doe' во всей таблице 'people'.

UPDATE people SET name='John Doe' WHERE name='John Deo'

USE

USE database

Выбирает БД по умолчанию. Указанная в выражении БД будет использоваться по умолчанию во всех последующих запросах. Другие БД могут быть явно указаны с помощью полной системы обозначения database.table.column .

Пример

# Сделать db1 БД по умолчанию USE db1

mSQLSQL

CREATE

CREATE TABLE name field_name field_type, [field2 type2, ...]

CREATE SEQUENCE ON table [STEP value] [VALUE value]

CREATE INDEX name ON table ( column, ...)

Создает новые элементы базы данных (или полностью новые базы). Предложение используется для создания БД, таблиц, индексов и счетчиков.

CREATE SEQUENCE создает счетчик на таблицу. Счетчик - это простое значение, связанное с таблицей, за которым следит сервер mSQL. Наиболее часто счетчик используют для создания уникальных идентификаторов в таблицах. При прочтении значение счетчика каждый раз инкрементируется. Спецификатор STEP указывает на какое значение каждый раз инкрементируется счетчик. Спецификатор VALUE задает начальное значение счетчика.

Оператор CREATE INDEX определяет индекс для таблицы. Система mSQL поддерживает индексы, содержащие более одного поля. Вы должны дать индексу имя, необязательно осмысленное, поскольку конечным пользователям редко необходим доступ к индексам.

CREATE TABLE определяет структуру таблицы в базе данных. Этим оператором создаются все таблицы mSQL. Предложение состоит из имени таблицы, за которым идет любое количество определений полей. Синтаксис определения полей включает в себя имя поля, затем его тип, за которым следует любой модификатор (например: name char(30) not null). mSQL поддерживает следующие типы данных:

CHAR (length)

Текстовое значение фиксированной длины. Никакое значение не может быть больше заданной длины.

DATE

Стандартный тип даты.

INT

Стандартное четырехбайтовое целое в диапазоне от -2147483646 до 2147483647.

MONEY

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

REAL

Стандартное восьмибайтовое число с плавающей запятой. Минимальные ненулевые значения +/-4.94Е-324 и максимальные значения +/- 1.79Е+308.

ТЕХТ( length)

Текстовое значение переменной длины. Заданная длина - это максимальное значение для большинства данных, однако могут быть введены и более длинные данные.

TIME

Стандартный тип времени.

UINT

Стандартное четырехбайтовое беззнаковое целое. Диапазон от 0 до 4294967295.

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

length

Это является максимальной длиной символьного типа. Для типа CHAR это абсолютный максимум, для типа TEXT это приблизительный максимум, применяющийся только к большинству данных. Более длинные данные могут быть введены в поле TEXT, однако это замедлит операции с таблицей.

NOT NULL

Указывает, что поле не может содержать нулевое значение. Попытка ввести в это поле такое значение вызовет ошибку.

Примеры

# Создать 'простую таблицу

CREATE TABLE emp_data ( id INT, name CHAR(50) )

# Добавить счетчик к таблице 'checks' с начальным значением '1000' и # шагом инкрементации по умолчанию (1)

CREATE SEQUENCE ON checks VALUE 1000

# Создать индекс для таблицы 'music', включающий в себя

# поля 'artist','publisher' и 'title'.

CREATE INDEX idxl O.N music ( artist, publisher, title )

DELETE

DELETE FROM table [WHERE clause]

Удаляет запись из таблицы. Если применяется без предложения WHERE, будет полностью удалена вся таблица, а затем создана новая пустая

таблица. С использованием WHERE будут удалены записи, отвечающие условиям выражения.

Примеры

# Стереть все данные из таблицы 'olddata'(no не саму таблицу). DELETE FROM olddata

# Стереть все записи в таблице 'sales', в которых поле 'year' равно '1995', DELETE FROM sales WHERE year=1995

DROP

DROP INDEX name DROP TABLE name DROP SEQUENCE FROM table

Полностью удаляет таблицу, индекс или счетчик из системы mSQL.

DROP - это, возможно, самое опасное из выражений SQL. Если вы имеете право на выполнение команд DROP, вы можете полностью стереть таблицу или даже целую базу данных. Это произойдет без предупреждения или запроса на подтверждение. Единственный способ отменить DROP - восстановление базы данных из резервной копии. Поэтому следует запомнить два правиле: (1) всегда сохраняйте резервную копию вашей базы (backup); (2) не используйте DROP до тех пор, пока вы полностью не уверены в том, что это необходимо.

Примеры

# Удалить таблицу 'oh_no'. DROP TABLE oh_no

# Удалить индекс с именем 'my_index' DROP INDEX my_index

# Стереть счетчик для таблицы 'counter'. Другой счетчик может быть

# создан в любое время с помощью команды 'CREATE SEQUENCE'.

DROP SEQUENCE FROM counter

INSERT

INSERT INTO table [ (column, ...) ] VALUES ( values )

Записывает данные в таблицу. Этот оператор вставит указанные значения в заданные столбцы. Поля, значения которых не указаны, получат значение NULL. Если вы не зададите список столбцов, число указанных значений должно точно совпадать с числом столбцов в таблице.

Примеры

# Добавить запись в таблицу'people'.

INSERT INTO people ( name, rank, serial_number )

VALUES ( 'Bob Smith', 'Captain', 12345 )

SELECT

SELECT [DISTINCT] columns FROM table [clause]

Выбирает данные из таблицы. Оператор SELECT является основным методом чтения данных из таблиц баз данных.

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

Если указано ключевое слово DISTINCT, будет показана только одна запись из каждой группы одинаковых записей возвращаемого набора.

Имена столбцов могут быть указаны как column или как table, column . Длинная форма необходима только для того, чтобы отличать столбцы с одинаковыми именами, но ее можно использовать в любое время (например, SELECT name FROM people; SELECT people, name FROM people ).

Список таблиц для соединения указывается как Table1, Table2, Tab-1еЗ, .... Таблицы будут соединены таким образом, как mSQL сочтет наиболее эффективным. Именам таблиц могут быть присвоены псевдонимы (например, SELECT t1.name, t2.address FROM Iong_table_name=t1, Ionger_table_name=t2 ). Если не указано выражение clause, SELECT вернет все данные из выбранной таблицы (или таблиц).

Выражение отбора записей может содержать следующие операторы:

WHERE

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

AND

Выполняет логическое И (вернет 0, если хоть один из аргументов равен 0, иначе вернет 1).

OR

Выполняет логическое ИЛИ (возвращает 1, если любой из аргументов не равен 0, иначе возвращает 0).

()

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

=

Возвращает 1, если два значения совпадают, иначе вернет 0. mSQL автоматически преобразует типы при сравнении значений.

<>

Возвращает 1, если два значения не совпадают, иначе возвращает 0.

<=

Возвращает 1, если левое значение меньше или равно правому, иначе возвращает 0.

<

Возвращает 1, если левое значение меньше, чем значение справа, иначе возвращает 0.

>=

Возвращает 1, если левое значение больше или равно правому, иначе возвращает 0.

>

Возвращает 1, если левое значение больше правого, иначе возвращает 0.

ORDER BY column [DESC][, column2 [DESC],...]

Сортирует возвращаемые данные по заданному столбцу (или столбцам). Если указать DESC, данные будут отсортированы в порядке убывания, иначе будет использована сортировка по возрастанию (например, SELECT name, age FROM people ORDER BY age DESC ).

value1 LIKE value2

Сравнивает valuel и value2 и возвращает 1, если они совпадают. Значение справа может содержать знак подстановки « % », который заменяет любое количество символов (в том числе и отсутствие символа), и знак '_', замещающий в точности один символ. Это, возможно, наиболее употребительное в SQL сравнение. Чаще всего используется сравнение поля с некоторой строкой, содержащей знак подстановки (например, SELECT name FROM people WHERE name LIKE 'B%' ).

value1 RLIKE value2

Сравнивает valuel и value2, используя расширенный синтаксис регулярных выражений, и возвращает 1, если они совпадают. Значение справа может содержать полные подстановочные выражения и конструкции Unix (например, SELECT name FROM people WHERE name RLIKE '^В. *').

value1 CLIKE value2

Сравнивает value1 с value2, используя нечувствительную к регистру версию оператора LIKE (например, SELECT name FROM people WHERE name CLIKE 'b%' ).

Предложение WHERE возвращает все записи, для которых значение заданного выражения не равно 0 или NULL. Таким образом, SELECT age FROM people WHERE age>10 вернет только те записи, где 'ages' больше 10.

Примеры

# Найти все имена (пате)в таблице 'people', у которых поле 'state' равно 'МI'. SELECT name FROM people WHERE state='MI' # Показать все данные из таблицы 'mytable'. SELECT * FROM mytable

UPDATE

UPDATE table SET column=value, . . . [WHERE clause]

Изменяет данные в таблице. Используется для обновления существующих данных, не изменяя саму таблицу.

Пример

# Изменить имя 'John Deo' на 'John Doe' во всей таблице 'people'. UPDATE people SET name='John Doe' WHERE name='John Deo'