Рассмотрим следующий простой пример:SQLite "COUNT (*)" Считается вредным?
prompt% sqlite3 test.db
sqlite> create table employee (
employee_id integer primary key,
first_name varchar2(32) not null,
last_name varchar2(32) not null
);
sqlite> insert into employee (first_name, last_name) values ('Bill', 'Smith');
sqlite> insert into employee (first_name, last_name) values ('Sally', 'Jones');
sqlite> insert into employee (first_name, last_name) values ('Bill', 'Jones');
sqlite> select first_name, count(*) from employee;
Что будет результат?
наивный может предположить, что это будет:
Bill|2
Sally|1
Но опытный заметит, что ВЫБРАТЬ запрос отсутствует «GROUP BY», п. Oracle, при предъявлении этого запроса, по сути, бросить ошибку:
SQL ERROR: ORA-00937: not a single-group group function
SQLite, однако, не жалуется, но вместо этого дает:
Bill|3
, который кажется поддельным мне. .. Отображение общего количества строк может иметь смысл, я полагаю, но просто выбор последнего «first_name» кажется довольно произвольным и потенциально опасным.
Является ли это ошибкой или функцией, которую я просто не понимаю? Есть ли причина, по которой SQLite не предлагает аналогичную систему безопасности?
Не имеет смысла использовать агрегатную функцию без предложения GROUP BY, когда вы не выбираете все строки. Подумайте, что вы даже считаете? Вы хотите «выбрать first_name, count (*) из группы сотрудников по первому имени;« – NullUserException
»Может иметь смысл использовать агрегат без« GROUP BY », если все записи считаются находящимися в одной группе (и все, что вы хотите, это количество записей или наибольшее значение или что-то еще). Здесь не имеет значения значение «first_name». Это похоже на ошибку или, по крайней мере, на крайне низкую реализацию SQL. – mwigdahl
Это идентичная реализация MySQL @mwigdahl. – Ben