Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PMO_PMS_shpory_final.docx
Скачиваний:
7
Добавлен:
17.09.2019
Размер:
457.71 Кб
Скачать
  1. Выборка данных оператором select. Структура оператора и примеры использования. Способы задания отображаемых полей. Использование distinct. Выборка значений с упорядочиванием.

SELECT ("селект") — оператор DML языка SQL, возвращающий набор данных (выборку) из базы данных, удовлетворяющих заданному условию. В большинстве случаев, выборка осуществляется из одной или нескольких таблиц. В последнем случае говорят об операции слияния (англ. join). В тех СУБД, где реализованы представления и хранимые процедуры, также возможно получение соответствующих наборов данных. При формировании запроса SELECT пользователь описывает ожидаемый набор данных: его вид (набор столбцов) и его содержимое (критерий попадания записи в набор, группировка значений, порядок вывода записей и т.п.). Запрос выполняется следующим образом: сначала извлекаются все записи из таблицы, а затем для каждой записи набора проверяется её соответствие заданному критерию. Если осуществляется слияние из нескольких таблиц, то сначала составляется произведение таблиц, а уже затем из полученного набора отбираются требуемые записи.

Особую роль играет обработка NULL-значений, когда при слиянии, например, двух таблиц — главной (англ. master) и подчинённой (англ. detail) — имеются или отсутствуют соответствия между записями таблиц, участвующих в слиянии. Для решения этой задачи используются механизмы внутреннего (англ. inner) и внешнего (англ. outer) слияния. Один и тот же набор данных может быть получен при выполнении различных запросов. Поиск оптимального плана выполнения данного запроса является задачей оптимизатора.

Оператор SELECT имеет следующую структуру:

SELECT

[DISTINCT | DISTINCTROW | ALL]

select_expression,...

[FROM table_references]

[WHERE where_definition]

[GROUP BY {unsigned_integer | col_name | formula}]

[HAVING where_definition]

[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]

Формат запроса с использованием данного оператора:

SELECT список полей FROM список таблиц WHERE условия…Основные ключевые слова, относящиеся к запросу SELECT:

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

GROUP BY — используется для объединения строк с общими значениями в элементы меньшего набора строк.

HAVING — используется для определения, какие строки после GROUP BY должны быть выбраны.

ORDER BY — используется для определения, какие столбцы используются для сортировки результирующего набора данных.

Примеры:

SELECT * FROM T; Для таблицы T запрос вернёт все столбцы всех строк данной таблицы

SELECT C1 FROM T; вернёт значения столбца C1 всех строк таблицы— в терминах реляционной алгебры можно сказать, что была выполнена проекция.

SELECT * FROM T WHERE C1 = 1; вернёт значения всех столбцов всех строк таблицы, у которых значение поля C1 равно '1'— в терминах реляционной алгебры можно сказать, что была выполнена выборка, так как присутствует ключевое слово WHERE.

Значения по умолчанию можно задавать для полей с типом данных «Текстовый», «Поле МЕМО», «Числовой», «Дата/время», «Денежный», «Логический» и «Гиперссылка». Если значение по умолчанию не определено, поле остается пустым, пока в него не введено значение. После задания значения по умолчанию оно будет применяться ко всем новым записям. При необходимости можно изменить значение в записи, заменив значение по умолчанию другим значением, если это не запрещено правилом проверки.

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

SELECT DISTINCT LEFT(Phone,3) FROM Phones

Про использование “DISTINCT”, в силу его простоты, многого не скажешь. Однако, стоит сказать несколько слов про то, когда его использовать нежелательно. Предположим, нам необходимо получить список всех абонентов, у которых есть хотя бы один телефон. Теоретически, можно это сделать с помощью “DISTINCT”:

SELECT DISTINCT a.PersonID, a.LastName

FROM Persons a JOIN Phones t ON a.PersonID = t.PersonID

Однако в данном случае правильнее использовать конструкцию “WHERE EXISTS”:

SELECT a.PersonID, a.LastName

FROM Persons a

WHERE EXISTS(SELECT * FROM Phones t WHERE a.PersonID = t.PersonID)

В первом случае мы говорим – “соедини две таблицы, а потом исключи дубликаты”, а во втором – “возьми только те строки из первой таблицы, для которых есть соответствие во второй”. Логика подсказывает, что второй вариант экономичнее с точки зрения ресурсов.

Выборка значений с упорядочиванием.

Выдать номера, фамилии и города поставщиков, находящихся в Лондоне, в обратном алфавитном

порядке:

SELECT Номер_поставщика, Фамилия, Город,

FROM Поставщики

WHERE Город = 'Лондон'

ORDER BY Фамилия DESC;

Результат:

Номер_Поставщика Фамилия Город

1 Смит Лондон

4 Кларк Лондон

В общем случае не гарантируется, что результирующая таблица будет упорядочена каким-либо

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

как он будет показан, должен быть организован в определенной последовательности.

Упорядочение может быть:

имя-столбца [упорядочение] [,имя-столбца [упорядочение]]...,

где "упорядочение", как и ранее, это ASC (возрастание) или DECS (убывание), и по умолчанию

принимается ASC. Каждое "имя-столбца" должно идентифицировать некоторый столбец результирующей

таблицы. Поэтому, например, следующее предложение недопустимо:

SELECT НОМЕР_ПОСТАВЩИКА

FROM Поставщики

ORDER BY ГОРОД;

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