Игонин С.В. Практический MySQL пособие для быстрого старта для начинающих Саратов 2019 Практический MySQL. Пособие для начинающих. 2 Оглавление 1 Введение в Базы Данных ...........................................................................................................3 2 Нормализация БД. ......................................................................................................................4 1NF ..............................................................................................................................................5 2NF ..............................................................................................................................................6 3NF ..............................................................................................................................................6 Общее правило при проектировании БД (для начинающих) ................................................7 3 Регистрация БД на хостинге ......................................................................................................8 4 Скачивание MySQL ....................................................................................................................8 5 Подключение к БД через командную строку ..........................................................................8 6 Подключение к БД через MySQL Command Line Client ........................................................9 7 Основные команды MySQL .....................................................................................................10 7.1 Создание таблицы..............................................................................................................10 7.2 Вставка строки в таблицу (добавление записей) ............................................................11 7.3 Удаление строки из таблицы. ...........................................................................................11 7.4 Выборка строк из таблицы ...............................................................................................11 7.4.1 Простой SELECT по одной таблице. ........................................................................11 7.4.2 Сложный SELECT по трем таблицам с вложенным SELECT. ...............................12 7.4.3 Разновидности JOIN ...................................................................................................14 7.5 Изменение значений в ячейках таблицы .........................................................................15 8 Дамп и Восстановление ...........................................................................................................15 Практический MySQL. Пособие для начинающих. 3 1 Введение в Базы Данных База данных (БД) – это информационная модель, позволяющая упорядоченно хранить данные о группе объектов, обладающих одинаковым набором свойств. Информация в БД хранится в упорядоченном виде. Например, записная книжка, классный журнал, библиотечный каталог. Система управления базами данных (СУБД) – программа, позволяющая выполнять операции с БД и, хранимой в ней информацией: создание, изменение, извлечение (данных), удаление. Типы БД: 1. Иерархическая – один элемент главный, остальные подчиненные. Присутствует связь между элементами по вертикали. Например, дерево каталогов файловой системы, список населенных пунктов страны (страна > область > город > район) 2. Сетевая БД – помимо вертикальных, можно устанавливать и горизонтальные связи. 3. Реляционная БД (англ. Relation – отношение, связь) – совокупность связанных между собой таблиц. Для каждого столбца реляционной БД задан тип. В столбце всегда хранятся значения одного типа. Запись – одна строка таблицы с данными. Поле – значение, хранимое в столбце записи (грубо говоря, это ячейка таблицы). Практический MySQL. Пособие для начинающих. 4 2 Нормализация БД. Целью нормализации БД является устранение недостатков структуры базы данных, приводящих к избыточности, которая, в свою очередь, потенциально приводит к различным аномалиям и нарушениям целостности данных. Но прежде познакомимся с понятием Ключ. 1. Первичный ключ – столбец, в полях которого значения уникальны (не повторяются) для каждой записи в таблице. 1.1 Простой ключ (следует из логики БД) – ИНН, СНИЛС, номер читательского (плохой пример) 1.2 Составной – состоит из двух и более столбцов (Фамилия Имя в БД класса школы, плохой пример) 1.3 Уникальный номер – например, числовой ID (см. VK) или GUID (универсальный в глобальном масштабе Вселенной) 2 Вторичный (внешний) ключ – устанавливается для столбцов в подчиненной таблице и указывает на один из столбцов в главной таблице (обычно на первичный). Нормализация – процесс приведения к нормальной форме. Всего форм насчитывается по различным источникам от 8 до 10. Познакомимся с первыми тремя, что, на данный момент, достаточно для практических целей. 1NF – Атомарность значений (неделимость значения в каждом поле). В одном поле хранится одно значение. 2NF – Все неключевые поля не должны быть зависимы от первичного ключа. В таблице необходимо хранить данные, непосредственно связанные с ней и не имеющие отношения к другой сущности. Данная форма решает вопрос нахождения дублирующихся данных. Различные сущности необходимо выносить в отдельные таблицы. В других источниках, вторую форму относят к БД, в которых имеются составные ключи. Неключевые поля не могут зависеть от части составного ключа. Они должны зависеть от составного ключа как единого целого (сразу от всех столбцов ключа одновременно). 3NF – Отсутствуют неключевые поля, зависящие от других неключевых полей. Практический MySQL. Пособие для начинающих. 5 Проанализируем ненормализованную таблицу 1. Найдем, какая форма нормализации нарушена. И приведем к нормализованному виду. Таблица 1 LIBRARY title author reader_name Информатика Л.Л. Иванов, А. Ж. Петров Р.М. Сидоров Информатика Л.Л. Иванов, А. Ж. Петров А.Д. Капрал Математика А.Ж. Петров Р.М. Сидоров reader_address Саратовская обл., г. Саратов, Московская XX Саратовская обл., г. Энгельс, ул. Тельмана ХХ Саратовская обл., г. Саратов, Московская XX return_date 01.01.2021 01.01.2021 01.01.2021 1NF В столбце author в первой и второй строке в полях записано по два автора, что не удовлетворяет 1NF. Чтобы привести БД к 1NF вынесем информацию о книгах в отдельные таблицы. Обратите внимание на новый столбец id (Таблица 2), который мы добавили к каждой таблице. Это первичный ключ в виде уникального номера. Интересна таблица BOOK_AUTHOR, которая связывает таблицы BOOKS и AUTHORS. Отличный пример реляционности БД. Может показаться, что в этой таблице отсутствует столбец, хранящий первичный ключ. На самом деле он составной. Сочетание book_id – уникально для каждой строки данной таблицы. В свою очередь, данные author_id столбцы являются и вторичными ключами. Они внешние ключи по отношению к таблицам BOOKS и AUTHORS, соответственно. Таблица 2 id book_id 1 1 2 1 3 3 BOOKS LIBRARY reader_address Саратовская обл., Р.М. Сидоров г. Саратов, Московская XX Саратовская обл., А.Д. Капрал г. Энгельс, ул. Тельмана ХХ Саратовская обл., Р.М. Сидоров г. Саратов, Московская XX AUTHORS reader_name id title id 1 Информатика 2 Литература 3 Математика return_date 01.01.2021 01.01.2021 01.01.2021 BOOK_AUTHOR name book_id author_id 1 Л.Л. Иванов 1 1 2 К.К. Кононов 1 3 3 А. Ж. Петров 2 2 3 3 Практический MySQL. Пособие для начинающих. 6 2NF Столбцы reader_name, reader_address из таблицы 2 (LIBRARY) явно имеют отношение к другой сущности. Их необходимо вынести в отдельную таблицу. Можно сказать, что во 2NF все строки имеют уникальный номер ID. В неключевых полях отсутствуют повторяющиеся значения. Имеется ввиду, что по вертикали все данные различны. БД из таблицы 3 приведена к 2NF. Таблица 3 CREDITS id book_id reader_id return_date 1 1 1 01.01.2021 2 1 2 01.01.2021 3 3 1 01.01.2021 READERS id reader_name 1 Р.М. Сидоров 2 А.Д. Капрал 3 И.Э. Деканская state city Саратовская обл. Саратов address Московская XX Саратовская обл. Энгельс ул. Тельмана ХХ Пензенская обл. Books Authors Тарханы ул. К.Маркса ХХ Book_Author id title id name book_id author_id 1 Информатика 1 Л.Л. Иванов 1 1 2 Литература 2 К.К. Кононов 1 3 3 Математика 3 А. Ж. Петров 2 2 3 3 3NF В READERS столбцы state, city, address не зависят от конкретного читателя с его id (по данному адресу может проживать несколько читателей). Зато зависят друг от друга: адрес от города, город от области. Можно вынести области в отдельную таблицу STATES, указав для каждой области id. Города вынести в таблицу CITIES, в которой один столбец будет ссылаться на область. Тогда в таблице READERS в 3NF вместо двух столбцов state и city, будет один city_id. Нормализация – хорошо, но всему необходимо знать меру. Столбец address в таблице READERS оставим без изменений. Практический MySQL. Пособие для начинающих. 7 Общее правило при проектировании БД (для начинающих) Выделять в объеме имеющихся данных максимальное количество сущностей и выносить их в разные таблицы (в разумных пределах). Каждая строка таблицы имеет свой id (первичный ключ). Связь между таблицами осуществляется через эти id с использованием вторичных ключей (столбцы типа book_id, author_id). Практический MySQL. Пособие для начинающих. 8 3 Регистрация БД на хостинге Регистрируем БД с возможностью удаленного доступа, например, по ссылке https://www.db4free.net/signup.php Выписываем на листочек (впоследствии теряем его) данные для входа db name: **** login: **** password: **** server: db4free.net port: 3306 4 Скачивание MySQL Скачиваем и устанавливаем MySQL. https://dev.mysql.com/downloads/installer/ В данном установочном пакете содержится много утилит. При установке переключаемся на Custom Install и выбираем из списка необходимые утилиты. MySQLServer MySQLConnector / .NET После установки конфигурировать Server не обязательно, поскольку MySQL будет находиться на удаленном сервере. Нам понадобиться только утилита MySQL Command Line Сlient для подключения к БД на удаленном сервере. MySQL – это СУБД (SQL от англ. Structured Query Language – язык структурированных запросов). 5 Подключение к БД через командную строку Открываем командную строку: Window + R >> cmd Переходим в каталог, в котором располагается файл mysql.exe, с использованием команды cd: cd C:\Program Files\MySQL\MySQL Server 8.0\bin\ либо выполняем команду setx /MPATH "%PATH%; C:\Program Files\MySQL\MySQL Server 8.0\bin\ Практический MySQL. Пособие для начинающих. 9 Команда setx позволяет добавить директорию к переменной среды PATH. В PATH содержатся пути к директориям, в которых Windows автоматически пытается найти исполняемые файлы и библиотечные модули. Добавив путь к файлу mysql.exe в переменную среды PATH, мы избавимся от необходимости для запуска mysql.exe каждый раз переходить в каталог MySQL SERVER 8.0\bin\ с использованием команды cd. Если директория была добавлена в PATH, то команду cd C:\Program Files\MySQL\MySQL Server 8.0\bin\ можно не выполнять. 6 Подключение к БД через MySQL Command Line Client Открываем mysql.exe и передаем параметры для подключения к БД: mysql –u <user_name> -p –h db4free.net -u задает имя пользователя (login), здесь и далее треугольные скобки не пишутся, -p означает, что для подключения необходимо ввести пароль, -h задает имя сервера (host) (server). Прим.:расширение .exe можно не указывать. Вводим пароль, если подключение прошло успешно, откроется приложение mysql.exe в режиме командной строки. Теперь можно вводить команды MySQL. Прежде чем общаться с БД, ее необходимо выбрать. Поэтому первая команда: USE <database_name>; Следующая команда показывает все таблицы, имеющиеся в БД SHOW TABLES; Для выхода из mysql.exe необходимо выполнить команду exit. Практический MySQL. Пособие для начинающих. 10 7 Основные команды MySQL Изучение команд будем производить на примере создания и заполнения БД «Библиотека», которую можно представить следующей схемой первая строка – название таблицы, вторая строка – названия столбцов, третья строка – типы данных в столбцах. 7.1 Создание таблицы Для создания таблицы используется команда CREATE TABLE (записывается в одну строчку без переносов строк): CREATE TABLE IF NOT EXISTS readers( id INT AUTO_INCREMENT, name VARCHAR(255), surname VARCHAR(255), PRIMARY KEY(id) ); Ключевое слово AUTO_INCREMENT, означает, что, при добавлении к таблице новой строки, значение в поле столбца (id) заносится автоматически. Каждый раз при добавлении строки, это значение будет увеличиваться на единицу (инкремент). Таким образом, в столбце id будут отсутствовать повторяющиеся значения, что позволит однозначно идентифицировать строку. Ключевое слово PRIMARY KEY(id) означает, что значения в столбце id будут являться первичными ключами. Чтобы задать столбец в качестве вторичного ключа, через запятую после PRIMARY KEY указывают FOREIGN KEY(столбец_вторичного_ключа) внешняя_таблица(столбец_первичного_ключа). REFERENCES Практический MySQL. Пособие для начинающих. VARCHAR(255) 11 – тип данных для хранения символов. Число в скобках означает, под сколько символов будет выделена память для полей данного столбца. Нельзя создать таблицы с одинаковыми именами. Без фразы IF NOT EXIST, при попытке создать существующую таблицу, скрипт выдаст ошибку. Оставшиеся три таблицы создайте самостоятельно. 7.2 Вставка строки в таблицу (добавление записей) Запись – это информация, хранящаяся в таблице БД в виде строки. Вставка строки осуществляется командой INSERT INTO ... VALUES ... INSERT INTO readers(name, surname) VALUES(“Ivan”, “Pupkin”); Обратите внимание на порядок следования столбцов и добавляемых значений. Между ними имеется прямое соответствие. Столбец name стоит на первой позиции, значит, в столбец name будет записано первое значение из скобок VALUES (т.е. “Ivan”). Как и в языках программирования, строки записываются в двойных кавычках. В readers отсутствует столбец id, поскольку значения в его поля заносятся автоматически (AUTO_INCREMENT). 7.3 Удаление строки из таблицы. DELETE FROM readers WHERE id = 777; Удалит из таблицы readers все строки с id равным 777. 7.4 Выборка строк из таблицы 7.4.1 Простой SELECT по одной таблице. Стоит задача выбрать все книги автора c id равным 777: SELECT id, title FROM books WHERE author_id = 777; Практический MySQL. Пособие для начинающих. 12 7.4.2 Сложный SELECT по трем таблицам с вложенным SELECT. Стоит задача выбрать все книги, которые находятся у читателя Ivan Pupkin: SELECT b.id, b.title, a.name, a.surname FROM books AS b INNER JOIN credits AS c ON c.book_id = b.id INNER JOIN authors ON b.author_id = a.id WHERE c.reader_id IN( SELECT r.id FROM readers AS r WHERE r.name=”Ivan” AND r.surname=”Pupkin”); Когда в запросе участвуют несколько таблиц, название столбца указывается после имени таблицы через точку, например, books.id. Ключевое слово AS позволяет задать более короткое имя для соответствующей таблицы. Оператор JOIN объединяет несколько таблиц в одну временную таблицу. В неё включаются все строки из таблиц credits, authors, books, которые удовлетворяют условиям, указанным после ключевого слова ON. Сперва объединяется credits c books, затем к ним добавляется authors. Рассмотрим, как происходит выполнения запроса, на примере следующей БД После первого соединения INNER JOIN credits AS c ON c.book_id = b.id. к таблице books добавляются столбцы из таблицы credits. Объединяются строки, у которых значение id из таблицы books и значение book_id из таблицы credits совпадают Практический MySQL. Пособие для начинающих. 13 (b.id = c.book_id). Обратите внимание, что книга с id = 4 не добавляется, а некоторые книги присутствуют по несколько раз (поскольку их брали разные читатели). После второго соединения INNER JOIN authors ON b.author_id = a.id к таблице, получившейся после первого JOIN, добавляются строки из таблицы authors, у которых id совпадает с author_id. В результате соединения трех таблиц, получается следующая сводная таблица Вложенный SELECT определяет, что id читателя «Ivan Pupkin» равен двум. Из объединенной таблицы books-credits-authors выбираются строки, у которых reader_id = 2 Практический MySQL. Пособие для начинающих. 14 Выбираются столбцы, указанные после SELECT b.id, b.title, a.name, a.surname 7.4.3 Разновидности JOIN INNER JOIN. В примере выше, использовался INNER JOIN. Данный оператор объединяет строки, у которых значения в некоторых столбцах совпадают. Остальные строки отсекаются. SELECT FROM A INNER JOIN B ON <condition> На диаграмме Венна это соответствует пересечению множеств. Зеленым цветом показаны строки, которые будут выбраны в результате запроса. LEFT JOIN. Например, SELECT FROM A LEFT JOIN B ON <condition> выбираются все строки из таблицы A, к ней присоединяются строки из таблицы B, удовлетворяющие некоторому условию (на рисунке показаны темным цветом). Для строк, не соответствующих условию, вместо значений из таблицы B заносится значение NULL (на рисунке им соответствует светло-зеленая область). Практический MySQL. Пособие для начинающих. RIGTH JOIN. 15 Аналогично SELECT FROM A RIGHT JOIN B ON <condition> OUTER JOIN. Выбирается все, что не входит в INNER JOIN SELECT FROM A INNER JOIN B ON <condition> CROSS JOIN. Осуществляется связь всех строк со всеми, перекрестное соединение или декартово произведение. Обратите внимание на отсутствие условия. SELECT FROM A CROSS JOIN B 7.5 Изменение значений в ячейках таблицы Стоит задача изменить фамилию читателя c id = 2 (“Pupkin”) на “Surokin”. UPDATE readers SET surname = “Surokin” WHERE id = 2 8 Дамп и Восстановление Для создания резервной копии БД (дампа) используется специальная утилита mysqldump.exe (располагается в той же папке, что и mysql.exe). Перед этим необходимо выйти из приложения mysql, выполнив команду exit. mysqldump –u <user_name> -h <host_name> -p <database_name> > dump.sql Произойдет копирование всего содержимого БД database_name в файл dump.sql, находящий в той же папке, что и приложение mysqldump.exe. Восстановление БД из файла дампа dump.sql происходит при выполнении следующей команды mysql –u <user_name> -p –h <host_name> <database_name> < dump.sql