Найти в Дзене
ZDG

Разрабатываем сайт #3: Работаем с таблицами MySQL

Предыдущие части: Создаём базу данных, Установка MySQL

В предыдущей части мы создали базу данных с именем cat, и в ней создали таблицу с именем note.

Таблица пока пуста. Есть три вида операций, которые изменяют данные в таблице:

  • Вставка новой записи в таблицу
  • Модификация существующей записи в таблице
  • Удаление записи из таблицы

Эти операции мы сегодня и рассмотрим. Зайдите, как обычно, в MySQL-консоль, запустив mysql.exe с именем пользователя и с именем базы:

mysql.exe -u root cat

Вставка

Вставка делается командой INSERT. В таблице note есть три столбца: date, title и content. Когда мы делаем вставку, то должны указать значения для всех столбцов:

insert into note values('2021-02-08 17:41:00', 'My Title', 'My Content');

Буквально это значит: "вставить в таблицу note значения(...)". Значения должны перечисляться в том же порядке, в каком объявлены столбцы таблицы. Первый – date, у него тип "дата-время", поэтому мы указываем значение в формате 'YYYY-MM-DD HH:MM:SS', то есть 'год-месяц-число часы:минуты:секунды'.

Далее идут столбцы title и content, для которых мы тоже указываем свои значения в виде строк.

Выборка

Кроме изменения данных, нам нужно их просматривать, поэтому сейчас самое время познакомиться с командой SELECT:

select * from note;

Буквально это значит: "выбрать все записи из таблицы note". У команды SELECT есть много дополнительных параметров, но на данный момент мы их рассматривать не будем. Нас интересует самая простая выборка:

-2

Как видим, перед нами прямо-таки настоящая таблица с одной записью, которую мы только что в неё добавили.

Модификация

Чтобы изменить запись в таблице, нужно использовать команду UPDATE. Допустим, мы решили поправить дату:

update note set date='2021-02-08 18:00:00';

Это буквально значит: "обновить таблицу note, присвоить столбцу date значение ..."

-3

Если нужно изменить сразу несколько столбцов, их можно перечислить через запятую:

update note set date='2021-02-08 18:00:00', title='New Title', content='New Content';

Удаление

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

delete from note;

Буквально это значит: "удалить из таблицы note".

-4

Фильтрация запросов с помощью WHERE

Предыдущие команды UPDATE и DELETE сработали, но у нас в таблице была только одна запись. Если бы в таблице было несколько записей, то результат оказался бы несколько неожиданным. Команда UPDATE изменила бы все записи в таблице, какие есть. Команда DELETE также удалила бы все записи.

Что делать, если мы хотим изменить или удалить не все, а только какую-то конкретную запись или группу записей?

Здесь нам на помощь приходит модификатор WHERE:

delete from note where date='2021-02-08 18:00:00';

Это буквально значит: "удалить из таблицы note записи, где date=...". Таким образом, будут удалены только те записи, у которых date='2021-02-08 18:00:00'.

В модификаторе WHERE можно использовать любой столбец, который вам подходит:

delete from note where title='My Title';

Вы также можете комбинировать несколько столбцов, используя условия "И" и "ИЛИ":

delete from note where date='2021-02-08 18:00:00' and (title='My Title' or content='My Content');

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

delete from note where date >= '2021-02-08 00:00:00' and date <= '2021-02-08 23:59:59';

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

С командой UPDATE модификатор WHERE работает абсолютно точно так же:

update note set date='2021-02-08 18:00:00' where date='2021-02-08 17:41:00';

С командой SELECT модификатор WHERE тоже работает:

select * from note where title='My Title' or date > '2021-02-08 00:00:00';

Это сделает выборку не всей таблицы, а только тех записей, которые соответствуют условию.

Проблема идентичности

Что, если в таблице оказались две абсолютно одинаковые записи? Давайте проверим таблицу note на соответствие реалиям.

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

Это делает поле date уникальным в таблице. То есть мы можем использовать его в модификаторе WHERE как уникальный идентификатор записи, чтобы точно выбрать нужную нам запись.

Но всё же, если вдруг в таблицу были добавлены две записи в одну секунду, то получатся два одинаковых значения поля date. И если мы попытаемся выбрать одну запись по дате, то вместе с ней выберется и вторая запись с таким же значением.

Мы можем усилить фильтрацию, добавив проверку по полям title и content. Даже если даты совпадают, то названия и содержимое заметок должны отличаться, ведь нет смысла добавлять в таблицу две абсолютно одинаковые записи.

И тем не менее допустим, что они всё-таки добавились, и теперь мы имеем две одинаковых записи в таблице. Что делать? Если попытаемся отредактировать одну, то отредактируется и вторая. Если попытаемся удалить одну, то удалится и вторая.

К сожалению, если это уже произошло, то тут мало чем поможешь. Придётся, скорее всего, удалять обе записи, а затем создавать заново одну.

Но чтобы этого не происходило, нужно заранее спроектировать таблицу так, чтобы в ней было уникальное поле. Если дата недостаточно уникальная, значит нужно просто сделать дополнительное поле, которое точно будет уникальным. Для этого MySQL располагает широкими возможностями.

И здесь появляется слово "реляционный". MySQL это реляционная база данных. Реляция значит "отношение". И мы познакомимся с уникальными полями и отношениями в следующих выпусках.

Читайте дальше: Уникальные идентификаторы