Реализация языка SQL в СУБД MySQL | ||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||
ALTER TABLE | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: ALTER [IGNORE] TABLE table_name alter_specification [, alter_specification ...] alter_specification: ADD [COLUMN] create_definition or CHANGE [COLUMN] old_column_name create_definition or ALTER [COLUMN] column_name { SET default | DROP DEFAULT } or DROP [COLUMN] column_name or DROP PRIMARY KEY or DROP INDEX key_name DROP FOREIGN KEY key_name ОПИСАНИЕ: Команда ALTER TABLE может быть использована для изменения определения таблицы. ALTER TABLE работает с временно созданной таблицей в которую копирует все данные из текущей таблицы. Когда копия готова, старая таблица удаляется, а новая переименуется в нее. Это выполнено таким способом, что все изменения автоматически переназначаются на новую таблицу. Пока работает ALTER TABLE, старая таблица доступна для других клиентов. Обновления и запись в таблицу останавливаются и будут выполнены только после того, как новая таблица будет готова. Если IGNORE не определен, то копирование будет прервано и процесс отработан назад в случае наличия любых уникальных ключей, дублированных в новой таблице.
Вы можете использовать функцию C API mysql_info(&MYSQL_RESULT) чтобы узнать, сколько записей скопировано и сколько удалено из-за дублированных ключей. Для использования команды ALTER TABLE вы должны иметь права доступа select, insert, delete, update, create и drop для этой таблицы. | ||||||||||||||||||||||||||||||||||||||||||
CREATE TABLE | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС:
CREATE TABLE table_name (create_definition, ...) Здесь create_definition имеет следующий формат: create_definition: column_name type NOT NULL [DEFAULT default_value] [ PRIMARY KEY ] or column_name type [NULL] [ PRIMARY KEY ] or PRIMARY (KEY|INDEX) [key_name] ( column_name,... ) or (KEY|INDEX) [key_name] ( column_name[length],...) or INDEX [key_name] ( column_name[length],...) or UNIQUE (column_name[length],...) or FOREIGN (KEY|INDEX) [key_name] (column_name[length],...) REFERENCES table_name [ON DELETE (RESTRICT | CASCADE | SET NULL) ] ОПИСАНИЕ: В MySQL все поля имеют неявное значение по умолчанию, если объявлены, как не пустые (NOT NULL). Если вы не даете значения по умолчанию при использовании не пустого поля, оно будет назначено, исходя из типа поля. Блок FOREIGN нужен только для совместимости. Ключевое слово REFERENCE тоже не выполняет в данной версии никаких действий. Команда MySQL CREATE TABLE не поддерживает ключевое слово SQL CHECK. Для создания таблицы Вы должны иметь права доступа create. Замечания:
| ||||||||||||||||||||||||||||||||||||||||||
Типы данных | ||||||||||||||||||||||||||||||||||||||||||
Поля должны иметь один из следующих типов данных:
Длина поля определяет, сколько всего цифр может иметь число, в то время как поле dec определяет, сколько из этих цифр будет после десятичной точки. Эти значения используются только для форматирования и вычисления максимальной ширины столбца. | ||||||||||||||||||||||||||||||||||||||||||
Ключи | ||||||||||||||||||||||||||||||||||||||||||
MySQL таблица может иметь до 16 ключей, каждый из которых может иметь до 15 полей. Максимальная поддерживаемая длина ключа 120 байт. Вы можете увеличить длину ключа, изменяя N_MAX_KEY_LENGTH в файле nisam.h и перекомпилировав пакет. Обратите внимание, что длинные ключи могут привести к низкой эффективности. Ключи могут иметь имена. В случае первичного ключа имя будет всегда PRIMARY. Если имя ключа не задано в процессе создания таблицы, то заданное по умолчанию имя ключа - первое имя столбца с факультативным суффиксом (_2, _3, и т. д.) чтобы сделать это имя уникальным. Имя ключа может использоваться с командой ALTER TABLE, чтобы удалить ключ. При создании ключа Вы можете факультативно определить, что только первые N символов поля будут использоваться. Например, если Вы хотите создавать уникальный ключ на поле, в котором только первые 40 символов уникальны, можно сделать следующее. CREATE TABLE SomeTable (composite CHAR(200), INDEX comp_idx(composite(40))); Хорошая идея - использовать эту опцию на неуникальных полях, поскольку эта мера значительно уменьшит размер вашего индекса, а снижение производительности будет очень не большим. Вы можете иметь один первичный ключ на таблицу. Если поле определено, как поле первичного ключа, то генерируется индекс. Нет никакой необходимости определять нормальный ключ. Кроме того, при определении дополнительных индексов, которые содержат первичный ключ не будет иметь смысла, поскольку первичный ключ сделает индекс бесполезным. Ключи с несколькими полями следует использовать для оптимизации узкоспецифических запросов. То есть, все поля в предложении WHERE запроса должны появляться в многопольном ключе. Поскольку MySQL использует B-Tree не нужно объявлять ключи, которые являются префиксами других ключей. Оптимизатор найдет любой пригодный для использования префикс ключа и использует его, чтобы выполнить поиск. Например, если Вы объявляете следующий ключ: INDEX (first, second, third, fourth) Вы также неявно создали следующие ключи: (first, second, third) Объявление ненужных ключей только займет дополнительное место и замедлит ваши запросы. Ключи должны быть созданы во время создания таблицы или изменения таблицы с использованием команды ALTER TABLE. | ||||||||||||||||||||||||||||||||||||||||||
BLOB'ы | ||||||||||||||||||||||||||||||||||||||||||
BLOB - "Binary Large OBject" - двоичный большой объект. Как отмечено выше, MySQL поддерживает четыре типа BLOB: tinyblob (0-255 байт) blob (0-65535 байт) mediumblob (0-16777216 байт) longblob (0-2147483648 байт) Обратите внимание, что могут иметься некоторые ограничения из-за размера буфера сообщения. Буфер сообщений выделяется динамически. Вы должны знать, что 'max_allowed_packet' устанавливается на сервере и клиенте. По умолчанию, это - 64КБ для сервера и 512КБ для клиента. Вы можете сменить размер буфера, запустив mysqld с опцией -O. Но помните, что это количество памяти будет выделяться каждому потоку! ПРИМЕР: mysqld -O max_allowed_packet=max_blob_length MySQL WIN95 ODBC драйвер определяет BLOB как LONGVARCHAR. Двоичные данные в BLOBSЕсли Вы вставляете двоичные данные в BLOB, Вы не должны применять следующие символов:
| ||||||||||||||||||||||||||||||||||||||||||
CREATE INDEX | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС:
ОПИСАНИЕ: В MySQL эта команда проверит был ли данный индекс создан, когда создавалась таблица. Она не создает индекс. Это предусмотрено по причинам совместимости. Если Вы хотите добавить, ключ используйте команду ALTER TABLE. | ||||||||||||||||||||||||||||||||||||||||||
DELETE | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС:
Здесь where_definition имеет формат: where_definition: where_expr or where_expr [AND | OR] where_exprwhere_expr имеет формат: where_expr: column_name [> | >= | = | <> | <= | < ] column_name_or_constant or column_name LIKE column_name_or_constant or column_name IS NULL or column_name IS NOT NULL or (where_definition) ОПИСАНИЕ: Удаляет записи из таблицы.
Замечания:
Вы должны иметь права доступа delete для удаления записей. | ||||||||||||||||||||||||||||||||||||||||||
DESCRIBE | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: (DESCRIBE | DESC) table [column] ОПИСАНИЕ: Описывает таблицу или столбец. Эта команда подобна команде SHOW. Факультативный параметр [column] может быть именем столбца или строкой. Если [column] - строка, он может содержать символы подстановки. | ||||||||||||||||||||||||||||||||||||||||||
DROP | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: DROP TABLE table_name [table_name ...] ОПИСАНИЕ: Удаляет (в оригинальной документации почему-то сказано, что роняет) одну или несколько таблиц. Если Вы хотите только удалить все данные в таблице и сохранить ее структуру для будущего повторного заполнения, Вы можете использовать команду DELETE. ОСТЕРЕГАЙТЕСЬ! DROP TABLE полностью удалит именованную таблицу(ы) из вашей системы. Не предусмотрено никакого UNDO или UNERASE (если Вы не имеете резервной копии, конечно). Вы должны иметь права доступа delete, чтобы использовать DROP. | ||||||||||||||||||||||||||||||||||||||||||
DROP INDEX | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: DROP INDEX index_name ОПИСАНИЕ: Эта команда ничего не делает. Чтобы удалить индекс, Вы должны использовать команду ALTER TABLE. DROP INDEX предусмотрен по причине совместимости. Это вводит в заблуждение некоторые клиенты, которые думают, что получили то, что они просили. Прежде всего это касается тупых ODBC драйверов. | ||||||||||||||||||||||||||||||||||||||||||
GRANT | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: GRANT (ALL PRIVILEGES | (SELECT, INSERT, UPDATE, DELETE, REFERENCES (column list), USAGE)) ON table TO user,... [WITH GRANT OPTION] ОПИСАНИЕ: Команда GRANT ничего не делает. Она всегда возвращает истину и нужна прежде всего, чтобы ввести в заблуждение некоторые прикладные программы, которые используют ODBC и думают, что команда GRANT, которую они выдали, что-то сделала. Вообще, ODBC такая библиотека, что для совместимости с ней предусмотрена не одна функция... См. главу Администрирование пакета для получения подробностей по поводу прав доступа в MySQL. | ||||||||||||||||||||||||||||||||||||||||||
SELECT | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: SELECT [STRAIGHT_JOIN] [DISTINCT | ALL] select_expression,... [FROM tables... [WHERE where_definition] [GROUP BY column,...] [ORDER BY column [ASC | DESC], ...] HAVING full_where_definition [LIMIT [offset,] rows] [PROCEDURE procedure_name]] [INTO OUTFILE 'file_name'... ] Здесь where_definition: where_definition: where_expr or where_expr [AND | OR] where_exprwhere_expr имеет формат: where_expr: column_name [> | >= | = | <> | <= | <] column_name_or_constant or column_name LIKE column_name_or_constant or column_name IS NULL or column_name IS NOT NULL or (where_definition) ОПИСАНИЕ: Оператор SELECT является краеугольным камнем всего языка SQL. Он используется, чтобы выполнить запросы к базе данных. Это действительно основа языка SQL. Для хорошего общего учебника о том, как работает SELECT, посмотрите http://w3.one.net/~jhoffman/sqltut.htm#Basics of the SELECT Statement. В MySQL версии меньше 3.21.x предложение WHERE очень ограничено. HAVING будет работать там, где предложение WHERE ничего не делает. Некоторые примеры, которые не работают в предложении WHERE - REGEXP и операторе !. В основном, Вы не можете использовать функции с WHERE, но Вы можете использовать функции с HAVING. HAVING по существу, WHERE применительно к результатам. Он используется главным образом для узкой области данных, возвращенных запросом. Вы должны иметь права select для использования SELECT. | ||||||||||||||||||||||||||||||||||||||||||
Функции | ||||||||||||||||||||||||||||||||||||||||||
select_expression может содержать следующие функции и операторы: | ||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||
select_expression может также содержать один или большее количество следующих математических функций | ||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||
select_expression может также содержать одну или больше следующих строковых функций | ||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||
И наконец несколько просто полезных функций, которые тоже можно применить в select_expression | ||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||
Групповые функции в операторе select: | ||||||||||||||||||||||||||||||||||||||||||
Следующие функции могут быть использованы в предложении GROUP:
Здесь MIN() и MAX() могут принимать строку или число в качестве аргумента. Эти функции не могут использоваться в выражении, хотя их параметр может быть выражением: ПРИМЕР: "SUM(value/10)" нормально, но вот "SUM(value)/10" уже нет!
| ||||||||||||||||||||||||||||||||||||||||||
Присоединения | ||||||||||||||||||||||||||||||||||||||||||
Свойство объединения SQL дает способность определить связи между таблицами и отыскивать) информацию, основанную на этих связях. Связи перечисляются в предложении FROM запроса SELECT. Каждая связь отделяется запятой. ПРИМЕР:
Этот запрос соединит таблицы db и user посредством поля user. Это распечатает что-то вроде следующего:
Первые два поля фактические db.user и db.delete_priv , последние два user.user и user.delete_priv. Обратите внимание, что мы используем имена таблицы в нашем запросе, чтобы определить точно, с какими полями мы работаем. Вы можете объединить до пятнадцати таблиц в одном объединении. MySQL не будет использовать ключи, чтобы соединить таблицы посредством полей, которые не имеют идентичный тип. Это означает, что Вы должны всегда использовать те же самые типы для полей, которые предназначены, для использования в объединениях. Псевдонимы могут также использоваться для имен столбца. См. детали в следующем разделе. | ||||||||||||||||||||||||||||||||||||||||||
Псевдонимы | ||||||||||||||||||||||||||||||||||||||||||
СУБД MySQL поддерживает концепцию псевдонимов для таблиц и полей. Псевдонимы для таблиц являются стандартной частью языка SQL. ПРИМЕР: SELECT A.user,A.select_priv,A.insert_priv,A.update_priv FROM user A В этом примере использован псевдоним таблицы, чтобы сократить ваш запрос, объявляя псевдоним, который короче имени таблицы. Вы используете псевдоним в первой части выбора, и определяете это в FROM, определяя реальное имя таблицы, пробел и псевдоним. Если Вы имеете больше чем одну таблицу, для которой Вы желаете создать псевдоним, просто добавьте запятую после каждой пары имя/псевдоним таблицы. Если Вы используете псевдонимы с запросом, который будет иметь предложение WHERE, Вы должны использовать псевдоним в предложении WHERE вместо реального имени таблицы. Псевдонимы для полей таблицы - специфическое для MySQL расширение. ПРИМЕР: SELECT user.user AS "User Name", user.delete_priv AS "Delete"
FROM user;
Хороший совет - брать псевдонимы в кавычки, в данном примере "Delete" вызвало бы ошибку синтаксического анализа при применение без кавычек. (Это потому, что DELETE является ключевым словом SQL. | ||||||||||||||||||||||||||||||||||||||||||
INSERT INTO | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: INSERT INTO table [(column_name, ...)] VALUES (expression,...) ||
ОПИСАНИЕ: Вставляет данные в таблицу.
ПРИМЕР: INSERT INTO Customer(customer_name,customer_contact) VALUES("Joes Wholesale","Joe Smith") Этот запрос создаст новую запись в таблице Customer, которая будет содержать автоматически сгенерированный customer_id, и значения, определенные в запросе. Все другие поля будут пустыми (NULL). Вы также можете использовать SELECT для копирования элементов из одной таблицы в другую. MySQL поддерживает ограниченную форму запросов sub, для выполнения этой возможности. Вы должны иметь права доступа insert для использования этой команды. | ||||||||||||||||||||||||||||||||||||||||||
LOAD DATA INFILE | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: LOAD DATA INFILE syntax ОПИСАНИЕ: Команды, для чтения данных из текстового файла. ПРИМЕР: LOAD DATA INFILE 'customer.tab' [REPLACE | IGNORE] INTO TABLE Customer [fields [terminated by ',' [optionally] enclosed by '"' escaped by '\\' ]] [lines terminated by '\n'] [(field list)] Для записи в текстовый файл используйте:
"fields terminated by" и "lines terminated by" могут быть больше, чем 1 символом. Если "fields terminated by" и "fields enclosed by" являются пустыми строками, то размер строки будет фиксированным. То есть, будет производиться чтение полей одной длины. С фиксированными значениями NULL для размера строки будут выводиться пустые строки. Если указаны "optionally" в "enclosed by" и Вы не используете фиксированный размер строк, только строки с этим символом будут включены в команду SELECT ... INTO. Если "escaped by" не пусто, то следующие символы будут снабжены префиксом: "escaped by", ASCII 0, и первый символ из "fields terminated by", "fields enclosed by" и "lines terminated by". Если использован REPLACE, новая строка заменит все строки, которые имеют тот же самый уникальный ключ. Если использован IGNORE, строки будут пропущен, если там уже существует запись с идентичным уникальным ключом. Если ни один из вышеупомянутых параметров не используется, будет выдана ошибка, и остальная часть textfile будет игнорироваться, если найден дублирующий ключ. Некоторые ситуации, которые не поддерживаются LOAD DATA INFILE:
Все строки читаются в таблицу. Если строка имеет слишком мало полей, остальная часть полей в таблице устанавливается в значения по умолчанию. По соображениям безопасности textfile должен находиться в каталоге баз данных или быть читаемым всеми. Если "FIELDS ENCLOSED BY" не пустое, то NULL читается как значение NULL. Если "FIELDS ESCAPED" не пустое, то \N тоже читается как значение NULL. Note Обратите внимание, что это БОЛЬШАЯ N, верхний регистр! Когда запрос LOAD DATA выполнен, Вы можете получить следующую строку информации, используя функцию C API mysql_info(). @result{Records: 1 Deleted: 0 Skiped: 0 Warnings: 0} Переменная Warnings увеличивается с каждым столбцом, который не может быть сохранен без потери точности, для каждого столбца, который не получал значение из строки текста при чтении (это случается, если строка слишком короткая) и для каждой строки, которая имеет большее количество данных чем может вписываться в данные столбцы. Вы должны иметь права доступа select и insert таблице user для использования этой команды. | ||||||||||||||||||||||||||||||||||||||||||
SET OPTION | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: SET OPTION SQL_VALUE_OPTON=value, ... ОПИСАНИЕ: Меняет или устанавливает опции MySQL. Опции действуют только в пределах текущего сеанса. MySQL поддерживает следующие опции (в этой версии пока одну):
| ||||||||||||||||||||||||||||||||||||||||||
UPDATE | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: UPDATE table SET column=expression,... WHERE where_definition Здесь where_definition: where_definition: where_expr or where_expr [AND | OR] where_exprЗдесь where where_expr имеет формат: where_expr: column_name [> | >= | = | <> | <= | < ] column_name_or_constant or column_name LIKE column_name_or_constant or column_name IS NULL or column_name IS NOT NULL or (where_definition) ОПИСАНИЕ: Обновляет одно или несколько полей в таблице MySQL.
ПРИМЕРЫ: UPDATE Widget_Table SET widgets_on_hand=widgets_on_hand - 300 where widget_id=3; Этот запрос вычтет 300 из значения widgets_on_hand для widget = 3. DELETE FROM Purchase_Order_Item WHERE purchase_order = 456 Этот запрос удалит все записи из Purchase_Order_Item, которые имеют значение 456 для purchase_order. Обратите внимание, что вообще Вы НИКОГДА не должны бы удалять данные из этого сорта базы данных. Вы создаете базы данных, чтобы следить за информацией, и даже плохая информация могла бы стать полезной в некотором случае. Гораздо лучше иметь некоторый тип кода состояния, который Вы используете, когда данные стали недопустимыми по каким-либо причинам. Вы также хотели бы удалять запись в Purchase_Order для purchase_order 456. Важно убедиться, что, когда Вы удаляете информацию, Вы избавляетесь от всех ссылок к этой информации. Иначе Вы закончите с разрушенной базой данных. Вы должны иметь права доступа update для использования этой команды. | ||||||||||||||||||||||||||||||||||||||||||
SHOW | ||||||||||||||||||||||||||||||||||||||||||
СИНТАКСИС: SHOW DATABASES [LIKE wild] ОПИСАНИЕ: Отображает информацию о базе данных MySQL. "wild" эквивалент регулярному выражению для SQL LIKE. ПРИМЕР:
Первые два поля довольно очевидны. Null будет содержать YES, если это поле может быть равным NULL, Key сообщает имеет ли это поле индекс, Default сообщает Вам значение по умолчанию, которое будет назначено этому полю, если там ничего не окажется после выполнения команды INSERT, Extra указывает другие атрибуты поля, такие как AUTO_INCREMENT, например. | ||||||||||||||||||||||||||||||||||||||||||
О строках | ||||||||||||||||||||||||||||||||||||||||||
Примеры правильных строк:
' в строке записывается как ''. " в строке записывается как "". Пример, чтобы прояснить ситуацию:
|