Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiNovye.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.92 Mб
Скачать

Реализация операций реляционной алгебры в языке sql

Для извлечения записей из таблиц в SQL определён оператор SELECT. С помощью этой команды осуществляется не только операция «выборка», но и предварительное соединение (join) двух и более таблиц. Это наиболее сложное и мощное средство SQL. Полный синтаксис оператора SELECT имеет вид:

SELECT [ALL | DISTINCT] <список выбора> FROM <имя таблицы>, ... [ WHERE <условие> ] [ GROUP BY <имя столбца>,... ] [ HAVING <условие> ] [ORDER BY <имя столбца> [ASC | DESC],... ]

Порядок предложений в операторе SELECT должен строго соблюдаться (например, GROUP BY должно всегда предшествовать ORDER BY), иначе это приведёт к появлению ошибок.

Начнём рассмотрение SELECT с наиболее простых его форм. Этот оператор всегда начинается с ключевого слова SELECT. В конструкции <список выбора> определяется столбец или столбцы, включаемые в результат. Список может состоять из имён одного или нескольких столбцов, или из одного символа * (звёздочка), определяющего все столбцы. Элементы списка разделяются запятыми.

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

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

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

Для выполнения операции такого рода в операторе SELECT после ключевого слова FROM указывается список таблиц, по которым производится поиск данных. После ключевого слова WHERE указывается условие, по которому производится слияние. Следует обратить внимание на то, что когда в разных таблицах присутствуют одноимённые поля, то для устранения неоднозначности перед именем поля указывается имя таблицы и знак «.» (точка). Например, используем базу данных судоходной компании для получения информации о расстоянии между портами:

SELECT РасстоянияМеждуПортами.Расстояние, Порты.НазваниеРусское AS НазваниеПервогоПорта, Порты_1.НазваниеРусское AS НазваниеВторогоПорта FROM Порты, Порты_1, РасстоянияМеждуПортами WHERE (Порты.СчетчикПорта = РасстоянияМеждуПортами.СсылкаПорт1) AND (РасстоянияМеждуПортами.СсылкаПорт2 = Порты_1.СчетчикПорта)

Этот запрос может быть записан по-другому с использованием ключевого слова JOIN (Рис.2.9):

SELECT РасстоянияМеждуПортами.Расстояние, Порты.НазваниеРусское AS НазваниеПервогоПорта, Порты_1.НазваниеРусское AS НазваниеВторогоПорта FROM Порты INNER JOIN РасстоянияМеждуПортами ON dbo.Порты.СчетчикПорта = РасстоянияМеждуПортами.СсылкаПорт1 INNER JOIN Порты AS Порты_1 ON РасстоянияМеждуПортами.СсылкаПорт2 = Порты_1.СчетчикПорта

рис 4.9. Конструктор запроса

Ключевое слово INNER в запросе может быть опущено. INNER JOIN является не обязательной частью инструкции SELECT. Если же она все-таки применяется, то оформляется как часть параметра FROM. В общем виде операция INNER JOIN выглядит так:

Таблица1 INNER JOIN Таблица2 ON Таблица1.ПолеА=Таблица2.ПолеБ

Объединяются (связываются) таблицы Таблица1 и Таблица2. В выходной набор (при отсутствии прочих условий) включаются записи таблиц Таблица1 и Таблица2, для которых выполнено условие равенства содержимого Таблица1.ПолеА = Таблица2.ПолеБ. В условии объединения могут участвовать два числовых поля любых (в том числе и различных) типов. Для других типов полей должно быть соблюдено следующее правило: поля должны относиться к одному и тому же типу данных и содержать один и тот же вид данных, но они не обязательно должны иметь одинаковые имена.

SQL позволяет выполнять различные арифметические операции над столбцами результирующего отношения. В конструкции <список выбора> можно использовать константы, функции и их комбинации с арифметическими операциями и скобками. В арифметических выражениях допускаются операции сложения (+), вычитания (-), деления (/), умножения (*), а также различные функции (COS, SIN, ABS). Также в запрос можно добавить строковую константу.

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

  • Group By – группировка значений;

  • Sum – сумма всех значений поля;

  • Avg – среднеарифметическое по всем значениям данного поля;

  • Count - число записей;

  • Max – максимальное из всех значений поля;

  • Min – минимальное из всех значений поля;

  • Stdev – среднеквадратичное отклонение ряда значений поля;

  • Var – дисперсия ряда значений поля.

Некоторые из перечисленных функций (например Sum, Avg, Count) допускают использование опции Distinct, обозначающей, что при применении функций используются только уникальные значения полей.

Группировка данных в операторе SELECT осуществляется с помощью ключевого слова GROUP BY и ключевого слова HAVING.

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

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

Ключевое слово HAVING работает следующим образом: сначала GROUP BY разбивает строки на группы, вычисляет значение групповых функций, затем на полученные наборы и значения накладываются условия HAVING. Это дополнительная возможность «профильтровать» выходной набор.

Используя базу судоходной компании, выберем все суда, у которых больше 6 грузовых помещений:

SELECT Суда.НазваниеСуднаРусское FROM Суда INNER JOIN СудаГрузовыеПомещения ON Суда.СчетчикСудна = СудаГрузовыеПомещения.СсылкаСудно GROUP BY dbo.Суда.НазваниеСуднаРусское HAVING (COUNT(СудаГрузовыеПомещения.СчетчикГрузовогоПомещения) > 6)

Используя HAVING, надо принимать во внимание следующее:

HAVING – не обязательный параметр, если же он задан, он должен следовать за GROUP BY;

HAVING выполняет те же функции, что и WHERE, но уже в рамках выходного набора; WHERE определяет, какие блоки данных должны быть выбраны, HAVING устанавливает, какие блоки данных, сгруппированные посредством GROUP BY, должны отображаться на экране (Рис. 4.10).

рис. 4.10. Конструктор запроса с использованием множественных операций

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

  • ORDER BY не является обязательным параметром, если он не задан, данные появятся не рассортированными, т.е. в том порядке, в котором они извлечены из входного набора;

  • по умолчанию реализуется сортировка по возрастанию (А-Я, 0-9). Явно она задаётся ключевым словом ASC;

  • для выполнения сортировки в обратной последовательности (Я-А, 9-0) необходимо после имени поля, по которому выполняется сортировка, написать ключевое слово DESC;

  • ORDER BY обычно является последним элементом SQL-инструкции.

Оператор UNION объединяет выходные данные (отношения) двух или более SQL-запросов в единое множество строк и столбцов. Естественно, эти отношения должны быть определены по одной схеме. Числовые поля должны иметь полностью совпадающие тип и размер. Символьные поля должны иметь точно совпадающее количество символов. Если NULL-значения запрещены для столбца любого подзапроса объединения, то они должны быть запрещены для всех соответствующих столбцов в других подзапросах объединения.

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