Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Васильев Ю. - Python для data science (Библиотека программиста) - 2023.pdf
Скачиваний:
7
Добавлен:
07.04.2024
Размер:
7.21 Mб
Скачать

Понимание инструкций SQL      109

Понимание инструкций SQL

SQL, или язык структурированных запросов (Structured Query Language), — основной инструмент взаимодействия с реляционной базой данных. Хотя наша цель — изучить принципы работы с БД при помощи Python, сам код Python должен содержать инструкции SQL. В этой книге мы не будем подробно рассматривать SQL, но краткое введение в этот язык запросов все же необходимо.

Инструкции SQL — это текстовые команды, распознаваемые и выполняемые ядром базы данных, например MySQL. Так, следующая инструкция SQL сообщает БД, что нужно извлечь все строки из таблицы orders, в поле status которых установлено значение Shipped:

SELECT * FROM orders WHERE status = 'Shipped';

Инструкции SQL обычно состоят из трех основных компонентов: операции, которая должна быть выполнена, цели этой операции и условия, которое сужает область действия операции. В предыдущем примере SELECT — это операция SQL, то есть мы получаем доступ к строкам из базы данных. Таблица orders является целью операции, которая определяется с помощью оператора FROM, а условие следует за оператором WHERE. Все SQL-инструкции должны иметь операцию и цель, но условие не обязательно. Следующая инструкция, например, не содержит условия, поэтому она извлекает все строки из таблицы orders:

SELECT * FROM orders;

Можно уточнить инструкцию так, чтобы она касалась только определенных столбцов таблицы. Например, получить только столбцы pono и date для всех строк таблицы orders можно так:

SELECT pono, date FROM orders;

По соглашению зарезервированные в SQL слова, такие как SELECT и FROM, пишутся прописными буквами. Однако язык SQL нечувствителен к регистру, поэтому заглавные буквы — не строгая необходимость. В конце каждой инструкции должна стоять точка с запятой.

Операции SELECT, подобные тем, что описаны выше, являются примерами инструкций языка манипулирования данными (DML, Data Manipulation Languagе). Этот тип инструкций используется для доступа к данным базы и манипулирования ими. К инструкциям DML также относятся: INSERT, UPDATEи DELETE, которые,

110      Глава 5. Работа с базами данных

соответственно, добавляют, изменяют и удаляют записи из базы данных. Также существуют инструкции языка определения данных (DDL, Data Definition Language). Это еще одна распространенная категория инструкций SQL. Они предназначены для определения структуры базы данных. Стандартные операции DDL, CREATE, ALTER и DROP, используются для создания, изменения и удаления контейнеров данных соответственно, будь то столбцы, таблицы или целые базы данных.

Начало работы с MySQL

MySQL доступен на большинстве современных операционных систем, включая Linux, Unix, Windows и macOS. Существуют как бесплатные, так и коммерческие версии. Для целей данной главы достаточно MySQL Community Edition1, бесплатной версии MySQL, которая доступна по лицензии GPL. Подробную инструкцию по установке MySQL для вашей операционной системы см. в справочном руководстве для последней версии MySQL2.

Чтобы запустить сервер MySQL после установки, необходимо использовать команду, указанную в руководстве по установке для вашей операционной системы. Затем можно подключиться к серверу MySQL через терминал/консоль, используя клиент mysql:

$ mysql -uroot

ПРИМЕЧАНИЕ

На macOS может понадобиться использовать весь путь до MySQL, например:

/usr/local/mysql/bin/mysql -uroot -p.

Вам будет предложено ввести пароль, который вы задали в процессе установки сервера MySQL. После этого вы увидите командную строку MySQL:

mysql>

Можно задать новый пароль для пользователя root с помощью следующей команды SQL:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_pswd';

1 https://www.mysql.com/products/community

2 https://dev.mysql.com/doc

Понимание инструкций SQL      111

Теперь можно создавать базу данных для приложения.

Введите следующую команду в командной строке mysql>:

mysql> CREATE DATABASE sampledb;

Query OK, 1 row affected (0.01 sec)

Эта команда создает базу данных под названием sampledb. Далее необходимо выбрать БД:

mysql> USE sampledb;

Database changed

Все последующие команды будут применяться к базе данных sampledb.

Определение структуры базы данных

Структура реляционной базы данных формируется на основе входящих в нее таблиц и из связей между ними. Поля, которые связывают таблицы, называются ключами. Существует два типа ключей: первичный ключ (primary key) и внешний ключ (foreign key). Первичный ключ служит для уникальной идентификации записи в таблице. Внешний ключ — это поле в другой таблице, которое соответствует первичному ключу в первой таблице. Как правило, первичный ключ и соответствующий ему внешний ключ имеют одинаковое имя в обеих таблицах.

ПРИМЕЧАНИЕ

Термины«поле»и«столбец»частоиспользуютсякаквзаимозаменяемые.Строго говоря,столбецстановитсяполем,когдавыссылаетесьнанеговконтекстеодной строки.

Теперь, когда мы создали базу данных sampledb, можно создать несколько таб­ лиц и определить их структуру. Для наглядности создадим таблицы с той же структурой, что и датафреймы pandas, с которыми мы работали в главе 3. Вот три табличные структуры данных для реализации в нашей БД:

emps

 

empno empname

job

-----------------------------

9001

Jeff

Russell

sales

9002

Jane

Boorman

sales

112      Глава 5. Работа с базами данных

9003

Tom Heints

sales

salary

 

 

 

empno

salary

 

 

----------------

 

9001

3000

 

 

9002

2800

 

 

9003

2500

 

 

orders

 

 

 

pono

empno

total

 

--------------------

 

2608

9001

35

 

2617

9001

35

 

2620

9001

139

 

2621

9002

95

 

2626

9002

218

 

 

 

 

 

Чтобы проанализировать, какие отношения можно установить между этими структурами, вернитесь к рис. 3.4 и 3.6. Как видно на рис. 3.4, строки в таблицах emps и salary связаны отношением «один-к-одному». Связь устанавливается через поле empno. Таблицы emps и orders тоже связаны через поле empno. Это связь типа «один-ко-многим», как видно на рис. 3.6.

Можно добавить эти структуры данных в реляционную БД, введя следующие SQL-команды в командной строке mysql>. Начнем с создания таблицы сотрудников emps:

mysql> CREATE TABLE emps ( empno INT NOT NULL, empname VARCHAR(50), job VARCHAR(30), PRIMARY KEY (empno) );

С помощью команды CREATE TABLEсоздаем таблицу, определяя каждый столбец, его тип и, по желанию, размер данных, которые будем в нем хранить. Например, в столбце empno должны храниться целые числа (тип INT), и примененное к этой колонке ограничение NOT NULL гарантирует, что не получится вставить строку с пустым значением в поле empno. В свою очередь, столбец empname может хранить строки (тип VARCHAR) длиной до 50 символов, а job — строки длиной до 30 символов. Также указываем, что empno — столбец первичного ключа таблицы. Это означает, что он не должен содержать повторяющихся значений.

Понимание инструкций SQL      113

При успешном выполнении этой команды вы увидите следующее сообщение:

Query OK, 0 rows affected (0.03 sec)

Аналогично создадим таблицу с размерами оклада (salary):

mysql> CREATE TABLE salary ( empno INT NOT NULL, salary INT,

PRIMARY KEY (empno) );

Query OK, 0 rows affected (0.05 sec)

Далее добавляем ограничение внешнего ключа по столбцу empno таблицы salary, ссылающегося на столбец empno таблицы emps:

mysql> ALTER TABLE salary ADD FOREIGN KEY (empno) REFERENCES emps (empno);

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

Поскольку в таблице salary пока нет строк, операция ALTER TABLEне затрагивает ни одной строки, что видно из полученного сообщения:

Query OK, 0 rows affected (0.14 sec)

Records: 0 Duplicates: 0 Warnings: 0

Наконец, создаем таблицу с заказами (orders):

mysql> CREATE TABLE orders ( pono INT NOT NULL, empno INT NOT NULL, total INT,

PRIMARY KEY (pono),

FOREIGN KEY (empno) REFERENCES emps (empno) );

Query OK, 0 rows affected (0.13 sec)