1 1 1 1 1 1 1 1 1 1 Рейтинг 0.00 (0 Голоса(ов)

Шпаргалка по MySQL

Типы данных в MySQL

Целые типы
TINYINT [(length)] [UNSIGNED] [ZEROFILL]

Один байт - 28

Диапазон числа со знаком от –128 до 127. 

Диапазон числа без знака (unsigned) от 0 до 255.

SMALLINT [(length)] [UNSIGNED] [ZEROFILL]

Два байта - 216

Диапазон числа со знаком от –32768 до 32767.

Диапазон числа без знака (unsigned) от 0 до 65535.

MEDIUMINT [(length)] [UNSIGNED] [ZEROFILL]

Три байта - 224

Диапазон числа со знаком от –8388608 до 8388607.

Диапазон числа без знака (unsigned) от 0 до 16777215.

INT [(length)] [UNSIGNED] [ZEROFILL] или INTEGER [(length)] [UNSIGNED] [ZEROFILL]

Четыре байта - 232

Диапазон числа со знаком от –2147483648 до 2147483647.

Диапазон числа без знака (unsigned) от 0 до 4294967295.

BIGINT [(length)] [UNSIGNED] [ZEROFILL]

Восемь байт - 264

Диапазон числа со знаком от –9223372036854775808 до 9223372036854775807.

Диапазон числа без знака (unsigned) от 0 до 18446744073709551615.

Типы с плавающей запятой
FLOAT [(length,decimals)] [UNSIGNED] [ZEROFILL]

Всегда знаковое.

Диапазоны от –3.402823466*10+38 до –1.175494351*10-38 или 1.175494351*10-38 до 3.402823466*10+38

Если количество знаков после запятой не установлено, либо меньше или равно 24, то занимает в памяти четыре байта.

DOUBLE [(length,decimals)] [UNSIGNED] [ZEROFILL],
DOUBLE PRECISION,
REAL [(length,decimals)] [UNSIGNED] [ZEROFILL]

Всегда знаковое.

Диапазоны от -1.7976931348623157*10+308 до -2.2250738585072014*10-308 или 2.2250738585072014*10-308 до 1.7976931348623157*10+308.

Если количество знаков после запятой не установлено или лежит в диапазоне от 25 до 53, то занимает в памяти восемь байт.

DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL],
NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]

Распакованное число с плавающей запятой.

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

Символ десятичной запятой и символ отрицательного числа "-" не учитывается в длине.

Если десятичное значение равно 0, значение не будет иметь десятичной запятой или дробной части.

Занимает в памяти length+2 байт, если decimal>0,length+1 байт, если decimal=0 (decimal+2, если length

Типы даты и времени
DATE

Дата в диапазоне от «1000-01-01» до «9999-12-31».

MySQL хранит поле типа DATE в виде «YYYY-MM-DD» (ГГГГ-ММ-ДД).

Занимает в памяти три байта.

DATETIME

Дата и время. Допустимые диапазоны от «1000-01-01 00:00:00» до «9999-12-31 23:59:59».

MySQL хранит поле типа DATETIME в виде «YYYY-MM-DD HH:MM:SS» (ГГГГ-ММ-ДД ЧЧ-ММ-СС).

Занимает в памяти восемь байт.

TIMESTAMP

Диапазон от «1970-01-01 00:00:00» до, примерно, 2037 года.

MySQL может хранить поле типа TIMESTAMP в видах «YYYYMMDDHHMMSS» (TIMESTAMP(14)), «YYMMDDHHMMSS» (TIMESTAMP(12)), «YYYYMMDD» (TIMESTAMP(8)) и др.

Занимает в памяти четыре байта.

TIME

Диапазон от «-838:59:59» до «838:59:59».

MySQL хранит поле TIME в виде «HH:MM:SS», но позволяет присваивать значения столбцам TIME с использованием строки или числа.

Занимает в памяти три байта.

YEAR

Год в двух, или четырехциферном представлении.

Если Вы используете 4 цифры, то допустимые значения лежат в диапазоне 1901-2155, также допустимым является 0000. Если Вы используете 2 цифры, то допустимыми являются значения 1970-2069 (70-69).

MySQL хранит значения поля YEAR в формате «YYYY».

Занимает в памяти один байт.

Строковые типы
CHAR(length) [BINARY]

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

Диапазон длины от 1 до 255 символов. Завершающие пробелы удаляются при извлечении значения. Значения CHAR сортируются и сравниваются без учета регистра в зависимости от кодировки по умолчанию, если не установлен флаг BINARY.

Занимает в памяти length байт.

VARCHAR(length) [BINARY]

Строка переменной длины. Примечание: конечные пробелы удаляются при сохранении (в отличие от спецификации ANSI SQL).

Диапазон длины от 1 до 255 символов. Значения VARCHAR сортируются и сравниваются без учета регистра, если не установлен флаг BINARY.

Занимает в памяти L+1 байт, где L - число символов в строке.

TINYBLOB, 
TINYTEXT

BLOB (бинарный набор) или ТЕХТ с максимальной длиной 255 (28 - 1) символов.

Занимает в памяти L+1 байт, где L - число символов в строке.

BLOB, 
TEXT

BLOB (бинарный набор) или ТЕХТ с максимальной длиной 65535 (216 - 1) символов.

Занимает в памяти L+2 байт, где L - число символов в строке.

MEDIUMBLOB, 
MEDIUMTEXT

BLOB (бинарный набор) или ТЕХТ с максимальной длиной 16777215 (224 - 1) символов.

Занимает в памяти L+3 байт, где L - число символов в строке.

LONGBLOB, 
LONGTEXT

BLOB (бинарный набор) или ТЕХТ с максимальной длиной 4294967295 (232 - 1) символов.

Занимает в памяти L+4 байт, где L - число символов в строке.

Перечисляемые типы
ENUM Перечисление

Строка-объект, который может принимать только одно значение, выбирается из списка значений «значение 1», «значение 2» или NULL. ENUM может собержать до 65535 различных значений.

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

SET Набор

Строка-объект, который может принимать ноль и более значений, каждое из которых должно быть выбрано из списка значений «значение 1», «значение 2», … Поле SET может содержать до 64 вариантов значений.

Занимает в памяти 1,2,3,4 либо 8 байт, в зависимости от числа перечисляемых значений.

 

Типы таблиц

В версии MySQL 5.5 поддерживается 9 типов таблиц. Тип ISAM исчез еще в четвертых версиях.

  • InnoDB - движок с поддержкой транзакций, откатов и защитой от потери данных. В данном типе таблиц используются блокировки на уровне записи и не блокирующее чтение, что позволило улучшить производительность при многопользовательском режиме работы. InnoDB сохраняет пользовательские данные в кластерных индексах, что позволяет компенсировать в/в для простых запросов основанных на первичных ключах.
  • MyISAM - движок таблиц MySQL используемый в основном в Web-приложениях, хранилищах данных и других программных средах. Данный тип таблиц поддерживается всеми инсталляциями MySQL. Поддерживает полнотекстовый поиск и сжатие данных, однако является неустойчивым к сбоям.
  • Memory (он же HEAP) - хранит данные в оперативной памяти для очень быстрого доступа. 
  • Merge - используется для логического объединения одинаковых MyISAM таблиц и обращение к ним, как к единому объекту. Хорошо подойдет для очень больших хранилищ данных.
  • Archive - идеальное решение для хранения больших объёмов информации, к которой не требуется частый доступ.
  • Federated - предоставляет возможность объединять различные MySQL сервера для создания одной логической базы данных из нескольких физических машин. Идеально подойдет для архитектур, которые поддерживают распределенное хранение данных.
  • CSV - хранит пользовательские данные в текстовых файлах разделяя значения запятыми. Используется если необходим простой обмен с приложениями, которые умеют экспортировать/импортировать данные из CSV формата (например Microsoft Excel, OpenOffice, LibreOffice).
  • Blackhole - принимает, но не возвращает никаких данных (Потому она и "черная дыра"). Результатами любых запросов из таких хранилищ будут пустые выборки.
  • Example - тестовый движок, не выполняет никаких функций, будет полезен только разработчикам, которые собираются писать свой движок, в качестве примера.
Сравнительная таблица основных типов таблиц
ФункцияMyISAMMemoryInnoDBArchive
Максимальный объём хранимых данных 256TB RAM 64TB Нет
Транзакции Нет Нет Да Нет
Блокировки Таблица Таблица Запись Запись
MVCC Нет Нет Да Нет
B-деревья Да Да Да Нет
Хэш индексы Нет Да Нет Нет
Индексы полнотекстового поиска Да Нет Нет Нет
Кластерные индексы Нет Нет Да Нет
Кэширование данных Нет Н/д Да Нет
Кэширование индексов Да Н/д Да Нет
Сжатие данных Да Нет Да Да
Шифрование данных Да Да Да Да
Поддержка кластерных БД Нет Нет Нет Нет
Репликация Да Да Да Да
Внешние ключи Нет Нет Да Нет
Бэкап Да Да Да Да
Кэширование запросов Да Да Да Да

ANALYZE TABLE

Код MySQL:
ANALYZE TABLE tTable1[,tTable2...]

Анализирует и сохраняет распределение ключей для таблицы. Во время проведения анализа таблица заблокирована для чтения. Эта функция работает для таблиц MyISAM и BDB.

Данная команда является эквивалентом выполнения myisamchk -a для таблицы.

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

Эта команда выдает таблицу со следующими столбцами:

Столбец Значение
Table Имя таблицы
Op Всегда analyze
Msg_type Одно из значений statuserrorinfo или warning.
Msg_text Сообщение.

Просмотреть сохраненное распределение ключей можно при помощи команды SHOW INDEX

Если таблица не изменялась с момента предыдущего запуска команды ANALYZE TABLE, повторный анализ таблицы проводиться не будет.

OPTIMIZE TABLE 

Код MySQL:
OPTIMIZE TABLE tbl_name[,tbl_name]...

Команда OPTIMIZE TABLE должна использоваться после удаления большей части таблицы или если в таблице было внесено много изменений в строки переменной длины (таблицы, в которых есть столбцы VARCHARBLOB или TEXT). Удаленные записи поддерживаются при помощи связного списка, и последующие операции INSERT повторно используют позиции старых записей. Чтобы перераспределить неиспользуемое пространство и дефрагментировать файл данных, можно воспользоваться командой OPTIMIZE TABLE.

На данный момент команда OPTIMIZE TABLE работает только с таблицами MyISAM и BDB. Для таблиц BDB команда OPTIMIZE TABLE выполняет ANALYZE TABLE.

Можно применить OPTIMIZE TABLE к таблицам других типов, запустив mysqld с параметром --skip-new или --safe-mode, но в этом случае OPTIMIZE TABLE только выполнит ALTER TABLE.

Команда OPTIMIZE TABLE работает следующим образом:

      • Если в таблице есть удаленные или разделенные строки, восстанавливает таблицу.
      • Если индексные страницы не отсортированы - сортирует их.
      • Если статистические данные не обновлены (и восстановление нельзя осуществить путем сортировки индексов), обновляет их.

Команда OPTIMIZE TABLE для MyISAM представляет собой эквивалент выполнения myisamchk --quick --check-only-changed --sort-index --analyze над таблицей.

Обратите внимание: на время работы OPTIMIZE TABLE таблица блокируется!

SHOW

Команда просмотра списка баз данных:

Код MySQL:
SHOW DATABASES;

Команда просмотра списка таблиц в активной базе данных:

Код MySQL:
SHOW TABLES;

FLUSH

Код MySQL:
FLUSH flush_option [,flush_option] ...

Команда FLUSH применяется для очистки части кэша, используемого MySQL. Для запуска FLUSH необходимо обладать привилегиями RELOAD.

Параметр flush_option может иметь следующее значение:

Параметр Описание
HOSTS Производится очистка таблиц кэша удаленных компьютеров. Сброс таблиц удаленного компьютера следует производить, если один из удаленных компьютеров изменил IP-адрес или если было получено сообщение об ошибке Host ... is blocked. Если во время соединения с сервером MySQL происходит больше ошибок подряд, чем указано в max_connect_errors для определенного удаленного компьютера, то MySQL предполагает, что что-то не в порядке, и блокирует последующие попытки установления соединения со стороны этого удаленного компьютера. Сброс таблиц удаленного компьютера позволяет снова попытаться установить соединение.
DES_KEY_FILE Производится перезагрузка ключей DES из файла, указанного параметром --des-key-file, при запуске сервера.
LOGS Закрываются и повторно открывается все файлы журналов. Если файл журнала обновлений или файл бинарного журнала был указан без расширения, номер расширения файла журнала будет увеличен на единицу относительно предыдущего файла. Если в имени файла было указано расширение, MySQL закроет и повторно откроет файл журнала обновлений. Эти действия аналогичны отправке сигнала SIGHUP на сервер mysqld.
PRIVILEGES Производится перезагрузка привилегий из таблиц привилегий в базе данных mysql.
QUERY CACHE Производится дефрагментация кэша запросов, чтобы эффективнее использовать его память. Эта команда не удаляет запросы из кэша, как команда RESET QUERY CACHE.
TABLES Закрываются все открытые таблицы и принудительно закрываются все используемые таблицы. Также сбрасывается кэш запросов.
[TABLE | TABLES] tbl_name [,tbl_name...] Производится сброс только указанных таблиц.
TABLES WITH READ LOCK Закрываются все открытые таблицы и блокируется доступ для чтения всех таблиц для всех баз данных, пока не будет запущена команда UNLOCK TABLES. Это очень удобный способ создавать резервные копии, если у вас файловая система наподобие Veritas, которая может обеспечить моментальные снимки данных в режиме реального времени.
STATUS Большинство переменных состояния сбрасываются в нуль. Эту команду необходимо использовать при отладке запроса.
USER_RESOURCES Все ресурсы пользователя сбрасываются в нулевое значение. Это позволяет заблокированному пользователю подсоединиться еще раз.

Ко всем приведенным выше командам можно получить доступ при помощи утилиты mysqladmin, используя команды flush-hostsflush-logsreload или flush-tables.

RESET

Код MySQL:
RESET reset_option [,reset_option] ...

Команда RESET используется для очистки. Кроме того, она также действует как усиленный вариант команды FLUSH.

Чтобы запустить команду RESET, необходимо обладать привилегиями RELOAD.

Параметр Описание
MASTER Удаляет все бинарные журналы, перечисленные в индексном файле, обнуляет значения индексного файла binlog. В версиях до 3.23.26 - FLUSH MASTER (Master)
SLAVE Сбрасывает положение репликации подчиненного компьютера в журналах головного компьютера. В версиях до 3.23.26 эта команда называлась FLUSH SLAVE (Slave)
QUERY CACHE Удаляет все результаты запросов из кэша запросов.

KILL

Код MySQL:
KILL thread_id

Каждое соединение с mysqld запускается в отдельном потоке. При помощи команды SHOW PROCESSLIST можно просмотреть список запущенных потоков, а при помощи команды KILL thread_id - удалить поток.

Если у вас есть привилегия PROCESS, можно просмотреть все потоки. Обладая привилегией SUPER, можно удалять любые потоки. В противном случае можно просматривать и удалять только свои собственные потоки.

Для просмотра и удаления потоков можно также применять команды mysqladmin processlist и mysqladmin kill.

При использовании команды KILL для потока устанавливается специальный флаг kill flag.

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

      • В циклах SELECTORDER BY и GROUP BY флаг проверяется только после считывания блока строк. Если установлен флаг удаления, то выполнение оператора будет отменено.
      • При выполнении команды ALTER TABLE флаг удаления проверяется перед считыванием каждого блока строк из исходной таблицы. Если флаг установлен, то выполнение команды отменяется и временная таблица удаляется. При выполнении команд UPDATE TABLE и DELETE TABLE флаг удаления проверяется после каждого считывания блока, а также после каждого обновления или удаления строки. Если флаг удаления установлен, то выполнение оператора отменяется. Обратите внимание: если не используются транзакции, то отменить изменения будет невозможно!
      • GET_LOCK() будет отменен при помощи NULL.
      • Поток INSERT DELAYED сбросит все строки, которые он содержит в памяти и будет удален.
      • Если поток находится в заблокированной таблице (состояние: Locked), то блокировка таблицы будет быстро отменена.
      • Если поток ожидает освобождения дискового пространства в запросе write, запись будет отменена с выдачей сообщения о переполнении диска.

CREATE

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

Код MySQL:
CREATE DATABASE [IF NOT EXISTS] dbName

Создать таблицу в активной БД:

Код MySQL:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tTable ( column1 datatype [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition], column2 datatype [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition], ... # Первичный ключ [PRIMARY KEY (index_col_name,...)] # Ключ [KEY [index_name] (index_col_name,...)] # Индекс [INDEX [index_name] (index_col_name,...)] # Уникальность значения [UNIQUE [INDEX] [index_name] (index_col_name,...)] # Полнотекстовый поиск [FULLTEXT [INDEX] [index_name] (index_col_name,...)] # Введен из соображений совместимости [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)[reference_definition] # Введено из соображений совместимоти [CHECK (условие проверки)] );

По умолчанию используется параметр NULL.

index_col_name:

  • col_name [(length)]

reference_definition:

  • REFERENCES tbl_name [(index_col_name,...)]
  • [MATCH FULL | MATCH PARTIAL]
  • [ON DELETE reference_option]
  • [ON UPDATE reference_option]

reference_option:

  • RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options:

  • TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }
  • или AUTO_INCREMENT = #
  • или AVG_ROW_LENGTH = #
  • или CHECKSUM = {0 | 1}
  • или COMMENT = "string"
  • или MAX_ROWS = #
  • или MIN_ROWS = #
  • или PACK_KEYS = {0 | 1 | DEFAULT}
  • или PASSWORD = "string"
  • или DELAY_KEY_WRITE = {0 | 1}
  • или ROW_FORMAT= { default | dynamic | fixed | compressed }
  • или RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=#
  • или UNION = (table_name,[table_name...])
  • или INSERT_METHOD= {NO | FIRST | LAST }
  • или DATA DIRECTORY="абсолютный путь к каталогу"
  • или INDEX DIRECTORY="абсолютный путь к каталогу"

select_statement:

  • [IGNORE | REPLACE] SELECT ... (любое корректное выражение SELECT)

Создать таблицу из другой таблицы:

Код MySQL:
CREATE TABLE tTable AS SELECT clColumn1, clColumn2,... FROM tExistingTableName WHERE ....;

Создать индекс:

Код MySQL:
CREATE [UNIQUE|FULLTEXT] INDEX indIndex ON tTable (colColumn[(length)],... )

Создать триггер (для MySQL версии 5.0.2 и старше, до версии 5.1.6 требуются права суперюзера):

Код MySQL:
CREATE TRIGGER tgTrigger trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt

На этои месте остановимся поподробнее. В MySQL можно описать хранимую процедуру, которая будет вызываться до (trigger_time=BEFORE), либо после (trigger_time=AFTER) наступления некоего события (INSERT, UPDATE или DELETE). Не стоит понимать названия событий буквально. Эти события наступают при вызове следующий операторов:

      • INSERT - INSERT, DATA LOAD, REPLACE
      • UPDATE - UPDATE
      • DELETE - DELETE, REPLACE. Удаление и очистка таблицы НЕ инициируют вызова данного триггера.
Код MySQL:
CREATE TRIGGER `tgTrigger` AFTER INSERT ON `tTable` FOR EACH ROW BEGIN INSERT INTO kuda SET novoepole = NEW.id; END;

При создании данного триггера после любой вставки в таблицу table_name произойдет копирование ее поля id в таблицу kuda (значение присвоится полю novoepole).

Создать хранимую процедуру:

Хранимые процедуры появились в MySQL версии 5. Это действительно довольно сложная и обширная тема, достойная целой статьи, но я постараюсь ее вкратце изложить (раз уж взялся за шпаргалку).

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

Используем набор символов '~~' (Вы можете использовать тот набор, который удобен Вам):

Код MySQL:
DELIMITER ~~

 И, собственно, опишем простую процедуру:

Код MySQL:
DELIMITER ~~   CREATE PROCEDURE `prMyFirstProcedure` () LANGUAGE SQL DETERMINISTIC SQL SECURITY DEFINER COMMENT 'My first procedure' BEGIN SELECT 'Hello World !'; END~~

 Теперь рассмотрим,, что за параметры у нас используются при создании.

LANGUAGE - всегда SQL.

DETERMINISTIC - указывает, что процедура всегда возвращает одинаковый результат. По умолчанию - NOT DETERMINISTIC.

SQL SECURITY - права пользователя. INVOKER - пользователь, вызывающий процедуру. DEFINER (по умолчанию) - создатель.

COMMENT - думаю, понятно, что это просто комментарий.

Вызов хранимой процедуры выглядит так:

Код MySQL:
CALL prMyProcedure

 в том случае, если у процедуры нет входных параметров, либо

Код MySQL:
CALL prMyProcedure(prmParam1,prmParam2,...)

 если процедура имеет входные параметры.

Собственно, возникает вопрос, а как передавать параметры, и какие они бывают.

Параметры бывают следующих видов:

      • IN (по умолчанию, можно не указывать) - входной параметр
      • OUT - выходной параметр
      • INOUT - параметр, являющийся и входным, и выходным (изменяющимся в процедуре).
Код MySQL:
CREATE PROCEDURE `prInProcedure` (IN vhod INT) BEGIN SELECT vhod+1 AS result; END ~~   CREATE PROCEDURE `prOutProcedure` (OUT vyhod INT) BEGIN SET vyhod = 10; END ~~   CREATE PROCEDURE `prInoutProcedure` (INOUT vhodvyhod INT) BEGIN SET vhodvyhod = vhodvyhod+1; END ~~

Внутри блока BEGIN...END могут быть объявлены переменные:

Код MySQL:
DECLARE varName type DEFAULT default;

Переменные могут использоваться внутри процедуры посредством операторов SET и SELECT:

Код MySQL:
CREATE PROCEDURE `prMyProcedure` (IN ormParam INT) BEGIN DECLARE i, j INT DEFAULT 5; DECLARE data TIMESTAMP DEFAULT CURRENT_DATE; INSERT INTO tTable VALUES (i); SET j = 1; SELECT data FROM dbName WHERE i=10; END ~~

Условный оператор в хранимых процедурах:

Код MySQL:
CREATE PROCEDURE `prMyProcedureIf` (IN prmParam INT) BEGIN DECLARE variable INT; SET variable = prmParam*2; IF variable>4 THEN SELECT variable; END IF; END ~~

Циклы в хранимых процедурах:

Код MySQL:
CREATE PROCEDURE `prMyProcedureWhile` (IN prmParam INT) BEGIN DECLARE variable, var_sel INT; SET variable = prmParam; WHILE variable>0 DO SET variable = variable-1; END WHILE; SELECT variable; END ~~   CREATE PROCEDURE `prMyProcedureRepeat` (IN prmParam INT) BEGIN DECLARE variable, INT; SET variable = prmParam; REPEAT SET variable=variable-1; UNTIL variable<=0 END REPEAT; END ~~   CREATE PROCEDURE `prMyProcedureLoop` (IN prmParam INT) BEGIN DECLARE variable, INT; SET variable = prmParam; looplabel: LOOP IF variable<=0 THEN LEAVE looplabel; SET variable=variable-1; ITERATE loop_label; END LOOP; END ~~

Оператор выбора в хранимых процедурах можно записать двумя способами:

Код MySQL:
CREATE PROCEDURE `prMyProcedureCase1` (IN prmParam INT) BEGIN DECLARE variable, var1 INT; SET variable = prmParam; SET var1=prmParam; CASE variable WHEN 0 THEN SET var1=var1+1; WHEN 1 THEN SET var1=var1+2; ELSE SET var1=var1+100; END CASE; END ~~   CREATE PROCEDURE `prMyProcedureCase2` (IN prmParam INT) BEGIN DECLARE variable, var1 INT; SET variable = prmParam; SET var1=prmParam; CASE WHEN variable=0 THEN SET var1=var1+1; WHEN variable=1 THEN SET var1=var1+2; ELSE SET var1=var1+100; END CASE; END ~~

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

Объявляем курсор:

Код MySQL:
DECLARE curName CURSOR FOR SELECT ...;

Сообщаем, что делать, когда записи закончились:

Код MySQL:
DECLARE CONTINUE handler FOR NOT FOUND

Открываем курсор:

Код MySQL:
OPEN curName;

Указываем переменную(-ые), равную текущему значению столбца:

Код MySQL:
FETCH curName INTO var1 [,var2];

В конце уничтожаем (закрываем) курсор:

Код MySQL:
CLOSE curName;

И пример использования:

Код MySQL:
CREATE PROCEDURE `prMyProcedureCursor` (OUT prmParam INT) BEGIN DECLARE a, b, c INT; DECLARE curCurs CURSOR FOR SELECT clColumn1 FROM tTable; DECLARE CONTINUE handler FOR NOT FOUND SET b=1; OPEN curCurs; SET b=0; SET c=0; WHILE b=0 DO FETCH curCurs INTO a; IF b=0 THEN SET c=c+a; END IF; END WHILE; CLOSE curCurs; SET par = c; END ~~

SET

Код MySQL:
SET [GLOBAL | SESSION] sql_variable=expression, [[GLOBAL | SESSION] sql_variable=expression...]

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

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

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

В MySQL 4.0.3 мы также добавили режимы GLOBAL и SESSION и реализовали доступ к наиболее важным переменным запуска.

LOCAL может использоваться как синоним для SESSION.

Если вы устанавливаете несколько переменных в одной команде, то будет использоваться последний указанный в списке режим GLOBAL | SESSION .

Код MySQL:
SET sort_buffer_size=10000; SET @@local.sort_buffer_size=10000; SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000; SET @@sort_buffer_size=1000000; SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;

Синтаксис @@variable_name поддерживается в целях совместимости.

Если вы используете режим SESSION (по умолчанию), то значения переменных, которые вы устанавливаете, остаются в в действии до тех пор, пока текущая сессия не будет завершена, или до тех пор, пока вы не установите переменные в другое значение. Если вы используете GLOBAL, который требует привилегии SUPER, это значение запоминается и используется для всех новых соединений до тех пор, пока сервер не будет перезагружен. Если вы хотите сделать какое-либо значение константой, то вам следует указать его в одном из файлов конфигураций MySQL.

Чтобы избежать неправильного использования, MySQL будет сообщать об ошибке, если вы будете выполнять SET GLOBAL на переменной, которую только можно изменять в SET SESSION или если вы не выбираете режим GLOBAL для глобальной переменной.

Если вы хотите установить сессионную (SESSION) переменную в значение глобальной (GLOBAL) или просто в значение по умолчанию - вы можете установить это значение в DEFAULT.

Код MySQL:
SET max_join_size=DEFAULT;

Это аналогично:

Код MySQL:
SET @@session.max_join_size=@@global.max_join_size;

Если вам необходимо ограничить максимальное значение, которое может принимать стартовая переменная с помощью SET, вы можете указать это с помощью использования опции командной строки --maximum-variable-name.

Список большинства переменных можно получить с помощью SHOW VARIABLES.  Вы можете получить конкретное значение с помощью синтаксиса @@[global.|local.]variable_name:

Код MySQL:
SHOW VARIABLES like "max_join_size"; SHOW GLOBAL VARIABLES like "max_join_size"; SELECT @@max_join_size, @@global.max_join_size;

Далее следует описание переменных, использующих нестандартный синтаксис SET и некоторых других. Описание других переменных можно найти в секции, описывающих системные переменные, вместе с описанием стартовых опций или в описании команды SHOW VARIABLES

  • CHARACTER SET character_set_name | DEFAULT

    Преобразует все строки, передающиеся от клиента, и строки передающиеся клиенту, в соответствии с заданным набором символов. В настоящее время единственной опцией для character_set_name является cp1251_koi8, но можно легко добавить новые наборы символов, отредактировав файл sql/convert.cc в дистрибутиве исходного кода MySQL. Чтобы восстановить установку по умолчанию, следует установить значение character_set_name в DEFAULT.

    Следует учитывать, что синтаксис установки опции CHARACTER SET отличается от синтаксиса установки других опций.

  • PASSWORD = PASSWORD('новый пароль') 

    Устанавливает пароль для текущего пользователя. Любой не анонимный пользователь может изменить свой собственный пароль!

  • PASSWORD FOR user = PASSWORD('новый пароль')

    Устанавливает пароль для особого пользователя для текущего серверного хоста. Это может сделать только пользователь, имеющий доступ к базе данных mysql. Данный пользователь должен быть представлен в формате user@hostname, где user и hostname в точности соответствуют записям этих позиций в столбцах User и Host в таблице mysql.user. Например, если записи в полях User и Host соответственно были sergey и %.loc.ru, то необходимо писать:

    Код MySQL:
    mysql> SET PASSWORD FOR sergey@"%.loc.ru" = PASSWORD("newpass");

    или

    Код MySQL:
    mysql> UPDATE mysql.user SET password=PASSWORD("newpass") -> WHERE user="sergey" AND host="%.loc.ru";
  • SQL_AUTO_IS_NULL = 0 | 1

    Если установить в 1 (значение по умолчанию), то можно найти последнюю внесенную строку для таблицы со столбцом AUTO_INCREMENT с помощью следующей конструкции: WHERE auto_increment_column IS NULL. Эта возможность используется некоторыми ODBC-программами, такими как Access.

  • AUTOCOMMIT = 0 | 1

    Если установить в 1, то все изменения в таблицу будут вноситься немедленно. Чтобы открыть многокомандную транзакцию, необходимо использовать команду BEGIN. Если установить данную опцию в 0, то необходимо использовать COMMIT / ROLLBACK для того, чтобы принять/отменить эту транзакцию. Следует учитывать, что при переходе из режима работы без AUTOCOMMIT в режим AUTOCOMMIT MySQL автоматически выполнит COMMIT для любой открытой транзакции.

  • BIG_TABLES = 0 | 1

    Если установить в 1, то предпочтительным местом хранения всех временных таблиц будет диск, а не оперативная память. Это вызовет некоторое замедление работы, зато для больших операций SELECT, требующих обширных временных таблиц, не будет выдаваться ошибка The table tbl_name is full. Для нового соединения значение этой величины по умолчанию равно 0 (т.е. использовать для временных таблиц оперативную память). Эта переменная раньше называлась SQL_BIG_TABLES.

  • SQL_BIG_SELECTS = 0 | 1

    При установке в 0 MySQL будет прерывать выполнение запроса, если поступившая команда SELECT может потребовать слишком много времени для выполнения. Такая возможность полезна при нерационально написанном выражении WHERE. Запрос классифицируется как слишком большой, если оператору SELECT пришлось бы обрабатывать больше строк, чем задано в max_join_size. Для нового соединения значение по умолчанию равно 1 (т.е. разрешаются любые команды SELECT).

  • SQL_BUFFER_RESULT = 0 | 1

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

  • LOW_PRIORITY_UPDATES = 0 | 1

    При установке в 1 все команды INSERTUPDATEDELETE и LOCK TABLE WRITE будут ожидать, пока не будет ни одной ожидающей решения команды SELECT или LOCK TABLE READ на обрабатываемой таблице. Эта переменная раньше называлась SQL_LOW_PRIORITY_UPDATES.

  • MAX_JOIN_SIZE = значение | DEFAULT

    Запрещает команды SELECT, которым, возможно, придется обрабатывать более, чем указанное значение комбинаций строк. Установив эту величину, можно определить команды SELECT, в которых ключи используются неправильно и которые, возможно, потребуют длительного времени для исполнения. При установке этой опции в величину, отличную от DEFAULT, сбрасывается флаг SQL_BIG_SELECTS. Если вновь установить флаг SQL_BIG_SELECTS, то переменная SQL_MAX_JOIN_SIZE будет игнорироваться. Значение по умолчанию для этой переменной можно установить, запустив mysqld с -O max_join_size=#. Эта переменная раньше называлась SQL_MAX_JOIN_SIZE.

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

  • QUERY_CACHE_TYPE = OFF | ON | DEMAND , QUERY_CACHE_TYPE = 0 | 1 | 2

    Определяет установку кэша запросов для данного потока.

    Опция Описание
    0 or OFF Не кэшировать или не извлекать результаты
    1 or ON Кэшировать все результаты за исключением запросов SELECT SQL_NO_CACHE ...
    2 or DEMAND Кэшировать только запросы SELECT SQL_CACHE ...
  • SQL_SAFE_UPDATES = 0 | 1

    Если установить в 1, то MySQL будет прерывать выполнение поступивших команд UPDATE или DELETE, в которых не используется ключ или LIMIT в выражении WHERE. Это позволяет обнаружить ошибочные обновления при ручном создании команд SQL.

  • SQL_SELECT_LIMIT = value | DEFAULT

    Максимальное количество записей, возвращаемых командой SELECT. Если SELECT содержит выражение LIMIT, то LIMIT превосходит по старшинству величину в SQL_SELECT_LIMIT. Для нового соединения значение по умолчанию равно "unlimited". Если предел был изменен, то его можно вернуть в значение по умолчанию указанием величины DEFAULT в выражении SQL_SELECT_LIMIT.

  • SQL_LOG_OFF = 0 | 1

    При установке в 1 для данного клиента в стандартный журнал не будут заноситься никакие записи, если клиент имеет привилегии SUPER. Это не относится к журналу обновлений!

  • SQL_LOG_UPDATE = 0 | 1

    При установке в 0 для данного клиента в журнал обновлений не будут заноситься никакие записи, если клиент имеет привилегии SUPER. Это не относится к стандартному журналу!

  • SQL_QUOTE_SHOW_CREATE = 0 | 1

    При установке этой опции в 1 SHOW CREATE TABLE будет заключать в кавычки имена таблиц и столбцов. Имеет значение Включено по умолчанию, чтобы работала репликация таблиц с изощренными именами столбцов.

  • TIMESTAMP = timestamp_value | DEFAULT

    Устанавливает время для данного клиента. Применяется для получения первоначальной временной метки при использовании журнала обновлений для восстановления строк. Переменная timestamp_value должна представлять системное время Unix, а не временную метку MySQL.

  • LAST_INSERT_ID = #

    Устанавливает величину, возвращаемую функцией LAST_INSERT_ID(). Хранится в журнале обновлений при использовании функции LAST_INSERT_ID() в команде, обновляющей таблицу.

  • INSERT_ID = #

    Устанавливает величину, которую следует использовать в следующей команде INSERT или ALTER TABLE при внесении величины AUTO_INCREMENT. В основном используется с журналом обновлений.

Начиная с версии 4.1 в СУБД MySQL внедрена новая система кодировок и сопоставлений. При использовании кодировки Windows-1251, перед выполнением SQL-инструкций необходимо настроить кодировку соединения при помощи операторов:

Код MySQL:
SET character_set_client='cp1251'; SET character_set_results='cp1251'; SET character_set_connection='cp1251';

Эти три оператора эквивалентны вызову одного оператора:

Код MySQL:
SET NAMES 'cp1251'

Переменная character_set_client устанавливает кодировку данных, отправляемых от клиента, переменная character_set_results устанавливает кодировку данных, отправляемых клиенту, переменная character_set_connection устанавливает кодировку, в которую преобразуется информация, пришедшая от клиента, перед выполнением запроса на сервере.

При использовании Юникода UTF-8 этот оператор выглядит следующим образом:

Код MySQL:
SET NAMES 'utf8mb4'

USE

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

Код MySQL:
USE dbName;

ALTER

Изменение структуры. По сути, используется только для таблиц:

Код MySQL:
ALTER [IGNORE] TABLE tTable alter_spec [, alter_spec ...]

alter_specification:

  • ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
  • или ADD [COLUMN] (create_definition, create_definition,...)
  • или ADD INDEX [index_name] (index_col_name,...)
  • или ADD PRIMARY KEY (index_col_name,...)
  • или ADD UNIQUE [index_name] (index_col_name,...)
  • или ADD FULLTEXT [index_name] (index_col_name,...)
  • или ADD [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...)
  • [reference_definition]
  • или ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  • или CHANGE [COLUMN] old_col_name create_definition
  • [FIRST | AFTER column_name]
  • или MODIFY [COLUMN] create_definition [FIRST | AFTER column_name]
  • или DROP [COLUMN] col_name
  • или DROP PRIMARY KEY
  • или DROP INDEX index_name
  • или DISABLE KEYS
  • или ENABLE KEYS
  • или RENAME [TO] new_tbl_name
  • или ORDER BY col
  • или table_options

 

DROP

Удаление БД вместе с хранимыми в ней таблицами:

Код MySQL:
DROP DATABASE [IF EXISTS] dbName

Удаление таблицы:

Код MySQL:
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...] [RESTRICT | CASCADE]

Параметры RESTRICT и CASCADE добавлены для совместимости и ничего не делают.

Удаление индекса:

Код MySQL:
DROP INDEX indIndex ON tTable

Удаление хранимой процедуры: 

Код MySQL:
DROP PROCEDURE [IF EXISTS] prMyProcedure;

RENAME

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

Код MySQL:
RENAME TABLE tTable TO tNewTable[, tTable2 TO tNewTable2,...]

На время выполнения операции всем другим потокам блокируется доступ к таблицам.

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

SELECT

Оператор SELECT имеет следующую структуру:

Код MySQL:
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY] [DISTINCT | DISTINCTROW | ALL] select_expression,... [INTO {OUTFILE | DUMPFILE} 'file_name' export_options] [FROM table_references [WHERE where_definition] [GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...] [HAVING where_definition] [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC], ...] [LIMIT [offset,] rows] [PROCEDURE procedure_name] [FOR UPDATE | LOCK IN SHARE MODE]]

SELECT применяется для извлечения строк, выбранных из одной или нескольких таблиц. Выражение select_expression задает столбцы, в которых необходимо проводить выборку. Кроме того, оператор SELECT можно использовать для извлечения строк, вычисленных без ссылки на какую-либо таблицу. Например:

Код MySQL:
mysql> SELECT 1 + 1; -> 2

При указании ключевых слов следует точно соблюдать порядок, указанный выше. Например, выражение HAVING должно располагаться после всех выражений GROUP BY и перед всеми выражениями ORDER BY.

      • Используя ключевое слово AS, выражению в SELECT можно присвоить псевдоним. Псевдоним используется в качестве имени столбца в данном выражении и может применяться в ORDER BY или HAVING. Например:
        Код MySQL:
        mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name FROM mytable ORDER BY full_name;
      • Псевдонимы столбцов нельзя использовать в выражении WHERE, поскольку находящиеся в столбцах величины на момент выполнения WHERE могут быть еще не определены.
      • Выражение FROM table_references задает таблицы, из которых надлежит извлекать строки. Если указано имя более чем одной таблицы, следует выполнить объединение.  Для каждой заданной таблицы по желанию можно указать псевдоним.
        Код MySQL:
        table_name [[AS] alias] [USE INDEX (key_list)] [IGNORE INDEX (key_list)]
        В версии MySQL 3.23.12 можно указывать, какие именно индексы (ключи) MySQL должен применять для извлечения информации из таблицы. Это полезно, если оператор EXPLAIN (выводящий информацию о структуре и порядке выполнения запроса SELECT), показывает, что MySQL использует ошибочный индекс. Если нужно. чтобы для поиска записи в таблице применялся только один из указанных индексов, следует задать значение этого индекса в USE INDEX (key_list). Альтернативное выражение IGNORE INDEX (key_list) запрещает использование в MySQL данного конкретного индекса. Выражения USE/IGNORE KEY являются синонимами для USE/IGNORE INDEX.
      • Ссылки на столбцы могут задаваться в виде col_nametbl_name.col_name или db_name.tbl_name.col_name. В выражениях tbl_name или db_name.tbl_name нет необходимости указывать префикс для ссылок на столбцы в команде SELECT, если эти ссылки нельзя истолковать неоднозначно.
      • Ссылку на таблицу можно заменить псевдонимом, используя tbl_name [AS] alias_name:
        Код MySQL:
        mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name;   mysql> SELECT t1.name, t2.salary FROM employee t1, info t2 WHERE t1.name = t2.name;
      • В выражениях ORDER BY и GROUP BY для ссылок на столбцы, выбранные для вывода информации, можно использовать либо имена столбцов, либо их псевдонимы, либо их позиции (местоположения). Нумерация позиций столбцов начинается с 1:
        Код MySQL:
        mysql> SELECT college, region, seed FROM tournament ORDER BY region, seed;   mysql> SELECT college, region AS r, seed AS s FROM tournament ORDER BY r, s;   mysql> SELECT college, region, seed FROM tournament ORDER BY 2, 3;
        Для того чтобы сортировка производилась в обратном порядке, в утверждении ORDER BY к имени заданного столбца, в котором производится сортировка, следует добавить ключевое слово DESC (убывающий). По умолчанию принята сортировка в возрастающем порядке, который можно задать явно при помощи ключевого слова ASC.
      • В выражении WHERE можно использовать любую из функций, которая поддерживается в MySQL. Выражение HAVING может ссылаться на любой столбец или псевдоним, упомянутый в выражении select_expressionHAVING отрабатывается последним, непосредственно перед отсылкой данных клиенту, и без какой бы то ни было оптимизации. Не используйте это выражение для определения того, что должно быть определено в WHERE. Например, нельзя задать следующий оператор:
        Код MySQL:
        mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;
        Вместо этого следует задавать:
        Код MySQL:
        mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;
        В версии MySQL 3.22.5 или более поздней можно также писать запросы, как показано ниже:
        Код MySQL:
        mysql> SELECT user,MAX(salary) FROM users GROUP BY user HAVING MAX(salary)>10;
        В более старых версиях MySQL вместо этого можно указывать:
        Код MySQL:
        mysql> SELECT user,MAX(salary) AS sum FROM users GROUP BY user HAVING sum>10;
      • Параметры (опции) DISTINCTDISTINCTROW и ALL указывают, должны ли возвращаться дублирующиеся записи. По умолчанию установлен параметр ALL, т.е. возвращаются все встречающиеся строки. DISTINCT и DISTINCTROW являются синонимами и указывают, что дублирующиеся строки в результирующем наборе данных должны быть удалены.
      • Все параметры, начинающиеся с SQL_STRAIGHT_JOIN и HIGH_PRIORITY, представляют собой расширение MySQL для ANSI SQL.
      • При указании параметра HIGH_PRIORITY содержащий его оператор SELECT будет иметь более высокий приоритет, чем команда обновления таблицы. Нужно только использовать этот параметр с запросами, которые должны выполняться очень быстро и сразу. Если таблица заблокирована для чтения, то запрос SELECT HIGH_PRIORITY будет выполняться даже при наличии команды обновления, ожидающей, пока таблица освободится.
      • Параметр SQL_BIG_RESULT можно использовать с GROUP BY или DISTINCT, чтобы сообщить оптимизатору, что результат будет содержать большое количество строк. Если указан этот параметр, MySQL при необходимости будет непосредственно использовать временные таблицы на диске, однако предпочтение будет отдаваться не созданию временной таблицы с ключом по элементам GROUP BY, а сортировке данных.
      • При указании параметра SQL_BUFFER_RESULT MySQL будет заносить результат во временную таблицу. Таким образом MySQL получает возможность раньше снять блокировку таблицы; это полезно в случаях, когда для посылки результата клиенту требуется значительное время.
      • Параметр SQL_SMALL_RESULT является опцией, специфической для MySQL. Данный параметр можно использовать с GROUP BY или DISTINCT, чтобы сообщить оптимизатору, что результирующий набор данных будет небольшим. В этом случае MySQL для хранения результирующей таблицы вместо сортировки будет использовать быстрые временные таблицы. В версии MySQL 3.23 указывать данный параметр обычно нет необходимости.
      • Параметр SQL_CALC_FOUND_ROWS возвращает количество строк, которые вернул бы оператор SELECT, если бы не был указан LIMIT. Искомое количество строк можно получить при помощи SELECT FOUND_ROWS().
      • Параметр SQL_CACHE предписывает MySQL сохранять результат запроса в кэше запросов при использовании SQL_QUERY_CACHE_TYPE=2 (DEMAND).
      • Параметр SQL_NO_CACHE запрещает MySQL хранить результат запроса в кэше запросов.
      • При использовании выражения GROUP BY строки вывода будут сортироваться в соответствии с порядком, заданным в GROUP BY, - так, как если бы применялось выражение ORDER BY для всех полей, указанных в GROUP BY. В MySQL выражение GROUP BY расширено таким образом, что для него можно также указывать параметры ASC и DESC:
        Код MySQL:
        SELECT a,COUNT(b) FROM test_table GROUP BY a DESC
      • Расширенный оператор GROUP BY в MySQL обеспечивает, в частности, возможность выбора полей, не упомянутых в выражении GROUP BY. Если ваш запрос не приносит ожидаемых результатов, прочтите, пожалуйста, описание GROUP BY.
      • При указании параметра STRAIGHT_JOIN оптимизатор будет объединять таблицы в том порядке, в котором они перечислены в выражении FROM. Применение данного параметра позволяет увеличить скорость выполнения запроса, если оптимизатор производит объединение таблиц неоптимальным образом.
      • Выражение LIMIT может использоваться для ограничения количества строк, возвращенных командой SELECTLIMIT принимает один или два числовых аргумента. Эти аргументы должны быть целочисленными константами. Если заданы два аргумента, то первый указывает на начало первой возвращаемой строки, а второй задает максимальное количество возвращаемых строк. При этом смещение начальной строки равно 0(не 1):
        Код MySQL:
        mysql> SELECT * FROM table LIMIT 5,10; # возвращает строки 6-15
        Если задан один аргумент, то он показывает максимальное количество возвращаемых строк:
        Код MySQL:
        mysql> SELECT * FROM table LIMIT 5; # возвращает первых 5 строк
        Другими словами, LIMIT n эквивалентно LIMIT 0,n.
      • Оператор SELECT может быть представлен в форме SELECT ... INTO OUTFILE 'file_name'. Эта разновидность команды осуществляет запись выбранных строк в файл, указанный в file_name. Данный файл создается на сервере и до этого не должен существовать (таким образом, помимо прочего, предотвращается разрушение таблиц и файлов, таких как '/etc/passwd'). Для использования этой формы команды SELECT необходимы привилегии FILE. Форма SELECT ... INTO OUTFILE главным образом предназначена для выполнения очень быстрого дампа таблицы на серверном компьютере. Команду SELECT ... INTO OUTFILE нельзя применять, если необходимо создать результирующий файл на ином хосте, отличном от серверного. В таком случае для генерации нужного файла вместо этой команды следует использовать некоторую клиентскую программу наподобие mysqldump --tab или mysql -e "SELECT ..." > outfile. Команда SELECT ... INTO OUTFILE является дополнительной по отношению к LOAD DATA INFILE; синтаксис части export_options этой команды содержит те же выражения FIELDS и LINES, которые используются в команде LOAD DATA INFILE. Следует учитывать, что в результирующем текстовом файле оператор ESCAPED BY экранирует только следующие символы:
        • Символ оператора ESCAPED BY
        • Первый символ оператора FIELDS TERMINATED BY
        • Первый символ оператора LINES TERMINATED BY
        Помимо этого ASCII-символ 0 конвертируется в ESCAPED BY, за которым следует символ '0' (ASCII 48). Это делается потому, что необходимо экранировать любые символы операторов FIELDS TERMINATED BYESCAPED BY или LINES TERMINATED BY, чтобы иметь надежную возможность повторить чтение этого файла. ASCII 0 экранируется, чтобы облегчить просмотр файла с помощью программ вывода типа pager. Поскольку результирующий файл не должен удовлетворять синтаксису SQL, нет необходимости экранировать что-либо еще. Ниже приведен пример того, как получить файл в формате, который используется многими старыми программами.
        Код MySQL:
        SELECT a,b,a+b INTO OUTFILE "/tmp/result.text" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY "\n" FROM test_table;
      • Если вместо INTO OUTFILE использовать INTO DUMPFILE, то MySQL запишет в файл только одну строку без символов завершения столбцов или строк и без какого бы то ни было экранирования. Это полезно для хранения данных типа BLOB в файле.
      • Следует учитывать, что любой файл, созданный с помощью INTO OUTFILE и INTO DUMPFILE, будет доступен для чтения всем пользователям! Причина этого заключается в следующем: сервер MySQL не может создавать файл, принадлежащий только какому-либо текущему пользователю (вы никогда не можете запустить mysqld от пользователя root), соответственно, файл должен быть доступен для чтения всем пользователям. При использовании FOR UPDATE с обработчиком таблиц, поддерживающим блокировку страниц/строк, выбранные строки будут заблокированы для записи.

В выражениях SELECT могут быть использованы функции, например:

  • COUNT — вычисляет количество найденых строк;
  • SUM — находит сумму значений в найденых строках;
  • MAX — находит найбольшее среди найденых значений;
  • MIN — находит наименьшее среди найденых значений;
  • AVG — находит среднее значение от найденых .
Код MySQL:
SELECT COUNT(prmParam) FROM tTable; SELECT MAX(prmParam) FROM tTable; SELECT AVG(prmParam) FROM tTable;

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

Код MySQL:
SELECT * FROM my_table ORDER BY RAND() LIMIT 10;

JOIN

MySQL поддерживает следующий синтаксис оператора JOIN при использовании в командах SELECT:

Код MySQL:
table_reference, table_reference table_reference [CROSS] JOIN table_reference table_reference INNER JOIN table_reference join_condition table_reference STRAIGHT_JOIN table_reference table_reference LEFT [OUTER] JOIN table_reference join_condition table_reference LEFT [OUTER] JOIN table_reference table_reference NATURAL [LEFT [OUTER]] JOIN table_reference { oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr } table_reference RIGHT [OUTER] JOIN table_reference join_condition table_reference RIGHT [OUTER] JOIN table_reference table_reference NATURAL [RIGHT [OUTER]] JOIN table_reference

где table_reference определено, как:

Код MySQL:
table_name [[AS] alias] [USE INDEX (key_list)] [IGNORE INDEX (key_list)]

и join_condition определено, как:

Код MySQL:
ON conditional_expr | USING (column_list)

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

Необходимо учитывать, что в версиях до 3.23.17 оператор INNER JOIN не принимает параметр join_condition.

Наличие последней из приведенных выше конструкций выражения LEFT OUTER JOIN обусловлено только требованиями совместимости с ODBC:

      • Вместо ссылки на таблицу может использоваться псевдоним, который присваивается при помощи выражений tbl_name AS alias_name или tbl_name alias_name:
        Код MySQL:
        mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name;
      • Условный оператор ON представляет собой условие в любой форме из числа тех, которые можно использовать в выражении WHERE.
      • Если запись для правой таблицы в частях ON или USING в LEFT JOIN не найдена, то для данной таблицы используется строка, в которой все столбцы установлены в NULL. Эту возможность можно применять для нахождения результатов в таблице, не имеющей эквивалента в другой таблице:
        Код MySQL:
        mysql> SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;
        Этот пример находит все строки в таблице table1 с величиной id, которая не присутствует в таблице table2 (т.е. все строки в table1, для которых нет соответствующих строк в table2). Конечно, это предполагает, что table2.id объявлен как NOT NULL.
      • USING (column_list) служит для указания списка столбцов, которые должны существовать в обеих таблицах. Такое выражение USING, как:
        Код MySQL:
        A LEFT JOIN B USING (C1,C2,C3,...)
        семантически идентично выражению ON, например:
        Код MySQL:
        A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
      • Выражение NATURAL [LEFT] JOIN для двух таблиц определяется так, чтобы оно являлось семантическим эквивалентом INNER JOIN или LEFT JOIN с выражением USING, в котором указаны все столбцы, имеющиеся в обеих таблицах.
      • INNER JOIN и , (запятая) являются семантическими эквивалентами. Оба осуществляют полное объединение используемых таблиц. Способ связывания таблиц обычно задается в условии WHERE.
      • RIGHT JOIN работает аналогично LEFT JOIN. Для сохранения переносимости кода между различными базами данных рекомендуется вместо RIGHT JOIN использовать LEFT JOIN.
      • STRAIGHT_JOIN идентично JOIN, за исключением того, что левая таблица всегда читается раньше правой. Это выражение может использоваться для тех (немногих) случаев, когда оптимизатор объединения располагает таблицы в неправильном порядке.
      • Начиная с версии MySQL 3.23.12, можно давать MySQL указания о том, какой индекс должен использоваться при извлечении информации из таблицы. Эта возможность полезна, если оператор EXPLAIN (выводящий информацию о структуре и порядке выполнения запроса SELECT), показывает, что MySQL использует ошибочный индекс. Задавая значение индекса в USE INDEX (key_list), можно заставить MySQL применять для поиска записи только один из указанных индексов. Альтернативное выражение IGNORE INDEX (key_list) запрещает использование в MySQL данного конкретного индекса. Выражения USE/IGNORE KEY являются синонимами для USE/IGNORE INDEX.

Несколько примеров:

Код MySQL:
mysql> SELECT * FROM table1,table2 WHERE table1.id=table2.id; mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; mysql> SELECT * FROM table1 LEFT JOIN table2 USING (id); mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id; mysql> SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3; mysql> SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;

UNION

Код MySQL:
SELECT ... UNION [ALL] SELECT ... [UNION SELECT ...]

Оператор UNION реализован в MySQL 4.0.0.

UNION используется для объединения результатов работы нескольких команд SELECT в один набор результатов.

Эти команды SELECT являются обычными командами выборки данных, но со следующим ограничением:

  • Только последняя команда SELECT может включать оператор INTO OUTFILE.

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

Если для всего результата UNION необходимо применить оператор ORDER BY, следует использовать круглые скобки:

Код MySQL:
(SELECT a FROM table_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM table_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10) ORDER BY a;

HANDLER

Оператор HANDLER обеспечивает прямой доступ к интерфейсу обработчика таблиц MyISAM, минуя оптимизатор SQL. Следовательно, этот оператор работает быстрее, чем SELECT.

Код MySQL:
HANDLER tbl_name OPEN [ AS alias ] HANDLER tbl_name READ index_name { = | >= | <= | < } (value1,value2,...) [ WHERE ... ] [LIMIT ... ] HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST } [ WHERE ... ] [LIMIT ... ] HANDLER tbl_name READ { FIRST | NEXT } [ WHERE ... ] [LIMIT ... ] HANDLER tbl_name CLOSE

Первая форма оператора HANDLER открывает таблицу, делая ее доступной для последовательности команд HANDLER ... READ. Этот объект недоступен другим потокам и не будет закрыт, пока данный поток не вызовет HANDLER tbl_name CLOSE или сам поток не будет уничтожен.

Вторая форма выбирает одну строку (или больше - в соответствии с установкой в выражении LIMIT), для которой(ых) указанный индекс соответствует заданному условию и условие в выражении WHERE также выполняется. Если индекс состоит из нескольких частей (охватывает несколько столбцов), то составляющие его величины указываются в виде разделенного запятыми списка. Обеспечиваются величины только для нескольких первых столбцов.

Третья форма выбирает одну строку (или больше - в соответствии с установкой в выражении LIMIT), из таблицы; в порядке указания индексов в соответствии с условием WHERE.

Четвертая форма (без указания индексов) выбирает одну строку (или больше - в соответствии с установкой в выражении LIMIT), из таблицы, используя естественный порядок строк (как они хранятся в файле данных), в соответствии с условием WHERE. Эта форма работает быстрее, чем HANDLER tbl_name READ index_name, в тех случаях, когда желателен просмотр всей таблицы.

Оператор HANDLER ... CLOSE закрывает таблицу, открытую оператором HANDLER ... OPEN.

Оператор HANDLER представляет собой что-то наподобие низкоуровневой команды. Например, он не обеспечивает целостности таблицы. Т.е. HANDLER ... OPEN НЕ делает моментального снимка таблицы и НЕ блокирует ее.

Отсюда следует, что после вызова команды HANDLER ... OPEN данные таблицы могут быть модифицированы (этим или любым другим потоком), а сами модификации в просмотрах таблицы при помощи HANDLER ... NEXT или HANDLER ... PREV могут появляться только частично.

INSERT

Оператор INSERT вставляет новые строки в существующую таблицу. Форма данной команды INSERT ... VALUES вставляет строки в соответствии с точно указанными в команде значениями. Форма INSERT ... SELECT вставляет строки, выбранные из другой таблицы или таблиц. Форма INSERT ... VALUES со списком из нескольких значений поддерживается в версии MySQL 3.22.5 и более поздних. Синтаксис выражения col_name=expression поддерживается в версии MySQL 3.22.10 и более поздних.

Код MySQL:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES (expression,...),(...),... или INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ... или INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name SET col_name=expression, col_name=expression, ...

tbl_name задает таблицу, в которую должны быть внесены строки. Столбцы, для которых заданы величины в команде, указываются в списке имен столбцов или в части SET:

      • Если не указан список столбцов для INSERT ... VALUES или INSERT ... SELECT, то величины для всех столбцов должны быть определены в списке VALUES() или в результате работы SELECT. Если порядок столбцов в таблице неизвестен, для его получения можно использовать DESCRIBE tbl_name.
      • Любой столбец, для которого явно не указано значение, будет установлен в свое значение по умолчанию. Например, если в заданном списке столбцов не указаны все столбцы в данной таблице, то не упомянутые столбцы устанавливаются в свои значения по умолчанию. Синтаксис оператора CREATE TABLE. В MySQL всегда предусмотрено значение по умолчанию для каждого поля. Это требование ``навязано'' MySQL, чтобы обеспечить возможность работы как с таблицами, поддерживающими транзакции, так и с таблицами, не поддерживающими их. Наша точка зрения (разработчиков) состоит в том, что проверка содержимого полей должна производиться приложением, а не сервером баз данных.
      • Выражение expression может относится к любому столбцу, который ранее был внесен в список значений. Например, можно указать следующее:
        Код MySQL:
        mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
        Но нельзя указать:
        Код MySQL:
        mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
      • Если указывается ключевое слово LOW_PRIORITY, то выполнение данной команды INSERT будет задержано до тех пор, пока другие клиенты не завершат чтение этой таблицы. В этом случае данный клиент должен ожидать, пока данная команда вставки не будет завершена, что в случае интенсивного использования таблицы может потребовать значительного времени. В противоположность этому команда INSERT DELAYED позволяет данному клиенту продолжать операцию сразу же. Следует отметить, что указатель LOW_PRIORITY обычно не используется с таблицами MyISAM, поскольку при его указании становятся невозможными параллельные вставки.
      • Если в команде INSERT со строками, имеющими много значений, указывается ключевое слово IGNORE, то все строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут проигнорированы и не будут внесены. Если не указывать IGNORE, то данная операция вставки прекращается при обнаружении строки, имеющей дублирующееся значение существующего ключа. Количество строк, внесенных в данную таблицу, можно определить при помощи функции C API mysql_info().
      • Если MySQL был сконфигурирован с использованием опции DONT_USE_DEFAULT_FIELDS, то команда INSERT будет генерировать ошибку, если явно не указать величины для всех столбцов, которые требуют значений не-NULL.
      • С помощью функции mysql_insert_id можно найти величину, использованную для столбца AUTO_INCREMENT.

Если задается команда INSERT ... SELECT или INSERT ... VALUES со списками из нескольких значений, то для получения информации о данном запросе можно использовать функцию C API mysql_info(). Формат этой информационной строки приведен ниже:

Код MySQL:
Records: 100 Duplicates: 0 Warnings: 0

Duplicates показывает число строк, которые не могли быть внесены, поскольку они дублировали бы значения некоторых существующих уникальных индексов. Указатель Warnings показывает число попыток внести величину в столбец, который по какой-либо причине оказался проблематичным. Предупреждения возникают при выполнении любого из следующих условий:

      • Внесение NULL в столбец, который был объявлен, как NOT NULL. Данный столбец устанавливается в значение, заданное по умолчанию.
      • Установка числового столбца в значение, лежащее за пределами его допустимого диапазона. Данная величина усекается до соответствующей конечной точки этого диапазона.
      • Занесение в числовой столбец такой величины, как '10.34 a'. Конечные данные удаляются и вносится только оставшаяся числовая часть. Если величина вовсе не имеет смысла как число, то столбец устанавливается в 0.
      • Внесение в столбцы типа CHAR, VARCHAR, TEXT или BLOB строки, превосходящей максимальную длину столбца. Данная величина усекается до максимальной длины столбца.
      • Внесение в столбец даты или времени строки, недопустимой для данного типа столбца. Этот столбец устанавливается в нулевую величину, соответствующую данному типу.

Команда INSERT ... SELECT обеспечивает возможность быстрого внесения большого количества строк в таблицу из одной или более таблиц.

Код MySQL:
INSERT [LOW_PRIORITY] [IGNORE] [INTO] tbl_name [(column list)] SELECT ...

Например

Код MySQL:
INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100;

Для команды INSERT ... SELECT необходимо соблюдение следующих условий:

      • Целевая таблица команды INSERT не должна появляться в утверждении FROM части SELECT данного запроса, поскольку в ANSI SQL запрещено производить выборку из той же таблицы, в которую производится вставка. (Проблема заключается в том, что операция SELECT, возможно, найдет записи, которые были внесены ранее в течение того же самого прогона команды. При использовании команд, внутри которых содержатся многоступенчатые выборки, можно легко попасть в очень запутанную ситуацию!)
      • Столбцы AUTO_INCREMENT работают, как обычно. 
      • Для получения информации о данном запросе можно использовать функцию C API mysql_info()
      • Чтобы гарантировать возможность использования журнала обновлений/двоичного журнала для восстановления исходного состояния таблиц, в MySQL во время выполнения команды INSERT ... SELECT параллельные вставки не разрешаются.

Разумеется, для перезаписи старых строк можно вместо INSERT использовать REPLACE.

Опция DELAYED для команды INSERT является специфической для MySQL возможностью, которая очень полезна, если клиент не может ждать завершения команды INSERT. Такая проблема встречается часто - она возникает, когда MySQL используется для ведения журналов (проще говоря, для логгинга) и при этом периодически запускаются команды SELECT и UPDATE, для выполнения которых требуется много времени. Оператор DELAYED был введен в версию MySQL 3.22.15. Он является расширением MySQL к ANSI SQL92.

INSERT DELAYED работает только с таблицами типа ISAM и MyISAM. Следует учитывать, что таблицы MyISAM поддерживают одновременное выполнение SELECT и INSERT, поэтому если нет свободных блоков в середине файла данных, то необходимость в применении INSERT DELAYED возникает очень редко.

При использовании оператора INSERT DELAYED клиент сразу же получает успешный ответ от сервера, а запись будет добавлена в таблицу сразу же после того, как эту таблицу перестанет использовать другой поток.

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

Обратите внимание: в настоящее время все записи, поставленные в очередь на добавление, хранятся только в памяти до тех пор, пока они не будут записаны на диск. Отсюда следует, что если выполнение mysqld будет завершено принудительно (kill -9) или программа умрет, то все находящиеся в очереди данные, которые не записаны на диск, будут потеряны!.

Ниже детально описано, что происходит при использовании опции DELAYED в командах INSERT или REPLACE. В этом описании "поток'' понимается как поток, принимающий команду INSERT DELAYED, а "обработчик'' - это поток, который обрабатывает все команды INSERT DELAYED в конкретной таблице.

      • При выполнении потоком команды DELAYED для таблицы создается поток-обработчик для обработки всех команд DELAYED в данной таблице, если подобный обработчик уже не существует.
      • Данный поток проверяет, выполнил ли уже обработчик блокировку DELAYED; если нет, то он предписывает обработчику сделать это. Блокировка DELAYED может быть осуществлена даже в случае, если блокировки READ или WRITE на данной таблице уже выполнены другими потоками. Однако обработчик будет ожидать всех блокировок ALTER TABLE и завершения всех команд FLUSH TABLES, чтобы убедиться в том, что структура таблицы соответствует последнему обновлению.
      • Поток выполняет команду INSERT, но вместо записи строки в таблицу он ставит финальную копию этой строки в очередь, управляемую потоком-обработчиком. Поток отмечает все синтаксические ошибки и сообщает о них клиентской программе.
      • Клиент не может уведомить о количестве дубликатов или значении AUTO_INCREMENT для данной результирующей строки; он также не может получить эти данные с сервера, поскольку команда INSERT возвращает результат до полного завершения операции вставки. По той же причине ничего существенного не даст и использование функции C API mysql_info().
      • Обновление журнала обновлений производится потоком-обработчиком после вставки строки в таблицу. В случае многострочной вставки обновление журнала обновлений производится при записи первой строки.
      • После записи каждых delayed_insert_limit строк, обработчик проверяет, не находятся ли в ожидании выполнения какие-либо команды SELECT. Если да, то обработчик перед продолжением своей работы "пропускает их вперед'' на выполнение.
      • Если очередь обработчика больше не содержит строк, то с данной таблицы будет снята блокировка. Если в течение delayed_insert_timeout секунд не поступят никакие новые команды INSERT DELAYED, то обработчик завершит свою работу.
      • Если более, чем delayed_queue_size строк уже ожидают в очереди обработчика, то поток, запрашивающий INSERT DELAYED, будет ждать, пока не освободится место в очереди. Таким образом можно иметь уверенность в том, что mysqld не займет всю память сервера для хранения запросов данной очереди.
      • Поток-обработчик будет наблюдаться в списке процессов MySQL со значением delayed_insert в столбце Command. Поток-обработчик можно уничтожить запуском команды FLUSH TABLES или командой KILL номер_потока. Однако перед своим завершением он вначале сохранит в таблице все поставленные в очередь строки. В процессе сохранения он не будет принимать никаких новых команд INSERT от иного потока. При выполнении после этого команды INSERT DELAYED будет создан новый поток-обработчик. Обратите внимание: отсюда следует, что команды INSERT DELAYED имеют более высокий приоритет, чем обычные команды INSERT, если уже существует запущенный обработчик INSERT DELAYED. Другие команды обновления должны ожидать, пока не опустеет очередь INSERT DELAYED или же пока кто-либо не прекратит выполнение потока-обработчика (с помощью KILL номер_потока) или не выполнит FLUSH TABLES.
      • Представленные в таблице переменные обеспечивают информацию об INSERT DELAYED:
        Переменная Значение
        Delayed_insert_threads Количество потоков-обработчиков
        Delayed_writes Количество строк, записанных INSERT DELAYED
        Not_flushed_delayed_rows Количество строк, ожидающих записи
      • Чтобы увидеть эти переменные, следует вызвать команду SHOW STATUS или выполнить команду mysqladmin extended-status.

Обратите внимание: если данная таблица не используется, то команда INSERT DELAYED работает медленнее, чем обычная команда INSERT. Кроме того, возникает дополнительная нагрузка на сервер, поскольку требуется управлять отдельным потоком для каждой таблицы, для которой используется INSERT DELAYED. Это означает, что команду INSERT DELAYED следует применять только тогда, когда в ней есть реальная необходимость.

DELETE

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

Код MySQL:
DELETE [LOW_PRIORITY | QUICK] FROM table_name [WHERE where_definition] [ORDER BY ...] [LIMIT rows]   или   DELETE [LOW_PRIORITY | QUICK] table_name[.*] [,table_name[.*] ...] FROM table-references [WHERE where_definition]   oили   DELETE [LOW_PRIORITY | QUICK] FROM table_name[.*], [table_name[.*] ...] USING table-references [WHERE where_definition]

Если оператор DELETE запускается без WHERE, то удаляются все строки. При работе в режиме AUTOCOMMIT это будет аналогично использованию оператора TRUNCATE. В MySQL 3.23 оператор DELETE без определения WHERE возвратит ноль как число удаленных записей.

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

Код MySQL:
mysql> DELETE FROM table_name WHERE 1>0;

Следует учитывать, что эта форма работает намного медленнее, чем DELETE FROM table_name без выражения WHERE, поскольку строки удаляются поочередно по одной.

Если указано ключевое слово LOW_PRIORITY, выполнение данной команды DELETE будет задержано до тех пор, пока другие клиенты не завершат чтение этой таблицы.

Если задан параметр QUICK, то обработчик таблицы при выполнении удаления не будет объединять индексы - в некоторых случаях это может ускорить данную операцию.

В таблицах MyISAM удаленные записи сохраняются в связанном списке, а последующие операции INSERT повторно используют места, где располагались удаленные записи. Чтобы возвратить неиспользуемое пространство и уменьшить размер файлов, можно применить команду OPTIMIZE TABLE или утилиту myisamchk для реорганизации таблиц. Команда OPTIMIZE TABLE проще в использовании, но утилита myisamchk работает быстрее.

Первый из числа приведенных в начале данного раздела многотабличный формат команды DELETE поддерживается, начиная с MySQL 4.0.0. Второй многотабличный формат поддерживается, начиная с MySQL 4.0.2.

Идея заключается в том, что удаляются только совпадающие строки из таблиц, перечисленных перед выражениями FROM или USING. Это позволяет удалять единовременно строки из нескольких таблиц, а также использовать для поиска дополнительные таблицы. Символы .* после имен таблиц требуются только для совместимости с Access:

Код MySQL:
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id

или

Код MySQL:
DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id

В этом случае  будут удалены совпадающие строки из таблиц t1 и t2.

Выражение ORDER BY и использование нескольких таблиц в команде DELETE поддерживается в MySQL 4.0.

Если применяется выражение ORDER BY, то строки будут удалены в указанном порядке. В действительности это выражение полезно только в сочетании с LIMIT. Например:

Код MySQL:
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp LIMIT 1

Данный оператор удалит самую старую запись (по timestamp), в которой строка соответствует указанной в выражении WHERE.

Специфическая для MySQL опция LIMIT для команды DELETE указывает серверу максимальное количество строк, которые следует удалить до возврата управления клиенту. Эта опция может использоваться для гарантии того, что данная команда DELETE не потребует слишком много времени для выполнения. Требуется повторять команду DELETE до тех пор, пока количество удаленных строк не станет меньше, чем значение LIMIT.

TRUNCATE

Используется для очистки таблиц. При этом все автоинкрементные счетчики сбрасываются. Триггеры по событию DELETE не вызываются.

Код MySQL:
TRUNCATE TABLE tTable;

Данная запись эквивалентна

Код MySQL:
DELETE FROM tTable;

с той лишь разницей, что для TRUNCATE  невозможно выполнить откат.

UPDATE

Оператор UPDATE обновляет столбцы в соответствии с их новыми значениями в строках существующей таблицы. В выражении SET указывается, какие именно столбцы следует модифицировать и какие величины должны быть в них установлены. В выражении WHERE, если оно присутствует, задается, какие строки подлежат обновлению. В остальных случаях обновляются все строки. Если задано выражение ORDER BY, то строки будут обновляться в указанном в нем порядке.

Код MySQL:
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2, ...] [WHERE where_definition] [LIMIT #]

Если указывается ключевое слово LOW_PRIORITY, то выполнение данной команды UPDATE задерживается до тех пор, пока другие клиенты не завершат чтение этой таблицы.

Если указывается ключевое слово IGNORE, то команда обновления не будет прервана, даже если при обновлении возникнет ошибка дублирования ключей. Строки, из-за которых возникают конфликтные ситуации, обновлены не будут.

Если доступ к столбцу из указанного выражения осуществляется по аргументу tbl_name, то команда UPDATE использует для этого столбца его текущее значение. Например, следующая команда устанавливает столбец age в значение, на единицу большее его текущей величины:

Код MySQL:
mysql> UPDATE persondata SET age=age+1;

Значения команда UPDATE присваивает слева направо. Например, следующая команда дублирует столбец age, затем инкрементирует его:

Код MySQL:
mysql> UPDATE persondata SET age=age*2, age=age+1;

Если столбец устанавливается в его текущее значение, то MySQL замечает это и не обновляет его.

Команда UPDATE возвращает количество фактически измененных строк.

В версии MySQL 3.22 и более поздних функция C API mysql_info() возвращает количество строк, которые были найдены и обновлены, и количество предупреждений, имевших место при выполнении UPDATE.

В версии MySQL 3.23 можно использовать LIMIT #, чтобы убедиться, что было изменено только заданное количество строк.

REPLACE

Оператор REPLACE работает точно так же, как INSERT, за исключением того, что если старая запись в данной таблице имеет то же значение индекса UNIQUE или PRIMARY KEY, что и новая, то старая запись перед занесением новой будет удалена.

Код MySQL:
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] VALUES (expression,...),(...),... или REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] SELECT ... или REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name SET col_name=expression, col_name=expression,...

Другими словами, команда REPLACE не предоставляет доступа к замещаемой записи. В некоторых старых версиях MySQL такой доступ иногда оказывался возможным, но эта ошибка была исправлена.

При использовании команды REPLACE функция mysql_affected_rows() вернет значение, равное 2, если старая строка была заменена новой. Объясняется это тем, что сначала в таблицу вставляется одна строка, а затем удаляется вторая - дубликат.

Это позволяет легко определять, какое действие произвела команда REPLACE - добавление или замещение строки. Достаточно проверить, какое число вернула функция mysql_affected_rows(). Если 1, то строка была добавлена, а если 2, то замещена.

Следует учитывать, что, если не используются индексы UNIQUE или PRIMARY KEY, то применение команды REPLACE не имеет смысла, так как она работает просто как INSERT.

LOAD DATA INFILE

Команда LOAD DATA INFILE читает строки из текстового файла и вставляет их в таблицу с очень высокой скоростью. Если задано ключевое слово LOCAL, то файл читается с клиентского хоста. Если же LOCAL не указывается, то файл должен находиться на сервере. (Опция LOCAL доступна начиная с версии MySQL 3.22.6.)

Код MySQL:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY '\t'] [[OPTIONALLY] ENCLOSED BY ''] [ESCAPED BY '\\' ] ] [LINES TERMINATED BY '\n'] [IGNORE number LINES] [(col_name,...)]

Если текстовые файлы, которые нужно прочитать, находятся на сервере, то из соображений безопасности эти файлы должны либо размещаться в директории базы данных, либо быть доступными для чтения всем пользователям. Кроме того, для применения команды LOAD DATA INFILE к серверным файлам необходимо обладать привилегиями FILE для серверного хоста. 

В версиях MySQL 3.23.49 и MySQL 4.0.2 команда LOCAL не будет работать в случаях, если демон mysqld запущен с параметром --local-infile=0 или если для клиента отключена поддержка LOCAL.

Если указывается ключевое слово LOW_PRIORITY, то выполнение данной команды LOAD DATA будет задержано до тех пор, пока другие клиенты не завершат чтение этой таблицы.

Если указывается ключевое слово CONCURRENT при работе с таблицами MyISAM, то другие потоки могут извлекать данные из таблицы во время выполнения команды LOAD DATA. Использование этой возможности, конечно, будет немного влиять на производительность выполнения LOAD DATA, даже если никакой другой поток не использует данную таблицу в это же время.

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

При использовании версий MySQL до 3.23.24 при помощи команды LOAD DATA INFILE нельзя выполнять чтение из FIFO. Если необходимо читать из FIFO (например, стандартный вывод gunzip), следует использовать LOAD DATA LOCAL INFILE.

Можно также загружать файлы данных, используя утилиту mysqlimport. Эта утилита выполняет загрузку файлов путем посылки на сервер команд LOAD DATA INFILE. Опция --local заставляет mysqlimport читать файлы данных с клиентского хоста. Можно указать параметр --compress, чтобы получить лучшую производительность при работе через медленные сети, если и клиент, и сервер поддерживают протокол сжатия данных.

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

      • Если задан абсолютный (полный) путь к файлу, то сервер использует этот путь без изменений.
      • Если задан относительный путь к файлу с указанием одного или более начальных каталогов, то поиск файла будет осуществляться относительно указанных каталогов в каталоге данных сервера (datadir).
      • Если дается путь к файлу без указания начальных каталогов, то сервер ищет этот файл в директории используемой базы данных.

Отсюда следует, что файл, заданный как './myfile.txt', читается из серверного каталога данных, в то время как файл, заданный как 'myfile.txt', читается из каталога используемой базы данных. Например, следующая команда LOAD DATA читает файл data.txt в каталоге базы данных для db1, поскольку db1 является текущей базой данных, даже если эта команда явно содержит указание загрузить файл в таблицу базы данных db2:

Код MySQL:
mysql> USE db1; mysql> LOAD DATA INFILE "data.txt" INTO TABLE db2.my_table;

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

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

При использовании LOAD DATA INFILE на пустых таблицах MyISAM все неуникальные индексы создаются в отдельном пакете (как в REPAIR). Обычно это значительно ускоряет работу LOAD DATA INFILE в случае большого количества индексов.

Команда LOAD DATA INFILE является дополнительной к SELECT ... INTO OUTFILE.  Чтобы записать данные из базы данных в файл, используется SELECT ... INTO OUTFILE. Чтобы прочитать данные обратно в базу данных, используется LOAD DATA INFILE. Синтаксис FIELDS и LINES одинаков в обеих командах. Обе части являются необязательными, но если указаны оба, то FIELDS должно предшествовать LINES.

Если указывается FIELDS, то каждое из его подвыражений (TERMINATED BY[OPTIONALLY] ENCLOSED BY, и ESCAPED BY) также является необязательным, однако необходимо указать по меньшей мере одно из них.

Если значение FIELDS не определено, то по умолчанию его параметры будут принимать следующие значения:

Код MySQL:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'

Если значение LINES не определено, то по умолчанию оно имеет следующую структуру:

Код MySQL:
LINES TERMINATED BY '\n'

Иными словами, при установках по умолчанию команда LOAD DATA INFILE при чтении входных данных будет работать следующим образом:

      • Искать концы строк в виде символов '\n'
      • Разбивать строки на поля по символам табуляции.
      • Не ожидать, что поля могут быть заключены в символы цитирования.
      • Интерпретировать встречающиеся символы табуляции, новой строки или '\', предваренные '\', как литералы, являющиеся частью значения поля.

И, наоборот, если действуют установки по умолчанию при записи выходных данных, команда SELECT ... INTO OUTFILE будет работать следующим образом:

      • Вставлять символы табуляции между полями.
      • Не заключать поля в символы цитирования. Использовать символы '\' для экранирования экземпляров символов табуляции, новой строки или '\', которые появляются среди величин поля.
      • Вставлять символы новой строки в конце каждой записи.

Следует учитывать, что в записи FIELDS ESCAPED BY '\' необходимо указывать два обратных слеша для величины, которая должна читаться как один обратный слеш.

Опцию IGNORE number LINES можно применять для игнорирования заголовка имен столбцов в начале файла:

Код MySQL:
mysql> LOAD DATA INFILE "/tmp/file_name" INTO TABLE test IGNORE 1 LINES;

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

Код MySQL:
mysql> SELECT * INTO OUTFILE 'data.txt' FIELDS TERMINATED BY ',' FROM ...;

Чтобы прочитать этот разделенный запятыми файл обратно в базу данных, корректная команда должна иметь вид:

Код MySQL:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY ',';

Если вместо этого попытаться прочитать этот файл с помощью команды, представленной ниже, то она не будет работать, поскольку предписывает команде LOAD DATA INFILE искать символы табуляции между полями:

Код MySQL:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY '\t';

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

Команду LOAD DATA INFILE можно также использовать для чтения файлов, полученных из внешних источников. Например, поля в файле формата базе данных dBASE будут разделены запятыми и заключены в двойные кавычки. Если строки в данном файле заканчиваются символами новой строки, то для записи файла можно использовать приведенную ниже команду, в которой проиллюстрировано задание опций, обрабатывающих поля и строки:

Код MySQL:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

Любая из опций, обрабатывающих поля и строки, может задавать пустую строку (''). Если строка не пустая, то величины опций FIELDS [OPTIONALLY] ENCLOSED BY и FIELDS ESCAPED BY должны содержать один символ. Величины опций FIELDS TERMINATED BY и LINES TERMINATED BY могут содержать более чем один символ. Например, чтобы записать строки, заканчивающиеся парами "возврат каретки - перевод строки" (как в текстовых файлах MS DOS или Windows), необходимо задать следующее выражение: LINES TERMINATED BY '\r\n'.

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

Код MySQL:
CREATE TABLE jokes ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joke TEXT NOT NULL);   LOAD DATA INFILE "/tmp/jokes.txt" INTO TABLE jokes FIELDS TERMINATED BY "";   LINES TERMINATED BY "\n%%\n" (joke);

Опция FIELDS [OPTIONALLY] ENCLOSED BY служит для управления полями, заключенными в заданные символы. Если параметр OPTIONALLY опущен, то в выводе (SELECT ... INTO OUTFILE) все поля будут заключены в символы, заданные в ENCLOSED BY. Пример такого вывода (в котором в качестве разделителя полей используется запятая) показан ниже:

Код :
"1","a string","100.20" "2","a string containing a , comma","102.20" "3","a string containing a \" quote","102.20" "4","a string containing a \", quote and comma","102.20"

Если указан параметр OPTIONALLY, то заданным в ENCLOSED BY символом выделяются только поля типа CHAR и VARCHAR:

Код :
1,"a string",100.20 2,"a string containing a , comma",102.20 3,"a string containing a \" quote",102.20 4,"a string containing a \", quote and comma",102.20

Следует учитывать, что появление символов ENCLOSED BY внутри величины поля экранируется применением перед ними префикса из ESCAPED BY. Также следует учитывать, что если в ESCAPED BY указана пустая величина, то существует возможность создать вывод, который оператор LOAD DATA INFILE не сможет правильно прочитать. Например, если символ экранирования является пустой строкой, то вывод, представленный выше, окажется таким, как показано ниже. Обратите внимание: второе поле в четвертой строке содержит запятую, следующую за кавычкой, которая (ошибочно) появляется, чтобы ограничить данное поле:

Код :
1,"a string",100.20 2,"a string containing a , comma",102.20 3,"a string containing a " quote",102.20 4,"a string containing a ", quote and comma",102.20

Для ввода символ ENCLOSED BY, если он есть, удаляется из обоих концов величин полей. (Это справедливо независимо от того, указан или нет параметр OPTIONALLY: при работе с входными данными параметр OPTIONALLY не учитывается.) Если встречается символ ENCLOSED BY, которому предшествует символ ESCAPED BY, то он интерпретируется как часть текущей величины поля. Кроме того, двойные символы ENCLOSED BY, встречающиеся внутри поля, интерпретируются как одиночные символы ENCLOSED BY, если данное поле само начинается с этого символа. Например, если указывается ENCLOSED BY '"', то кавычки обрабатываются, как показано ниже:

Код :
"The ""BIG"" boss" -> The "BIG" boss The "BIG" boss -> The "BIG" boss The ""BIG"" boss -> The ""BIG"" boss

Опция FIELDS ESCAPED BY служит для управления записью или чтением специальных символов. Если символ FIELDS ESCAPED BY не пустой, он используется в качестве префикса для следующих символов в выводе:

      • Символ FIELDS ESCAPED BY
      • Символ FIELDS [OPTIONALLY] ENCLOSED BY
      • Первый символ величин FIELDS TERMINATED BY и LINES TERMINATED BY
      • Символ ASCII 0 (в действительности после экранирующего символа пишется ASCII '0', а не байт с нулевой величиной)

Если символ FIELDS ESCAPED BY пустой, то никакие символы не экранируются. На самом деле указывать пустой экранирующий символ нет смысла, особенно если величины полей в обрабатываемых данных содержат какие-либо из символов, указанных в приведенном выше списке.

Если символ FIELDS ESCAPED BY не пуст, то в случае входных данных вхождения такого символа удаляются и следующий за таким вхождением символ принимается буквально как часть величины поля. Исключениями являются экранированные '0' или 'N' (например, \0 или \N, если экранирующим символом является '\'). Эти последовательности интерпретируются как ASCII 0 (байт с нулевым значением) и NULL

В ряде случаев опции обработки полей и строк взаимодействуют:

      • Если LINES TERMINATED BY является пустой строкой и FIELDS TERMINATED BY является не пустой строкой, то строки также заканчиваются символами FIELDS TERMINATED BY.
      • Если обе величины FIELDS TERMINATED BY и FIELDS ENCLOSED BY являются пустыми (''), то применяется формат с фиксированной строкой (без разделителей). В формате с фиксированной строкой не предусмотрены никакие разделители между полями. Вместо этого при чтении и записи величин столбцов используется ширина "вывода" столбцов. Например, если столбец объявлен как INT(7), значения для этого столбца записываются с использованием полей шириной 7 символов. Входные значения для этого столбца получаются чтением 7 символов. Формат с фиксированной строкой влияет также на обработку величин NULL. Отметим, что формат с фиксированными размерами не будет работать при использовании мультибайтного набора символов.

Значения NULL в зависимости от используемых опций FIELDS и LINES будут обрабатываться по-разному:

      • Для установленных по умолчанию величин FIELDS и LINES NULL записывается как \N для вывода и \N читается как NULL для ввода (исходя из предположения, что символ ESCAPED BY равен '\').
      • Если FIELDS ENCLOSED BY не является пустым, то поле, значение которого представляет собой строку из букв NULL, читается как величина NULL (в отличие от слова NULL, заключенного между символами FIELDS ENCLOSED BY, которое читается как строка 'NULL').
      • Если FIELDS ESCAPED BY является пустым, NULL записывается как слово NULL.
      • В формате с фиксированной строкой (который имеет место, если оба спецификатора - FIELDS TERMINATED BY и FIELDS ENCLOSED BY - являются пустыми), NULL записывается как пустая строка. Отметим, что вследствие этого величина NULL и пустая строка в данной таблице будут неразличимы при записи в файл, поскольку они обе записываются как пустые строки. Если необходимо, чтобы эти величины были различными при обратном чтении файла, то не следует использовать формат с фиксированной строкой.

Некоторые случаи, не поддерживаемые оператором LOAD DATA INFILE:

      • Строки с фиксированным размером (обе опции FIELDS TERMINATED BY и FIELDS ENCLOSED BY пустые) и столбцы имеют тип BLOB либо TEXT.
      • Если указывается разделитель, совпадающий с другим или являющийся префиксом другого, то LOAD DATA INFILE не сможет интерпретировать ввод правильно. Например, следующее утверждение FIELDS вызовет проблемы:
        Код MySQL:
        FIELDS TERMINATED BY '"' ENCLOSED BY '"'
      • Если опция FIELDS ESCAPED BY пустая, то содержащееся в значении поля вхождение символа FIELDS ENCLOSED BY или LINES TERMINATED BY, за которым следует символ FIELDS TERMINATED BY, приведет к преждевременному завершению чтения поля или строки командой LOAD DATA INFILE. Это происходит вследствие того, что LOAD DATA INFILE не может правильно определить, где заканчивается поле или строка.

Следующий пример загружает все столбцы таблицы persondata:

Код MySQL:
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

Список полей не указывается, следовательно, команда LOAD DATA INFILE ожидает входные строки для заполнения каждого столбца таблицы. При этом используются значения FIELDS и LINES по умолчанию.

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

Код MySQL:
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

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

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

Значение пустого поля интерпретируется иначе, чем отсутствие значения:

      • Для строковых типов столбец устанавливается в пустую строку.
      • Для числовых типов столбец устанавливается в 0.
      • Для типов даты и времени столбец устанавливается в соответствующее этому типу значение "ноль".

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

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

Если входная строка имеет слишком много полей, то лишние поля игнорируются и количество предупреждений увеличится.

Команда LOAD DATA INFILE интерпретирует все входные данные как строки, поэтому нельзя указывать числовые величины для столбцов с типами ENUM или SET так же, как для команд INSERT. Все величины ENUM и SET должны обязательно быть заданы как строки.

При использовании C API можно получить информацию о запросе, вызвав функцию API mysql_info() по окончании запроса LOAD DATA INFILE. Ниже показан формат строки информации для этого случая:

Код MySQL:
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0

Предостережения выдаются при тех же обстоятельствах, что и при записи величин командой INSERT, за исключением того, что команда LOAD DATA INFILE дополнительно генерирует предупреждения, когда во входной строке слишком мало или слишком много полей. Предостережения нигде не хранятся; количество предупреждений может использоваться только для того, чтобы проверить, нормально ли выполнились указанные действия. Если необходимо точно знать причины предупреждений, то следует выполнить команду SELECT ... INTO OUTFILE в другой файл и сравнить результат с первоначальным входным файлом - это единственный способ получить такую информацию.

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

Код bash:
mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat < /dev/tcp/10.1.1.12/4711 > /nt/mysql/db/x/x mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x

При использовании версии MySQL старше, чем 3.23.25, вышеприведенное можно сделать только с LOAD DATA LOCAL INFILE.

DO

 

Выполняет данное выражение, но не возвращает какой-либо результат. Является сокращенной формой оператора SELECT expression, expression, но преимущество его заключается в том, что он работает немного быстрее, если нет необходимости в возвращении результата.

Оператор главным образом полезен при использовании с функциями, имеющими побочные эффекты, такими как RELEASE_LOCK.

Код MySQL:
DO expression, [expression, ...]

Оставьте свой комментарий

Оставить комментарий как гость

0
  • Комментариев нет