Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000555.doc
Скачиваний:
31
Добавлен:
30.04.2022
Размер:
19.12 Mб
Скачать

9.2. Основные операторы запроса

В предыдущем разделе мы рассмотрели простейший запрос, состоящий из двух предложений

Сначала рассмотрим команды SQL-языка на примере простого запроса.

В SQL существует два ключевых слова, которые характеризуют параметры вывода информации: ALL и DISTINCT.

Параметр ALL означает, что нужно выводить все строки, а DISTINCT означает, что не нужно выводить повторяющиеся строки.

Следующий запрос выведет все возможные фамилии из таблицы Список, причем если в таблице встретится две строки с одинаковой фамилией, то запрос выведет эту фамилию только один раз.

SELECT DISTINCT Фамилия

FROM Список;

Если не задать параметр DISTINCT , то по умолчанию считается, что используется параметр ALL.

Следующее предложение запроса начинается ключевым словом WHERE. Как сказано ранее, это предложение содержит предикат, т.е. задаёт критерии поиска.

Например, надо выбрать все записи из таблицы Список, где в поле УчГруппа содержится текст "номер1". В этом случае запрос имеет следующий код:

SELECT *

FROM Список

WHERE УчГруппа LIKE 'номер1’

Результатом запроса будут все строки, содержащие в поле УчГруппа значение 'номер1’.

Если повторить последнюю строку запроса, то она будет звучать так: Где поле УчГруппа равно номер 1.

В запросах строки выделяются кавычками. В зависимости от базы данных, кавычки могут быть одинарными или двойными. В Delphi это одинарные кавычки.

Ключевое слово LIKE идентично знаку равенства (=) и оно используется для сравнения строк.

Если нужно сравнивать числа, то необходимо использовать знак равенства (=), а если сравнивать строки, то необходимо использовать оператор LIKE.

При поиске по числам запрос будет выглядеть так.

SELECT *

FROM Список

WHERE УчГруппа =15

В этом запросе мы производим поиск по числовому полю, поэтому используем знак равенства (=). Результатом запроса будут все строки, содержащие в поле УчГруппа значение 15.

Знак равенства (=) является реляционным оператором.

Реляционный оператор - математический символ, который указывает на определенный тип сравнения между двумя значениями.

SQL разрешает использовать следующие реляционные операторы:

• "=" - Равно

• ">" - Больше

• "<" - Меньше

• ">=" - Больше или равно

• "<=" - Меньше или равно

• "<>" – Не равно

Операторы "больше", "меньше" и др. можно использовать не только с числами, но и со строками.

При сравнении строк разного регистра меньшее значение будет иметь строка в верхнем регистре, например, "А" будет меньше "а" и "Р" будет меньше "а".

При сравнении строк необходимо использовать кавычки.

Кроме реляционных операторов, SQL разрешает использовать и логические операторы:

С помощью логических операторов можно делать сложные запросы.

В SQL предусмотрено три логических оператора:

AND (логическое "и"),

OR (логическое "или"),

NOT (логическое "не").

Рассмотрим пример запроса:

SELECT *

FROM User

WHERE Страна LIKE "Россия"

AND Покупка > 1

Первые два предложения требуют вывести все строки из таблицы User. Третье предложение указывает, что из всех строк нужно вывести только те, которые в поле "Страна" имеют значение "Россия" и в поле Покупка значение больше "1".

Если какое-то из этих условий не выполнится, то строка

не будет выбрана.

Запрос

SELECT *

FROM User

WHERE Страна LIKE " Россия "

OR Покупка =1

Результат запроса - все строки, содержащие в поле " Страна " значение " Россия " или в поле Покупка значение "1".

Для того, чтобы строка была выбрана, необходимо чтобы хотя бы одно из этих условий выполнилось.

SELECT *

FROM User

WHERE Страна LIKE "Россия"

AND NOT Покупка =1

Результат запроса - все строки, содержащие в поле Страна значение Россия и в поле Покупка значение не равное "1". Для того, чтобы строка была выбрана, необходимо

чтобы оба условия были верны (потому что используется оператор AND).

В принципе, это условие идентично условию Покупка " <>1", но иногда оператор NOT более удобен.

При использовании логических операторов можно использовать скобки:

SQL понимает круглые скобки как означающие, что все внутри них, будет оцениваться первым и обрабатываться как единое выражение.

Запрос

SELECT *

FROM User

WHERE СтранаLIKE Россия

AND (Покупка=1 OR Покупка =2)

Результат запроса - все строки, содержащие в поле Страна значение Россия и в поле Покупка значение равное "1" или "2". Для того, чтобы строка была выбрана, необходимо чтобы условие Страна LIKE Россия и условие в скобках были верны.

Рассмотрим ещё несколько операторов и шаблонов, упрощающих поиск необходимой информации.

Это операторы IN, BETWEEN, IS NULL и шаблоны - % (процент), и _ (подчёркивание).

Начнем я с оператора IN.

Оператор IN определяет набор значений с помощью имен или номеров членов набора, заключенных в круглые скобки и отделенных запятыми. Затем оператор IN проверяет различные значения указанного поля, пытаясь найти совпадение со значениями из набора. Если это случается, то предикат верен, иначе нет.

В принципе, можно создавать запросы и без оператора IN, но он упрощает SQL-код и делает его более наглядным.

Рассмотрим пример:

SELECT *

FROM User

WHERE Страна LIKE Россия or СтранаLIKE Украина or

Страна LIKE Армения;

Этот запрос вполне работающий, но представим, что надо перечислить 20 или более стран. В этом случае запрос получается громоздким.

Этот же запрос с оператором IN будет выглядеть так.

SELECT *

FROM User

WHERE Страна IN ("Россия", "Украина", "Армения");

Намного проще и занимает меньше места.

В данном случае оператор IN выводит все записи, в которых поле Страна имеет одно из значений, указанных в круглых скобках.

Если используется числовое поле, то кавычки надо убрать, как в запросе

SELECT *

FROM User

WHERE Покупка IN (1, 2, 3)

В этом случае мы увидим все записи, где поле Покупка равно 1 или 2 или 3.

Вместе с оператором IN и со всеми последующими операторами можно использовать логические операторы, например:

SELECT *

FROM User

WHERE Покупка NOT IN (1, 2, 3)

Теперь к рассмотрим оператор BETWEEN.

Оператор BETWEEN в общем то нужен для удобства пользования и можно обойтись без него.

Оператор BETWEEN похож на оператор IN.

В отличии от определения по номерам из набора, как это делает оператор IN, оператор BETWEEN определяет диапазон, значения которого должны уменьшаться, что делает предикат верным. Нужно ввести ключевое слово BETWEEN с начальным значением, ключевое AND и конечное значение. В отличие от оператора IN, оператор BETWEEN чувствителен к порядку, и первое значение в предложении должно быть первым по алфавитному или числовому порядку.

Рассмотрим пример.

Допустим, что надо вывести все строки, где поле Покупка больше либо равно 1 и меньше либо равно 5.

Этот запрос будет выглядеть так:

SELECT *

FROM User

WHERE Покупка>= 1 AND Покупка <= 5

С оператором BETWEEN та же запись будет выглядеть так:

SELECT *

FROM User

WHERE ПокупкаBETWEEN 1 AND 5

Таким образом, этот оператор задаёт диапазон чисел. Нужно помнить, что конечные точки включаются в результат запроса.

Этот оператор можно использовать и с строковыми полями:

SELECT *

FROM User

WHERE Сountry BETWEEN "A" AND "R";

В результат этого запроса войдут такие страны как GERMANY, AUSTRY, но не войдёт RUSSIA. Да потому что "GERMANY" меньше чем "R", а "RUSSIA" больше, потому что в слове "Russia" больше букв.

Рассмотрим ещё два оператора - % (процент) и _ (подчёркивание).

Точнее сказать это не операторы, это управляющие символы, используемые в шаблонах. Короче, эти управляющие символы используются вместе с оператором LIKE.

Оператор LIKE с вышеуказанными символами применим только к полям типа CHAR или VARCHAR, с которыми он используется, чтобы находить подстроки, т.е. он ищет поле символа, чтобы видеть, совпадает ли с условием часть его строки.

В качестве условия он использует групповые символы(wildkards) - специальные символы которые могут соответствовать чему-нибудь. Имеются два типа групповых символов используемых с LIKE:

  • символ подчеркивания ( _ ) замещает любой одиночный символ. Например, 'b_t' будет соответствовать словам 'bat' или 'bit', но не будет соответствовать 'brat'.

  • знак процента (%) замещает последовательность любого числа символов (включая символы нуля). Например '%p%t' будет соответствовать словам 'put', 'posit', или 'opt', но не 'spite'.

Следующий запрос позволяет выбрать из таблицы Список все имена, начинающиеся с К.

SELECT

FROM Список

WHERE Имя LIKE 'К%';

Пусть нужно вывести из таблицы User все записи, которые в поле Страна содержат значения, начинающееся на "Р". Запрос будет выглядеть так:

SELECT *

FROM User

WHERE Страна LIKE "Р%";

Значок % (процент) означает любое количество символов, т.е. в результат войдут все слова, начинающиеся на R и содержащие потом любое количество любых символов.

Рассмотрим ещё пример: "А%С".

В результат такого шаблона войдут слова, которые

начинаются на "А" и заканчиваются на "С".

Значок _ (подчёркивание) означает один любой символ. Если % означал любое количество символов, то _ означает только один.

Рассмотрим пример: "Т_К".

В результат такого шаблона войдут слова, содержащие между буквами Т и К одну букву, например ТОК, ТУК, ТИК, но не войдут ТУПИК и другие слова, содержащие между буквами Т и К больше одной буквы.

Таблицы - это неупорядоченные наборы данных, и данные, которые выходят из них, не обязательно появляются в какой-то определенной последовательности.

SQL использует команду ORDER BY, которая позволяет упорядочивать вывод. Эта команда упорядочивает вывод запроса согласно значениям в том или ином количестве выбранных столбцов.

Можно определять возрастание ( ASC ) или убывание ( DESC ) для каждого столбца. По умолчанию установлено - возрастание.

Так, команда ORDER BY Фамилия ASC упорядочивает содержимое столбца Фамилия по возрастанию.

Следует обратить внимание, что во всех случаях столбцы, которые упорядочиваются, должны быть указаны в запросе SELECT

Вместо имен столбца, можно использовать их порядковые номера для указания поля, используемого в упорядочении вывода. Эти номера должны ссылаться на порядок столбцов в запросе, а не на порядок столбцов в таблице.

Другими словами, поле, упомянутое в предложении SELECT первым, для ORDER BY - это поле 1, независимо от того каким по порядку оно стоит в таблице.

До сих пор мы обращались к одной таблице, теперь рассмотрим случай, когда имеются две связанные таблицы,

и из них нужно вывести поля Фамилия, имеющие оценку Хорошо.

Так как поле Фамилия, как связующее, имеется в обеих таблицах, то в предложении SELECT это поле нужно при выводе указывать по общему правилу – Имя таблицы. Имя поля.

В этом случае запрос имеет вид

SELECT Список.Фамилия,. Оценка;

FROM Список. Оценки;

WHERE Список.Фамилия LIKE Оценки. Фамилия

AND Оценка LIKE ‘Хорошо’;

В первом предложении запроса указывается, что нужно вывести поле Фамилия, из таблицы Список, и поле Оценка.

Второе предложение указывает, что вывод надо сделать из таблиц Список и Оценки.

Третье предложение указывает, что выводить надо только те поля Фамилия, которые имеются в обеих таблицах и которые в поле Оценка имеет значение Хорошо

Часто в таблицах могут иметься записи, которые не имеют никаких значений для некоторых полей, например, потому что информация не завершена, или потому что это поле просто не заполнялось.

SQL учитывает такой вариант, позволяя вводить значение NULL (ПУСТОЙ) в поле, вместо значения поля.

Когда значение поля равно NULL, это означает, что программа базы данных специально промаркировала это поле, как не имеющее никакого значения для этой строки (или записи).

Это отличается от просто назначения полю, значения нуля или пробела, которые база данных будет обрабатывать также как и любое другое значение.

NULL не является техническим значением, оно не имеет и типа данных. Оно может помещаться в любой тип поля. Тем ни менее, NULL в SQL часто упоминается как нуль.

Предположим, что имеются таблицы продавцов и покупателей. Получили нового покупателя, который еще не был назначен продавцу. Чем ждать продавца, к которому нужно назначить нового покупателя, можно ввести покупателя в базу данных теперь же, так что он не потеряется при перестановке.

Вы можете ввести строку для покупателя со значением NULL в поле Номер продавца и заполнить это поле значением позже, когда продавец будет назначен.

Так как NULL указывает на отсутствие значения, то не возможно знать, каков будет результат любого сравнения с использованием NULL.

Когда NULL сравнивается с любым значением, даже с другим таким же NULL, результат будет ни верным, ни неверным, он будет неизвестным.

Неизвестный логический оператор, вообще ведет себя также как неверная строка, которая, произведя неизвестное значение в предикате, не будет выбрана запросом, потому что в то время как NOT(неверное) - равняется верно, NOT (неизвестное) - равняется неизвестно.

Следовательно, выражение типа 'city = NULL' или city' IN (NULL)' будет неизвестно, независимо от значения поля city.

Часто необходимо делать различия между понятиями неверно и неизвестно, т.е. между строками, содержащими значения столбцов, которые не соответствуют условию предиката и которые содержат NULL в столбцах.

По этой причине, SQL предоставляет специальный оператор IS, который используется с ключевым словом NULL, для размещения значения NULL.

Найдем все записи в нашей таблице Заказчиков с NULL значениями в столбце city:

SELECT *

FROM Customers

WHERE city IS NULL;

Если не имеется никаких значений NULL в наших типовых таблицах, то не будет и никакого вывода

Ранее рассмотренные операторы NULL, IS NULL, IN, BETWEEN, LIKE могут действовать совместно с логическим оператором NOT.

Так, если мы хотим устранить NULL из нашего вывода, необходимо использовать NOT, чтобы изменить на противоположное значение предиката:

SELECT *

FROM Customers

WHERE city NOT NULL;

При отсутствии значений NULL(что предполагалось выше), будет выведена вся таблица Заказчиков.

Аналогично можно ввести следующее

SELECT *

FROM Customers

WHERE NOT city IS NULL;

Мы можем также использовать NOT с IN при таком запросе:

SELECT *

FROM Salespeople

WHERE city NOT IN ( 'London', 'San Jose' );

Подобный запрос можно записать и так.

SELECT *

FROM Salespeople

WHERE NOT city IN ( 'London', ' San Jose' );

Таким же способом Вы можете использовать NOT BETWEEN и NOT LIKE.