Часть 3. Некоторые пояснения по поводу подзапросовЯ полагаю, что у тех, кто думает, должен возникнуть вопрос по поводу вот этого
- Код: Выделить всё
WHERE not id in
(
SELECT a.id FROM Ученики a INNER JOIN оценки b on a.id=b.id_u
)
а именно, почему собственно нельзя было написать по другому
- Код: Выделить всё
WHERE id in
(
SELECT a.id FROM Ученики a INNER JOIN оценки b on a.id<>b.id_u
)
казалось бы все логично. Ан нет.
Дело в том, что происходит соединение двух таблиц по принципу все строки первой таблицы со всеми строками второй. А далее идет условие, по которому должны быть отобраны строки из этого множества. Т.е. остануться все пары, в которых id первой таблицы, не равно id_u второй таблицы. Количество таких строк легко подсчитать. Если в первой таблице N1 строк, а во второй N2 строк, то в результирующей таблице будет N1*N2 - N2 строк, но это при условии, что все строки второй таблицы участвуют в связи. В нашем случае это естественно, так как не бывает оценки без ученика.
Вот почему мне больше нравится, когда связь указывается в разделе
from, а не в разделе
where. В первом случае понятно, что таблицы в начале объединяются и потом происходит отбор, а во втором из записи это не очевидно. Сравните два равноправных запроса
SELECT * FROM Ученики a INNER JOIN оценки b on a.id=b.id_uи
SELECT * FROM Ученики a, оценки b
where a.id=b.id_uПродолжение следует...