Wiki-учебник по веб-технологиям: MySQL/Операторы ...

Главная | |

Основные операторы языка SQL


Оглавление документа


Функции любой СУБД включают:

К первым двум функциям имеют доступ только администраторы СУБД или привилегированные пользователи. Рассмотрим, как решаются последние две задачи (на самом деле это семь задач).

Прежде чем что-либо делать с данными, нужно создать таблицы, в которых эти данные будут храниться, научиться изменять структуру этих таблиц и удалять их, если потребуется. Для этого в языке SQL существуют операторы CREATE TABLE, ALTER TABLE и DROP TABLE.

1. Оператор CREATE TABLE


Оператор CREATE TABLE создает таблицу с заданным именем в текущей базе данных. Правила для допустимых имен таблицы приведены в документации. Если нет активной текущей базы данных или указанная таблица уже существует, то возникает ошибка выполнения команды.

В версии Mysql 3.22 и более поздних имя таблицы может быть указано как имя_базы_данных.имя_таблицы. Эта форма записи работает независимо от того, является ли указанная база данных текущей.

В версии Mysql 3.23 при создании таблицы можно использовать ключевое слово TEMPORARY. Временная таблица автоматически удаляется по завершении соединения, а ее имя действительно только в течение данного соединения. Это означает, что в двух разных соединениях могут использоваться временные таблицы с одинаковыми именами без конфликта друг с другом или с существующей таблицей с тем же именем (существующая таблица скрыта, пока не удалена временная таблица). В версии Mysql 4.0.2 для создания временных таблиц необходимо иметь привилегии CREATE TEMPORARY TABLES.

В версии Mysql 3.23 и более поздних можно использовать ключевые слова IF NOT EXISTS для того, чтобы не возникала ошибка, если указанная таблица уже существует. Следует учитывать, что при этом идентичность структур этих таблиц не проверяется.

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

1.1. Синтаксис


CREATE [TEMPORARYTABLE [IF NOT EXISTS]
имя_таблицы [(определение_столбца,...)]
[опции_таблицы] [select_выражение]


В выражении определение_столбца перечисляют, какие столбцы должны быть созданы в таблице. Каждый столбец таблицы может быть пустым (NULL), иметь значение по умолчанию, являться ключом или автоинкрементом. Кроме того, для каждого столбца обязательно указывается тип данных, которые будут в нем храниться. Если не указывается ни NULL, ни NOT NULL, то столбец интерпретируется так, как будто указано NULL. Если поле помечают как автоинкремент (AUTO_INCREMENT), то его значение автоматически увеличивается на единицу каждый раз, когда происходит добавление данных в таблицу и в это поле записывается пустое значение (NULL, т.е. ничего не
записывается) или 0. Автоинкремент в таблице может быть только один, и при этом он обязательно должен быть проиндексирован.

1.2. Последовательность


AUTO_INCREMENT начинается с 1. Наличие автоинкремента является одной из особенностей Mysql. Формально описание столбца (определение_столбца) выглядит так:
имя_столбца тип [NOT NULL | NULL]
[DEFAULT значение_по_умолчанию]
[AUTO_INCREMENT][PRIMARY KEY]
[reference_definition]


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

Полный список типов смотрите в документации Mysql.

Вместо перечисления столбцов и их свойств в определении_столбца можно задавать списки ключевых и индексных полей, ограничения и проверки:

PRIMARY KEY (имя_индексируемого_столбца, ...)

или

KEY [имя_индекса] (имя_индексируемого_столбца,...)

или

INDEX [имя_индекса] (имя_индексируемого_столбца,...)

или

UNIQUE [INDEX] [имя_индекса]
(имя_индексируемого_столбца,...)

или

FULLTEXT [INDEX] [имя_индекса]
(имя_индексируемого_столбца,...)

или

[CONSTRAINT symbol]
FOREIGN KEY [имя_индекса]
(имя_индексируемого_столбца,...)
[reference_definition]

или

CHECK (expr)


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

имя_столбца [(длина_индекса)]
FOREIGN KEY, CHECK и REFERENCES на самом деле ничего не делают в Mysql. Они добавлены только для совместимости с другими SQL-серверами.

Поэтому на них мы останавливаться не будем.

Кроме всего перечисленного, при создании таблицы можно указать некоторые ее свойства (опции_таблицы), например такие:

И последний (опять же опциональный) элемент команды CREATE – это выражение SELECT (select_выражение). Синтаксис такой:
[IGNORE | REPLACE] SELECT ...
(любое корректное выражение SELECT)


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

Пример 10.1. Создание таблицы Persons

Mysql>CREATE TABLE Persons
(id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50), last_name
VARCHAR(100), death_date INT,
description TEXT, photo INT,
citienship CHAR(50DEFAULT 'Russia');


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

Показать все базы данных:

Mysql>SHOW databases;


Сделать текущей базу данных book и показать все таблицы в ней:

Mysql>use book;
Mysql>show tables;

Показать все столбцы в таблице Persons:

Mysql> show columns from Persons;

2. Оператор DROP TABLE


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

Синтаксис:

DROP TABLE [IF EXISTS] имя_таблицы
[, имя_таблицы,...]
[RESTRICT | CASCADE]


В версии Mysql 3.22 и более поздних можно использовать ключевые слова IF EXISTS, чтобы предупредить ошибку, если указанные таблицы не существуют.

Опции RESTRICT и CASCADE позволяют упростить перенос программы с других СУБД. В данный момент они не задействованы.

Mysql> DROP TABLE IF EXISTS Persons,
Artifacts, test;


Пример 10.2. Использование оператора DROP TABLE

3. Оператор ALTER TABLE


Оператор ALTER TABLE обеспечивает возможность изменять структуру существующей таблицы. Например, можно добавлять или удалять столбцы, создавать или уничтожать индексы или переименовывать столбцы либо саму таблицу. Можно также изменять комментарий для таблицы и ее тип.

Синтаксис:
ALTER [IGNORE] TABLE имя_таблицы
alter_specification
[, alter_specification ...]


Можно производить следующие изменения в таблице (все они записываются в alter_specification):
ADD [COLUMN] определение_столбца
[FIRST | AFTER имя_столбца ]
или
ADD [COLUMN] (определение_столбца,
определение_столбца,...)


Здесь, как и далее, определение_столбца записывается так же, как при создании таблицы.

ADD INDEX [имя_индекса] (имя_индексируемого_столбца,...) или ADD
PRIMARY KEY (имя_индексируемого_столбца,...) или ADD UNIQUE
[имя_индекса] (имя_индексируемого_столбца,...) или ADD FULLTEXT
[имя_индекса] (имя_индексируемого_столбца,...)


ALTER [COLUMN] имя_столбца {SET DEFAULT literal | DROP DEFAULT} или
CHANGE [COLUMN] старое_имя_столбца определение_столбца или
MODIFY [COLUMN] определение_столбца


DROP [COLUMN] имя_столбца
DROP PRIMARY KEY
DROP INDEX имя_индекса


RENAME [TO] новое_имя_таблицы


ORDER BY поле
или
опции_таблицы


Если оператор ALTER TABLE используется для изменения определения типа столбца, но DESCRIBE имя_таблицы показывает, что столбец не изменился, то, возможно, Mysql игнорирует данную модификацию по одной из причин, описанных в специальном разделе документации. Например, при попытке изменить столбец VARCHAR на CHAR Mysql будет продолжать использовать VARCHAR, если данная таблица содержит другие столбцы с переменной длиной.

Оператор ALTER TABLE во время работы создает временную копию исходной таблицы. Требуемое изменение выполняется на копии, затем исходная таблица удаляется, а новая переименовывается. Это делается для того, чтобы в новую таблицу автоматически попадали все обновления, кроме неудавшихся. Во время выполнения ALTER TABLE исходная таблица доступна для чтения другими клиентами.

Операции обновления и записи в этой таблице приостанавливаются, пока не будет готова новая таблица. Следует отметить, что при использовании любой другой опции для ALTER TABLE, кроме RENAME, Mysql всегда будет создавать временную таблицу, даже если данные, строго говоря, и не нуждаются в копировании (например, при изменении имени столбца).

Пример 10.3. Добавим в созданную таблицу Persons поле для записи года рождения человека:

Mysql> ALTER TABLE Persons
ADD bday INTEGER AFTER last_name;


Пример 10.3. Добавление в таблицу Persons поля для записи года рождения человека

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

Теперь разберемся, как делать то же самое с данными, которые в этих таблицах хранятся.

4. Оператор SELECT


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

Кроме того, оператор SELECT можно использовать для извлечения строк, вычисленных без ссылки на какую-либо таблицу. Например, чтобы вычислить, чему равно 2*2, нужно просто написать
Mysql> SELECT 2*2;

Упрощенно структуру оператора SELECT можно представить следующим образом:
SELECT select_выражение1, select_выражение2,
...
[FROM table_references
[WHERE where_definition]
[ORDER BY {число | имя_столбца |
формула}
[ASC | DESC], ...]]


Квадратные скобки [ ] означают, что использование находящегося в них оператора необязательно, вертикальная черта | означает перечисление возможных вариантов. После ключевого слова ORDER BY указывают имя столбца, число (целое беззнаковое) или формулу и способ упорядочения (по возрастанию – ASC, или по убыванию – DESC). По умолчанию используется упорядочение по возрастанию.

Когда в select_выражении мы пишем «*», это значит выбрать все столбцы. Кроме «*» в select_выражения могут использоваться функции типа max, min и avg.

Пример 10.4. Выбрать из таблицы Persons все данные, для которых поле first_name имеет значение 'Александр':

Mysql> SELECT * FROM Persons
WHERE first_name='Александр';


Пример 10.4. Использование оператора SELECT

Выбрать название и описание (title, description) артефакта под номером 10:
Mysql> SELECT title,description
FROM Artifacts WHERE id=10;

5. Оператор INSERT


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

Синтаксис:

[INTO] имя_таблицы [(имя_столбца,...)]
VALUES (выражение,...),(...),...
Эта форма команды INSERT вставляет строки в соответствии с точно указанными в команде значениями. В скобках после имени таблицы перечисляются столбцы, а после ключевого слова VALUES – их значения.

Например:

Mysql> INSERT INTO Persons
(last_name, bday) VALUES
('Иванов', '1934');

вставит в таблицу Persons строку, в которой значения фамилии (last_name) и даты рождения (bday) будут заданы соответственно как «Иванов» и
«1934».
[INTO] имя_таблицы [(имя_столбца,...)]
SELECT ...

Эта форма команды INSERT вставляет строки, выбранные из другой таблицы или таблиц.

Например:

Mysql> INSERT INTO Artifacts (author)
SELECT id FROM Persons
WHERE last_name='Иванов'
AND bday='1934';

вставит в таблицу Artifacts в поле «автор» (author) значение идентификатора, выбранного из таблицы Persons по условию, что фамилия человека Иванов.

Например:

Mysql> INSERT INTO Persons
SET last_name='Петров',
first_name='Иван';

Эта команда вставит в таблицу Persons в поле last_name значение «Петров», а в поле first_name – строку «Иван».

Форма INSERT... VALUES со списком из нескольких значений поддерживается в версии Mysql 3.22.5 и более поздних. Синтаксис выражения имя_столбца=выражение поддерживается в версии Mysql 3.22.10 и более поздних.

Действуют следующие соглашения.

Mysql> INSERT INTO имя_таблицы (col1,col2)
VALUES(15,col1*2);


Но нельзя указать:

Mysql> INSERT INTO имя_таблицы (col1,col2)
VALUES(col2*2,15);


Мы еще не обсудили три необязательных параметра, присутствующих во всех трех формах команды: LOW_PRIORITY, DELAYED и IGNORE.

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

Если в команде INSERT указывается ключевое слово IGNORE, то все строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут проигнорированы и не внесены в таблицу. Если не указывать IGNORE, то данная операция вставки прекращается при обнаружении строки, имеющей дублирующееся значение существующего ключа.

6. Оператор UPDATE


Синтаксис:
UPDATE [LOW_PRIORITY] [IGNORE] имя_таблицы
SET имя_столбца1=выражение1
[, имя_столбца2=выражение2, ...]
[WHERE where_definition]
[LIMIT число]


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

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

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

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

Mysql> UPDATE Persons
SET death_date=death_date+1;


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

Например, такая операция заменит в первой строке нашей таблицы экспонатов название title на строку «Ламповая ЭВМ»:
Mysql> UPDATE Artifacts
SET title='Ламповая ЭВМ' Limit 1;

7. Оператор DELETE


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

Если оператор DELETE запускается без определения WHERE, то удаляются все строки.

Синтаксис:

DELETE [LOW_PRIORITY] FROM имя_таблицы
[WHERE where_definition]
[LIMIT rows]


Например, следующая команда удалит из таблицы Persons все записи, у которых поле «год рождения» (bday) больше 2003:

Mysql> DELETE FROM Persons WHERE bday>2003;


Удалить все записи в таблице можно еще и с помощью такой команды:

Mysql> DELETE FROM Persons WHERE 1>0;


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

Mysql> DELETE FROM Persons;


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

В дистрибутив PHP входит расширение, содержащее встроенные функции для работы с базой данных Mysql. В этой лекции мы познакомимся с некоторыми основными функциями для работы с Mysql, которые потребуются для решения задач построения web-интерфейсов с целью отображения и наполнения базы данных. Возникает вопрос, зачем строить такие интерфейсы? Для того чтобы вносить информацию в базу данных и просматривать ее содержимое могли люди, не знакомые с языком запросов SQL. При работе с web-интерфейсом для добавления информации в базу данных человеку нужно просто ввести эти данные в html-форму и отправить их на сервер, а наш скрипт сделает все остальное. А для просмотра содержимого таблиц достаточно просто щелкнуть по ссылке и зайти на нужную страницу.

Для наглядности будем строить эти интерфейсы для таблицы Artifacts, в которой содержится информация об экспонатах виртуального музея информатики. В предыдущей лекции мы уже приводили структуру этой коллекции, а также ее связи с коллекциями описания персон (Persons) и изображений (Images). Напомним, что каждый экспонат в коллекции Artifacts описывается с помощью следующих характеристик:

Название и альтернативное название являются строками менее чем 255 символов длиной (т.е. имеют тип VARCHAR(255)), описание – текстовое поле (имеет тип TEXT), а в полях «автор» и «изображение» содержатся идентификаторы автора из коллекции Persons и изображения экспоната из коллекции Images соответственно.