Использование псевдонимов таблиц в запросах с соединением

Можно несколько сократить тексты приведенных выше запросов за счет использования коротких псевдонимов вместо довольно длинных имен таблиц.

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

select st.name_st, m.mark

from students st, marks m

where st.cod_st=m.cod_st

или так:

select st .name_st, m.mark

from students st join marks m

on st.cod_st=m.cod_st

В дальнейших примерах мы будем использовать псевдонимы таблиц.

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

a) Вариант с выборкой из декартова произведения:

select st.cod_st, st.name_st, s.name_sub, m.mark

from students st, marks m, subjects s
where st.cod_st=m.cod_st and s.cod_sub=m.cod_sub

 

b) Вариант с использованием операции соединения:

select st.cod_st, st.name_st, s.name_sub, m.mark

from students st join marks m on st.cod_st=m.cod_st

join subjects s on s.cod_sub=m.cod_sub

 

Результаты этих запросов опять одинаковы и предоставляют исчерпывающую информацию об успеваемости студентов в виде одной большой ненормализованной таблицы:

 

 

cod_st name_st name_sub mark
… … … Иванов Иванов … Петров Петров Петров … Иванов Иванов … Математика Физика … Физика Информатика История … Математика Информатика …   … …

 

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

Следующий пример запроса выводит ФИО, код студента и средний балл (обратим внимание на то, что группировку придется выполнять сразу по двум столбцам, чтобы выполнилось правило для запросов с группировкой, которое было рассмотрено в предыдущей лекции).

 

select st.cod_st, st.name_st, avg(m.mark) avg_mark

From students st, marks m where st.cod_st=m.cod_st

Group by st.cod_st, st.name_st

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

select st.cod_st, MAX(st.name_st) name_st, avg(m.mark) avg_mark

From students st, marks m where st.cod_st=m.cod_st

Group by st.cod_st

В приведенном примере использование агрегатной функции MAX(st.name_st) выглядит искусственным, с таким же успехом можно использовать и функцию MIN, однако любая из этих функций позволит выполнить группировку только по одному столбцу cod_st.








Дата добавления: 2015-08-26; просмотров: 966;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.