Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Топовые новости
Новое

Предложение WHERE (SELECT/UPDATE/DELETE)

Предложение WHERE указывает критерий поиска для таких операций, как SELECT, UPDATE или DELETE. Записи целевой таблицы, которые не удовлетворяют этому критерию, из операции исключаются. Условия поиска могут включать множество вариантов, таких, как вычисления, булевы операторы и предикаты SQL (такие, как LIKE или BETWEEN).


Синтаксис SQL 2003

{WHERE критерий_поиска | WHERE CURRENT OF имя_курсора)


Ключевые слова

WHERE критерий_поиска

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

WHERE CURRENT OF имя_курсора

Действия инструкции ограничиваются текущей строкой в созданном и открытом курсоре с именем имя_курсора.


Общие правила

Предложения WHERE используются в инструкциях SELECT, инструкциях DELETE, инструкциях INSERT, SELECT, инструкциях UPDATE, а также в любых инструкциях, которые могут содержать запрос или подзапрос, например DECLARE, CREATE TABLE, CREATE VIEW и тому подобное. К условиям поиска, которые все были описаны в посвященных им разделах этой книги, относятся следующие. Условия типа ALL!=ALL, >ALL, <= ALL, SOME/ANY)

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

SELECT
pub_name
FROM publishers
WHERE city=SOME (SELECT city FROM authors);


Комбинации (AND, OR и NOT) и иерархия их проверки

Например, чтобы увидеть авторов, объемы продаж книг которых больше или равны 75 единицам, или вторых авторов с уровнем старшинства большим или равным 60, используется такой запрос.

SELECT
a.au_id
FROM authors AS a
JOIN title_author AS ta ON a.au_id=ta.au_id
WHERE ta.title.id IN (SELECT titie_id FROM sales WHERE qty >= 75)
OR (a.au_id IN (SELECT au_id FROM titleauthor WHERE royaltyper >= 60)
AND a.au_id IN (SELECT au_id FROM titleauthor WHERE au_ord=2));

За дополнительной информацией обращайтесь к следующему разделу «Советы и хитрости программирования». Операторы сравнения (такие, как =, <>, <, >, < — и >=)

Например, чтобы увидеть имена и фамилии авторов из таблицы authors, у которых нет контракта (то есть значение contract равно 0), можно использовать такой запрос.

SELECT
au_lname,
au_fname
FROM authors
WHERE contract=0;


Списки (IN и NOT IN)

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

SELECT
au_fname,
au_lname
FROM authors
WHERE au_id NOT IN
(SELECT au_id FROM titleauthor);


Проверка на NULL (IS NULL и IS NOT NULL)

Например, чтобы вывести заголовки книг, для которых количество продаж с начала года (year-to-date sales, ytd_sales) равно NULL, используем такой запрос.

SELECT
title.id,
SUBSTRING(title, 1, 25) AS title
FROM titles
WHERE ytd_sales IS NULL;

He указывайте в запросе конструкции типа=NULL. Значение NULL является неизвестным, и оно не может быть равным чему-либо. Использование конструкции=NULL — это не то же самое, что оператор IS NULL. За дополнительной информацией обрсацайтесъ к разделу «Оператор IS» выше в данной главе.


Совпадение с шаблоном (LIKE и NOT LIKE)

Например, получим записи об авторах, чьи фамилии начинаюся с «С».

SELECT
au_id
FROM authors
WHERE au_lname LIKE, C%’;


Операторы работы с диапазонами (BETWEEN и NOT BETWEEN)

Например, чтобы увидеть фамилии авторов, расположенные между «Smith» и «White», используем следующий запрос.

SELECT
au_lname,
au_fname
FROM authors
WHERE au_lname BETWEEN ‘smith’ AND ‘white’;


Советы и хитрости программирования

Для предложения WHERE может потребоваться специальная обработка при работе с некоторыми типами данных, такими, как LOB, и некоторыми наборами символов, такими, как UNICODE.

Для определения порядка выполнения операторов в предложении WHERE используются скобки. Заключение предложения в скобки заставляет систему выполнить это предложение прежде остальных. Скобки можно вкладывать друг в друга, создавая иерархию выполнения. Первым будет проверяться наиболее глубоко вложенное предложение. При работе со скобками следует быть осторожным в силу двух причин.

Количество открывающих и закрывающих скобок должно быть одинаковым. Любое несоответствие числа открывающих и закрывающих скобок вызовет ошибку.

Скобки нужно расставлять внимательно, поскольку неправильная расстановка может существенно изменить результат вашего запроса.

Например, рассмотрим снова следующий запрос, который возвращает шесть строк из базы данных pubs на платформе SQL Server.

SELECT DISTINCT
a.au.id
FROM authors AS a
JOIN titleauthor AS ta ON a.au_id=ta.au_id
WHERE ta.title_id IN
(SELECT title_id
FROM sales
WHERE qty >= 75) OR (a au_ia IN
(SELECT au_id
FROM titleauthor WHERE royaltyper >= 60)
AND a.au_ic IN (SELECT au_id FROM titleauthor WHERE au_ord=2));

Результат этого запроса будет следующий:

3u…10

213-46-8915 724-80-9391 899-46-2035 998-72-3567

Изменение всего лишь одного набора скобок создаст другой результат.

SELЕСТ DISTINCT
a.au_id
FROM authors AS a
JOIN titleauthor AS ta ON a.au_id=ta.au_id
WHERE (ta.title_id IN
(SELECT title_id FROM sales
WHERE qty >= 75) OR a.au_id IN
(SELECT au_id
FROM titleauthor
WHERE royaltyper >= 60)) AND a.au_id IN
(SELECT au_id FROM titleauthor WHERE au_ord=2)

В этот раз результат будет такой:

au_:id

213-46-8915 724-80-9391 899-46-2035


DB2

Поддерживается так, как описано выше.


MySQL

Поддерживается так, как описано выше.


Oracle

Поддерживается так, как описано выше.


PostgreSQL

Поддерживается так, как описано выше.


SQL Server

Поддерживается так, как описано выше.

Источник