это набор сведений, хранящихся некоторым упорядоченным образом. На англ. база данных - database (DB).
Используют для работы с базами данных
системы управления базами данных (СУБД). На англ. – Database Management System (DBMS).
Система управления базами данных (СУБД)
это совокупность языковых и программных средств, которая осуществляет доступ к данным, позволяет их создавать, менять и удалять, обеспечивает безопасность данных и т.д.
Преимущества использования БД
1. Хранилище данных с высокой производительностью и сжатием; 2. Настройка прав доступа; 3. Транзитивность; 4. Журналирование (логирование); 5. Удобные языки; 6. Проверка валидации данных; 7. Удобные программы для работы с базами данных.
Транзитивность (основы БД)
в случае ошибки данные откатываются к предыдущему корректному сохраненному состоянию.
Журналирование (логирование) (основы БД)
все операции над БД записываются в лог-файл, который можно просматривать, чтобы находить ошибки, подозрительные операции и т.д.
Сама СУБД установлена на сервере, и БД находятся на сервере. Клиенты делают запросы к серверу СУБД.
Суть встраиваемой СУБД
Не требуется отдельный сервер и отдельная установка – СУБД просто является частью приложения, где она используется. Обычно является подключаемой библиотекой, предназначена для локального хранения данных.
NoSQL БД
общее название для не реляционных СУБД.
Например: MongoDB, Redis, Neo4j.
Таблица в реляционной БД
это хранилище сущностей (данных) одного вида
Как устроена таблица реляционной БД
состоит из столбцов (их еще называют поля и атрибуты) и строк (их еще называют записями и кортежами).
Столбец таблицы реляционной БД
имеет название и тип данных. Название каждого столбца уникально внутри таблицы, каждый столбец хранит значения одного типа. Столбцы отвечают за структуру данных в таблице.
Строка таблицы реляционной БД
отвечают за конкретные сущности (данные), которые хранятся в таблице.
Представление понятий "Таблица", "столбец" и "строка" по аналогии с ООП
Таблица это класс, Столбцы это поля, Строки это объекты класса.
Какие строки запрещено иметь в таблице реляционной БД?
полностью одинаковые строки.
Необходимый минимум в таблицах реляционной БД
может не быть ни одной строки, но должен быть хотя бы один столбец.
Порядок столбцов в таблице
Они находятся в некотором порядке. Обычно порядок фиксируется при создании таблицы. Но на этот порядок не следует полагаться, всегда стоит обращаться к столбцам по именам.
Первичный ключ
Таблица должна иметь некоторое поле (или совокупность полей), по которым можно однозначно найти любую строку
Второе название первичного ключа который состоит из нескольких столбцов
составным.
Идентификатор (ID) первичного ключа
первичный ключ не имеющий осмысленных данных имеет отдельный числовой столбец.
Суррогатный ключ
первичный ключ который не несет определенного информационного смысла.
Важное свойство первичного ключа
уникальность т.е. не должен повторяться в пределах таблицы.
Если в таблице не создать первичный ключ, то что им будет являться?
В таком случае первичным ключом является вся строка.
Виды связей таблиц
1. Один ко многим; 2. Многие ко многим; 3. Один к одному.
Связь таблиц "один ко многим"
каждой строке одной таблицы может соответствовать много строк в другой таблице.
Способы связи "один ко многим"
Способ с внешним ключом и способ с вспомогательной таблицей.
Связь таблиц "многие ко многим"
каждой строка первой таблицы имеет много строк во второй, а также каждая строка второй таблицы имеет множество строк в первой.
Способы связи "многие ко многим"
Способ с вспомогательной таблицей.
Связь таблиц "один к одному"
каждой строке одной таблицы соответствует одна строка в другой таблице.
Способы связи "один к одному"
1. Обычно моделируют в одну таблицу; 2. Сделать первичный ключ одной из таблиц внешним ключом на другую таблицу; 3. Добавить внешний ключ в любую из таблиц. Но при этом на него нужно будет навесить ограничение уникальности; 4. Через вспомогательную таблицу. Но нужно навесить ограничение уникальности на оба внешних ключа из этой таблицы.
Преимущества связи способом с внешним ключом
Проще в реализации. Работает быстрее.
Преимущества и недостатки способом с вспомогательной таблицей
Сложнее в реализации. Работает медленно. Но зато мы не меняем данные в таблицах.
Нормальная форма (НФ)
это требование к структуре таблиц реляционной БД для устранения избыточных функциональных зависимостей между полями таблиц.
Функциональная зависимость
ситуация, когда некоторое поле (или совокупность полей) напрямую зависит от другого поля (или совокупности полей).
В чем смысл использования нормальной формы (НФ)
устранение избыточности данных - чтобы каждая единица данных хранилась всего 1 раз.
Количество нормальных форм
6
Требования к первой нормальной форме
Все поля являются атомарными, т.е. неделимыми. Нет одинаковых строк в таблице.
Требования ко второй нормальной форме
Соблюдена 1 НФ. Каждое не ключевое поле неприводимо (функционально полно) зависит от первичного ключа.
Неприводимость
не ключевое поле зависит от всего ключа в целом, а не только от его части.
Требования к третьей нормальной форме
Соблюдена 2 НФ. Каждое не ключевое поле не транзитивно зависит от первичного ключа. Т.е. имеется в виду, что каждое не ключевое поле зависит именно от первичного ключа, а не от какого-то другого не ключевого поля.
SQL
"Structured Query Language" язык запросов, позволяющий создавать/изменять/удалять базы данных, а также искать в них данные. Является стандартом, т.е. четко задокументирован, его синтаксис и конструкции и т.д.
В каком регистре в SQL можно писать ключевые слова, имена таблиц и так далее?
в любом.
Кавычки в которые рекомендуется заключать литералы строк в SQL
в одинарные.
Если внутри строки потребуется написать знак ', то что нужно сделать? (SQL)
нужно удвоить одинарную кавычку.
Типы комментариев в SQL
однострочные и многострочные.
Синтаксис однострочного комментария
-- Комментарий
Синтаксис многострочного комментария
/* Комментарий */
Команда для создания базы данных в SQL
CREATE DATABASE имя_базы;
Что нужно делать если имя БД, таблиц, столбцов являются зарезервированным словом или содержат спец символы?
заключить в кавычки `. Например: SELECT * FROM `products`
Команда для выбора нужной базы данных в SQL
USE имя_базы;
Команда создания таблицы в SQL
CREATE TABLE имя_таблицы ( перечень_столбцов);
Обозначить что данное поле является первичным ключом
id INT AUTO_INCREMENT PRIMARY KEY или так PRIMARY KEY (id1, id2)
Что означает NULL если его принимает поле?
отсутствие данных.
Можно ли помечать поля на то могут они принимать NULL или нет?
да
Обозначить поле что бы оно принимала NULL
name INT NULL
Обозначить поле что бы оно не принимала NULL
name INT NOT NULL
Обозначение чтобы значения полей были уникальными
name INT UNIQUE
Присвоить полю значение по умолчанию
price INT DEFAULT 0
Проверка корректности при вставке и изменении данных (SQL)
price INT NOT NULL CHECK (price > 0)
Команда для удаления базы данных
DROP DATABASE имя_базы_данных;
Команда для удаления таблицы
DROP TABLE имя_таблицы;
Создание внешнего ключа в таблице
FOREIGN KEY (supplierId) REFERENCES suppliers(id)
Как написать запрос чтобы удалить фиксированное количество строк, например 4?
DELETE FROM products WHERE id = 3 LIMIT 4;
Внешний ключ
это когда таблица содержит столбец (или совокупность столбцов), который является первичным ключом в другой таблице.
Требования при создании таблиц
если у вас БД из нескольких таблиц, то очень важен порядок создания таблиц. В объявлении внешних ключей нельзя ссылаться на таблицы, которые еще не существуют.
Варианты поведения при настройке внешнего ключа
1. Удаление ON DELETE из главной таблицы; 2. Обновление строки ON UPDATE из главной таблицы.
Какие варианты для команды ON DELETE и ON UPDATE вы помните?
1. NO ACTION; 2. CASCADE; 3. RESTRICT; 4. SET NULL; 5. SET DEFAULT.
Команда для вставки строки в таблицу
INSERT INTO имя_таблицы(имя_столбца1, имя_столбца2) VALUES (значение_столбца1, значение_столбца2);
Команда для удаления всех строк в таблице
DELETE FROM имя_таблицы;
Команда ON DELETE NO ACTION
выдает ошибку если кто-то ссылается на строку главной таблицы, удаление не делается.
Команда ON UPDATE NO ACTION
выдает ошибку если кто-то ссылается на строку главной таблицы, обновление не делается.
Команда ON DELETE CASCADE
каскадное удаление. Если из главной таблицы удаляется строка, то удаляются все связанные строки других таблиц.
Команда ON UPDATE CASCADE
каскадное обновление. Если в главной таблице меняется первичный ключ, то меняется внешний ключ всех связанных строк других таблиц.
Команда ON DELETE RESTRICT
аналогично NO ACTION. Выдает ошибку если кто-то ссылается на строку главной таблицы, удаление не делается.
Команда ON UPDATE RESTRICT
аналогично NO ACTION. Выдает ошибку если кто-то ссылается на строку главной таблицы, обновление не делается.
Команда ON DELETE SET NULL
выставить NULL во внешнем ключе при удалении строки из главной таблицы.
Команда ON UPDATE SET NULL
выставить NULL во внешнем ключе при изменении первичного ключа строки из главной таблицы.
Команда ON DELETE SET DEFAULT
выставить значение по умолчанию для ON DELETE или NULL, если значения по умолчанию нет.
Команда ON UPDATE SET DEFAULT
выставить значение по умолчанию для ON UPDATE или NULL, если значения по умолчанию нет.
Команда CREATE DATABASE
создает базу данных.
Команда USE
служит для выбора нужной базы данных.
Команда CREATE TABLE
создает таблицу.
Команда UNIQUE
не позволяет повторяться значениям поля.
Команда DEFAULT
позволяет задать значение поля по умолчанию.
Команда CHECK (SQL)
проверить корректность при вставке и изменении данных.
Команда DROP DATABASE
удаление базы данных.
Команда DROP TABLE
удаление таблицы.
Команда INSERT INTO имя_таблицы(столбец1, столбец2) VALUES ('строка', 5)
вставляет строки в таблицу.
Команда DELETE FROM имя_таблицы;
удаляет все строки из таблицы.
Команда для удаления определенного количества строк в таблице. (пример)
Так можно удалить 7 строк: DELETE FROM products WHERE id = 3 LIMIT 7;
получить день недели в виде числа от 0 (понедельник) до 6 (воскресенье).
Функция DATE_ADD(date, expr)
прибавить указанное время.
Функция DATE_SUB(date, expr)
вычесть указанное время.
Функция DATEDIFF(expr1, expr2)
разница между датами в днях, время игнорируется.
Функция LAST_DAY(date)
выдает дату-последний день месяца из этой даты.
Функция для получения текущей даты и времени
NOW()
Функция для получения дня из даты
DAY(date)
Функция для получения месяца из даты
MONTH(date)
Функция для получения года из даты
YEAR(date)
Функция для получения дня недели в виде числа из даты
WEEKDAY(date)
Функция для прибавления указанного времени
DATE_ADD(date, expr)
Функция для вычитания указанного времени
DATE_SUB(date, expr)
Функция для получения разницы между датами в днях
DATEDIFF(expr1, expr2)
Функция для получения последнего дня месяца из указанной даты
LAST_DAY(date)
Команда DISTINCT
выкидывает из результата полностью дублирующиеся строки.
Команда для удаления из результата полностью дублирующихся строк
DISTINCT
Команда LIMIT
для выдачи указанного количества строк.
Команда для выдачи определенного количества строк
LIMIT
С какой командой рекомендуется использовать команду LIMIT и почему?
следует всегда использовать совместно с сортировкой ORDER BY, иначе порядок не гарантируется и может получится так что будут выбраны любые строки.
Что выдаст команда, если написать ее подобным образом? LIMIT 5, 10;
первый аргумент говорит о том сколько строк будет пропущено от начала, а второй сколько строк взять от этой позиции.
Виды соединения таблиц
1. CROSS JOIN; 2. INNER JOIN; 3. OUTER JOIN; 3.1. LEFT JOIN; 3.2. RIGHT JOIN; 3.3. FULL JOIN.
Команда для соединения строк двух таблиц всеми возможными способами
CROSS JOIN
Команда CROSS JOIN
соединяет строки двух таблиц всеми возможными способами.
Команда где строка одной таблицы соединяется не с каждой строкой из другой таблицы, а только с теми, где выполняется равенство.
INNER JOIN
Команда INNER JOIN
строка одной таблицы соединяется не с каждой строкой из другой таблицы, а только с теми, где выполняется равенство.
Команда ON в INNER JOIN
осуществляет фильтрацию строк по указанному условию.
Команды OUTER JOIN
в отличии от INNER JOIN если не нашлось соответствия , то строка в результат попадет, а все значения из этой таблицы будут NULL.
Команда LEFT JOIN
берет все строки первой таблицы, ищет соответствие во второй, и, если что, ставит NULL.
Команда RIGHT JOIN
берет все строки второй таблицы, ищет соответствие в первой, и, если что, ставит NULL.
Команда FULL JOIN
берутся все записи всех таблиц, если не нашлось соответствие, то ставится NULL.
Назначение префиксов в SQL
служат для обозначения что данное поле принадлежит определенной таблице, как вариант их используют если два поля из разных таблиц имеют одинаковые имена, и префикс помогает понять, что есть что.
Вложенные запросы
это когда запросы можно вкладывать друг в друга.
Что используется для того чтобы ускорить поиск по таблице?
индексы
Как формируется индекс?
формируется из значений одного или нескольких столбцов, и позволяет быстрее искать по запросам по этим столбцам.
Какие положительные и отрицательные качества вы можете сказать об использовании индексов?
- плюс в том что ускоряет поиск; - минусы в том что замедляет вставку, удаление и изменение строк.
Пример создания индекса
CREATE INDEX ix_create_date ON request (create_date);
Пример удаления индекса
DROP INDEX ix_create_date ON request;
Виртуальные таблицы (View)
это просто некоторый запрос, который сохранен как объект БД. То есть просто взяли запрос, который выдает таблицу, и дали ему имя.
Создание виртуального запроса (View)
CREATE VIEW Countries AS SELECT * FROM country;
Транзакция
это последовательность операций с БД, которая представляет собой логическую единицу работы с данными.
Может ли быть выполнена транзакция частично?
может быть выполнена только целиком.
Если во время транзакции что-то пошло не так, то что произойдет с уже произошедшими изменениями?
транзакция должна быть выполнена целиком, либо не выполнена целиком.
Свойство транзакции Consistency (согласованность)
транзакция переводит данные из одного корректного состояния в другое корректное состояние.
Свойство транзакции Isolation (изолированность)
параллельные транзакции не должны оказывать влияние на результат текущей транзакции.
Свойство транзакции Durability (долговечность)
если транзакция завершена, то изменения должны оставаться сохраненными даже если будут низкоуровневые проблемы, например, с оборудованием.
Процесс работы с транзакциями в MySQL
Начинаем транзакцию с START TRANSACTION; затем выполняем команды, которые составляют транзакцию, если хотим откатить изменения используем ROLLBACK;, а если хотим применить изменения используем команду COMMIT;
Пример транзакции
START TRANSACTION; UPDATE account SET money = money – 1000 WHERE id = 1; COMMIT;
Можно ли в MySQL создавать функции, хранимые процедуры и триггеры?
да
Функция
это некоторый код, который можно вызывать, например, из SELECT. Они не должны ничего менять, т.е. вызывать INSERT, UPDATE, DELETE.
Хранимая процедура
то же самое что и функция, но имеет другой синтаксис вызова – через CALL или EXECUTE. И процедуры могут что-то менять – вызывать INSERT, UPDATE, DELETE.
Триггер
код, который будет срабатывать при некотором событии. Например, при добавлении строки в таблицу.
Команда DELIMETER
чтобы временно заменять разделитель команд ";". Например, это необходимо при создании процедур.
Команда для замены разделителя команд
DELIMETER.
Команда для изменения существующей таблицы
ALTER TABLE
Команда для изменения существующей БД
ALTER DATABASE
Команда ALTER TABLE
изменяет существующую таблицу.
Команда ALTER DATABASE
изменяет существующую БД.
Пример добавления столбца в таблицу
ALTER TABLE product ADD count INT;
Пример удаления столбца из таблицы
ALTER TABLE product DROP count;
Пример добавления ограничения про внешний ключ
ALTER TABLE product ADD FOREIGN KEY (supplierId) REFERENCES suppliers(id);
Пример удаления ограничения про внешний ключ
ALTER TABLE product DROP FOREIGN KEY fk_name;
Какие ограничения можно удалять или добавлять у столбцов таблицы?
Оператор который можно использовать в качестве условия или в него можно передать запрос
EXISTS - условие будет истинно, если подзапрос выдаст хотя бы одну строку.
NOT EXISTS - условие будет истинно, если подзапрос выдал 0 строк.
Оператор для сбора данных в единый набор по нескольким разным таблицам
UNION
Важная особенность оператора UNION
он откидывает полностью совпадающие строки.
Команда для сбора данных в единый набор по нескольким разным таблицам и для отображения дубликатов
UNION ALL
Пара операторов позволяющая выполнять сравнение между значением одного столбца и диапазоном других значений
ANY и ALL.
Оператор EXISTS
используется в качестве условия, в него передается запрос, условие будет истинно если подзапрос выдаст хотя бы одну строку.
Оператор NOT EXISTS
используется в качестве условия, в него передается запрос, условие будет истинно, если подзапрос выдал 0 строк.
Оператор UNION
собирает данные в единый набор по нескольким разным таблицам и не отображает дубликаты.
Оператор UNION ALL
собирает данные в единый набор по нескольким разным таблицам и отображает дубликаты.
Оператор ANY
если хотя бы для одного значения, получаемого из подзапроса, результат операции равняется TRUE, то будет выдано TRUE.
Оператор ALL
значение будет истинным, если для всех значений, получаемых из подзапроса, будет выдано TRUE.
Оператор CASE
когда при выводе результатов есть необходимость добавить условную логику – в зависимости от условия выводить разные значения. Использование при сортировке. Использование внутри агрегатных функций (чаще всего COUNT) при группировке.
Пример использования оператора CASE
SELECT requestId, CASE status WHEN 0 THEN ‘Новая’ WHEN 1 THEN ‘В работе’ ELSE ‘Неизвестный статус’ END AS statusName FROM requests;