Пересказ статьи Erik Darling. The How To Write SQL Server Queries Correctly Cheat Sheet: EXISTS and NOT EXISTS
Замечательная вещь, связанная с SQL, состоит в том, что имеется много директив, которые довольно легко понять и использовать по назначению.
Ужасная вещь, относящаяся к SQL, заключается в том, что в нем столько же правил, которые применяются избирательно, как и в самом английском языке.
У меня, конечно, есть свои жалобы и недовольство относительно выбора некоторых из них, и вы тоже в этом убедитесь, когда глубже вникните в язык. Типичным примером этого типа является мое желание использовать в SQL GET вместо SELECT для извлечения данных.
Очень немного людей идут в магазин
выбирать (select) молоко, яйца, масло, соль, перец и виски. Большинство из нас просто идет
взять (get) их. Но хватит о завтраке.
Давайте поговорим о двух наиболее часто упускаемых из виду и недооцененных возможностях в языке SQL: EXISTS и NOT EXISTS. Возможно, они бы больше привлекали внимание, если бы назывались THERE and NOT THERE, но тогда была бы опасность начального затруднения с предложениями WHERE и THERE.
Часто очерняемые теми, кто читал статью в 1998 о "подзапросах в MySQL, которые медленнее, чем соединения", эти предикаты являются двумя наиболее полезными вещами, которые вы можете освоить и использовать регулярно.
Хотя они несколько напоминают подзапросы, столбцы, которые вы выбираете в подзапросе EXISTS или NOT EXISTS не могут использоваться во внешнем запросе. Вы можете поместить что угодно в список SELECT, от * или 1 до COUNT или 1/0, или всего содержимого Библии короля Якова, и это никогда не приведет ни к каким даже самым незначительным изменениям в мире. Аналогично, добавление DISTINCT, TOP или любого другого ограничителя числа строк не сделает ничего такого, чтобы изменить план запроса или его производительность.
Преодолейте себя.
И EXISTS, и NOT EXISTS уже установили число строк в 1, поскольку все, что нужно сделать каждому из них, это определить, существует хотя бы одна строка или нет, и наоборот.
Continue reading "Шпаргалка по правильному написанию запросов к SQL server: EXISTS и NOT EXISTS"