SELECT * FROM Table WHERE Field IS NOT NULL
SELECT * FROM Table WHERE Field IS NULL
Необходимо отметить, что язык SQL, в отличие от языков программирования, имеет встроенные средства поддержки факта отсутствия каких-либо данных. Осуществляется это с помощью NULL-концепции. NULL не является каким-то фиксированным значением, хранящимся в поле записи вместо реальных данных. Значение NULL не имеет определенного типа. NULL – это индикатор, говорящий пользователю (и SQL) о том, что данные в поле записи отсутствуют. Поэтому его нельзя использовать в операциях сравнения. Для проверки факта наличия-отсутствия данных в SQL введены специальные выражения.
Выражение [NOT] LIKE используется при проверке текстовых данных на [не]соответствие заданному шаблону. Символ ‘%’ (процент) в шаблоне заменяет собой любую последовательность символов, а символ ‘_’ (подчеркивание) – один любой символ.
SELECT * FROM Employees WHERE Name LIKE ‘Иван%’
Попадающие под заданное условие фамилии: Иванов
SELECT * FROM Employees WHERE Name LIKE ‘__д%’
Попадающие под заданное условие фамилии: Сидоров
Выражение [NOT] IN проверяет значения на [не]вхождение в определенный список:
SELECT * FROM Employees WHERE Position IN (‘Начальник’, ‘Менеджер’)
Выражение [NOT] BETWEEN проверяет значения на [не]попадание в некоторый диапазон:
SELECT * FROM Employees WHERE Salary BETWEEN 200 AND 500
Этот запрос вернет список работников, зарплата которых больше либо равна 200 у.е. и меньше либо равна 500 у.е.
Несколько условий поиска могут комбинироваться посредством логических операторов AND, OR или NOT:
SELECT *
FROM Employees
WHERE Position IN (‘Начальник’, ‘Менеджер’)
AND Salary BETWEEN 200 AND 500
SELECT *
FROM Employees
WHERE (Position = ‘Начальник’ OR Position =
‘Менеджер’)
AND Salary BETWEEN 200 AND 500
SELECT *
FROM Employees
WHERE NOT (Position = ‘Начальник’ OR Position =
‘Менеджер’)
Секция ORDER BY
Необязательная секция ORDER BY в команде SELECT предназначена для сортировки строк результирующего набора данных. Формат этой секции в общем виде выглядит так:
ORDER BY Field1 [ASC | DESC] [, Field2 [ASC | DESC] ] [, …]
Ключевое слово ASC предписывает производить сортировку по возрастанию, а DESC – по убыванию. Если ASC и DESC отсутствуют, по умолчанию подразумевается ASC. Например, выберем записи о начальниках и отсортируем результат в порядке убывания размера зарплат:
SELECT *
FROM Employees
WHERE Position = ‘Начальник’
ORDER BY Salary DESC
Следующий запрос отсортирует сотрудников по отделам (в порядке возрастания номера отдела) и по размеру зарплат внутри каждого отдела (в порядке убывания зарплаты):
SELECT *
FROM Employees
ORDER BY DeptNum ASC, Salary DESC
Ключевое слово ASC можно опустить, ибо оно действует по умолчанию:
SELECT *
FROM Employees
ORDER BY DeptNum, Salary DESC
Групповые функции
Если нас не интересуют строки таблицы как таковые, а интересуют некоторые итоги, мы можем использовать в процессе выборки колонок таблиц групповые функции. Основные групповые функции представлены ниже:
Функция | Описание |
SUM(Field) | Вычисляет сумму по указанной колонке |
MIN(Field) | Вычисляет минимальное значение по указанной колонке |
MAX(Field) | Вычисляет максимальное значение по указанной колонке |
AVG(Field) | Вычисляет среднее значение по указанной колонке |
COUNT(*) | Вычисляет количество строк в результирующей выборке |
COUNT(Field) | Вычисляет количество не пустых значений в колонке |
Например, чтобы узнать максимальную зарплату, получаемую сотрудниками в организации, можно выполнить запрос вида:
SELECT MAX(SALARY)
FROM Employees
Общее количество записей в таблице вернет запрос вида:
SELECT COUNT(*)
FROM Employees
Секция GROUP BY
По умолчанию группой, на которой вычисляется групповая функция, является вся результирующая выборка. Если мы нуждаемся в вычислении промежуточных итогов, мы можем разбить итоговую выборку на подгруппы с помощью необязательной секции GROUP BY:
GROUP BY Field1 [, Field2] [, …]
Например, подсчитаем максимальную зарплату по отделам организации:
SELECT DeptNum, MAX(SALARY)
FROM Employees
GROUP BY DeptNum
В этом случае функция MAX будет считаться отдельно для всех записей с одинаковым значением поля DeptNum.
Секция HAVING
На промежуточные итоги может быть наложен дополнительный фильтр посредством секции HAVING. В ниже приведенном примере в результат попадут только отделы, максимальная зарплата в которых превышает 1000 у.е.:
SELECT DeptNum, MAX(SALARY)
FROM Employees
GROUP BY DeptNum
HAVING MAX(SALARY) > 1000
Важно понимать, что секции HAVING и WHERE взаимно дополняют друг друга. Сначала с помощью ограничений WHERE формируется итоговая выборка, затем выполняется разбивка на группы по значениям полей, заданных в GROUP BY. Далее по каждой группе вычисляется групповая функция и в заключение накладывается условие HAVING.
Изменение данных
Под изменением данных понимаются следующие операции:
- втавка новых строк в таблицу;
- именение существующих строк;
- уаление существующих строк.
Команда INSERT
Добавление новых записей в таблицу осуществляется посредством команды INSERT. Она имеет следующий синтаксис:
INSERT INTO <имя таблицы> [(<список имен колонок>)]
VALUES(<список констант>)
Например, для внесения сведений о новом работнике необходимо выполнить следующую команду:
INSERT INTO Employees(TabNum, Name, Position, DeptNum,
Salary)
VALUES(45, ‘Сергеев’, ‘Старший менеджер’, 15, 850)
После выполнения команды таблица Employees будет выглядеть следующим образом:
Employees | ||||
TabNum | Name | Position | DeptNum | Salary |
Иванов | Начальник | |||
Петров | Инж. | |||
Сидоров | Менеджер | |||
Сергеев | Ст. менеджер |
Если какая-либо колонка в списке будет опущена при вставке – в соответствующее поле записи автоматически будет занесено пустое значение (NULL):
INSERT INTO Employees(TabNum, Name, DeptNum, Salary)
VALUES(45, ‘Сергеев’, 15, 850)
После выполнения команды таблица Employees будет выглядеть следующим образом:
Employees | ||||
TabNum | Name | Position | DeptNum | Salary |
Иванов | Начальник | |||
Петров | Инж. | |||
Сидоров | Менеджер | |||
Сергеев |
Количество констант в секции VALUES всегда должно соответствовать количеству колонок. Список колонок в команде INSERT может быть опущен целиком, в этом случае список констант в секции VALUES должен точно соответствовать описанию колонок таблицы в словаре данных СУБД, иначе команда будет отвергнута ядром БД. Пример правильной команды:
INSERT INTO Employees VALUES(45, ‘Сергеев’,
‘Старший менеджер’, 15, 850)
Команда вида:
INSERT INTO Employees VALUES(45, ‘Сергеев’, 15, 850)
Завершится ошибкой, так как количество констант не соответствует реальному количеству колонок в таблице.
В колонку можно в явном виде внести пустое значение посредством ключевого слова NULL. Последний запрос можно переписать следующим образом:
INSERT INTO Employees VALUES(45, ‘Сергеев’, NULL, 15, 850)
В этом случае команда вставки отработает корректно и в поле Position будет внесено пустое значение. Очевидно, что к аналогичному результату приведет и команда:
INSERT INTO Employees(TabNum, Name, Position, DeptNum,Salary)
VALUES(45, ‘Сергеев’, NULL, 15, 850)
Кроме простого добавления новых записей команда INSERT позволяет осуществлять пакетную перекачку данных из таблицы в таблицу. Синтаксис подобной команды следующий:
INSERT INTO <имя таблицы> [(<список имен колонок>)]
<команда SELECT>
Например:
INSERT INTO Table1(Field1, Field2)
SELECT Field3, (Field4 + 5) FROM Table2
Команда DELETE
Чтобы удалить ненужные записи из таблицы – следует использовать команду DELETE:
DELETE FROM <имя таблицы> [WHERE <условия поиска>]
Если опустить секцию условий поиска WHERE – из таблицы будут удалены все записи. Иначе – только записи, удовлетворяющие критериям поиска. Форматы секций WHERE команд SELECT и DELETE аналогичны.
Примеры команды DELETE:
DELETE FROM Employees
DELETE FROM Employees WHERE TabNum = 45
Команда UPDATE
Изменить ранее внесенные командой INSERT данные можно с помощью команды UPDATE:
UPDATE < имя таблицы>
SET <имя колонки> = <новое значение> , <имя колонки> =
<новое значение>, …
WHERE <условия поиска>]
Как и в случае команды DELETE, при отсутствии секции WHERE обновлены будут все строки таблицы. Иначе – только подходящие под заданные условия. Примеры:
UPDATE Employees SET Salary = Salary + 100
UPDATE Employees
SET Position = ‘Старший менеджер’, Salary = 1000
WHERE TabNum = 45 AND Position IS NULL