
00-tech-book
.pdf
MySQL
MySQL – самая известная и популярная СУБД (Система управления базами данных). Высокая популярность тесно взаимосвязана с бесплатностью продукта. Но по возможностям она не уступает платным аналогам, таким как Oracle или IBM DB2. Я даже знаю многие компании где помимо Oracle для менее официальных задач используют MySQL и она отлично справляется!
На позиции системного администратора/инженера знать MySQL никто не заставляет. Для этого есть целых две должности — разработчик БД и администратор БД. Чем занимается и первый, и второй я думаю понятно из названия. Но если все же освоить эту тему то это будет только ощутимым плюсом в вашем резюме. Меня очень часто спрашивали на собеседованиях, знаю ли я MySQL. Причем обычно требовалось знание только основ и опыт написания простых запросов. В большинстве случаев этого достаточно. Помните закон Парето ? Вот-вот, 20% знаний о MySQL покроют 80% ваших потребностей в этой технологии. Так давайте получим их.
Принцип работы
Раньше все данные хранились в обычных текстовых файлах. Но со временем, объем информации с которым стали работать становился все больше и больше. Появилась необходимость в получение к ней быстрого и удобного доступа. Появилась необходимость структурировать большой объем данных и производить там поиск.
MySQL — это клиент-серверное приложение. То есть где-то запущена программа-сервер а вы как клиент подключаетесь к ней, делаете специально
сформированный запрос и получаете результат в виде набора данных.
Данные в базе хранятся в двухмерном массиве, примерно вот так, как в примере ниже.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Имя |
|
|
|
|
|
|
Фамилия |
|
|
|
|
|
Телефон |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
Александр |
|
|
Иванов |
|||||||||||||||||||||
|
|
|
|
|
|
|
|
111-22-33 |
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
Федор |
|||||||||||||||||||||||
|
|
|
|
|
|
Емельянин |
||||||||||||||||||
|
|
|
|
|
|
|
|
222-33-11 |
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
Сергей |
|
|
|||||||||||||||||||||
|
|
|
|
|
|
Петров |
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
333-22-11 |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
И подобных данных может быть очень много. Запросы к базе осуществляются с помощью SQL-запросов.
Модуль 11. MySQL. |
|
121 |
|
|

SQL(Structured Query Language) — язык структурированных запросов, не путать с СУБД.
Принцип работы с БД прост. Создается база данных, в ней создаются таблицы с нужными типами данных и размерами. Таблицы заполняются данными. Далее к ним делают запросы, чтобы извлечь, добавить, модифицировать или удалить данные.
Для однозначного определения строки в таблице используется так называемый первичный ключ. Обычно это номер, который уникален для каждой записи. Обозначается он как PRIMARY KEY.
Команды принято набирать заглавными буквами.
Пример роли MySQL в информационном пространстве
СИС – это справочно-информационная система, по сути это обычно вебсайт, данные которого хранятся в базе MySQL.
Типы данных
Все данные хранятся в определенном формате, который принято называть типом данных. Типы данных бывают разные, числовые – хранят числа, строковые – хранят наборы символов (слова, целые предложения) и
|
122 |
|
Модуль 11. MySQL. |
|
|
|
|

бинарные – хранят бинарные данные, такие как графические картинки. Тип данных нужно выбирать исходя из своих потребностей.
Числа
TINYINT – очень маленькое целое число, может быть от -128 до 127 или от 0 до 255
SMALLINT – малое целое число, может быть от -32768 до 32767 или от 0 до 65535
MEDIUMINT – целое число среднего размера, может быть от -8388608 до 8388607 или от 0 до 16777215
INT – целое число нормального размера, может быть от -2147483648 до 2147483647 или от 0 до 4294967295
BIGINT – большое целое число, может быть от -9223372036854775808 до 9223372036854775807 или от 0 до 18446744073709551615
FLOAT – малое число с плавающей точкой обычной точности. Может быть от -3.402823466E+38 до -1.175494351E-38, 0, и от 1.175494351E-38 до 3.402823466E+38.
DOUBLE - число с плавающей точкой удвоенной точности нормального размера.Можетбытьот-1,7976931348623157E+308до-2,2250738585072014E- 308, 0, и от 2,2250738585072014E-308 до 1,7976931348623157E+308
Символы
CHAR – до 255 символов, пустота заполняется пробелами
VARCHAR – строка переменной длины, для хранения величин типа VARCHAR используется только то количество символов, которое нужно + 1 байт для хранения информации о длине
Бинарные данные
BLOB – этот тип данных содержит бинарные данные, например графические картинки. Максимальная размер BLOB – 65535 байт.
MEDIUMBLOB – тоже самое что и BLOB, только максимальный размер - 16,777,215 байт (16 МБ)
LONGBLOB – бинарный тип, размер до 4 Гб.
Тип данных для хранения даты и времени
DATE – поддерживает диапазон от '1000-01-01' до '9999-12-31'
Модуль 11. MySQL. |
|
123 |
|
|
|

DATETIME – содержит комбинацию даты и времени. Может быть от '1000-01- 01 00:00:00' до '9999-12-31 23:59:59'
TIMESTAMP – содержит время в секундах начиная с 1970-01-01. Может быть от '1970-01-01 00:00:01' UTC до '2038-01-09 03:14:07' UTC
TIME – Время. Диапазон от '-838:59:59' до '838:59:59'
YEAR[(2|4)] – год в двухзначном или четырехзначном формате. В четырехзначном может быть от 1901 до 2155, и 0000. В двухзначном может быть от 70 до 69, воспроизводя даты от 1970 до 2069.
Сколько нужно места под хранение типа данных ?
Числа
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Тип данных |
|
|
Сколько нужно места для хранения |
|
|
|||||||||||||||
TINYINT |
|
|
|
|
|
|
|
|
1 |
байт |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
SMALLINT |
|
|
|
|
2 |
байта |
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
MEDIUMINT |
|
|
|
3 |
байта |
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
INT, INTEGER |
|
|
4 |
байта |
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
BIGINT |
|
|
|
8 |
байт |
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
байта если 0 <= p <= 24, 8 байт если 25 |
|
||||||
|
|
FLOAT(p) |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
<= p <= 53 |
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
FLOAT |
|
|
|
4 |
байта |
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
DOUBLE [PRECISION], REAL |
|
8 |
байт |
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Даты и время
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Тип данных |
|
Сколько нужно места |
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
DATE |
|
|
|
3 |
байта |
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
TIME |
|
|
|
|
3 |
байта |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
DATETIME |
|
|
8 |
байт |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
TIMESTAMP |
|
4 |
байта |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
YEAR |
|
1 |
байт |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Строки и бинарный тип
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Тип данных |
|
|
Сколько нужно места |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
CHAR |
|
|
M × w байт, 0 <= M <= 255, где w – нужное число байт |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
для объекта |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
VARCHAR |
|
L + 1 байт если значение требует до 255 байт, L + 2 |
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
байт если требуется больше чем 255 байт |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
|
Модуль 11. MySQL. |
|
|
|

|
|
|
|
|
|
|
|
|
|
|
BLOB |
|
|
|
|
L + 2 байт, где L < 216 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
MEDIUMBLOB |
|
L + 3 байт, где L < 224 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
LONGBLOB |
|
L + 4 байт, где L < 232 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
M – декларированная длина ячейки, L – актуальная длина ячейки
Лучший источник о типах данных в MySQL 5.0 – это конечно же официальная документация: http://dev.mysql.com/doc/refman/5.0/en/data-types.html
Практика
Начнем осваивать MySQL но для начала поставим нужное ПО.
#yum -y install mysql-server
Теперь проверим статус базы
#/etc/init.d/mysqld status mysqld is stopped
База в выключенном состояние. Давайте ее запустим в первый раз.
#chkconfig mysqld on
#/etc/init.d/mysqld start
Initializing MySQL database: Installing MySQL system tables...
OK
Filling help tables...
OK
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h centos52 password 'new-password'
See the manual for more instructions.
Модуль 11. MySQL. |
|
125 |
|
|
|

You can start the MySQL daemon with:
cd /usr ; /usr/bin/mysqld_safe &
You can test the MySQL daemon with mysql-test-run.pl
cd mysql-test ; perl mysql-test-run.pl
Please report any problems with the /usr/bin/mysqlbug script!
The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at http://shop.mysql.com
[ OK ]
Starting MySQL: |
[ OK ] |
Запуская впервые БД мы увидели предупреждение о необходимости установить административный пароль. Попробуем получить доступ в интерфейс mysql без пароля.
# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.45 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
Мы без проблем попали внутрь и можем делать что хотим! Думаю вам не захочется чтобы кто-то еще получил доступ к Вашим данным. Поэтому мы сейчас поставим административный пароль.
# /usr/bin/mysqladmin -u root password ‘the_secret’
Готово. Проверяем что изменилось.
# mysql
|
126 |
|
Модуль 11. MySQL. |
|
|
|
|

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
Ошибка доступа! Это хорошо, это означает что уже не любой сможет попасть в базу. Теперь зададим команду mysql с ключом -p, То есть запросим строку ввода пароля, ключ -u позволяет задать пользователя под которым мы хотим
зайти. Но если ключ не задан будет использован root, То есть администратор сервера.
# mysql -p
<вводим наш пароль на MySQL, который мы ввели выше>
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.0.45 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
Выполним команду status, ее можно ввести сокращенно, То есть так: \s
Она нам покажет различную информацию о MySQL.
mysql> \s
--------------
mysql Ver 14.12 Distrib 5.0.45, for redhat-linux-gnu (i686) using readline 5.0
|
Connection id: |
12 |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Current database: |
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Current user: |
root@localhost |
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||
SSL: |
Not in use |
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|||||
Current pager: |
stdout |
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||
Using outfile: |
'' |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
||||
Using delimiter: |
; |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|||||||||
Server version: |
5.0.45 Source distribution |
|||||||||||||
|
|
|
|
|
|
|
|
|||||||
Protocol version: |
10 |
|
|
|
|
Модуль 11. MySQL. |
|
127 |
|
|
|

|
Connection: |
|
Localhost via UNIX socket |
||||||||
|
|
|
|
|
|
|
|
|
|
||
|
Server characterset: latin1 |
||||||||||
|
|
|
|
|
|
|
|
|
|||
|
Db characterset: latin1 |
||||||||||
|
|
|
|
|
|
|
|
||||
Client characterset: |
latin1 |
||||||||||
|
|
|
|
|
|
|
|||||
|
Conn. characterset: |
latin1 |
|||||||||
|
|
|
|
|
|
||||||
|
UNIX socket: |
/var/lib/mysql/mysql.sock |
|||||||||
|
|
|
|
|
|||||||
|
Uptime: |
19 min 51 sec |
Threads: 1 Questions: 26 Slow queries: 0 Opens: 12 Flush tables: 1 Open tab les: 6 Queries per second avg: 0.022
mysql>
Выход из монитора MySQL выполняется командой quite или просто \q
Справка по командам — команда help или просто \h
Посмотрим какие базы данных у нас есть
mysql> show databases;
+------------------------- |
+ |
|
|
| Database |
| |
-------------------------+ |
+ |
| information_schema |
| mysql |
| |
|
|
|
|
|
|
| test |
| |
|
|
-------------------------+ |
+ |
3 rows in set (0.00 sec)
Эти три базы стандартные, они всегда есть в новой инсталляции MySQL. Базу test можно удалить, это делается командой DROP DATABASE
mysql> DROP DATABASE test;
Query OK, 0 rows affected (0.00 sec)
|
128 |
|
Модуль 11. MySQL. |
|
|
|
|

Отлично мы поставили MySQL, задали на нее административный пароль, научились заходить и поняли как выполнять там команды. Продолжим.
Лучше всего обучение происходит на практике. Давайте поставим задачу. Создадим базу данных, создадим в ней две таблицы, занесем в них данные, создадим пользователя и сделаем его владельцем этой базы. Ну и в конце сделаем несколько SQL-запросов.
Создаем базу данных company, это делается командой CREATE DATABASE
mysql> CREATE DATABASE company;
Query OK, 1 row affected (0.00 sec)
Воспользовавшись командой \s мы заметим что поле Current database: является пустым. В этом поле отображается текущая база данных. Выбрав какую-то базу мы можем производить в ней манипуляции, например просматривать структуру таблиц и делать запросы.
Выберем нашу базу данных в качестве текущей, это делается командой USE
mysql> USE company;
Database changed
Просмотрим содержимое базы а именно ее таблицы
mysql> show tables;
Empty set (0.00 sec)
Пока пусто, исправим это. Создадим таблицу с сотрудниками нашей компании
mysql> CREATE TABLE users ( id INT(5) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(64), surname VARCHAR(64), age TINYINT(3), email VARCHAR(64), status VARCHAR(128)) DEFAULT CHARACTER SET UTF8;
Query OK, 0 rows affected (0.01 sec)
Отлично. Проверим, действительно ли таблица была создана.
Модуль 11. MySQL. |
|
129 |
|
|
|

Проверим, правильно ли описана наша таблица. Структуру таблицы можно посмотреть командой DESCRIBE
Таблица готова, теперь ее нужно заполнить.
mysql> INSERT INTO users VALUES('', 'Ivan', 'Petrov', '25', 'petrov@company.ru', 'work');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> INSERT INTO users VALUES('', 'Sergey', 'Malevin', '29', 'serg@company.ru', 'tourism');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> INSERT INTO users VALUES('', 'Fyodor', 'Karpin', '27', 'fyodor@company.ru', 'work');
Query OK, 1 row affected, 1 warning (0.01 sec)
Файл как источник запросов
Внимание! Вы можете все свои запросы к базе поместить в файл а потом выполнить его в помощью команды SOURCE. Создадим файл sourcefile.sql и поместим туда все наши запросы INSERT. Сам файл расположен в /root.
mysql>USE company;
|
130 |
|
Модуль 11. MySQL. |
|
|
|
|