- •1. Основные сведения о языке sql
- •2. Определение данных
- •2.1. Создание и удаление таблицы
- •2.2. Изменение состава полей таблицы
- •2.3. Создание и удаление индекса
- •IndName on Personnel.Db (Name)
- •IndNamePosition on Personnel.Db (Name, Position)
- •3. Отбор данных из таблиц
- •3.1. Описание оператора select
- •3.2. Управление полями
- •3.3. Простое условие отбора записей
- •3.4. Сложные критерии отбора записей
- •3.5 Группирование записей
- •3.6. Сортировка записей
- •Var s: string;
- •3.7. Соединение таблиц
- •4. Модификация записей
- •4.1. Редактирование записей
- •4.2. Вставка записей
- •Insert into Store
- •Values ("Торшер", 499.9, 10);
- •Insert into CardsArchives
- •4.3. Удаление записей
- •5. Статический и динамический запросы
- •Var str: string;
3.3. Простое условие отбора записей
В предыдущем разделе в набор данных попадали все записи из указанных таблиц, при этом разработчик мог управлять составом полей этих записей. На практике набор данных обычно ограничивается записями, удовлетворяющими каким-либо определенным условиям (критериям) отбора, задаваемым с помощью операнда where. Критерий отбора может варьироваться от простейшего, в котором сравниваются два значения, до сложного, когда учитывается много факторов. При этом в набор данных попадают записи, для которых выполняется условие отбора.
Критерий отбора представляет собой логическое выражение, в котором можно использовать операции, перечисленные ниже.
1. Сравнение
= — равно • <= — меньше или равно
> — больше • <> или ! = — не равно
< — меньше • ! > — не больше
>= — больше или равно • ! < — не меньше
2. like — сравнение по шаблону
3. is null — проверка на нулевое значение
4. in — проверка на вхождение
between — проверка на вхождение в диапазон
В простом критерии отбора используется одна операция. Для операций сравнения и сравнения по шаблону критерий отбора имеет следующий формат:
<Выражение1> «Операция сравнения> <Выражение2>
Выражение состоит из имен полей, функций, констант, значений, знаков операций и круглых скобок. В простейшем случае — из имени поля или значения. Например:
SELECT Name
FROM Personnel
WHERE Salary >= 4000;
Этот оператор задает получение списка сотрудников, имеющих оклад не менее 4000 рублей:
Name
Иванов P.O.
Петров А.П.
Семенова И.И.
Пример отбора записей по значениям символьного поля:
SELECT Name
FROM Personnel
WHERE Position = 'Водитель';
В результате получим выборку с фамилиями водителей:
Name
Попов А.Л.
Васин Н.Е.
Поля, входящие в набор данных, и поля, используемые в критерии отбора, могут отличаться друг от друга. Так, в приведенном примере в наборе данных присутствует поле фамилии Name, в то время как в критерии отбора записей используется поле оклада Salary.
В последнем примере в операции сравнения учитывается регистр символов, и слова Водитель и водитель не равны друг другу. Поэтому различия в регистре символов или наличие ведущих и конечных пробелов приводят к ошибкам отбора записей. В данной ситуации критерий отбора лучше записать в следующем виде:
WHERE UPPER(TRIM(Post)) = 'ВОДИТЕЛЬ'
Функция trim удаляет из строкового значения ведущие и конечные пробелы, а функция upper приводит символы полученной строки к верхнему регистру. В результате должность водитель независимо от наличия ведущих и конечных пробелов, а также регистра букв будет приведена к значению водитель.
Для сравнения строк вместо операций =, != и <> можно использовать операцию like, выполняющую сравнение по частичному совпадению. Частичное совпадение значений целесообразно проверять, например, в случаях, когда известны только начальная часть фамилии или названия предмета. Вот образец соответствующего запроса:
SELECT Name
FROM Personnel
WHERE Name LIKE "Ав"
Здесь мы получаем список фамилий, начинающихся на Ав.
В выражениях операции like допускается использование шаблона, в котором разрешены все алфавитно-цифровые символы (с учетом регистра). При этом два символа имеют специальное назначение:
% — замещение любого количество символов, в том числе и нулевого;
_ — замещение одного символа.
С помощью шаблона можно выполнить проверку на частичное совпадение не только начальных символов строки, но и найти вхождение заданного фрагмента в любую часть строкового значения. Например:
SELECT Name
FROM Goods
WHERE Name LIKE "%" | | "ка" | | "%"
В приведенном запросе происходит отбор всех товаров, в названия которых входят символы ка. Набор данных, полученный при таком отборе, может иметь вид:
Name
ручка
карандаш
замазка
Перед операцией like можно использовать описатель not, который изменяет результат выполнения операции на противоположное значение и проверяет значения выражений на несовпадение.
Для проверки нулевого значения выражения служит операция is null, которая имеет следующий формат:
<Выражение> IS [NOT] NULL
Так, в запросе:
SELECT *
FROM Store
WHERE S_Price IS NULL
выполняется отбор всех полей записей таблицы склада (store), для которых не определена цена (s_Price) товара.
Проверка на вхождение значения выражения в список выполняется с помощью операции in следующего формата:
<Выражение> [NOT] IN <Список значений >
Эту операцию удобно использовать, если выражение может принимать относительно небольшое количество различных значений. Вот пример соответствующего запроса:
SELECT Name, Salary
FROM Personnel
WHERE LOWER(Post) IN ("менеджер", "водитель")
В результате его выполнения мы получим выборку фамилий и окладов всех менеджеров и водителей:
Name Salary
Петров А.П. 5200
Семенова И.И. 5200
Попов А.Л. 2400
Васин Н.Е. 2500
Операция between выполняет проверку вхождения значения в диапазон и имеет формат:
<Выражение> [NOT] BETWEEN
<Минимальное значение > AND < Максимальное значение >
При использовании этой операции в набор данных включаются записи, для которых значение выражения больше или равно минимальному, а также меньше или равно максимальному значениям.
Замечание
Описатель not изменяет результат операции на противоположный.
Рассмотрим запрос:
SELECT *
FROM Cards
WHERE C_Date BETWEEN "21.5.08" AND "27.5.2008"
В результате его выполнения получим набор записей, для которых дата (поле CDate) находится в диапазоне с 21 по 27 мая 2008 года:
С_Number C_Code C_Move C_Date
3 3 -150 22.05.08
4 3 -30 22.05.08
5 3 270 24.05.08
6 4 200 27.05.08
Значение даты заключается в апострофы, в качестве разделителя используется точка. В некоторых других реализацих языка SQL в качестве разделителей допускается использовать символы — и /. Значение года можно задавать как двумя (21.5.08), так и четырьмя (27.5.2008) цифрами. Для значения дня и месяца можно опускать незначащий ноль.
