Использование псевдонимов таблиц в запросах с соединением
Можно несколько сократить тексты приведенных выше запросов за счет использования коротких псевдонимов вместо довольно длинных имен таблиц.
Например, текст запроса, соединяющего студентов с оценками, может выглядеть так:
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; просмотров: 961;