Введение

У MySQL интересная история. Даже после покупки MySQL компанией Oracle и разделения, в результате которого возникла MariaDB, MySQL по-прежнему остается самой популярной системой управления реляционными базами данных (СУБД) с открытым исходным кодом для разработки программного обеспечения с открытым исходным кодом.

С обновлением MySQL 8.x мир SQL изменился к лучшему. Вы можете прочитать об этом здесь One Giant Leap For SQL: MySQL 8.0 Released. » Были даны ответы на произошедшие изменения - MySQL 5.7 vs MySQL 8.0 - Что нового в MySQL 8.0?

Но для тех из нас, кто задается вопросом, о чем идет речь, позвольте мне помочь вам набрать скорость. MySQL 5 был важным выпуском, поскольку он принес в MySQL такие корпоративные функции, как хранимые процедуры и триггеры. Теперь, когда большие данные летают повсюду, реляционные базы данных просто должны быть быстрее и эффективнее. NoSQL был ответом на получение большого количества данных для последующей сортировки. Для данных, которые уже структурированы, SQL по-прежнему является лучшим способом.

Сегодня, если кто-то не создает статический веб-сайт, веб-разработчик будет иметь дело с базами данных в определенный момент времени. Многие фреймворки и инструменты, такие как SQLAlchemy, абстрагируют базу данных от промежуточного программного обеспечения, в данном случае Python. Для Frontend-разработчиков: если вы прошли HTML5 / CSS3 / ECMAScript 6 или React / Vue концепции и войдете в Rails (Ruby) / Django (Python ) Угловые (JavaScript) веб-фреймворки, произойдет массовый сдвиг парадигмы. Но во многих случаях вы можете никогда не написать ни строчки SQL.

Я погрузился в Python, и Django стал моим основным инструментом для тех проектов, которые я делаю (с большим объемом данных). В то время (конец нулевых) я решил, что было бы неплохо понять, как я могу работать с базой данных, на случай, если моей ORM-структуре потребуется помощь. Итак, я придумал свои личные обучающие упражнения, чтобы затем ознакомиться с выбранной мной базой данных. Я думаю, что эта серия статей поможет следующей партии ниндзя баз данных.

Реляционная база данных

База данных - это хранилище данных в виде файлов или URL-адресов, по которым хранятся фактические данные. В своей базовой форме база данных может быть списком статей, связанных друг с другом одним или несколькими атрибутами. Например, список мужских имен и другой список свиданий.

Реляционная база данных (RDB) - это место, где список мужских имен может быть связан со списком дат. Пусть отношения между двумя списками будут днями рождения. Два списка будут помещены в таблицу в виде двух столбцов, а таблица будет называться «дни рождения». Эта таблица является реляционной базой данных. Как каждый выбирает для просмотра данных из него; например, сколько мужчин родилось в апреле или когда родился Джон, зависит от сделанных запросов.

MySQL часто выбирают веб-разработчики, которым требуется функциональность базы данных. Другие базы данных SQL, такие как PostgreSQL или Microsoft MSSQL Server, могут использовать немного другой синтаксис запросов, но показанные концепции проектирования реляционных баз данных все равно будут применяться.

В этой статье предполагается, что MySQL 5.x установлен на используемом компьютере или сервере, и используемый синтаксис будет работать в выбранном вами интерфейсе командной строки.

Я выбрал определенные имена для своей базы данных и таблиц, и я поддерживаю эту практику, поскольку она повышает безопасность, как? Хакерам сложнее угадать названия таблиц. Конечно, также должна быть надлежащая документация и контроль версий, о да, базы данных.

MySQL

Эта статья подойдет абсолютному новичку, чтобы начать возиться с базой данных MySQL. Если у вас нет установки на вашем localhost, получите установщик здесь - Загрузите MySQL Community Server.

Установка

У меня Mac OS X 10.11.6, так что вот мои инструкции по установке. Выполнив все инструкции, я открыл Терминал для запуска mysql. После новой установки команда mysql скрывается в /usr/local/mysql/bin. Создайте alias, чтобы вы могли легко вызывать команду. Вы можете работать как root, хотя лучше всего создать нового пользователя и войти в систему как новый пользователь. Я предполагаю, что вы знаете, как это сделать, и вошли в систему как зарегистрированный пользователь, а не как root. Чтобы узнать, кто это делает, ознакомьтесь с руководством.

Раньше КЛЮЧЕВЫЕ СЛОВА писались ЗАГЛАВНЫМИ буквами. Но теперь ключевые слова можно вводить в любом регистре. Итак, все это эквивалентно:

mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

Часть 1: Разработка RDB с использованием интерфейса командной строки

Я буду использовать строчные буквы для синхронизации с командами CLI (интерфейс командной строки). Давайте посмотрим, что у нас есть для баз данных:

mysql> show databases;
+ — — — — — — — — — — +
| Database            |
+ — — — — — — — — — — +
| information_schema  | 
| mysql               |
| performance_schema  |
| sys                 |
+ — — — — — — — — — — +
4 rows in set (0.00 sec)

Это базы данных по умолчанию, используемые mysql. В распечатках консоли для команды show databases я опущу эти конкретные базы данных.

База данных: Вакс Нома

Наша база данных будет содержать информацию об участниках компании, занимающейся веб-дизайном, об используемых ими технологиях, проектах, над которыми они работали по отдельности или совместно, а также о продолжительности проектов.

Выберите любое имя для своей базы данных, поскольку те, которые я использовал, могут быть абстрактными и иметь смысл на пиджине суахили, известном как Шэн.

Пусть дизайнерская компания будет называться Waks Noma. Итак, создаем базу данных по компании:

mysql> create database waks_noma;
Query OK, 1 row affected (0.00 sec)

Чтобы убедиться, что мы успешно создали таблицу:

mysql> show databases;
+ — — — — — — — — — — +
| Database            |
+ — — — — — — — — — — +
| waks_noma           |
+ — — — — — — — — — — +

i) Создание таблицы вакансий: majobo

Нам нужно решить, что мы будем настраивать как элемент базы данных, вокруг которого будет вращаться все остальное. Этому элементу мы даем «первичный идентификатор». Мы выбираем между дизайнером или элементом работы. Это обдумывание и во многих случаях вытягивание - это Проектирование схемы базы данных. К проектированию схемы следует относиться серьезно в начале разработки каждой базы данных. Это хорошая практика - планировать отношения между элементами в базе данных. В нашем случае мы хотим показать рабочие места, а затем дизайнеров на этих должностях. Таким образом, мы дадим заданиям первичный ключ.

В нашей первой таблице будут представлены работы, выполненные компанией Waks Noma.

mysql> use waks_noma;

А затем мы создаем таблицу majobo:

create table majobo (
 job_id int not null auto_increment primary key,
 job_name varchar(20) not null, job_desc text not null,
 job_pic_url varchar(255) not null
);

Мы запрашиваем базу данных, чтобы увидеть результаты,

mysql> show tables;

и получаем:

+ — — — — — — — — — — -+
| Tables_in_waks_noma  |
+ — — — — — — — — — — -+
| majobo               |
+ — — — — — — — — — — -+
1 row in set (0.00 sec)

Проверяем, выглядит ли таблица такой, какой мы ее хотим:

mysql> describe majobo;

Мы получили:

+ — — — — — — + — — - — — —- + — — -+ — — — — - - -+ — — — — — — — +
| Field       | Type         | Null | Key | Default | Extra        |
+ — — — — — - + — — — — — -— + — - -+ — - + — — - -+ — — — — — — — +
| job_id      | int(11)      | NO   | PRI | NULL   | auto_increment|
| job_name    | varchar(20)  | NO   |     | NULL   |               |
| job_desc    | text         | NO   |     | NULL   |               |
| job_pic_url | varchar(255) | NO   |     | NULL   |               |
+ — — — — — — -+ — — — — — — + — — — + — — -+ — — -+ — — — — — — — +
4 rows in set (0.02 sec)

Мы в деле!

ПРИМЕЧАНИЕ. Можно хранить изображения в базе данных MySQL, но это не рекомендуется из соображений скорости и стабильности. Вместо этого сохраните URL-адреса изображений и других носителей, как показано.

Загрузка таблицы со значениями

Есть два способа загрузить базу данных со значениями:

  • через приглашение оболочки
  • путем загрузки данных из текстового файла

Это не только для вставки данных, но и для удаления данных через приглашение оболочки. При загрузке данных через файл удаляются все предыдущие записи и вносятся исправления в файл, а данные загружаются снова. Если набор данных, вводимых через файл, велик и нужно внести изменения в одну запись, то это тоже можно сделать.

а) Вставить и удалить через приглашение оболочки

В реальном мире приглашение оболочки редко используется напрямую, если пользователь не добавляет одну или две нечетные записи. Однако по мере написания и выполнения файлов сценария MySQL эти инструкции будут находиться в файле сценария. Мы стилизуем код так, как если бы он был в файле сценария.

/*** INSERT sample data into majobo ***/
insert into majobo (job_name, job_desc, job_pic_url)
  values (‘The Warehouse’, ’Developing a comprehensive website that
  will deliver on all fronts. Client-side was developed in ReactJS.
  Server-side was developed Django REST API and incorporating some
  custom modules’, ‘https://www.waksnoma.ke/thewarehouse/'
);
/*** end INSERT ***/

Результат выглядит так, отформатированный под размер страницы:

mysql> select * from majobo;
+ — — — — + — — — — — — — -+ — — — — — — — — -+ — — — — — — — — — +
| job_id  | job_name       | job_desc         | job_pic_url       |
+ — — — — + — — — — — — — -+ — — — — — — — — -+ — — — — — — — — — +
| 1    | The Warehouse | Developing a comprehensive website that will deliver on all fronts. Client-side was developed in ReactJS. Server-side was developed Django REST API and incorporating some custom modules         | https://www.waksnoma.ke/thewarehouse/    |
+ — — — — + — — — — — — — -+ — — — — — — — — -+ — — — — — — — — — +
1 row in set (0.00 sec)

Вы заметите, что мы никогда не устанавливаем значение для job_id. Это показывает, что наша auto_increment работает как надо. Добавляем еще один набор данных:

/*** INSERT sample data into majobo ***/
insert into majobo (job_name, job_desc, job_pic_url)
  values (‘aim to succeed’,’This was a graphic design poster job
  that was to introduce the school open day. the client company has
  a group of schools’,
  ’https://www.waksnoma.ke/waks/aimingposter.jpg'
);
/*** end INSERT ***/

Это дает нам таблицу со следующими характеристиками:

mysql> select * from majobo;
+ - - - -+ - - - - - - - -+ - - - - - - - + - - - - - - - - - - - -+
| job_id | job_name       | job_desc      | job_pic_url            |
+ - - - -+ - - - - - - - -+ - - - - - - - + - - - - - - - - - - - -+
|      1 | The Warehouse  | Developing a comprehensive website that will deliver on all fronts. Client-side was developed in ReactJS. Server-side was developed Django REST API and incorporating some custom modules            | https://www.waksnoma.ke/thewarehouse/  |
|      2 | aim to succeed | This was a graphic design poster job that was to introduce the school open day. the client company has a group of schools   | https://www.waksnoma.ke/waks/aimingposter.jpg |
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
2 rows in set (0.00 sec)

Вопрос: что, если мы хотим вставить данные содержания, которые, особенно в описании, имеют апостроф ?

Давайте рассмотрим приведенный выше пример, чтобы проиллюстрировать это.

/*** INSERT sample data into majobo ***/
insert into majobo (job_name, job_desc, job_pic_url)
 values ("Aim to Succeed","This was a graphic design poster job that
 was to introduce the school's open day. The client company has a
 group of schools","https://www.waksnoma.ke/waks/aimingposter.jpg"
);
/*** end INSERT ***/

Обратите внимание, однако, что вместо одинарных кавычек для выделения данных в строки используются двойные кавычки. Таким образом, описание позволит без проблем ввести «… день открытых дверей школы…» в базу данных. Итак, в нашей базе данных теперь есть:

mysql> select * from majobo;
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
| job_id  | job_name     | job_desc      | job_pic_url             |
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
|       1 | The Warehouse | Developing a comprehensive website that will deliver on all fronts. Client-side was developed in ReactJS. Server-side was developed Django REST API and incorporating some custom modules      | https://www.waksnoma.ke/thewarehouse/        |
|       2 | aim to succeed | This was a graphic design poster job that was to introduce the school open day. the client company has a group of schools | https://www.waksnoma.ke/waks/aimingposter.jpg   |
|       3 | Aim to Succeed | This was a graphic design poster job that was to introduce the school's open day. The client company has a group of schools | https://www.waksnoma.ke/waks/aimingposter.jpg |
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
3 rows in set (0.00 sec)

ПРИМЕЧАНИЕ. Двойные кавычки работают так же, как одинарные кавычки при определении строк в данных. Это верно для ряда языков программирования и сценариев.

К сожалению, в таблице majobo есть две похожие записи, и их нужно удалить. Мы удалим записи id=2 и id=3.

mysql> delete from majobo where job_name = ‘Aim to Succeed’ order by job_id limit 2;

Результат:

mysql> select * from majobo;
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
| job_id | job_name      | job_desc      | job_pic_url             |
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
|      1 | The Warehouse | Developing a comprehensive website that will deliver on all fronts. Client-side was developed in ReactJS. Server-side was developed Django REST API and incorporating some custom modules | https://www.waksnoma.ke/thewarehouse/ |
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +

Чтобы очистить всю таблицу, используйте следующую команду:

mysql> delete from majobo;

Проверка таблицы:

mysql> select * from majobo;
Empty set (0.00 sec)

Сброс AUTO_INCREMENT

Поскольку мы удалили все данные из таблицы, нам нужно сбросить наш auto_increment, чтобы сохранить целостность данных.

mysql> alter table majobo auto_increment = 0;
Query OK, 0 rows affected (0.14 sec)
Records: 0 Duplicates: 0 Warnings: 0

б) Вставить данные из файла

Данные, которые нужно поместить в majobo, могут быть загружены из файла в удаленном месте или с локального диска.

Вот вид нашего текстового файла в виде обычного текста со значениями, разделенными табуляцией.

В зависимости от того, где находится файл на вашем локальном диске, наши инструкции по его загрузке следующие:

mysql> load data local infile ‘[absolute_path]/mawaks.txt’ into table majobo;
Query OK, 4 rows affected, 4 warnings (0.00 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0

Наша таблица теперь выглядит так:

mysql> select * from majobo;
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
| job_id | job_name      | job_desc      | job_pic_url             |
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
|      1 | The Warehouse  | The client is an art and entertainment facilitator. The web space was required to showcase the various groups that they are involved with. It is a multimedia site with blogs and comments.  | https://www.waksnoma.ke/waks/thewarehouse/  |
|      2 | Aim to Succeed | This was a graphic design poster job that was to introduce the school open day. The client company has a group of schools and the poster was to be put up in selected shopping centers and malls. |
https://www.waksnoma.ke/waks/aimingposter.jpg |
|      3 | Oiling Life    | The client is an established petroleum company that needed a company brochure of all their lubricating products. The brochure was to be given to the company's service stations and car speciality shops.  |
https://www.waksnoma.ke/waks/oilinglife.pdf   |
|      4 | Dying to Give  | The main piece was a video documentary on the state of organ donation in East Africa and what needs to be done to make sure that the awareness is raised of this selfless giving. The client is a major cardiological hospital. | https://www.waksnoma.ke/waks/dyingtogive.mov  |
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
4 rows in set (0.00 sec)

Возвращаясь к нашему заданию, давайте расположим нашу таблицу так, чтобы мы могли видеть ее дизайн.

mysql> describe majobo;
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
| Field       | Type         | Null | Key | Default | Extra        |
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
| job_id      | int(11)      | NO   | PRI | NULL  | auto_increment |
| job_name    | varchar(20)  | NO   |     | NULL    |              |
| job_desc    | text         | NO   |     | NULL    |              |
| job_pic_url | varchar(255) | NO   |     | NULL    |              |
+ - - - - + - - - - - - -+ - - - - - - - + - - - - - - - - - - - - +
4 rows in set (0.24 sec)

Нарисуем графическое представление majobo, получим:

Приведенная выше диаграмма представляет собой диаграмму отношений сущностей. ERD базы данных используются для отображения взаимосвязей между таблицами в базе данных, а также между структурами таблиц. Поскольку ERD помогают визуализировать структуры таблиц и взаимосвязи, они часто приводят нас к лучшему дизайну баз данных.

Вывод

Мы создали базу данных и в процессе использовали наиболее важные запросы MySQL, а именно CREATE, USE, DESCRIBE, INSERT, SELECT, DELETE и ALTER.

Это первая часть из трех статей. А вот и следующий - Создание базы данных с MySQL с использованием интерфейса командной строки - Часть 2.