- •Белорусский национальный технический университет
- •Моделирование баз данных средствами Erwin
- •Методические указания по изучению языка sql
- •Запуск MySql
- •Ввод запросов
- •Запросы на создание и использование базы данных
- •I. Простые запросы на языке sql
- •II. Использование функций
- •III. Запросы, использующие соединения
- •IV. Группирование
- •V. Построение внешнего соединения
- •VI. Операторы манипулирования данными. Удаление данных
- •VII. Операторы манипулирования данными. Вставка данных
- •Учебная литература
- •Дополнительная литература
- •Задание 1
- •Варианты контрольных заданий
- •Задание 2
- •Задание 3( не нужно)
- •Утилита субд mysql Mysqldump
- •Синтаксис оператора create table
- •Синтаксис оператора alter table
- •Синтаксис оператора drop table, database
- •Синтаксис оператора update
- •Синтаксис оператора delete
- •Синтаксис оператора select
Запросы на создание и использование базы данных
Создать базу данных, при условии наличия необходимых прав, можно следующим образом:
mysql> CREATE DATABASE your_base;
При создании базы данных она автоматически не выбирается; выбирать ее нужно отдельно. Текущей базу можно cделать с помощью следующей команды:
mysql> USE your_base
Database changed
Создавать базу нужно только однажды, но выбирать ее приходится в каждом сеансе работы с mysql. Делать это можно с помощью команды USE, представленной выше. А можно выбирать базу и из командной строки при запуске mysql. Для этого достаточно лишь ввести ее имя после параметров соединения, которые нужно вводить в любом случае. Например:
shell> mysql -h host -u user -p your_base
Enter password: ********
Обратите внимание: в вышеприведенной команде your_base не является паролем. Ввести пароль в командной строке после параметра -p можно без пробела (например, -pmypassword, а не -p mypassword). Впрочем, пароль в командной строке все равно лучше не вводить, так как таким образом его могут и подсмотреть.
Эти операции, также как и другие, описанные в этом руководстве, доступны для использования в программе MySQL-Front(см. рис. 15).
Рис. 15. Создание БД в среде MySQL-front
После задания активной БД можно с помощью средств, предоставляемых программой, изменять структуру БД, вводить данные, задавать ключевые поля. Помимо этого можно в специально отведенном окне напрямую вводить инструкции, используя синтаксис языка SQL, как показано на рис. 16:
Рис. 16. Использование синтаксиса SQL
Будем исходить из того, что стоит задача реализовать базу данных поставщиков, деталей, изделий и поставок, таблицы которой описаны следующим образом (рис. 17):
Рис. 17. Концептуальная модель учебной базы данных
Структура новой таблицы определяется при помощи команды CREATE TABLE (см. Приложение С) и в нашем случае имеет вид
CREATE TABLE `j` (
`Jnum` varchar(6) NOT NULL default '',
`Jnam` varchar(20) default NULL,
`Ci` varchar(20) default NULL,
PRIMARY KEY (`Jnum`)
) TYPE=MyISAM;
CREATE TABLE `p` (
`Pnum` varchar(6) NOT NULL default '',
`Pnam` varchar(20) default NULL,
`Co` varchar(20) default NULL,
`We` int(11) default NULL,
`Ci` varchar(20) default NULL,
PRIMARY KEY (`Pnum`)
) TYPE=MyISAM;
CREATE TABLE `s` (
`Snum` varchar(6) NOT NULL default '',
`Snam` varchar(20) default NULL,
`St` int(11) default NULL,
`Ci` varchar(20) default NULL,
PRIMARY KEY (`Snum`)
) TYPE=MyISAM;
CREATE TABLE `spj` (
`Snum` varchar(6) NOT NULL default '',
`Pnum` varchar(6) NOT NULL default '',
`Jnum` varchar(6) NOT NULL default '',
`Qt` int(11) default NULL,
PRIMARY KEY (`Snum`,`Pnum`,`Jnum`)
) TYPE=MyISAM;
Создав таблицу, нужно позаботиться об ее заполнении. Для этого предназначены команды LOAD DATA и INSERT.
Так как Вы начинаете работу с пустой таблицей, заполнить ее будет проще всего, если создать текстовый файл, содержащий по строке на каждую вводимую строку таблицы, а затем загрузить его содержимое в таблицу одной командой.
Создайте текстовый файл с именем `data.txt', содержащий по одной записи в каждой строке (значения столбцов должны быть разделены символами табуляции и даны в том порядке, который был определен командой CREATE TABLE). Незаполненным полям (например, неизвестный статус или город) можно присвоить значение NULL. В текстовом файле это значение представляется символами \N.
Загрузить файл `data.txt' в таблицу можно с помощью следующей команды:
mysql> LOAD DATA LOCAL INFILE "data.txt" INTO TABLE S;
В результате получим заполненную таблицу.
Snum |
Snam |
St |
Ci |
S1 |
Smit |
20 |
Лондон |
Маркер конца строки и символ, разделяющий значения столбцов, можно специально задать в команде LOAD DATA, но по умолчанию используются символы табуляции и перевода строки. Воспринимая их, команда сможет корректно прочитать файл `data.txt'.
При добавлении одиночных записей используется команда INSERT. В самом простом варианте ее применения необходимо задать значения каждого столбца в том порядке, в каком они были перечислены в команде CREATE TABLE. Предположим, появилось новое оборудование. Соответствующую запись в таблицу J можно внести с помощью команды INSERT примерно так:
mysql>insert into J (Jnum, Jnam, Ci) values ('J1','Жесткий диск','Париж');
или
mysql>insert into J values ('J1','Жесткий диск','Париж');
В случае если Вы вставляете данные во все поля таблицы, то их перечислять не обязательно.
Обратите внимание на то, что здесь строковые выражения и даты представлены в виде ограниченных кавычками строк. Кроме того, в команде INSERT отсутствующие данные можно прямо заменять на NULL. Пользоваться эвфемизмом \N, как в команде LOAD DATA, нужды нет.
Этот пример наглядно показывает, что если бы с самого начала все данные вносились в базу при помощи нескольких команд INSERT, а не одной команды LOAD DATA, то набирать пришлось бы гораздо больше текста.
Общие инструкции для использования этих операторов приведены ниже.
INSERT INTO |
Вставляет данные в таблицу |
Синтаксис:
INSERT INTO table [(column_name, ...)] VALUES (expression,...) ||
INSERT INTO table [(column_name, ...)] SELECT ...
LOAD DATA INFILE |
Команды для чтения данных из текстового файла |
Синтаксис:
LOAD DATA INFILE syntax
Пример:
LOAD DATA INFILE Customer.tab' INTO TABLE Customer
Для записи в текстовый файл используйте
SELECT ... INTO OUTFILE 'customer.tab' fields terminated by
',' enclosed by '"' escaped by '\\' lines terminated by '\n' .
“fields terminated by” |
Имеет значение по умолчанию \t |
“fields [optionally] enclosed by” |
Имеет значение по умолчанию " |
“fields escaped by” |
Имеет значение по умолчанию '\\' |
“lines terminated by” |
Имеет значение по умолчанию '\n' |
“fieldsterminatedby” и “linesterminatedby” могут быть больше чем одним символом.
Если “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:
Фиксированные размеры строк (“FIELDS TERMINATED BY” и “FIELDS ENCLOSED BY” являются пустыми) и поля BLOB.
Разделитель, являющийся префиксом другого разделителя.
“FIELDS ESCAPED BY” пустое и данные содержат один или несколько разделителей.
Все строки читаются в таблицу. Если строка имеет слишком мало полей, остальная часть полей в таблице устанавливается в значения по умолчанию.
По соображениям безопасности textfile должен находиться в каталоге баз данных или быть читаемым всеми.
Если “FIELDS ENCLOSED BY” не пустое, то NULL читается как значение NULL. Если “FIELDS ESCAPED” не пустое, то \N тоже читается как значение NULL. Когда запрос LOAD DATA выполнен, Вы можете получить следующую строку информации, используя функцию C API mysql_info():
@result{Records: 1Deleted: 0Skiped: 0Warnings: 0}
Переменная Warnings увеличивается с каждым столбцом, который не может быть сохранен без потери точности для каждого столбца, который не получал значение из строки текста при чтении (это случается, если строка слишком короткая), и для каждой строки, которая имеет большее количество данных, чем может вписываться в данные столбцы.
Вы должны иметь права доступа select и insert в таблице user для использования этой команды. После выбора способа заполнения необходимо воспользоваться операторами языка для достижения необходимого содержания таблиц базы данных. В нашем случае предполагается получить следующее содержание:
Таблица поставщиков (S)
Hомеp_поставщика |
Фамилия |
Рейтинг |
Гоpод |
S1 |
Смит |
20 |
Лондон |
S2 |
Джонс |
10 |
Париж |
S3 |
Блейк |
30 |
Париж |
S4 |
Кларк |
20 |
Лондон |
S5 |
Адамс |
30 |
Афины |
Таблица деталей (P)
Номер детали |
Название |
Цвет |
Вес |
Гоpод |
P1 |
Гайка |
Красный |
12 |
Лондон |
P2 |
Болт |
Зеленый |
17 |
Париж |
P3 |
Винт |
Голубой |
17 |
Рим |
P4 |
Винт |
Красный |
14 |
Лондон |
P5 |
Кулачок |
Голубой |
12 |
Париж |
P6 |
Блюм |
Красный |
19 |
Лондон |
Таблица поставок (SPJ)
Номер поставщика |
Номер детали |
Дата поставки |
Количество |
S1 |
P1 |
02/01/95 |
300 |
S1 |
P2 |
04/05/95 |
200 |
S1 |
P3 |
05/12/95 |
400 |
S1 |
P4 |
06/15/95 |
200 |
S1 |
P5 |
07/22/95 |
100 |
S1 |
P6 |
08/13/95 |
100 |
S2 |
P1 |
03/03/95 |
300 |
S2 |
P2 |
06/12/95 |
400 |
S3 |
P2 |
04/04/95 |
200 |
S4 |
P2 |
03/23/95 |
200 |
S4 |
P4 |
06/17/95 |
300 |
S4 |
P5 |
08/22/95 |
400 |
Замечания. В целях большей наглядности, при записи запроса на языке SQL, для создания полей таблиц использованы обозначения на русском языке.
После того как таблицы БД созданы и наполнены данными, необходимо создать запросы согласно исходному заданию (см. Приложение A).