Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ИОСУ часть 2 _SQL.doc
Скачиваний:
19
Добавлен:
10.11.2019
Размер:
3.88 Mб
Скачать

6. Предложения select и from

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

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

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

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

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

Результатом SQL-запроса на выборку всегда является таблица. Если пользователь выполняет инструкцию SQL в интерактивном режиме, СУБД выводит результаты запроса на экран в табличной форме. Если программа посылает запрос СУБД с помощью “программного SQL”, то СУБД возвращает таблицу результатов запроса программе.

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

То что, SQL-запрос всегда возвращает таблицу, означает следующее:

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

  2. результаты двух запросов, имеющие похожую структуру, можно объединить в одну таблицу,

  3. результаты запроса сами могут стать предметом дальнейших запросов.

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

Простые запросы. Простые запросы извлекают данные из столбцов, расположенных в одной таблице базы данных. Например, следующий запрос извлекает из таблицы STAFF три столбца:

Вывести для каждого сотрудника имя, фамилию и занимаемую должность:

SELECT fname, lname, position

FROM staff;

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

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

При выполнении следующего запроса создается вычисляемый столбец:

Выдать строки сотрудников с указанием зарплаты с 10 % надбавкой

SELECT fname, lname, position, (salary + 0.1*salary) AS percent

FROM staff;

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

Фраза SELECT может включать не только выражения, но и отдельные числовые или текстовые константы. Текстовые константы должны заключаться в апострофы ('). Это необходимо для создания результата запроса в более удобном для пользователя виде.

SELECT Pno, type, ‘with rent’, rent, ‘per cent’

FROM property_for_rent;

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

SELECT * FROM staff;

В стандарте ANSI/ISO сказано, что в предложении SELECT может использоваться либо символ выборки всех столбцов либо список возвращаемых столбцов, однако большинство коммерческих СУБД допускают использование и того и другого одновременно, например: SELECT *, salary FROM staff. В Oracle, как и требует стандарт, такой запрос не работает.

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

Определить в каких городах существуют отделения предприятия

SELECT DISTINCT city

FROM branch;

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

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

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

Вместо DISTINCT можно указать - ALL тогда дублирование строк вывода сохранится.

Сортировка результатов запроса (предложение ORDER BY). Строки результатов запроса, как и строки таблицы БД, не имеют определенного порядка. Поэтому, включив в инструкцию SELECT предложение ORDER BY, можно отсортировать результаты запроса. При этом упорядочение можно производить в порядке возрастания - ASC (ASCending) или убывания DESC (DESCending), по умолчанию принимается ASC.

В предложение ORDER BY входит список имен, разделенных запятыми:

Вывести отделения компании, отсортированные в алфавитном порядке по названию городов:

SELECT bno, city, tel_no

FROM branch

ORDER BY city;

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

Если в списке ORDER BY несколько столбцов, то используется понятие старшего и младшего ключей сортировки. Особенно удобно использовать это в многотабличных запросах:

Для каждого отделения компании вывести ФИО работников, отвечающих за какие-либо объекты, а также перечень этих объектов

SELECT s.bno, s.sno, fname, lname, pno

FROM staff s, property_for_rent p

WHERE s.sno=p.sno

ORDER BY s.bno, s.sno, pno;