Найти в Дзене
programmer's notes (python and more)

Реляционные базы данных. Язык SQL. Команды модификации данных insert, delete, update

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Программирование и проектирование реляционных баз данных | programmer's notes (python and more) | Дзен

Команды изменения данных в языке SQL (подмножество DML)

Видео-лекции по командам insert, update, delete уже были, осталось написать текст приложения к этим урокам. Напомню, что DML это Data Manipulation Language. Это набор команд, которые меняют содержимое таблиц базы данных. Сюда ещё относят также команду select, позволяющую извлекать данные из таблиц, но о ней у нас особый разговор и материалов по этой команде много и будет ещё больше (см. подборку).

Команда insert

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

Также и в реляционных базах данных. Для столбца можно определить два атрибута: 1) значение по умолчанию и 2) разрешение на использование в нём NULL. Формально это два значения "по умолчанию". Первое имеет приоритет перед вторым. Оба этих значения имеют прямое отношение к команде insert.

И так команда insert, её наиболее правильный (по моему) вариант использования имеет вид

insert into имя_таблицы (поле1, поле2, ... полеn)
values (значение1, значение2, ... значениеn);

При выполнении команды добавляется строка к таблице, а полям присваиваются соответствующие значения из скобки после ключевого поля values в соответствие с порядком: поле1=значение1, поле2=значение2 и т.д. Важно отметить, что поля в списке могут следовать в любом порядке.

Например команды,

insert into tbl1 (fio, adres) values ('Петров', 'Загородная 6')

и

insert into tbl1 (adres, fio) values ('Загородная 6', 'Петров')

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

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

Теперь представим, что в нашей таблице есть ещё первичный ключ id, у которого, как мы знаем, есть значение по умолчание, которое автоматически генерируется и порядок следования столбцов такой (id, adres, fio) . Тогда представленные выше команды всё равно будут правильными, а первичному ключу будет присвоено значение по умолчанию.

Можно выполнить

insert into tbl1 (fio) values ('Петров')

тогда fio получит значение 'Петров', id получит значение по умолчанию, adres получит значение по умолчанию, если это значение определено, NULL если значения по умолчанию нет, а NULL разрешено и наконец, будет ошибка, если нет значения по умолчанию и NULL не разрешено.

Можно написать также

insert into tbl1 (adres) values ('Набережная 5')

тогда указанное значение получит поле adres, а относительно поля id и fio будет всё так, как в предыдущем случае.

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

insert into tbl1 values(1, 'Песчаная 2', 'Иванов И.И.')

и в этом случае учитывается изначальный порядок следования (создания) столбцов в таблице. Такой вариант предполагает явное задание всех значений полей.

Наконец, есть ещё такая форма, которую мы тоже не можем использовать, как я выше объяснил:

insert into tbl1 DEFAULT VALUES

Т.е. всем полям будет присвоено значение по умолчанию.

Есть также вариант использования insert, который предполагает добавление строк из команды select. Это позволяет вставлять в таблицу сразу не одну, а множество строк. Но мы отложим рассмотрение этого вопроса. У нас будет отдельная тема: использование select в командах insert, delete, update.

Команда delete

Команда delete имеет чрезвычайно простую форму

delete from имя_таблицы where <условие>

из таблицы удаляются те строки, которые удовлетворяют условию в разделе where. Если ключевое слово where отсутствует, то будут удалены все строки. С таким вариантом надо быть аккуратнее.

Условная конструкция может содержать в себе разные условия, соединённые логическими связками and и or. Можно также использовать логическую операцию not. Например

delete from student where id=2 or fio='Иванов';

Надеюсь команда вполне понятна.

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

Команда update

У данной команды синтаксис чуть посложнее чем у команды delete. update обрабатывает только те строки таблицы, которые соответствуют условию в разделе where. Если такого раздела нет, то обрабатываются все строки.

В разделе set указываются имена столбцов и значения. Например

update tbl1
set fio='Иванов П.П.', adres='Первая линия 1'
where fio='Иванов И.И.'

В разделе set указаны поля adres и fio, значит значения в других столбцах меняться не будут.

Также как и в случае с delete раздел where может быть достаточно сложным, если условий несколько и если в нём используется команда select. Но этому вопросу будет посвящена отдельная тема.

Замечание
Заметим, что команда update избыточна. Ведь любое изменение в строке таблицы можно реализовать последовательностью команд: insert и delete.

Ну, пока всё!

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

Я пишу клиента, а зачем мне знать, что там творится с данными?
Я пишу клиента, а зачем мне знать, что там творится с данными?