Название: Базы данных. Концепция баз данных, реляционная модель данных, языки SQL и XML (Токмаков Г. П.)

Жанр: Информационные системы и технологии

Просмотров: 1437


4.1.оператор выборки select

 

4.1.1. О БЩИЙ  ФОРМАТ  ОПЕРАТОРА  SELECT

 

Инструкция SELECT, используемая для построения SQL-запросов, является наиболее мощной из всех инструкций SQL, и реализует все операции реляцион- ной алгебры.

Синтаксис оператора SELECT имеет вид:

 

SELECT [ALL | DISTINCT] (<Список полей>) FROM <Список таблиц>

[WHERE <Предикат – условие выборки или соединения>]

[GROUP BY <Список полей результата>] [HAVING <Предикат – условие для группы>] [ORDER BY < список_столбцов>]

 

Инструкция состоит из шести предложений:

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

– предложения FROM, перечисляющего список имен таблиц, содержащих эле-

менты данных, извлекаемые запросом;

– предложения WHERE, содержащего условия отбора записей из перечислен-

ных таблиц;

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

– предложения HAVING, указывающего что в результаты запроса следует толь-

ко некоторые из групп, созданных с помощью предложения GROUP BY. В этом предложении, как и в предложении WHERE, для отбора включаемых групп исполь-

зуются условия отбора;

– предложение ORDER BY сортирует результаты запроса на основании данных,

содержащихся в одном или нескольких столбцах.

 

4.1.2. П РЕДЛОЖЕНИЕ  SE LE CT

 

С предложения SELECT начинаются все инструкции SELECT. Наличие этого предложения обязательно, и оно используется для определения столбцов, кото- рые вы хотите получить в наборе данных для своего запроса. Эти элементы за- даются в виде списка возвращаемых столбцов, разделенных запятыми. Для ка- ждого элемента из этого списка в таблице результатов будет создан один стол- бец, которые будут расположены в том порядке, что элементы списка.

Возвращаемый столбец может представлять собой:

– имя столбца, идентифицирующее один из столбцов, содержащихся в табли-

цах, которые перечислены в предложении FROM;

– константу, показывающую, что в каждой строке результатов запроса долж-

но содержаться одно и то же значение. Это может пригодиться для создания таб-

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

 

SELECT CITY, ‘имеет объем продаж’, SALES FROM OFFISY

 

В результате выполнения этого запроса получаем таблицу

 

CITY

ИМЕЕТ_ОБЪЕМ_ПРОДАЖ

SALES

Инза

имеет объем продаж

$186 000.00

Буинск

имеет объем продаж

$567 000.00

Тверь

имеет объем продаж

$735 000.00

– выражение, показывающее, что СУБД должна помещать в результирую-

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

мере в результирующую таблицу добавляется столбец, содержащий значение,

превышающее плановое задание по продажам:

 

SELECT CITY, REGION, SALES‐TARGET FROM OFFISY

 

В результате выполнения этого запроса получаем таблицу

 

CITY

REGION

SALES - TARGET

Инза

Ульяновская

- $389 000.00

Буинск

Татарстан

- $118 000.00

Тверь

Московская

- $065 000.00

 

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

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

ALL – в результирующий набор строк включаются все строки, удовлетво-

ряющие условиям запроса, то есть могут иметь место одинаковые строки;

DISTINCT – в результирующий набор включаются только различные строки,

то есть дубликаты строк результата не включаются в набор.

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

Повторяющиеся строки из таблицы результатов можно удалить, если в ин-

струкции SELECT перед списком возвращаемых столбцов указать предикат DIS‐

TINCT.

Наоборот, если в результирующий запрос нужно включить все записи, по-

сле SELECT указывают слово ALL (во многих СУБД это делается по умолчанию).

Столбцам можно присвоить псевдонимы с помощью предиката AS:

 

SELECT имя_столбца AS новое_имя_столбца

 

4.1.3. П РЕДЛОЖЕНИЕ  FR OM

 

Предложение FROM содержит список имен таблиц, разделенных запятыми. Каждое имя определяет таблицу, содержащую данные, извлекаемые данным запросом. Такие таблицы называются исходными таблицами запроса (инструк- ции SELECT), поскольку все данные, содержащиеся в таблице результатов запро- са, берутся из них.

При составлении много табличных запросов может, что в разных таблицах имеются одноименные столбцы. При этом необходимо перед именем столбца

через точку указать имя таблицы. Использование имен таблиц при написании имен столбцов может привести к громоздким записям. Намного лучше присво- ить каждой таблице какое-нибудь краткое имя. Такие имена называются псев- донимами таблиц. Формат задания псевдонимов таблиц следующий:

 

SELECT          . . .

FROM <таблица1 псевдоним> [, <таблица1 псевдоним> ...] WHERE    . . .

 

Например, запрос

 

SELECT SLUZHASCHIE.FAMILY, SLUZHASCHIE.NAME, OFFISY.CITY FROM SLUZHASCHIE, OFFISY

WHERE SLUZHASCHIE.ID_OFC = OFFISY.ID_OFC

 

после введения в него псевдонимов выглядит так

SELECT С.FAMILY, С.NAME, О.CITY FROM SLUZHASCHIE С, OFFISY О WHERE С.ID_OFC = О.ID_OFC

 

4.1.4. П РЕДЛОЖЕНИЕ  WHERE

 

Предложение  WHERE используется  для  включения  в  набор  данных  лишь нужных записей. В этом случае оператор SELECT имеет следующий формат:

 

SELECT {* | <Список_полей>} FROM <Список_таблиц>

WHERE <условие_выборки>

 

В наборе данных, возвращаемых оператором SELECT, будут включены толь-

ко те записи, которые удовлетворяют условиям поиска.

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

сравнение – значение одного выражения сравнивается со значением друго- го выражения. Например, такое условие отбора используется для отбора всех офисов, находящихся в Московской области, или всех служащих, фактические объемы продаж которых превышают плановые;

проверка на принадлежность диапазону – проверяется, попадает ли указан- ное значение в определенный диапазон. Например, такое условие отбора ис- пользуется для нахождения служащих, чей возраст больше 30, но меньше 50 лет;

проверка на членство в множестве – проверяется, совпадает ли значение выражения с одним из значений заданного множества. Например, такое условие отбора используется для выбора офисов, расположенных в городах Москва, Пен‐ за или Самара;

проверка на соответствие шаблону – проверяется, соответствует ли значе- ние, содержащееся в столбце, определенному шаблону. Например, такое усло- вие используется для выбора клиентов, чьи имена начинаются с буквы «А»;

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

 

Ср авнение

 

Наиболее общим типом условия выборки является сравнение. При сравне- нии СУБД вычисляет и сравнивает значения двух выражений для каждой стро- ки данных. Синтаксис сравнения можно записать следующим образом:

 

<выражение1> <оператор> <выражение2>

оператор − {= | < | > | <= | >= | !< | !> | <> | !=}.

 

Сравнение столбца с константой. Чаще всего выражения бывают про- стыми и содержат в качестве выражения1 имя столбца, а в качестве выражения2 – константу. При этом условие поиска имеет такой вид:

 

<имя_столбца> <оператор> <константа>.

Здесь в качестве константы явно указываются строковые или числовые значения.

Сравнение столбца с результатом вычисления выражения. В более сложных ситуациях условие поиска в предложении WHERE может быть сформу- лировано при помощи выражения:

 

<выражение1> <оператор> <имя_столбца>

 

Или может использоваться и другой вариант написания условия поиска

<имя_столбца> <оператор> <выражение2>

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

Использование логических выражений. Сложные логические выражения строятся при помощи операторов AND, OR и NOT. Их использование, а также по-

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

что избавляет от необходимости расстановки многочисленных скобок.

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

должен быть не меньше 30 и не больше 50 лет.

 

SELECT S.FAMILY, S.NAME, О.CITY FROM SLUZHASCHIE S, OFFISY О WHERE (S.ID_OFC = О.ID_OFC) AND

(S.AGE >= 30 AND S.AGE <= 50)

 

Когда СУБД сравнивает значения двух выражений, могут получиться сле-

дующие результаты:

– если значение истинно, то результат проверки имеет значение TRUE;

– если значение ложно, то результат проверки имеет значение FALSE

– если хотя бы одно из выражений имеет значение NULL, то результат провер-

ки имеет значение NULL.

Следует помнить, что в трехзначной логике SQL в результат запроса попа- дают только те строки, для которых условие отбора рано TRUE. Поэтому строки, содержащие NULL‐значения, «исчезают» при выполнении запроса.

 

Проверка  на  принадлежно сть  диа п аз ону

 

Предикат BETWEEN A AND B – принимает значения между A и B. Предикат истинен, когда сравниваемое значение попадает в заданный диапазон, включая границы диапазона. Одновременно в стандарте задан и противоположный пре- дикат Not Between A and B, который истинен только тогда, когда сравниваемое значение не попадает в заданный интервал, включая его границы.

В условии поиска можно указать, что некоторое значение должно нахо-

диться в интервале между значениями:

 

<проверяемое выражение> [NOT] BETWEEN <A> AND <B>

Оператор BETWEEN ... AND проверяет, находится ли проверяемое выражение между двумя заданными значениями A и B. При этом типы данных выражений проверяемое выражение, A и B должны быть сравнимыми.

Проверяемое выражение, заданное в операторе BETWEEN ... AND, может быть любым допустимым выражением, однако обычно оно представляет собой

имя столбца.

Пример: вывести сведения обо всех заказах, сделанных между 1 и 31 ок‐

тябрем 1989 года.

 

SELECT ID_ORDER, DATE_ORDER, ID_MFR, ID_PRD FROM   ZAKAZY

WHERE           DATE_ORDER BETWEEN `01‐OCT‐89` AND `31‐OCT‐89`

 

В результате выполнения этого запроса получаем таблицу

 

ID_ORDER

DATE_ORDER

ID_MFR

ID_PRD

112961

17.10.89

УАЗ

2А34

113888

21.10.89

ВАЗ

41234

122777

29.10.89

ПМЗ

4Е45М

Следует помнить, что проверку на принадлежность диапазону можно выра-

зить в виде двух операций сравнения.

 

Проверка на  ч л ен ст во  в  мно ж ест в е

 

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

В условии поиска можно указать, что некоторое значение должно совпа-

дать с одним из значений заданного множества:

 

<проверяемое_выражение> [NOT] IN список_констант

 

Пример: вывести список служащих, которые работают в Инзе (22) и Твери (12)

 

SELECT FAMILY, NAME, QUOTA, SALES* FROM         SLUZHASCHIE

WHERE           ID_OFC IN (22, 12)

 

В результате выполнения этого запроса получаем таблицу

 

FAMILY

NAME

QUOTA

SALES

Петров

Петр

$350 000.00

$367 991.00

Федоров

Федор

$350 000.00

$476 456.00

 

Одновременно существует обратный предикат NOT IN (множество). В этом случае в результирующий набор данных будут включены только те записи, для

которых <значение>, стоящее слева от IN, равно одному из значений, указанных в списке (<значение1> [, <значение2> ...]).

Проверку IN также можно выполнить через проверку на сравнение.

 

Проверка  на  соответствие  шаблону

 

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

Однако очень легко можно забыть, какое именно название носит интере- сующая нас компания: «Грант», «Гранит» или «Гранат». Проверка на соответст- вие шаблону позволяет выбрать из базы данных строки на основе частичного

соответствия текстовых строк.

Предложение LIKE определяет шаблоны сравнения строковых значений. Если необходимо, чтобы сравниваемое значение (значение столбца или результат вы-

числения строкового выражения) удовлетворяло шаблону, в условии поиска необ-

ходимо указать

 

<значение> [NOT] LIKE <шаблон> [ESCAPE <подшаблон>]

 

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

– символ «\%» (или «*») обозначает строку любой длины;

– символ «_» (или «?») используется для указания любого единичного символа.

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

При проверке строк на соответствие шаблону может оказаться, что подста-

новочные знаки входят в строку символов в качестве литералов (например, знак

\%). Для проверки наличия в строке литералов, использующихся в качестве под-

становочных знаков, применяются символы пропуска.

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

Символ пропуска определяется с помощью ключевого слова ESCAPE. Ниже приведен пример использования знака доллара ($) в качестве символа пропуска.

Найти товары, коды которых начинаются с букв A\%BC

 

SELECT ID_ORDER, ID_PRD FROM          ZAKAZY

WHERE           ID_PRD LIKE `A$\%BC\%` ESCAPE $

 

Первый символ \% в шаблоне, следующий за символом пропуска $, считает-

ся литералом, второй – подстановочным знаком.

Проверка  на  значе н ие  NULL

 

Значения NULL обеспечивают возможность применения трехзначной логики в условиях отбора. Иногда бывает необходимо явно проверять значения столб- цов на равенство NULL и непосредственно обрабатывать их.

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

указать предложение

<значение> IS [NOT] NULL

Неопределенное значение интерпретируется в реляционной модели как значение, неизвестное на данный момент времени. Это значение при появлении дополнительной информации может быть заменено некоторым конкретным значением. Введение NULL – значений вызвало необходимость модификации классической двухзначной логики и превращения ее в трехзначную. Все логи- ческие операции, производимые с неопределенными значениями, подчиняются этой логике в соответствии с заданной таблицей истинности.

 

A

B

NotA

A(B)

A(B)

TRUE

TRUE

FALSE

TRUE

TRUE

TRUE

FALSE

FALSE

FALSE

TRUE

TRUE

NULL

FALSE

NULL

TRUE

FALSE

TRUE

TRUE

FALSE

TRUE

FALSE

FALSE

TRUE

FALSE

FALSE

FALSE

NULL

TRUE

FALSE

NULL

NULL

TRUE

NULL

NULL

TRUE

NULL

FALSE

NULL

FALSE

NULL

NULL

NULL

NULL

NULL

NULL

 

Наличие неопределенных значений повышает гибкость обработки инфор-

мации, хранящейся в баз данных.

Пример: найти служащих, которые еще не закреплены за офисом

 

SELECT FAMILY, NAME FROM SLUZHASCHIE WHERE ID_OFC IS NULL

 

Результат:

 

FAMILY

NAME

Скворцов

Петр

Семшов

Иван

Аршавин

Федор

 

Может показаться странным, но нельзя проверить значение на равенство

NULL с помощью операции сравнения, например,

 

SELECT FAMILY, NAME FROM SLUZHASCHIE

WHERE ID_OFC = NULL

 

Ключевое слово NULL здесь нельзя использовать, поскольку NULL это не зна-

чение, а просто сигнал о том, что значение неизвестно.

 

4.1.5.  П РАВИЛА  ВЫПОЛ НЕНИЯ  З АПРОС А  SELECT

 

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

Результаты запроса, возвращаемые инструкцией SELECT, получаются в ре-

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

1. Берется таблица, указанная в предложении FROM.

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

3. Далее выполняется предложение SELECT, которое из указанных в нем столб-

цов создает строки результирующей таблицы.

4. Если в предложении SELECT указано ключевое слово DISTINCT, то повто-

ряющиеся строки из результирующей таблицы удаляются.

5. Если в запросе имеется предложение ORDER BY, результирующая таблица сортируется.