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

Наши рекомендации