Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Технологии_Баз_Данных_2020.docx
Скачиваний:
274
Добавлен:
01.07.2020
Размер:
1.01 Mб
Скачать

10. Телефонная станция

Минимальный список характеристик:

  • Номер абонента, фамилия абонента, адрес, наличие блокиратора, примечание;

  • Код АТС, код района, количество номеров;

  • Номер спаренного телефона абонента, задолженность, дата установки.

Один спаренный номер одной АТС может использоваться несколькими абонентами и один и тот же абонент может использовать телефоны разных АТС.

Выборки:

  • Выбрать пары сблокированных телефонов.

SELECT Номера.Номер_телефона, Count(Номера.Абонент) AS [Count-Абонент] FROM Абоненты INNER JOIN Номера ON Абоненты.Номер_абонента = Номера.Абонент WHERE (((Абоненты.Блокиратор)=Yes)) GROUP BY Номера.Номер_телефона HAVING (((Count(Номера.Абонент))>1));

  • Определить АТС, районы действия которых перекрываются.

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

SELECT АТС.[Код района], Count(АТС.Код) AS [Count-Код] FROM АТС GROUP BY АТС.[Код района] HAVING (((Count(АТС.Код))>1));

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

SELECT АТС.Код, АТС.[Код района] FROM АТС RIGHT JOIN АТС1 ON АТС.[Код района] = АТС1.[Код района] WHERE (((АТС.[Код района])=[АТС1]![Код района]));

  • Выбрать телефоны группового пользования, Вывести их номера и фамилии абонентов.

Это задание похоже на первое, но осложняется выбором ФИО. Поэтому сделаем его из двух запросов. В первом отберем записи с номерами групповых телефонов (число абонентов на один номер больше единицы).

SELECT Номера.Номер_телефона, Count(Абоненты.Номер_абонента) AS [Count-Номер_абонента] FROM Абоненты INNER JOIN Номера ON Абоненты.Номер_абонента = Номера.Абонент GROUP BY Номера.Номер_телефона HAVING (((Count(Абоненты.Номер_абонента))>1));

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

SELECT Номера.Номер_телефона, Абоненты.ФИО FROM Группа1, Абоненты INNER JOIN Номера ON Абоненты.Номер_абонента = Номера.Абонент WHERE (((Номера.Номер_телефона)=[Группа1]![Номер_телефона]));

  • Выбрать список абонентов АТС 47, имеющих задолженность больше 100 руб.

SELECT Абоненты.ФИО, Номера.Задолженность FROM АТС INNER JOIN (Абоненты INNER JOIN Номера ON Абоненты.Номер_абонента = Номера.Абонент) ON АТС.Код = Номера.АТС WHERE (((Номера.Задолженность)>100) AND ((АТС.Код)=47));

11. Спорт

Минимальный список характеристик:

  • Название вида спорта, единица измерения, мировой рекорд и его дата;

  • ФИО спортсмена, год рождения, команд, спортивный разряд;

  • Наименование соревнования, показанный результат, дата проведения, место проведения.

Один спортсмен может заниматься разными видами спорта.

Выборки:

  • Вывести таблицу распределения мест в соревновании 'открытый чемпионат' в городе 'Киев' по 'шахматам' в 2000 г. SELECT спортсмен.фио, результаты.позиция FROM результаты INNER JOIN спортсмен ON результат.спортсмен_id = спортсмен.id INNER JOIN соревнование ON результаты.соревнование_id = соревнование.id INNER JOIN вид_спорта ON результаты.вид_спорта_id = вид_спорта.id WHERE соревнование.название = 'открытый чемпионат' and соревнование.место_проведения = 'Киев' and вид_спорта.название = 'шахматы' and YEAR(соревнование.дата) = 2000 ORDER BY результаты.позиция

  • Определить спортсменов, которые выступают более чем в 3 видах спорта.

SELECT спортсмен.фио, COUNT(DISTINCT результаты.вид_спорта_id) as count FROM результаты INNER JOIN спортсмен ON результат.спортсмен_id = спортсмен.id INNER JOIN вид_спорта ON результаты.вид_спорта_id = вид_спорта.id GROUP BY результат.вид_спорта_id HAVING count > 3

  • Вывести список спортсменов, превысивших мировые рекорды.

SELECT DISTINCT спортсмен.фио FROM результаты INNER JOIN спортсмен ON результат.спортсмен_id = спортсмен.id INNER JOIN вид_спорта ON результаты.вид_спорта_id = вид_спорта.id WHERE результаты.результат > вид_спорта.рекорд

  • Определить наилучший показатель спортсмена 'Караваев' в виде спорта 'бег'.

SELECT спортсмен.фио, MAX(результаты.результат) AS лучший_результат FROM результаты INNER JOIN спортсмен ON результат.спортсмен_id = спортсмен.id INNER JOIN соревнование ON результаты.соревнование_id = соревнование.id INNER JOIN вид_спорта ON результаты.вид_спорта_id = вид_спорта.id WHERE вид.спорта = 'бег' and спортсмен.фио = 'Караваев' and GROUP BY спортсмен.id