Во-первых, создайте запрос, используя явный синтаксис JOIN, а не декартово произведение. Вероятно, это не повлияет на производительность для любого современного оптимизатора, но делает информацию о том, как работают соединения, более доступной для программистов.
SELECT Player.Name, Game.Date
FROM Player
INNER JOIN Game ON Game.WinnerPlayerID = Player.PlayerID
WHERE Game.WinnerFrags > Game.TotalFrags/2
ORDER BY Player.Name
Это даст нам всех игроков, отсортированных по именам, которые взяли больше фрагов в игре, чем все остальные игроки в игре, вместе взятых, а также даты проведения игр. Помещение обоих условий в JOIN, вероятно, также не повлияет на производительность, поскольку оптимизатор, скорее всего, выполняет фильтрацию как часть JOIN. Это начинает иметь значение для левых соединений, хотя. Допустим, мы ищем, сколько игр в десятке лучших игроков недели когда-либо выиграл с разницей, описанной выше. Так как возможно, что у некоторых из них такого еще никогда не было, нам понадобится LEFT JOIN.
SELECT Player.WeekRank, Player.Name, COUNT(Game.*) AS WhitewashCount
FROM Player
LEFT JOIN Game ON Game.WinnerPlayerID = Player.PlayerID
WHERE Player.WeekRank >= 10
AND Game.WinnerFrags > Game.TotalFrags/2
GROUP BY Player.WeekRank, Player.Name
ORDER BY Player.WeekRank
Ну, не совсем. JOIN возвращает записи для каждой игры, в которую играл игрок, или данные игрока и данные игры NULL, если игрок не играл ни в какие игры. Эти результаты будут отфильтрованы во время или после присоединения в зависимости от решения оптимизатора на основе критериев фрагмента. Это исключит все записи, которые не соответствуют критериям фрагмента. Таким образом, не будет записей группы для игроков, у которых никогда не было такой захватывающей победы. Эффективно создать ВНУТРЕННЕЕ СОЕДИНЕНИЕ .... FAIL.
SELECT Player.WeekRank, Player.Name, COUNT(Game.*) AS WhitewashCount
FROM Player
LEFT JOIN Game ON Game.WinnerPlayerID = Player.PlayerID
AND Game.WinnerFrags > Game.TotalFrags/2
WHERE Player.WeekRank >= 10
GROUP BY Player.WeekRank, Player.Name
ORDER BY Player.WeekRank
Как только мы переместим критерии фрагмента в JOIN, запрос будет работать правильно, возвращая записи для всех игроков в первой десятке недели, независимо от того, достигли ли они побелки.
После всего этого краткий ответ:
Для ситуаций ВНУТРЕННЕГО СОЕДИНЕНИЯ это, вероятно, не влияет на производительность, когда вы ставите условия. Тем не менее, запросы будут более читабельными, если вы разделите условия объединения и фильтрации. И получение условия в неправильном месте может серьезно испортить результаты LEFT JOIN.