-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCOUNT.txt
182 lines (132 loc) · 10.3 KB
/
COUNT.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
SQL функция COUNT
SQL запрос с COUNT используется для подсчета количества строк, возвращаемых
в операторе SELECT.
Синтаксис для функции COUNT в SQL:
**************************************************************************************
SELECT COUNT(aggregate_expression)
FROM tables
[WHERE conditions]
[ORDER BY expression [ ASC | DESC ]];
**************************************************************************************
Или синтаксис для функции COUNT при группировке результатов по одному или
нескольким столбцам.
**************************************************************************************
SELECT expression1, expression2, ... expression_n,
COUNT(aggregate_expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, ... expression_n
[ORDER BY expression [ ASC | DESC ]];
**************************************************************************************
Параметры:
- expression1, expression2, ... expression_n - выражения, которые не инкапсулированы в
функции COUNT и должны быть включены в
предложение GROUP BY в конце SQL запроса.
- aggregate_expression - это столбец или выражение, чьи ненулевые значения будут
учитываться.
- tables - таблицы, из которых вы хотите получить записи. В предложении FROM должна
быть указана хотя бы одна таблица.
- WHERE conditions - необязательный. Это условия, которые должны быть выполнены для
выбора записей
- ORDER BY expression - необязательный. Выражение, используемое для сортировки записей
в наборе результатов. Если указано более одного выражения,
значения должны быть разделены запятыми
- ASC - необязательный. ASC сортирует результирующий набор в порядке возрастания по
expressions. Это поведение по умолчанию, если модификатор не указан.
- DESC - необязательный. DESC сортирует результирующий набор в порядке убывания по
expressions
****** Функция COUNT включает только значения NOT NUL ******
Не все это понимают, но функция COUNT будет подсчитывать только те записи, в которых
expressions НЕ равно NULL в COUNT(expressions). Когда expressions является значением NULL,
оно не включается в вычисления COUNT.
Допустим у нас есть таблица customers со следующими полями: customer_id, first_name,
last_name, favorite_website.
Формируем SQL запрос с SELECT, который использует функцию COUNT.
**************************************************************************************
SELECT COUNT(customer_id)
FROM customers;
**************************************************************************************
В этом примере запрос вернет все N значений, поскольку в таблице customer есть N записей,
и все значения customer_id НЕ равны NULL (т.е. customer_id является первичным ключом для
таблицы).
Но что происходит, когда мы сталкиваемся со значением NULL при использовании функции COUNT?
Формируем SELECT запрос, который посчитает столбец favourite_website, который может содержать
значения NULL.
**************************************************************************************
SELECT COUNT(favorite_website)
FROM customers;
**************************************************************************************
В даннном примере будет возвращено значение N - K. Где N - количество записей, а K - записи
в которых значение favourite_website равно NULL, оно будет исключено из вычисления функции
COUNT.
!!! ВНИМАНИЕ !!!
Используйте первичный ключ в функции COUNT или COUNT(*), если мы хотим быть уверены, что
все записи включены в расчы без исключений.
!!! ВНИМАНИЕ !!!
****** Использование одного выражения в функции COUNT ******
Давайте рассмотрим пример, который показывает, как использовать функцию COUNT с одним
выражением в запросе. У нас есть таблица employees со следующими данными: employee_number,
first_name, last_name, salary, dept_id
Формируем следующий SQL запрос:
**************************************************************************************
SELECT COUNT(*) AS total
FROM employees
WHERE salary > 50000;
**************************************************************************************
В этом запросе мы вернем количество сотрудников, у которых зарплата превышает 50000.
Мы присвоили COUNT(*) псевдоним total, чтобы сделать результаты наших запросов более
читабельными. Теперь total будет отображаться как заголовок столбца при возврате набора
результатов.
****** Использование GROUP BY с функцией COUNT ******
В некоторых случаях нам потребуется использовать оператор GROUP BY с функцией COUNT.
Это происходит, когда в операторе SELECT указаны столбцы, которые не являются частью
функции COUNT. Снова используя таблицу employees, с полями: employee_number, first_name,
last_name, salary, dept_id.
Формируем SQL запрос:
**************************************************************************************
SELECT dept_id,
COUNT(*) AS total
FROM employees
WHERE salary > 50000
GROUP BY dept_id;
**************************************************************************************
В этом запросе функция COUNT будет возвращать количество сотрудников, которые зарабатывают
более 50000 для каждого dept_id. Поскольку столбец dept_id не включен в функцию COUNT, он
должен быть указан в операторе GROUP BY.
****** Использование DISTINCT с функцией COUNT ******
DISTINCT можно испоьзовать в функции COUNT. Это позволяет рассчитывать только уникальные
значения запроса. Используем employees с полями, что и в предыдущем примере.
**************************************************************************************
SELECT COUNT(DISTINCT dept_id) AS total
FROM employees
WHERE salary > 50000;
**************************************************************************************
В этом запросе функция COUNT будет возвращать уникальное количество значений dept_id,
в которых хотя бы один сотрудник имеет salary более 50000.
!!! ВНИМАНИЕ !!!
Настройка производительности с помощью функции COUNT.
Поскольку функция COUNT будет возвращать одни и те же результаты независимо от того,
какие поля NOT NULL включены в параметры функции COUNT (т.е. в скобках), мы можем
использовать COUNT(1) для повышения производительности. Теперь ядру базы данных не
нужно будет извлекать какие-либо поля данных, вместо этого оно просто получит
целочисленное значение 1.
!!! ВНИМАНИЕ !!!
Например, вместо ввода этого запроса:
**************************************************************************************
SELECT dept_id,
COUNT(*) AS total
FROM employees
WHERE salary > 50000
GROUP BY dept_id;
**************************************************************************************
Мы можем заменить COUNT(*) на COUNT(1), чтобы повысить производительность.
**************************************************************************************
SELECT dept_id,
COUNT(1) AS total
FROM employees
WHERE salary > 50000
GROUP BY dept_id;
**************************************************************************************
Теперь функции COUNT не нужно извлекать все поля из таблицы employees, как это было-бы
при использовании синтаксиса COUNT(*). Запрос просто получит числовое значение 1 для
каждой записи, которая соответствует нашим критериям.