Базы данных: SQL
Содержание |
Введение
Многолетние рассуждения на эту тему начинались с того, что её знание как для рядовых, так и для продвинутых пользователей — пустая трата времени на их получение. Все подобные вопросы с учетом их сложности должны реализовываться программно, а не за счет погружения в синтаксис тысячесимвольных команд.
Тенденции развития ПО в последнее десятилетие XX века позволяли надеяться на то, что будут реализованы программные интерфейсы, в достаточно дружелюбном варианте. По крайней мере для людей с нормальным интеллектом.
Но этого не произошло. Разбирать причины нет ни желания, ни времени. Поэтому ограничимся констатацией факта: развитие происходит по синусоиде, постепенно опускающейся вниз. То есть без знания основ SQL становится невозможным использование встроенных во многие программы (модули) обращений к базам данных, а, значит, ограничивается их потенциал. Иногда настолько, что теряется больше половины смысла. Также, информация будет полезна любым начинающим программистам БД.
Принципиально важными являются три момента.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Итак, SQL — аббревиатура от англ. Structured Query Language (язык структурированных запросов). Как уже понятно из контекста, запросы осуществляются к базам данных, точнее — к их таблицам. Соответственно, по умолчанию данный язык распространяется на реляционные базы данных, пусть это и не совсем так.
Стандарт SQL не открыт для свободного доступа и распространяется ISO: ISO/IEC 9075(1-4, 9-11, 13, 14, 15):2016/2019 (последняя действующая версия) по 178 швейцарских франков за том (~193$). К большому сожалению, у нас в стране действует достаточно архаическая версия ГОСТ Р ИСО/МЭК 9075-93 (Аутентичный текст с ISO/IEC 9075:1989).
....
Принципиально можно говорить о том, что весь SQL для пользователя сводится всего к четырем командам (операторам в терминологии ГОСТ). Большинство остальных действий совершается посредством интерфейсов, то есть незаметно для пользователя.
- SELECT — выбор строк (записей) из таблицы. Эта команда является абсолютно необходимой и самой важной!
- UPDATE — изменение данных в имеющиихся записях.
- INSERT — добавление (вставка) записей в таблицу.
- DELETE — удаление записей.
- Дополнительно следует выделить управление объектами БД.
Дополнительные знания
К бочке меда с небольшим набором команд надо добавить еще одну — с дёгтем.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Условие (WHERE)
Начнем с базового вопроса. Большинство случаев выполнения команд поиска и обновления определяется с учетом соответствия строк таблицы какому-либо требованию. Обновить нужно данные в конкретной строке или нескольких, относимых к группе по признаку. Удалить — аналогично. Выборка записей — и подавно. Отобрать всё подряд из базы с 10 млрд записей немного накладно.
Во всех СУБД для этой цели служит ключевое слово WHERE (спецификатор выборки)
Общий синтаксис
команда... [WHERE <условие поиска>]
Как видно, выражение является необязательным, но среды, ориентированные на работу с большими таблицами, навязывают его использование через интерфейс, например, WHERE 1 (для phpMyAdmin, управляющую MySQL), означающее «всё подряд» (1=True), но заставляющее и задуматься.
В простейшем виде, условием поиска будет имя поля, сопоставляемое оператором отношения с выражением:
WHERE Field1 = "Москва"
WHERE Field1 != "Москва"
WHERE Field1 > "Москва"
WHERE Field2 <= 2020
В самом примитивном (но, по-видимому, и самом частом) виде, условием поиска будет соответствие ключевого поля значению, что позволяет однозначно идентифицировать конкретную запись:
WHERE KeyField = 100
Несколько более сложным становится введение составного условия, объединяемого логическими операторами и, возможно, группируемого скобками:
WHERE Field1 = "Москва" AND Field2 <= 2020
WHERE (Field1 = "Москва" OR Field1 = "Уфа") AND Field2 <= 2020
Вероятно можно говорить о том, что операторы сравнения в данном случае относятся к одной из крайне непростых тем.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
....
SELECT
Со всех точек зрения эту команду следует считать единственной нужной для всех категорий пользователей. Только её полный синтаксис занимает половину страницы текста, а ограничение на количество символов в ней измеряется десятками тысяч.
Общий синтаксис (упрощен для типичного прикладного случая):
SELECT <что> FROM <откуда> [WHERE <условие>] [ORDER BY <порядок>] [<куда>]
<что> определяет перечень полей таблицы БД, которые должны быть выбраны в результате.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
<откуда> заменяется именем таблицы, из которой выбираются данные и располагается после ключевого слова FROM (спецификатор отображения).
<условие> обсуждено выше.
ORDER BY указывает на сортировку результата по параметру <порядок>, который может быть полем, их совокупностью или результатом работы функции(й).
<куда> опционно указывает направление вывода. По умолчанию, таковым является курсор (временная таблица в памяти), к которому можно обратиться для последующего вывода или обработки.
<>
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
....
Упорядочивание
Если из базы выбирается несколько записей, предполагаемых для показа человеку, то вполне естественным будет, если они расставлены по порядку.
Каким будет условие, в данном случае неважно, сортируется итоговый результат. Принципиально, что для этого используется ключевое слово ORDER BY.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
....
UNION
Оператор, который можно рассматривать как «присоединение снизу», то есть добавление строк. Позволяет объединить две или более таблиц (частей) с идентичной структурой.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
....
JOIN
В отличие от сравнительно редко нужного UNION, данный оператор предназначен для «присоединения сбоку», то есть для обратной сборки реляционных таблиц БД в простую таблицу.
Таблиц может быть много (для каждой дополнительной нужен ещё один оператор JOIN), но начнем рассмотрение со слияния двух таблиц: tabl1 и tabl2. Попутно подчеркну, что речь пойдет исключительно про команду SELECT.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
....
COUNT
Очень нужная и важная процедура, реализуемая принципиально по-разному, далеко не всегда разумно. Надеюсь, понятно, что речь идет о подсчете числа записей.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
....
UPDATE
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
....
INSERT
Общий синтаксис
INSERT INTO <куда> [[<поле1>, [<поле2>...]] [VALUES (<значение1>, [<значение2>...])]
Добавить (вставить) можно пустую запись, а можно сразу присвоить значения полям: всем или избранным.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
....
DELETE
Общий синтаксис
DELETE FROM <откуда> [WHERE <условие>]
....
Управление объектами БД
В первую очередь речь идет о командах:
- CREATE DATABASE | TABLE | INDEX | VIEW | PROCEDURE — создание БД, таблицы, индекса, представления или хранимой процедуры. Интересно на практике только с точки зрения автоматизации работы.
- ALTER TABLE | COLUMN — добавляет, удаляет или изменяет столбцы в таблице, а также различные ограничения.
- DROP COLUMN | CONSTRAINT | FOREIGN KEY | DEFAULT | INDEX | DATABASE | TABLE | VIEW — удаление соответствующего объекта. Используются разный синтаксис и параметры в разных СУБД.
В очень многих случаях, даже профессиональных, интерфейсный доступ к данному набору команд у пользователя отсутствует, точнее — жестко ограничен диалогами. Только набор вручную дает полный доступ к синтаксису.
Если угодно, то их можно сравнить с плотницким топором: отрубить что-нибудь — раз плюнуть. Поэтому ограничимся тем, что назовем несколько функций.
Во-первых, те, которые в интерфейсах обычно все же есть.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Дополнительные источники
При обращении к литературе настоятельно советую внимательно следить за применимостью текстов к конкретной СУБД. В противном случае можно получить неработающие варианты. Или, что намного страшнее — дающие некорректный результат, обнаружение чего может быть крайне сложным.