Разделение сложных команд
Команды Update, Delete и частично Insert не являются атомарными: они основываются на подкомандах. Во-первых, чтобы изменить или удалить кортежи в некоторой таблице, прежде нужно найти таблицу и кортежи, которые или в которых нужно сделать изменения или которые следует удалить. И во-вторых, кортеж (запись) в таблице включает в себя полный набор полей, в то время как в операциях изменения или добавления могут указываться ограниченное количество полей. Это отличается от объектов в программировании, которые содержат сразу все свойства класса. Когда кортежи добавляются в таблицу, то не указанные явно поля принимают значение по умолчанию или же принимают пустое значение (null).
Вызывает сомнение не содержание этих команд, но форма, в которой они подаются. Следующие главы покажут примеры, которые были бы более удобны для разработчиков и аналитиков, чем существующая сложившаяся практика.
Использование источников данных
Адресация данных в базах данных происходит через указание источника данных (from). На элементарном или на самом базовом уровне – это указание имени таблицы. В более сложном случае оно может быть заменено на подзапрос – выражение выборки, заключенное в скобки: (select field1, field2 from Table1). Однако для применения прямых изменений, таких как удаление или изменение данных, должна указываться таблица, а не расчётное выражение (выборка).
Возможной подкомандой, которая идёт вслед за выбором источника данных, может быть команда соединения (join). У команды соединения может быть множество различных вариантов, которые определяются как синтаксисом, так и описательно. Синтаксисом выделяется:
- Декартово произведение (Cartesian Product) выражается командой cross join или через последовательное перечисление источников данных в конструкции from.
- внутреннее соединение (inner join или join)
- левое внешнее соединение (outer left join или left join)
- правое внешнее соединение (outer right join или right join)
- полное внешнее соединение (outer full join или full join)
Команда соединения включает 2 операнда, которые обозначают источники данных (TableA join TableB). Соединение добавляет новый источник данных, поэтому комбинация команд join может образовывать дерево из таблиц. Помимо указания в качестве источника данных непосредственно таблицы, в качестве источника данных может использоваться выражение выборки (подкоманды (Select) ).
Ремарка: здесь и далее используя обозначение join подразумевается весь спектр операций соединения, в том числе кросс-соединение (декартово произведение), внутреннее соединение (собственно join), левое, правое, полное соединение, а также полу-соединения и анти-соединения (левый и правый остаток).
Селекция
Если не указывать дополнительные фильтры по отношению к таблице, то выборка, изменение или удаление записей применяется ко всем кортежам таблицы. Дополнительные уточнения указываются через подкоманду селекции (selection). Команда селекции является добавлением в подкоманде указания источников данных. В SQL подкоманда селекции описывается через ключевое слово where.
Кроме того, команды изменения и удаления также имеют возможность выполнять селекцию через соединения: натуральное, левое, правое, полное. Ведь соединение также ограничивает выбираемые строки из основной таблицы. Это достигается через указание таблицы в запросе.
Простой конструкцией является конструкция с селекцией:
delete [from] Table1 where FieldA=’Name’
Сложная конструкция с использованием соединения:
delete a from Table1 a join Table2 b on a.FieldA=b.FieldA where a.FieldB=’John’
На примерах видно, что основой для команд добавления (Insert), изменения (Update) и удаления (Delete) является операция выборки данных – то есть конструкции, аналогичные тем, что используются в команде «Select», за некоторым исключением. Исключение составляют операции группировки (агрегации) – они используются в выборке, но не используются при обновлении или удалении данных, несмотря на то, что по своей сути группировка аналогична фильтру.
При изменении данных и при удалении данных, удаляемые и изменяемые кортежи таблиц должны быть идентифицированы, то есть найдены среди кортежей таблицы в базе данных.
Внутри таблицы отсутствует определенная последовательность кортежей, поэтому адресация через индекс (порядок) невозможен – то есть при обновлении и удалении невозможно указать изменение в одной или нескольких записях по порядку, аналогично тому, как это сделано в операции выборки. Уникальная идентификация элемента в таблице происходит через указание конкретного значения полей первичного или альтернативных ключей.