Из теории нам пока будет достаточно минимальных представлений. Будем считать, что база данных это множество таблиц. Таблица состоит из строк (записей). Колонки (столбцы, поля) таблицы имеют определенное имя и тип.
Установка СУБД MySQL
- На koding.com достаточно
1kpm install mysql - В Ubuntu linux:
- Обновить списки пакетов
1sudo apt-get update
- Установить клиент, сервер и общие файлы СУБД MySQL
1sudo apt-get install mysql-server mysql-common mysql-client - Придумать и ввести пароль для главного пользователя root
- Если планируется дальнейшее программирование на PHP, то возможно придется установить соответствующее расширение
1sudo apt-get install php5-mysql1sudo service apache2 restart
- Запустить консоль MySQL
1mysql -u root -p
- Для выхода из клиента MySQL необходимо нажать комбинацию клавиш Ctrl+D
Детальнее с процессом установки можно познакомиться в этом подробном руководстве.
Создание базы данных
- Для просмотра существующих баз show databases;. Сейчас скорее всего существует только служебная база (или несколько) с инфраструктурой системы.
- Создадим базу данных для экспериментов test_base:
1create database test_base; - Удобнее сразу сообщить, что дальнейшие команды будут работать именно с этой базой данных. use test_base;
Создание пользователя
После запуска клиентской консоли можно давать СУБД различные команды от имени главного пользователя root. Но лучше создать контролируемого пользователя и без необходимости не использовать привилегированный доступ.
- Создадим на той машине, на которой запущена консоль нового пользователя со входом по паролю
1>create user 'stud'@'localhost' identified by 'my_secret_password';
- Созданный пользователь не обладает никакими правами — в некоторых системах он не может даже входить. Пользователю нужно предоставить необходимые права для работы в системе. Старайтесь делать это по минимуму:
1grant all on test_base.* to 'stud'@'localhost';
- Чтобы войти в СУБД с этим новым логином необходимо закрыть клиентскую консоль
Ctrl+D и снова запустить ее под другим пользователем:
1mysql -u stud -p
Создание таблиц
1 |
create table A(ID int, NAME varchar(25), GENDER bool); |
Вставка записей (строк) в таблицу
- insert into A values (1, 'Pushkin', True);
- insert into A values (2, 'Safo', False);
- Просмотреть список таблиц, чтобы убедиться, что таблица создана успешно
1show tables;
Простые запросы информации
- Получить значения всех полей всех строк
1select * from A;
- Получить значения ID и NAME из строк со значением true в поле GENDER
1select ID, NAME from A where GENDER = True;
Ключи
Если выполнить команду вставки несколько раз, то в нашей таблице появится несколько абсолютно одинаковых строк. Обычно это не желательно. Хотелось бы иметь возможность однозначно идентифицировать нужную строку по значению какого-либо поля. В нашем случае таким полем будет ID. Чтобы поручить СУБД следить за уникальностью значений этого поля и использовать эти значения как уникальные ключи строк при создании таблицы следует использовать модификатор PRIMARY KEY. Например, мы могли создать таблицу A так:
1 |
create table A(ID int PRIMARY KEY, NAME varchar(25), GENDER bool); |
Теперь попытка создать две строки с одинаковыми ID приведет к ошибке.
Поскольку у нас уже имеется таблица А, мы можем просто модифицировать ее добавив первичный ключ командой alter table:
1 |
alter table A add PRIMARY KEY (ID); |
<
blockquote>Детальнее с работой в MySQL можно познакомиться <a href=http://www.mysql.ru/docs/mysql-man-4.0-ru/tutorial.html» target=»_blank»>в этом подробном руководстве.
Связанные таблицы
Связывать таблицы друг с другом приходится практически всегда. Это делается при помощи FOREIGN KEY. Связывание проводят в тех случаях когда одна таблица ссылается на информацию из другой. Например, в таблице студентов в поле ВУЗ логично указать ссылку на таблицу ВУЗов. Делается это так:
- Создадим простую таблицу ВУЗов:
12345create table Universities (ID int PRIMARY KEY,NAME varchar(25),FOUNDATION int);12345create table Universities (ID int NOT NULL AUTO_INCREMENT PRIMARY KEY,NAME varchar(25),FOUNDATION int); - Вставим несколько записей в таблицу:
123456insert into Universities(Name, Foundation)values ('ONU I.I.Mechnikov', 1865);insert into Universities(Name, Foundation)values ('ONPU', 1918);insert into Universities(Name, Foundation)values ('SUNPU K.D.Ushynsky', 1817);
- Убедимся, что все хорошо. Команда
1select * from Universities; - Теперь создадим таблицу студентов, которая будет ссылаться на таблицу ВУЗов при помощи «чужого ключа» (FOREIGN KEY):
123456create table Students (ID int NOT NULL AUTO_INCREMENT PRIMARY KEY,NAME varchar(25),University int,FOREIGN KEY (University) REFERENCES Universities(ID));
- Добавим несколько студентов в таблицу:
12345678910insert into Students(Name, University)values ('Ivanov', 1);insert into Students(Name, University)values ('Petrov', 1);insert into Students(Name, University)values ('Sidorov', 3);insert into Students(Name, University)values ('Korolenko', 2);insert into Students(Name, University)values ('Romanenro', 3);
- Посмотрим, как согласуется информация в таблицах:
123select *from Students, Universitieswhere Students.university = Universities.ID;
Как видно из последней команды, связь таблиц никак не помогает в создании запросов. Зачем же нужно связывать таблицы. Во-первых, это позволяет избежать дублирования информации — нам ведь не хочется вводить всю информацию о ВУЗе для каждого его студента. Во-вторых, связанные таблицы позволяют задать поведение системы при изменении или удалении данных. Например, можно указать, что делать с информацией о студентах, если запись о ВУЗе где они учатся была удалена.
Теперь попробуйте разобраться в этом переводе с простым и понятным примером.
Достаточно полное описание синтаксиса команд SQL в редакции MySQL можно найти здесь.
Работа из программ на С++
Составим простой код для соединения с нашей базой данных
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <mysql.h> using namespace std; MYSQL mysql; int main( int argc, char *argv[] ) { <pre>[crayon-66e4b2c155460568720998 inline="true" ]mysql_init( &mysql ); if ( !mysql_real_connect(&mysql, "localhost", "root", "123", "test_base", 3306, NULL, 0)) { cout << "Connection error - " << mysql_error(&mysql) << endl; } else { cout << "Connection successed\n"; mysql_close( &mysql ); } return 0; |
}
Здесь мы предполагаем, что пароль пользователя root просто 123.
Для компиляции этой программы нужно предварительно установить библиотеки разработчика MySQL:
1 |
sudo apt-get install libmysqlclient-dev |
Потом при компиляции нужно будет указывать будет указывать путь к заголовочным файлам и библиотекам MySQL:
1 |
g++ mysql.cpp -I /usr/include/mysql -L /usr/mysql -lmysqlclient |
Подробнее о функциях mysql.h можно почитать здесь. Также можно почитать и полное руководство по MySQL, но лучше это отложить на потом.
Если еще остались силы, давайте разберем самый сложный пример — распечатка результатов работы SQL запроса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <mysql.h> using namespace std; MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; int main(){ unsigned int i = 0; if (!mysql_init (&mysql)) return 0; if (!(mysql_real_connect(&mysql,"localhost","root","123", "test_base", 3306 , NULL , 0))) return 0; if (mysql_select_db(&mysql,"test_base")) return 0; if (mysql_query(&mysql,"SELECT * FROM Students")) return 0; if (!(res = mysql_store_result(&mysql))) return 0; while((row = mysql_fetch_row(res))) { for (i = 0 ; i < mysql_num_fields(res); i++) cout << row[i] << "\t"; cout << endl; } if (!mysql_eof(res)) return 0; mysql_free_result(res); mysql_close(&mysql); } |
Надеюсь все помнят, что запускать откомпилированные программы нужно как-то так
1 |
./a.out |