Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

699

.pdf
Скачиваний:
4
Добавлен:
15.11.2022
Размер:
3.63 Mб
Скачать

{ { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [,...n ]

[ BY expression [,...n ] ]

]

[ <FOR Clause>]

[ OPTION ( <query_hint> [,...n ] ) ]

<query_expression>::=

|

(

{

<query_specification>

<query_expression> ) }

 

 

[ { UNION [ ALL ] | EXCEPT |

INTERSECT }

 

|

(

<query_specification>

<query_expression> ) [...n ] ]

 

 

<query_specification>::=

 

 

SELECT [ ALL | DISTINCT ]

[

WITH

[TOP

expression [PERCENT]

TIES ] ]

 

 

 

< select_list >

[ INTO new_table ]

[ FROM { <table_source> } [,...n ] ] [ WHERE <search_condition> ]

[ <GROUP BY> ]

[ HAVING < search_condition > ]

В запросе SELECT используются операторы: WITH common_table_expression, UNION, SELECT Clause, EXCEPT, INTERSECT, INTO Clause, ORDER BY, FROM, COMPUTE, WHERE, FOR Clause, GROUP BY, OPTION, Clause, HAVING [29].

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

SELECT DISTINCT Клиент.Фирма FROM

Клиент

Функция COUNT()

COUNT(). Эта функция подсчитывает число строк. Причем если в качестве аргумента этой функции выступа-

161

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

NOT NULL.

SELECT COUNT(id_topic) FROM posts;

Предложение FROM

Предложение FROM задает имена таблиц и представлений, которые содержат поля, перечисленные в операторе SELECT. Необязательный параметр псевдонима – это сокращение, устанавливаемое для имени таблицы.

Обработка элементов оператора SELECT выполняется в следующей последовательности:

FROM – определяются имена используемых таблиц; WHERE – выполняется фильтрация строк объекта в

соответствии с заданными условиями;

GROUP BY – образуются группы строк, имеющих одно и то же значение в указанном столбце;

HAVING – фильтруются группы строк объекта в соответствии с указанным условием;

SELECT – устанавливается, какие столбцы должны присутствовать в выходных данных;

ORDER BY – определяется упорядоченность результатов выполнения операторов.

Порядок предложений и фраз в операторе SELECT не может быть изменен. Только два предложения SELECT и FROM являются обязательными, все остальные могут быть опущены. SELECT – закрытая операция: результат запроса к таблице представляет собой другую таблицу. Существует множество вариантов записи данного оператора, что иллюстрируется приведенными ниже примерами.

Составить список сведений о всех клиентах.

162

SELECT * FROM Клиент

SELECT name, email FROM users;

Раздел WHERE

Могут находиться следующие предикаты: предикат сравнения, предикат between, предикат in, предикат like, предикат null, предикат с квантором и предикат exists. Наличие таких предикатов позволяет СУБД использовать индексы при выполнении запроса, т.е. избегать полного просмотра таблицы.

SELECT имя_столбца FROM имя_таблицы WHERE условие;

SELECT * FROM topics WHERE id_author=4;

Извлечение всех строк и столбцов из таблицы

Чтобы получить все записи из таблицы (все хранящиеся в ней данные), используйте выражение SELECT со специальным символом «*»:

select * from emp

Его применение обусловливает извлечение всех столбцов таблицы. Альтернативный вариант – явно перечислить в выражении SELECT все столбцы:

select empno,ename,job,sal,mgr,hiredate,comm,dept no

from emp

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

163

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

--Returns all columns in the table

--Does not use the optional schema,

dbo

SELECT * FROM Products

Извлечение подмножества строк из таблицы

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

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

select * from emp

where deptno = 10

Предикат WHERE дает возможность извлекать только определенные строки. Если для данной строки выражение предиката WHERE истинно, то она будет возвращена. Большинство производителей поддерживают обычные операторы, такие как =, <, >, <=, >=, !, <>. Кроме того, для выбора записей, отвечающих нескольким условиям, используются операторы AND (логическое И), OR (логическое ИЛИ) и круглые скобки.

Чтение данных из таблицы SQL

Чтобы прочитать данные из таблицы Products, введите и выполните следующие инструкции:

SELECT ProductID, ProductName, Price, ProductDescription FROM dbo.Products

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

-- Returns only two of the columns from the table

SELECT ProductName, Price

164

FROM dbo.Products

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

-- Returns only two of the records in the table

SELECT ProductID, ProductName, Price, ProductDescription

FROM dbo.Products WHERE ProductID < 60

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

--Returns ProductName and the Price including a 7% tax

--Provides the name CustomerPays for the calculated column

SELECT ProductName, Price * 1.07 AS CustomerPays

FROM dbo.Products

Ограничение числа возвращаемых строк

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

В Oracle ограничение на число возвращаемых строк накладывается с помощью функции ROWNUM в предикате

WHERE:

select * from emp

where rownum <= 5

165

В SQL Server для ограничения числа возвращаемых строк используйте ключевое слово TOP:

select top 5 * from emp

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

Требуется выбрать строки, удовлетворяющие нескольким условиям.

Используйте предикат WHERE в сочетании с операторами OR и AND. Например, по следующему запросу будут выбраны все служащие 10-го отдела, а также служащие, получающие комиссионные, и служащие 20-го отдела, зарабатывающие не более 2000 долл.:

select * from emp

where deptno = 10 or comm is not null or sal <= 2000 and deptno=20

Предикат сравнения

Синтаксис предиката сравнения определяется следующими правилами:

<comparison predicate>::= <value expression> <comp op>

{<value expression> | <subquery>} <comp op>::=

= | <> | < | > | <= | >=

Через «<>» обозначается операция «неравенства». Арифметические выражения левой и правой частей предиката сравнения строятся по общим правилам построения арифметических выражений и могут включать в общем случае имена столбцовтаблиц изразделаFROM иконстанты.

Отбираются значения больше указанного:

SELECT * FROM topics WHERE id_author>2;

Отбираются значения, не равные указанному: SELECT * FROM topics WHERE id_author!=1;

166

Отбираются значения, меньшие и равные указанному:

Пример: SELECT * FROM topics WHERE id_author<=3;

Предикат between

Предикат between имеет следующий синтаксис:

<between predicate>::= <value expression>

[NOT] BETWEEN <value expression> AND <value expression>

По определению результат "x BETWEEN y AND z" тот же самый, что и результат логического выражения "x >= y AND x <= z". Результат "x NOT BETWEEN y AND z" тот же самый, что и результат "NOT (x BETWEEN y AND z)".

SELECT * FROM topics WHERE id_author BETWEEN 1 AND 3;

Предикат in

Предикат in определяется следующими синтаксическими правилами:

<in predicate>::=

<value expression> [NOT] IN {<subquery> | (<in value list>)} <in value list>::=

<value specification> {,<value specification>}...

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

Значение предиката равно true в том и только в том случае, когда значение левого операнда совпадает хотя бы с одним значением списка правого операнда. Если список правого операнда пуст (так может быть, если правый операнд задается подзапросом) или значение «подразумевае-

167

мого» предиката сравнения x = y (где x – значение арифметического выражения левого операнда) равно false для каждого элемента y списка правого операнда, то значение предиката in равно false. В противном случае значение предиката in равно unknown (например, так может быть, если значение левого операнда есть NULL). По определению значение предиката "x NOT IN S" равно значению предика-

та "NOT (x IN S)".

SELECT * FROM topics WHERE id_author IN (1, 4);

Пример: SELECT * FROM topics WHERE id_author NOT IN (1, 4);

Предикат like

Предикат like имеет следующий синтаксис:

<like predicate>::=

<column specification> [NOT] LIKE <pattern>

[ESCAPE <escape character>] <pattern>::= <value specification> <escape character>::= <value

specification>

Типы данных столбца левого операнда и образца должны быть типами символьных строк. В разделе ESCAPE должен специфицироваться одиночный символ.

Значение предиката равно true, если pattern является подстрокой заданного столбца. При этом если раздел ESCAPE отсутствует, то при сопоставлении шаблона со строкой производится специальная интерпретация двух символов шаблона: символ подчеркивания («_») обозначает любой одиночный символ; символ процента («%») обозначает последовательность произвольных символов произвольной длины (может быть, нулевой).

Если же раздел ESCAPE присутствует и специфицирует некоторый одиночный символ x, то пары символов «x_»

168

и «x%» представляют одиночные символы «_» и «%» соответственно.

Значение предиката like есть unknown, если значение столбца либо шаблона не определено.

Значение предиката “x NOT LIKE y ESCAPE z” совпа-

дает со значением “NOT x LIKE y ESCAPE z”.

SELECT * FROM topics WHERE topic_name LIKE 'вел%';

Отбираются значения, не соответствующие образцу:

SELECT * FROM topics WHERE topic_name NOT LIKE 'вел%';

Предикат null

Предикат null описывается синтаксическим правилом:

<null predicate>::=

<column specification> IS [NOT] NULL

Этот предикат всегда принимает значения true или false. При этом значение «x IS NULL» равно true тогда и только тогда, когда значение х не определено. Значение предиката «x NOT IS NULL» равно значению «NOT x IS NULL».

SELECT * FROM topics WHERE id_author IS NOT NULL;

SELECT * FROM topics WHERE id_author IS NULL;

Сортировка результатов запроса. Ключевое слово

ORDER BY

Возвращение результатов запроса осуществляется в заданном порядке.

Синтаксис следующий: SELECT имя_столбца FROM имя_таблицы ORDER BY имя_столбца_сортировки:

Select * from topics ORDER BY topic_name;

По умолчанию сортировка идет по возрастанию, но это можно изменить, добавив ключевое слово DESC:

169

Select * from topics ORDER BY topic_name DESC;

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

select ename,job,sal from emp

where deptno = 10 order by sal asc [11]

2.20. Использование агрегативных функций

Функции, которые работают с коллекциями значений и выдают одно значение:

AVG Получить среднюю зарплату по де-

партаменту:

d.name,

AVG

SELECT

(d.employees.salary) FROM Department d; SUM Получить сумму зарплат по депар-

таменту:

d.name,

AVG

SELECT

(d.employees.salary) FROM Department d;

MAX Получить максимальную зарплату в

департаменте

 

d.name,

SELECT

 

MAX(d.employees.salary) FROM Department d; MIN Получить минимальную зарплату в

департаменте

d.name,

SELECT

MIN(d.employees.salary) FROM Department d; COUNT Получить количество работников: SELECT d.name, COUNT(d.employees)

FROM Department d;

Подсчет связей для объекта (двунаправленная связь):

SELECT fnm,lnm,BDt,cmt,age,gnd,adrs,eml,ppth,clgr

170

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