Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
77
Добавлен:
14.01.2018
Размер:
8.23 Mб
Скачать

Темы вопросов по курсу "Базы данных"

  1. Операции реляционной алгебры: проекция, выборка, соединение, объединение, умножение.

  1. Правила записи оператора SELECT и назначение составляющих его предложений.

  1. Предложение SELECT оператора SELECT

  1. Предложение WHERE оператора SELECT

  1. Правила записи условий поиска в языке SQL: сравнение, проверка на принадлежность диапазону, проверка на принадлежность множеству, проверка на соответствие шаблону, проверка на равенство неопределенному значению (NULL).

  1. Составные условия поиска в языке SQL. Таблицы истинности.

  1. Сортировка таблицы результатов запроса предложением ORDER BY оператора SELECT.

  1. Объединение результатов нескольких запросов оператором UNION. Требования к объединяемым таблицам результатов запросов.

  1. Многотабличные запросы на чтение.

  1. Использование псевдонимов таблиц; самосоединение таблиц; внутреннее и внешние соединения..

  1. Итоговые запросы на чтение. Агрегатные функции языка SQL: AVG, SUM, MIN, MAX, COUNT, COUNT(*).

  1. Запросы с группировкой и ограничения на них.

Предложения group by и having (запросы с группировкой)

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

SELECT AVG(SUMD)FROM PERSON

вычисляет среднедушевой доход жителя.

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

SELECT ADR,AVG(SUMD) FROM PERSON GROUP BY ADR

Этот запрос возвращает несколько итоговых строк - по одной строке для каждой квартиры. Логика выполнения запроса следующая.

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

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

Запрос, включающий в себя предложение GROUP BY, называется запросом с группировкой. Столбцы, указанные в этом предложении, называютсястолбцами группировки, поскольку именно они определяют, по какому признаку строки объединяются в группы. Ниже приведен ряд запросов с группировкой:

1) сколько жителей зарегистрировано в каждой квартире?

SELECT ADR,COUNT(*) FROM PERSON GROUP BY ADR

2) сколько источников дохода имеет каждый житель с ненулевым общим доходом?

SELECT NOM,COUNT(ID) FROM HAVE_D GROUP BY NOM

3) сколько различных источников дохода имеют жители каждой квартиры?

SELECT ADR,COUNT(DISTINCT ID) FROM PERSON,HAVE_D WHERE PERSON.NOM=HAVE_D.NOM GROUP BY ADR

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

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

SELECT ADR,FIO,SUM(SUMD) FROM PERSON GROUP BY ADR,FIO

Ограничения на запросы с группировкой

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

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

1) константа;

2) агрегатная функция, возвращающая одно значение для всех строк, входящих в группу;

3) столбец группировки, который, по определению, имеет одно и то же значение во всех строках группы;

4) выражение, включающее в себя перечисленные выше элементы.

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

SELECT NOM,FIO,SUMD,COUNT(ID) FROM PERSON,HAVE_D WHERE PERSON.NOM=HAVE_D.NOM GROUP BY NOM

В этом запросе список возвращаемых столбцов содержит помимо столбца группировки NOM также столбцы FIO и SUMD, не указанные в предложении GROUP BY. Чтобы не нарушать ограничение, необходимо просто включить эти два столбца в предложение GROUP BY:

SELECT NOM,FIO,SUMD,COUNT(ID) FROM PERSON,HAVE_D WHERE PERSON.NOM=HAVE_D.NOM

GROUP BY NOM,FIO,SUMD

  1. Условия поиска групп и ограничения на эти условия.

Условия поиска групп

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

SELECT ADR,AVG(SUMD) FROM PERSON GROUP BY ADR HAVING COUNT(*)>1

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

Ограничения на условия поиска групп

Условие поиска, используемое в предложении HAVING, применяется не к отдельным строкам, а к группе в целом. Это значит, что в условие поиска может входить:

1) константа;

2) агрегатная функция, возвращающая одно значение для всех строк, входящих в группу;

3) столбец группировки, который, по определению, имеет одно и то же значение во всех строках группы;

4) выражение, включающее в себя перечисленные выше элементы.

На практике условие поиска в предложении HAVING всегда должно включать в себя как минимум одну агрегатную функцию. Если это не так, то условие поиска можно переместить в предложение WHERE. Чтобы определить, где следует указать условие поиска - в предложении WHERE или HAVING, необходимо помнить, как применяются эти предложения:

1) предложение WHERE применяется к отдельным строкам, поэтому выражения, содержащиеся в нем, должны вычисляться для отдельных строк;

2) предложение HAVING применяется к группам строк, поэтому выражения, содержащиеся в нем, должны вычисляться для групп строк.

  1. Вложенный запрос и его особенности.

Соседние файлы в папке БД - билеты - 2017