Выборка данных из нескольких таблиц



Лекция 4. Выборка данных

 

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

Цель: сформировать представление о возможностях и способах использования оператора SELECT.

 

Целью любой системы управления базами данных является осуществление операций над данными: ввод, изменение, удаление и выборка. При этом выборка данных является наиболее часто используемым аспектом управления данными. Выборка осуществляется с помощью одной единственной команды SELECT, являющейся частью языка DML[1] (Data Manipulation Language – язык управления данными).

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

Команда SELECT состоит из семи основных частей: списка выборки и разделов FROM, WHERE, GROUP BY, HAVING, ORDER BY и COMPUTE – обязательным является лишь список выборки, при использовании же остальных частей необходимо их использовать в том порядке, в котором они приведены выше.

 

Простая выборка данных

 

Для простой выборки данных используется сокращенный синтаксис оператора SELECT:

 

SELECT [ALL | DISTINCT] [TOP n [PERCENT] СписокВыборки

FROM ИмяТаблицы

WHERE УсловиеОтбора

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

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

Использование ключевого слова TOP предписывает выводить не все записи итогового набора, а только n первых. Можно выбирать не фиксированное количество записей, а определенный процент от всех строк – для этого указывается ключевое слово PERCENT.

 

Список выборки

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

 

* | ИмяПоля | Выражение [AS Псевдоним], [...n].

 

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

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

Например, для получения списка стран с указанием их кода и последней даты изменения записи из таблицы CountryRegion базы данных AdventureWorks 2008 необходимо выбрать поля CountryRegionCode, Name, ModifiedDate:

 

SELECT CountryRegionCode AS 'Код',

[Name] AS 'Страна',

ModifiedDate AS 'Дата изменения'

FROM Person.CountryRegion

При этом БД AdventureWorks должна быть текущей. Обратите внимание, что перед названием таблицы используется еще название схемы Person, предназначенной для управления объектами, связанными с работниками и департаментами. Поля данных будут представлены пользователю в порядке, определенном в списке выборки.

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

Например, список сотрудников с указанием фамилии и первого символа имени и идентификационного номера может быть получен в результате запроса:

 

Select LastName+’ ‘+Substring(FirstName,1,1)+’.’ as [Сотрудник],

 ContactID

From Person.Contact

 

Удобочитаемость получаемого набора данных может быть повышена путем его сортировки в возрастающем или убывающем порядке. Сортировка возможна по имени поля (даже если оно и не указано в списке выборки), по псевдониму или по позиции в списке выборки, которые указываются в разделе ORDER BY ИмяПоля [,…n] [ASC | DESC].

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

Для отображения, рассмотренного ранее, списка сотрудников упорядоченного в алфавитном порядке необходимо дополнить запрос:

 

Select LastName+’ ‘+Substring(FirstName,1,1)+’.’ as [Сотрудник],

 ContactID

From Person.Contact

ORDER BY [Сотрудник]

Условие отбора

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

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

Например, чтобы получить список товаров, цена которых находится в диапазоне от $12 до $20, необходимо выполнить следующий запрос:

 

Select [Name], ListPrice

From Production.Product

Where (ListPrice>=12) and (ListPrice<=20)

Order by 2

 

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

 

Select [Name], ListPrice

From Production.Product

Where ListPrice Between 12 and 20

Order by ListPrice

 

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

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

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

· % – подразумевает любую строку, состоящую из 0 и более символов;

· _ – ровно один символ;

· [ ] – любой символ из заданного множества (например, [adfh]) или диапазона (например, [0-9]),

· [^] – любой символ, не попадающий в заданный диапазон или множество.

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

 

Select LastName, JobTitle

From HumanResources.vEmployee

Where CountryRegionName Not Like ‘%United States%’

 

Для определения соответствия выражения одному из перечисленных в заданном списке значений применяется логический оператор IN. Данный оператор всегда может быть записан и в виде группы условий, объединенных операндом OR.

 

Например, с помощью следующего запроса может быть получен список сотрудников из США и Канады:

 

Select LastName, JobTitle

From HumanResources.vEmployee

WHERE CountryRegionName IN (‘United States’, ‘Canada’)

 

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

 

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

 

SELECT [Name]

FROM Production.Product

WHERE Color IS NULL

 

Выборка данных из нескольких таблиц

 

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

Существует три вида соединений: внутреннее, внешнее и перекрестное. Для объединения трех и более таблиц можно применять последовательность соединений.

Для соединения таблиц необходимо раздел FROM дополнить ключевыми словами JOIN, которое определяет соединяемые таблицы и метод соединения, и ON, указывающее общие для таблиц поля.

 

Внутреннее соединение

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

Например, в таблице Product нормализованной базы данных AdventureWorks храниться только идентификатор категории товара. Чтобы получить список товаров с указанием их категорий, необходимо соединить таблицы Product и ProductSubcategory:

 

SELECT Product.Name, ProductSubcategory.Name, Product.ListPrice

FROM Production.Product INNER JOIN Production.ProductSubcategory

ON Product.ProductSubcategoryID = ProductSubcategory.ProductSubcategoryID

 

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

Обратите внимание, что в разделе FROM необходимо указать имя схемы Production, а в остальных случаях перед указанием поля используется имя таблицы Product и ProductSubcategory для разрешения конфликтов, т.к. в обеих таблицах присутствуют поля Name.

 

Внешнее соединение

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

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

Например, следующий запрос возвращает имя контактного лица и дату размещения заказа:

 

SELECT FirstName, LastName, OrderDate

FROM Person.Contact LEFT JOIN Sales.SalesOrderHeader

ON Contact.ContactID = SalesOrderHeader.ContactID

 

Для лиц, не размещавших заказы, в поле OrderDate содержится значение NULL.

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

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

 

Перекрестные соединения

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

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

Например, с помощью перекрестного соединения можно перечислить все возможные способы поставки товаров в базе данных Northwind (поставлялась с MS SQL Server до появления AdventureWorks):

 

SELECT DISTINCT Suppliers.Country, Orders.ShipCountry

from Suppliers CROSS JOIN Orders


Дата добавления: 2020-11-27; просмотров: 282; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!