简体   繁体   中英

count(*) and count(column_name), what's the diff?

count(*)count(column_name) ,mysql的区别是什么。

  • COUNT(*) counts all rows in the result set (or group if using GROUP BY).
  • COUNT(column_name) only counts those rows where column_name is NOT NULL. This may be slower in some situations even if there are no NULL values because the value has to be checked (unless the column is not nullable).
  • COUNT(1) is the same as COUNT(*) since 1 can never be NULL.

To see the difference in the results you can try this little experiment:

CREATE TABLE table1 (x INT NULL);
INSERT INTO table1 (x) VALUES (1), (2), (NULL);
SELECT
    COUNT(*) AS a,
    COUNT(x) AS b,
    COUNT(1) AS c
FROM table1;

Result:

a   b   c
3   2   3

根据列定义 - 如果您的列允许NULL - 您可能会得到不同的结果(在Mark已经告知的某些情况下,它可能会慢于count(列))。

There is no performance difference between COUNT (*) , COUNT (ColumnName) , COUNT (1) .

Now, if you have COUNT (ColumnName) then the database has to check if the column has a NULL value, and NULL s are eliminated from aggregates. So COuNT (*) or COUNT (1) is preferable to COUNT (ColumnName) unless you want COUNT (DISTINCT ColumnName)

In most cases there's little difference, and COUNT(*) or COUNT(1) is generally preferred. However, there's one important situation where you must use COUNT(columnname) : outer joins.

If you're performing an outer join from a parent table to a child table, and you want to get zero counts in rows that have no related items in the child table, you have to use COUNT(column in child table) . When there's no matches, that column will be NULL , and you'll get the desired zero count (actually, you'll get NULL , but you can convert that to 0 with IFNULL() or COALESCE() ). If you use COUNT(*) , it counts the row from the parent table, so you'll get a count of 1 .

SELECT c.name, COALESCE(COUNT(o.id), 0) AS order_count
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.id

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM