Intereting Posts
Использование CASE с предложением IN в T-SQL Что означает число в скобках? MySQL выбирает, между предложением AND, OR и запросом Схема базы данных для тегов (например, каждый пост имеет некоторые необязательные теги) Выпуск Tricky GROUP BY на ORACLE Разница в производительности между глобальным подключением к базе данных и открытием соединения каждый раз на Golang Является ли SQL IN плохой для производительности? Функция окна PostgreSQL: раздел по сравнению вставить тысячи строк в DB2 Использование хранимой процедуры в классическом ASP .. выполнение и получение результатов Динамический запрос к множественным базам данных Союза разбиение строк в Redshift Поиск вложенного SQL-декодера или переформатирования Кросс-таблица с большим или неопределенным количеством категорий Поиск по порядковым номерам DataReader по сравнению с именованными поисковыми запросами

Sql: как правильно проверить, существует ли запись

Читая некоторую документацию по SQL Tuning, я нашел это:

Select count(*) :
– подсчитывает количество строк
– Часто неправильно используется для проверки наличия записи

Действительно ли значение Select count(*) так плохо?

Каков правильный способ проверить наличие записи?

Лучше использовать

 select 1 from table where key = value; select count(1) from table where key = value; 

Первая альтернатива не должна давать вам никакого результата или одного результата, второй счет должен быть равен нулю или одному.

Сколько лет используется документация? Несмотря на то, что вы хорошо читали советы, большинство оптимизаторов запросов в недавних RDBMS оптимизируют select count(*) любом случае, поэтому, хотя есть разница в теории (и более старых базах данных), вы не должны замечать никакой разницы на практике.

Я бы предпочел не использовать функцию Count вообще:

 IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... ) <do smth> 

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

 IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = 'John' AND LastName = 'Smith' ) BEGIN INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith') END 

Другие ответы довольно хорошие, но было бы полезно добавить LIMIT 1 (или эквивалент , чтобы предотвратить проверку ненужных строк.

Вы можете использовать:

 SELECT 1 FROM MyTable WHERE <MyCondition> 

Если нет записи, соответствующей условию, приведенный набор записей пуст.

Вы можете использовать:

 SELECT COUNT(1) FROM MyTable WHERE ... 

или

 WHERE [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... ) 

Это будет более эффективно, чем SELECT * поскольку вы просто выбираете значение 1 для каждой строки, а не все поля.

Существует также тонкая разница между COUNT (*) и COUNT (название столбца):

  • COUNT(*) будет считать все строки, включая нули
  • COUNT(column name) будет считать только непустые вхождения имени столбца
 SELECT COUNT(1) FROM MyTable WHERE ... 

будет проходить через все записи. Именно по этой причине это плохо для использования в качестве записи.

я хотел бы использовать

 SELECT TOP 1 * FROM MyTable WHERE ... 

После нахождения 1 записи, он завершит цикл.

Вы можете использовать:

 SELECT 1 FROM MyTable WHERE... LIMIT 1 

используйте select 1 для предотвращения проверки ненужных полей.

uss LIMIT 1 чтобы предотвратить проверку ненужных строк.