Когда использовать * в SQL запросах, содержащих соединения и агрегаты? - PullRequest
0 голосов
/ 27 апреля 2020

Вопрос

  • Web_events таблица содержит id, ..., channel, account_id

  • accounts таблица содержит id, ..., sales_rep_id

  • sales_reps таблица содержит id, name

Учитывая приведенные выше таблицы, напишите запрос SQL, чтобы определить, сколько раз конкретный channel использовался в таблице web_events для каждого имени в sales_reps. Ваша итоговая таблица должна иметь три столбца - имя sales_reps, channel и количество вхождений. Сначала закажите таблицу с наибольшим количеством вхождений.

Ответ

SELECT s.name, w.channel, COUNT(*) num_events
FROM accounts a
JOIN web_events w
ON a.id = w.account_id
JOIN sales_reps s
ON s.id = a.sales_rep_id
GROUP BY s.name, w.channel
ORDER BY num_events DESC;

COUNT(*) сбивает меня с толку. Я не понимаю, как SQL выяснить, что COUNT(*) это COUNT(w.channel). Кто-нибудь может уточнить?

1 Ответ

0 голосов
/ 27 апреля 2020

Я не понимаю, как SQL выяснить, что COUNT (*) равно COUNT (w.channel)

COUNT() - это функция агрегирования, которая подсчитывает число строки, соответствующие условию. На самом деле, COUNT(<expression>) в целом (или COUNT(column) в частности) подсчитывает количество строк, в которых выражение (или столбец) не равно NULL.

В общем, следующее делает точно то же самое:

  • COUNT(*)
  • COUNT(1)
  • COUNT(<primary key used on inner join>)

В общем, Я предпочитаю COUNT(*), потому что это стандарт SQL для этого. Я могу принять COUNT(1) в качестве признания того, что COUNT(*) - это просто функция раздувания. Тем не менее, я не вижу смысла использовать третью версию, потому что она просто требует избыточного набора текста.

Более того, я считаю, что новые пользователи часто путаются между этими двумя конструкциями:

  • COUNT(w.channel)
  • COUNT(DISTINCT w.channel)

Люди, изучающие SQL, часто думают, что первое действительно делает второе. По этой причине я рекомендую придерживаться более простых способов подсчета строк. Затем используйте COUNT(DISTINCT), когда вы действительно хотите получить накладные расходы для подсчета уникальных значений (COUNT(DISTINCT) дороже COUNT()).

...