Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BBD_Shpory.doc
Скачиваний:
11
Добавлен:
26.09.2019
Размер:
13.1 Mб
Скачать

26. Команда select, устранение избыточности данных - distinct. Определение выборки - where.

Команда SELECT

Все запросы в SQL конструируются на базе одной команды – SELECT. Ее можно расширять для выполнения сложных обработок.

SELECT name1, name2, … - список столбцов, представляемых в результате

FROM Table name; связаны

Перенос на другую строку ничего не меняет в команде.

*- означает все.

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

Устранение избыточности данных

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

SELECT snum

FROM Orders;

Если добавить аргумент DISTINCT, то

SELECT DISTINCT snum

FROM Orders;

Исключит дублирующиеся значения из результата.

Противоположным аргументом является ALL– он включает все значения (по умолчанию - ALL).

Определение выборки – предложение WHERE

Предложение WHERE команды SELECT позволяет определить предикат, условие, которое может быть либо истинным, либо ложным для каждой строки. Команды извлекает только те, для которых предикат имеет значение “истина”.

Предположим, нужно узнать имена всех продавцов в городе London:

SELECT sname, city

FROM Sales people

WHERE city = ‘London’;

Пример на числовое поле:

SELECT * FROM Customers

WHERE rating = 100;

Очевидно, что применение WHERE не исключает DISTINCT и наоборот.

Допустимы и другие операторы:

>, <, >=, <= , <>

‘а’ <’n’ означает, что ‘а’ предшествует ‘n’ в алфавитном порядке.

Булевы операторы: AND, OR, NOT

Пример:

SELECT * FROM Customers

WHERE city = ‘London’

AND rating > 200;

Пример на OR:

SELECT * FROM Customers

WHERE city = ‘London’

OR NOT rating > 200;

Или записи у которых город Лондон, или если rating не больше 200.

NOT должен предшествовать булеву выражению, значение которого он должен изме-нить (но не перед оператором сравнения rating NOT >200 ). SQL применяет NOT только к тому выражению, которое непосредственно следует за ним. Если нужно охватить больше, то ставятся круглые скобки:

… WHERE NOT (city = ‘London’ OR rating > 200);

Проследим логику в намеренно усложненном примере:

SELECT *

FROM Orders

WHERE NOT ((odate = 10/03/1990 AND snum > 1002)

OR amt > 2000.00);

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

Рассмотрим приведенный пример:

Наибольшая глубина вхождения у предиката:

odate = 10/03/1990 AND snum > 1002, который дает “истину” для строк, удовлетворяющим обоим условиям. Обозначим его как В1. Это выражение соединено с amt > 2000,00 В2 с помощью OR и образует выражение В3. Оно полностью в круглых скобках перед NOT и вместе с ним образует В4 – предикат запроса.

27. Операторы in, between... And, like, is null.

Оператор IN

IN полностью определяет множество, к которому данное значение может принадлежать или не принадлежать. Допустим, нужно наити всех продавцов, расположенных либо в «Barcelona», либо в «London»:

SELECT * FROM Sales people

WHERE city = «Barcelona» OR city = «London»:

IN позволяет упростить:

SELECT * FROM Sales people

WHERE city IN («Barcelona», «London»);

Пример 2. Найти всех покупателей, обслуживаемых продавцами 1001, 1007, 1004.

SELECT * FROM Customers

WHERE snum IN (1001, 1007, 1004);

Но наиболее полезен IN в случае, когда в скобках расположен подзапрос (рассмотрен далее).

Оператор BETWEENAND

Вместо перечисления, как в IN, в BETWEEN задаются границы. Первое значение должно быть первым в алфавитном или числовом порядке (чувствителен к порядку).

SELECT * FROM Salespeople

WHERE comm BETWEEN .10 AND .12;

Граничные значения включаются в зону истинности. Если их нужно исключить, то:

SELECT * FROM Salespeople

WHERE (comm BETWEEN .10 and .12) and not

Comm IN (.10, .12);

Для символьных полей:

SELECT * FROM Salespeople

WHERE cname BETWEEN “A” AND “G”;

Заметим, что “A” и “G” строки и при сравнении неравные строки заполняются пробелами, но пробел предшествует символам в алфавитной кодировке, поэтому строка “Giovanni” не будет включена, поэтому нужно либо дать следующую букву- «Н», либо приписать несколько Z к G- “GZZ”, чтобы включить все имена на G.

Оператор LIKE

Используется для поиска подстрок и применим только к символьным (текстовым) полям. Для расширения зоны поиска применяются символы- шаблоны:

« _ » - заменяет один любой; % - последовательность, в том числе и нулевой длины

SELECT * FROM Customers

WHERE cname LIKE “G%”;

Иногда (достаточно редко) возникает проблема для самих этих символов (как искать их). Для ее решения существует возможность определить так называемый ESCAPE- символ. Предшествуя символу - шаблону ESCAPE-символ делает из него обычный символ. Он действует и на себя самого если указать два раза подряд.

SELECT * FROM Sales people

WHERE sname LIKE “%/-%” ESCAPE ‘/’;

определяет символ ‘/’ как служебный ESCAPE

Оператор IS NULL

Поскольку в полях может быть значение NULL, которые расшифровываются как «неизвестные», то и операции над ними дают «неизвестное» (например NOT). Поэтому нужен механизм фильтрования подмножества с NULL и это оператор IS NULL:

SELECT * FROM Customers WHERE city IS NULL;

Допустима противоположная конструкция IS NOT NULL. Еще пример на NOT с другими операторами:

WHERE NOT city IN (“London”, “Barcelona”);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]