Так как MySQL подчиняется стандарту ANSI SQL92, то описываемые SQL-команды можно использовать и в случае других серверов баз данных, не забывая, что они, возможно, используют другие диалекты SQL.
mysql — клиент для работы с сервером MySQL Если на вашей машине уже установлен сервер баз данных MySQL, то соединиться ним можно программой-клиентом mysql. В некоторых случаях вам понадобится указать пользователя сервера MySQL и его пароль. После ее запуска и успешного соединения с сервером появится строка приглашения для ввода команд серверу. Создать базу данных можно командой, если это разрешено пользователю, от имени которого вы соединились с сервером:
mysql> CREATE DATABASE catalog;
где catalog — имя вашей базы данных, которое мы будем использовать в дальнейшем. Использование прописных букв в командах SQL не является обязательным, но это облегчает их чтение и поиск ошибок в дальнейшем. Обратите внимание, что команды заканчиваются символом ";", который означает конец SQL-команды. С помощью команды
mysql> SHOW DATABASES;
можно посмотреть, какие базы данных есть на вашем сервере, и убедиться, что база данных catalog действительно создана. Теперь, когда у нас есть база для работы, надо ее сделать текущей, используя команду:
mysql> USE catalog;
Команды SQL можно хранить в отдельном файле Можно и дальше вводить команды в строке приглашения программы-клиента, но на этапе создания и проектирования базы данных гораздо удобнее создать файл с командами SQL — например, create.sql — и передавать его на исполнение программе-клиенту:
% mysql < create.sql
Проанализируйте таблицы на избыточность Давайте попытаемся создать простую базу данных для каталога товара, который можно описать следующими характеристиками: наименование товара, категория товара, количество на складе, цена за единицу, страна-производитель. Можно добавить и другие характеристики, но всегда нужно анализировать, насколько они необходимы, и нельзя ли их вычислить на основе уже существующих данных. В представленных данных выделим такую характеристику, как «наименование товара», которую можно считать индивидуальной для каждого товара, все остальные так или иначе можно связать с этой характеристикой. Среди других характеристик можно выделить категорию и страну-производителя, связь которых с «наименованием» можно описать как «один ко многим». Если для каждого наименования товара записывать полностью категорию и страну-производителя, то во многих строках информация будет дублироваться (то есть будет избыточной). Есть смысл создать две дополнительные таблицы, где хранить информацию о странах и категориях. При дальнейшей разработке, если понадобится ввести дополнительные характеристики, привязанные к странам и категориям, то изменения надо будет внести только в эти таблицы. Таким образом, в нашей базе данных будет три таблицы — одна основная и две вспомогательных.
Первой командой в нашем файле будет команда выбора базы данных USE catalog;, а следующие за ней команды будут создавать таблицы. Начнем с создания вспомогательных таблиц, чтобы при создании основной таблицы нам было на что ссылаться. Создать таблицу можно с помощью команды CREATE TABLE, но так как, скорее всего, мы будем запускать наш файл несколько раз, пока не создадим оптимальную структуры, то второй командой мы сначала проверим существование таблиц и удалим их в случае необходимости:
DROP TABLE IF EXISTS countries, categories, items;
где countries, categories, items — имена таблиц, которые мы будем создавать.
Теперь мы можем создавать необходимые нам таблицы и начнем со стран:
CREATE TABLE IF NOT EXISTS countries (
country_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
country_name VARCHAR(100) NOT NULL
);
Ключевые поля обеспечивают уникальность В команде создания таблице условно можно выделить несколько частей — саму команду на создание таблицы CREATE TABLE, проверку не-существования таблицы IF NOT EXISTS, название таблицы countries и в скобках — перечисление полей с их описанием. В описании полей на первом месте стоит его имя, а за ним — служебные слова, описывающие его; поля отделяются друг от друга запятыми. Название страны будет храниться в поле country_name, которое мы описали как VARCHAR(100), то есть символьное, длиной не более 100 символов; NOT NULL — означает, что отсутствовать значение у этого поля не может. Не путайте отсутствие значения — NULL, и значение поля — пустая строка «»: в действительности, возможность поля приобретать значение NULL ему нужна редко — например, она могла бы понадобиться в поле «дата смерти», когда надо как-то отобразить, что ее нет. Но у нас есть еще одно поле — country_id, описание которого гораздо сложнее, и информационного смысла для человека оно не несет. Это поле обеспечивает уникальность каждой записи в таблице, что позволяет точно ссылаться на каждую ее строку. Это поле, очевидно, должно быть описанием NOT NULL, ведь в поле, обеспечивающем уникальность, значение не может отсутствовать. Уникальность легко обеспечить, если каждое поле будет иметь разные числовые идентификаторы, поэтому мы описали его как TINYINT, то есть целочисленное поле с самым малым диапазоном, потому как количество стран вряд ли будет превышать число 256. Описанием UNSIGNED мы указываем, что нам будут не нужны отрицательные целые значения, и за счет этого мы увеличиваем диапазон значений больше нуля (если не указать, то диапазон значений будет от -128 до 127). Но что действительно обеспечивает нам уникальность этого поля, так это ключевое слово AUTO_INCREMENT. При добавлении каждой новой записи в таблицу значение поля с таким описанием устанавливается автоматически, увеличиваясь после занесения каждой записи на единицу. Так как именно это поле обеспечивает нам уникальность, то с помощью ключевого слова PRIMARY KEY мы определяем его как первичный ключ, и именно по нему будет осуществляться сортировка по умолчанию.
Теперь, когда есть таблица для стран, можно занести некоторые значения в нее, и следующей нашей командой будет INSERT — команда добавления строки в таблицу:
INSERT INTO countries (country_name) VALUES ("Россия"), ("Германия"), ("Франция");
Эта команда состоит из самой команды INSERT (вставить), указания, куда INTO countries, списка полей (countries) – если полей больше одного, они перечисляются через запятые — и значений, которые нужно вставить в строки таблицы, которые идут после VALUES; в скобках указываются значения для отдельных строк, строки перечисляются через запятые. Обратите внимание, что мы задаем только одно поле, значения для поля country_id будут устанавливаться автоматически. Таким же образом можно создать таблицу с категориями товара, только диапазон значений для уникального ключа зададим больше:
CREATE TABLE IF NOT EXISTS categories (
category_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
category_name VARCHAR(150) NOT NULL
); INSERT INTO categories (category_name) values ("Химия"), ("Игрушки"), ("Инструменты");
После создания вспомогательных таблиц можно перейти к созданию основной таблицы:
CREATE TABLE IF NOT EXISTS items (
item_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
item_name VARCHAR(255) NOT NULL,
category_id SMALLINT UNSIGNED NOT NULL,
item_price DECIMAL(6,2) NOT NULL,
item_quantity MEDIUMINT UNSIGNED NOT NULL,
country_id TINYINT UNSIGNED NOT NULL
);
Используйте подходящие типы полей Обратите внимание, что поля, содержащие информацию о странах и категориях, имеют такое же описание, как ключевые поля во вспомогательных таблицах. Для цены мы установили тип, более подходящий для описания денежных сумм, а также сделали диапазон значений количества товаров с хорошим запасом по максимальному значению — до 16777215 штук. Вставить данные в эту таблицу тоже не представляет сложности:
INSERT INTO items (item_name, category_id, item_price, item_quantity, country_id)
values ("Порошок", 1, 36.50, 284, 2), ("Кукла", 2, 149.99, 5, 1),
("Молоток", 3, 90.00, 500, 3);
Свести данные в одну таблицу очень легко База данных товара у нас создана. Но как теперь получить всю информацию о товаре, ведь она хранится в разных таблицах? Для проверки правильности ссылок в нашей базе данных последней командой в нашем файле можно сделать SQL-запрос, который легко выведет всю необходимую информацию:
SELECT i.item_name AS Name, cat.category_name AS Category, i.item_price AS Price,
i.item_quantity AS Quantity, c.country_name AS Country
FROM items AS i, categories AS cat, countries AS c
WHERE cat.category_id = i.category_id AND c.country_id = i.country_id;
Оператор SELECT, с помощью которого извлекается информация из базы данных, является одним из самых употребляемых в SQL-запросом и имеет очень большое количество возможностей для сортировок, группировок, фильтрации, объединения данных, и рассматривать его использование нужно отдельно.
Созданная нами база данных очень проста, в реальном проекте количество таблиц и характеристик в таблице будет гораздо больше, образуя сложную систему ссылок между ними. Созданный нами файл с SQL-запросами можно дополнять, проектируя и усложняя базу данных, а конечный результат использовать в скриптах PHP или Perl для создания таблиц базы данных и их наполнения на сервере провайдера.
Ссылки по теме
Статья получена: hostinfo.ru