Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БазыДанных(заочка) / БД лабпрактикум ч2.doc
Скачиваний:
55
Добавлен:
17.04.2015
Размер:
218.11 Кб
Скачать

Инструкция выбора select

Язык запросов (Data Query Language) в SQL состоит из единственной инструкции SELECT. Эта единственная инструкция поиска реализует все операции реляци­онной алгебры. Кстати, один и тот же запрос может быть реализован несколькими способами, и, будучи все правильными, они, тем не ме­нее, могут существенно отличаться по времени исполнения, и это особенно важ­но для больших баз данных.

Синтаксис инструкции SELECT имеет следующий вид.

SELECT [ALL| DISTINCT|DISTINCTROW|TOP] «список полей>|*)

FROM <Список таблиц> [IN база-данных]

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

[GROUP BY <Список полей результата>]

[HAVING Предикат-условие для группы>]

[ORDER BY <Список полей, по которым упорядочить вывод>]

Здесь предложения From, Where, Group by, Having и Order by изменяют условия, используемые для определения данных, которые требуется отобрать или обработать, и являются необязательными (заключены в квадратные скобки).

Рассмотрим детально предложения инструкции SELECT:

- SELECT — предложение, которое сообщает СУБД, что это команда — запрос. Все запросы начинаются этим словом с последующим пробелом. За ним мо­жет следовать способ выборки — с удалением дубликатов (DISTINCT и DISTINCTROW), без удаления (ALL, подразумевается по умолчанию) или количество TOP. Затем следует список пере­численных через запятую столбцов, которые выбираются запросом из таб­лиц, или символ '*' (звездочка) для выбора всей строки. Любые столбцы, не перечисленные здесь, не будут включены в результирующее отношение, со­ответствующее выполнению команды. Это, конечно, не значит, что они будут удалены или их информация будет стерта из таблиц, потому что запрос не воздействует на информацию в таблицах — он только показывает данные.

- FROM — предложение, подобно SELECT, которое должно быть представлено в каждом запросе. Оно сопровождается пробелом и затем именами таблиц, используемых в качестве источника информации. В случае если указано бо­лее одного имени таблицы, неявно подразумевается, что над перечисленными таблицами осуществляется операция декартова произведения. Таблицам можно присвоить имена-псевдонимы, что бывает полезно для осуществления операции соединения таблицы с самой собою или для доступа из вложенно­го подзапроса к текущей записи внешнего запроса.

Самый простой запрос SELECT без необязательных частей соответствует просто декартову произведению. Например, выражение SELECT * FROM Rl, R2 соответствует декартову произведению таблиц R1 и R2. Выражение

SELECT Rl.A, R2.В

FROM Rl, R2

соответствует проекции декартова произведения двух таблиц на два столбца А из таблицы Rl и В из таблицы R2, при этом дубликаты всех строк сохранены, в от­личие от операции проектирования в реляционной алгебре, где при проектиро­вании по умолчанию все дубликаты кортежей уничтожаются.

Если в список отбираемых полей требуется включить поля, имеющиеся в более чем одной таблице, то эти поля нужно квалифицировать именем таблицы с операцией «.» (точка).

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

Select [Студент].[Группа], [Студент_заочник].[Группа]

From Студент, Студент_заочник

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

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

Инструкция SELECT DISTINCT [Фамилия] FROM Служащие – отбирает из таблицы Служащие только разные фамилии. Если DISTINCT опустить, этот запрос возвращает все записи.

Чтобы получить только некоторое количество записей, которые располагаются наверху или внизу интервала, определенного предложением ORDER BY, используется оператор ТОР. Предположим, требуется отобрать имена 25 наиболее успевающих студентов потока NNNN года из таблицы Студенты:

SELECT TOP 25 [Имя], [Фамилия] FROM Студенты _

WHERE [Год] = NNNN _

ORDER BY [Рейтинг успеваемости] DESC;

Здесь параметр DESC задает сортировку по убыванию.

Если не включить предложение ORDER BY, запрос вернет произвольный набор из 25 записей таблицы Студенты, которые удовлетворяют предложению WHERE.

Особенность оператора ТОР в том, что он не отбрасывает дублированные значения. В приведенном примере, если в число 25 самых высоких рейтингов успеваемости попадают тридцать студентов, запрос выберет все 30 записей.

В качестве альтернативы можно использовать ключевое слово PERCENT, чтобы вернуть некоторый процент от записей, значения которых располагаются наверху или внизу интер­вала, определенного предложением ORDER BY. Предположим, что вместо 25 самых успевающих студентов требуется получить верхние десять процентов по успеваемости от потока 2005 года:

SELECT TOP 10 PERCENT [Имя], [Фамилия] _

FROM Студенты _

WHERE [Год] = 2005 _

ORDER BY [Рейтинг успеваемости] DESC;

Для переименования имен столбцов используется оператор AS – Select имя_столбца As новое_имя_столбца. Этот же оператор можно использовать для переименования столбцов при применении агрегатных функций.

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

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

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

Примечание. Хотя предложение WHERE может решать подобного рода задачи, все же, если требует­ся, чтобы результирующий набор записей был обновляемым, операции SQL объединения нескольких таблиц нужно выполнять с помощью предложения JOIN.

WHERE — необязательное предложение, но, будучи включено, оно должно следовать за FROM.

Примеры WHERE:

WHERE Отдел = “Бухгалтерия”

WHERE Возраст Between 18 AND 30

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

SELECT [Фамилия служащего], Оклад

FROM Служащие

WHERE Оклад > 1000;

Предложение WHERE может содержать до 40 выражений, связанных логическими операци­ями AND и OR.

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

Если в качестве критерия используется дата, то она должна быть задана в американском формате. Например, дата 10 мая 2005 года должна выглядеть как 5/10/05. Кроме того, дату нужно окружать знаками номера (#), как показано в следующем примере:

SELECT * FROM Заказы

WHERE [Дата поставки] = # 5 / 10 / 02 #;

Можно также использовать функцию DateValue, которая "понимает" установки даты и вре­мени Microsoft Windows. Например, следующие инструкции равнозначны:

SELECT * FROM Заказы

WHERE [Дата поставки] = DateValue('5/10/02');

SELECT * FROM Заказы

WHERE [Дата поставки] = DateValue('10/5/02');

- GROUP BY — необязательное предложение, которое объединяет записи с идентичными значениями в заданном списке полей в единственную запись. Если в инструкции SELECT включить агрегатную функцию SQL, такую как Sum или Count, для каждой записи создается итоговое значение.

Пустые значения в полях GROUP BY не игнорируются и группируются. Однако агрегатными функциями SQL значения Null не учитываются.

Если инструкция SELECT включает, по крайней мере, одну агрегатную функцию SQL, в списке GROUP BY может быть включено любое поле таблиц, перечисленных в предложе­нии FROM, даже если это поле не включено в инструкции SELECT. Исключение — поля, содержащие большое значение Memo (процессор базы данных Jet не может группировать записи по полям Memo). Все поля в списке SELECT должны быть включены либо в предло­жении GROUP BY, либо как параметры агрегатной функции SQL.

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

SELECT [Наименование товара], Sum([Количество]) _

FROM Товары _

GROUP BY [Наименование товара];

Предложение HAVING - определяет, какие группированные записи должны быть выбраны инструкцией SELECT с предложением GROUP BY. После объединения записей предложением GROUP BY будут выбраны только те из них, которые удовлетворяют условиям предложения HAVING.

HAVING — необязательное предложение, которое может содержать до 40 выражений, связанных логическими операциями AND и OR.

Предложение ORDER BY определяет порядок сортировки записей, отбираемых в запросе. В предложении ORDER BY задается столбец или столбцы, которые нужно использовать как ключ упорядочения; затем нужно указать, в каком порядке должны возвращаться записи — по возрастанию или по убыванию значений ключа. В следующем примере выбираются все записи таблицы Служащие, упорядоченные по фамилиям служащих в алфавитном порядке:

SELECT * FROM Служащие _

ORDER BY [Фамилия служащего] ASC;

В этом примере параметр ASC (для сортировки по возрастанию) необязательный: умолчательный порядок сортировки в запросе — по возрастанию (А — Z, А — Я, 0 — 9), Однако можно включить ключевое слово ASC после каждого поля, по которому требуется сортировать в порядке возрастания, чтобы ясно документировать предложение ORDER BY. Обе следующие инструкции сортируют записи служащих в порядке возрастания значений поля Фамилия:

SELECT [Фамилия], [Имя] FROM Служащие _

ORDER BY [Фамилия];

SELECT [Фамилия], [Имя] FROM Служащие _

ORDER BY [Фамилия] ASC;

Чтобы отсортировать записи в порядке убывания значений (Z — А, Я — А, 9 — 0), после каждого поля, по которому требуется выполнить сортировку, добавляют ключевое слово DESC.

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

SELECT [Имя служащего], [Фамилия служащего]

EROM Служащие _

ORDER BY 2 ASC;

В предложение ORDER BY можно включать несколько полей. Записи сортируются, начиная с первого поля, перечисленного после ORDER BY. Записи, которые имеют равные значения в этом поле, далее сортируются по значениям во втором поле списка и т. д. В следующей инструкции отбираются записи с зарплатой служащих, которые сортируются в порядке убывания; все служащие, имеющие одинаковую зарплату, выводятся в алфавитном порядке фамилий по возрастанию:

SELECT [Фамилия служащего], Оклад FROM Служащие _

ORDER BY Оклад DESC, [Фамилия служащего];

ORDER BY — обычно последний элемент в инструкции SQL. Это необязательное предложение (если только в предложении SELECT не используется предикат ТОР или TOP n PERCENT). Если ORDER BY опущено, данные будут не отсортированы