В этом разделе мы рассмотрим язык структурированных запросов SQL и его применение для выполнения запросов к базам данных. На примере базы данных приложения Интернет-магазин мы покажем, как вставлять, удалять и обновлять данные, равно как и отправлять запросы в базу данных.
SQL — это аббревиатура от Structured Query Language (язык структурированных запросов). Он является стандартным языком для доступа к системам управления реляционными базами данных (СУРБД). SQL используется для сохранения данных в базе данных и последующего их извлечения из нее. Его применяют в таких системазх баз данных, как MySQL, Oracle, PostgreSQL, Sybase, Miccrosoft SQL Server и других.
Для SQL существует стандарт ANSI, и такие системы как MySQL используют этот стандарт. Конечно, не без того, чтобы добавить в них что-нибудь свое. Система привилегий MySQL — наглядный тому пример. Существует ряд незначительных различий между стандартным языком SQL и SQL системы MySQL. Некоторые из различий планируется устранить в последующих версиях MySQL, другие введены умышленно.
Наверняка доводилось слышать о языках определения данных (Data Definition Languages, DDL), которые используются для определения баз данных, и о языках манипулирования данными (Data Manipulation Languages, DML), применяемых для запросов баз данных. SQL обладает основами и тех, и других языков. DDL используется в самом начале установки базы данных.
Функции DML используется в SQL намного чаще, поскольку именно таким образом сохраняются и извлекаются реальные данные из баз данных.
Прежде чем всерьез приняться работать с базой данных, в ней необходимо сохранить какие-нибудь данные. Наиболее приемлемый способ предполагает использование оператора SQL INSERT.
Не забывайте, что СУРБД содержит таблицы, в которых, в свою очередь, находятся строки данных, организованные в столбцы. Каждая строка в таблице обычно описывает какой-либо реальный объект или отношение, а значения столбцов в этой строке хранят информацию о реальном объекте. Оператор INSERT можно использовать для внесения строк с данными в базу данных.
Типичная форма оператора INSERT выглядит так:
INSERT [INTO] table [(column1, column2, column3, ...)]
VALUES (value1, value2, value3, . . .) ;
Например, чтобы вставить запись в таблицу Customers базы данных Интернет-магазина, можно набрать:
insert into customers values
(NULL, "Сидоров Владимир", "ул. Гоголя 5 ", "Пушкин");
Как видите, мы заменили table реальным именем таблицы, в которую требуется внести данные, a values — необходимыми значениями. Значения в данном примере заключены в двойные кавычки. В MySQL строки в любом случае должны быть помещены в пару одинарных или двойных кавычек. (Мы будем использовать оба варианта.) Числа и даты в кавычках не нуждаются.
С оператором INSERT связано несколько интересных моментов.
Указанные значения будут использованы для того, чтобы заполнять столбцы таблицы по порядку. Если необходимо заполнить только отдельные столбцы, или если вы хотите сами указать их порядок — можно поместить список столбцов в ту часть оператора, которая относится к столбцам. Например:
insert into customers (name, city) values
("Пупкин Василий", "Гатчина");
Такой подход полезен, когда о какой-либо записи есть лишь частичная информация или если несколько полей записи необязательны. Аналогичного эффекта можно достичь, прибегнув к следующему синтаксису:
insert into customers
set name="Иванов Павел",
address="ул. Сталеваров 52",
city="Новгород";
Вы, вероятно, заметите, что, добавляя Сидорова Владимира, мы присвоили столбцу customerid нулевое значение (NULL), а при внесении других клиентов этот столбец просто игнорируется. Когда мы создавали базу данных, customerid был первичным ключом для таблицы Customers, так что это может показаться странным. В любом случае, поле было обозначено как AUTOINCREMENT. Это значит, что если вставить строку с нулевым значением или без значения, MySQL сгенерирует следующее число в автоинкрементной последовательности и вставит его автоматически. Это свойство может быть исключительно полезно.
В таблицу можно также вставлять несколько строк сразу. Каждая строка должна быть заключена в скобки, разделенные запятыми.
Для представления INSERT возможны лишь несколько вариантов. После слова INSERT можно указать LOW_PRIORITY или DELAYD. Ключевое слово LOW_PRIORITY означает, что система подождать и выполнить вставку позже, когда данные не будут читаться из таблицы. Ключевое слово DELAYD указывает, что вставляемые данные будут буферизироваться. Если сервер занят, вы сможете продолжать выполнять запросы, и не ожидать выполнение операции INSERT.
Непосредственно после LOW_PRIORITY или DELAYD можно указать необязательное ключевое слово IGNORE, которое означает, что при попытке вставки строк, которые вызывают дублирование уникальных ключей, эти строки просто игнорируются. Альтернатива такого поведения состоит в том, чтобы поместить в конце оператора INSERT конструкцию ON DUPLECATE KEY UPDATE выражение. Это может использоваться для изменения дублирования значения с помощью обычного оператора UPDATE.
Чтобы сказанное стало понятнее, заполним базу данных рядом простых примеров данных. Используемый для этого код представляет собой последовательность простых операторов INSERT, в которых используется описанный выше подход вставки нескольких строк.
SQL-код для заполнения данными таблиц БД Интернет-магазина
C:\mysql\bin>chcp 1251
Текущая кодовая страница: 1251
C:\mysql\bin>mysql -u root -p
Enter password: *****
mysql> use books;
mysql> insert into customers values
-> (1, "Сидоров Владимир", "ул. Гоголя 5", "Пушкин"),
-> (2, "Пупкин Василий", "ул. Полевая 14/2", "Гатчина")
-> (3, "Иванов Павел", "ул.Сталеваров 52", "Новгород");
mysql> insert into orders values
-> (NULL, 3, 100.00, "2010-06-02"),
-> (NULL, 1, 300.00, "2010-06-15"),
-> (NULL, 2, 150.00, "2010-06-28"),
-> (NULL, 4, 350.00, "2010-07-04");
mysql> insert into books values
-> ("0-1-1", "Cмирнов В.И.", "Разработка веб-сайта с помощью РНР и MySQL", 300.00),
-> ("0-1-2", "Смирнов В.И.", "Используем Adobe Dreamweaver CS3", 000.00),
-> ("0-2-1", "Смирнов В.И.", "Основы веб-дизайна. Графический редактор Adobe Fireworks CS4", 300.00);
mysql> insert into order_items values
-> (1, "0-1-1", 1),
-> (2, "0-1-1", 2),
-> (2, "0-2-1", 1),
-> (3, "0-2-1", 1);
mysql> insert into book_reviews values
-> ("0-1-1", "Курс Разработка веб-сайтов с помощью РНР и MySQL написана понятно и является прекрастной методикой для начинающих веб-разработчиков по реализации первых веб-проектов на РНР.");