了解 JOINS 、子查询和聚合函数
Understanding JOINS , Sub Query and Aggregate Functions
在 MYSQL 中,我试图理解聚合函数并在 northwind 模式中尝试一些示例。
table 名员工的描述如下。
+-----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| company | varchar(50) | YES | MUL | NULL | |
| last_name | varchar(50) | YES | MUL | NULL | |
| first_name | varchar(50) | YES | MUL | NULL | |
| email_address | varchar(50) | YES | | NULL | |
| job_title | varchar(50) | YES | | NULL | |
| business_phone | varchar(25) | YES | | NULL | |
| home_phone | varchar(25) | YES | | NULL | |
| mobile_phone | varchar(25) | YES | | NULL | |
| fax_number | varchar(25) | YES | | NULL | |
| address | longtext | YES | | NULL | |
| city | varchar(50) | YES | MUL | NULL | |
| state_province | varchar(50) | YES | MUL | NULL | |
| zip_postal_code | varchar(15) | YES | MUL | NULL | |
| country_region | varchar(50) | YES | | NULL | |
| web_page | longtext | YES | | NULL | |
| notes | longtext | YES | | NULL | |
| attachments | longblob | YES | | NULL | |
+-----------------+-------------+------+-----+---------+----------------+
另外table里面的数据是
mysql> select city , first_name,last_name from employees;
+----------+------------+----------------+
| city | first_name | last_name |
+----------+------------+----------------+
| Seattle | Nancy | Freehafer |
| Bellevue | Andrew | Cencini |
| Redmond | Jan | Kotas |
| Kirkland | Mariya | Sergienko |
| Seattle | Steven | Thorpe |
| Redmond | Michael | Neipper |
| Seattle | Robert | Zare |
| Redmond | Laura | Giussani |
| Seattle | Anne | Hellung-Larsen |
+----------+------------+----------------+
我想了解如何找到来自不同城市的平均人数。
到目前为止,我有
mysql> select city,count(city) from employees group by city;
+----------+-------------+
| city | count(city) |
+----------+-------------+
| Bellevue | 1 |
| Kirkland | 1 |
| Redmond | 3 |
| Seattle | 4 |
+----------+-------------+
我还有
SELECT SUM(inner_count_city) from
(
SELECT city AS inner_city,
COUNT(*) AS inner_count_city
FROM employees
GROUP BY inner_city
) temp_table;
+-----------------------+
| SUM(inner_count_city) |
+-----------------------+
| 9 |
+-----------------------+
由于以下原因,我正在努力推进这项工作。
- 我无法执行 AVG(COUNT(city)) - 无法执行两个聚合函数
- 我也不知道,如何除以城市总数(= 9)。
- 不确定我是否应该使用 unions 或 joins 或子查询。
我正在尝试做类似
的事情
- select 城市,inner_count_city / 总和 (inner_count_city) 来自 ..
您可以在外部查询中应用 AVG
聚合函数:
select avg(cnt)
FROM (select count(city) as cnt
from employees
group by city) as t
要获取每个城市的人口百分比,您可以使用以下查询:
select city, count(city) * 100.0 / total_count as cnt
from employees
cross join (select count(*) as total_count from employees) AS t
group by city, total_count
SQL一次只支持一个聚合;对于多个聚合,您需要多个 subqueries/CTEs。如果你想要平均个城市的人口,那么你就差不多了:
SELECT AVG(inner_count_city * 1.0) from
FROM (SELECT city AS inner_city, COUNT(*) AS inner_count_city
FROM employees
GROUP BY inner_city
) c;
请注意,SQL 服务器对整数进行整数运算。所以 1 和 2 的平均值是 1,而不是 1.5。因此 * 1.0
.
您也可以在没有子查询的情况下执行此操作:
SELECT COUNT(*) * 1.0 / COUNT(DISTINCT city)
FROM employees;
在 MYSQL 中,我试图理解聚合函数并在 northwind 模式中尝试一些示例。
table 名员工的描述如下。
+-----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| company | varchar(50) | YES | MUL | NULL | |
| last_name | varchar(50) | YES | MUL | NULL | |
| first_name | varchar(50) | YES | MUL | NULL | |
| email_address | varchar(50) | YES | | NULL | |
| job_title | varchar(50) | YES | | NULL | |
| business_phone | varchar(25) | YES | | NULL | |
| home_phone | varchar(25) | YES | | NULL | |
| mobile_phone | varchar(25) | YES | | NULL | |
| fax_number | varchar(25) | YES | | NULL | |
| address | longtext | YES | | NULL | |
| city | varchar(50) | YES | MUL | NULL | |
| state_province | varchar(50) | YES | MUL | NULL | |
| zip_postal_code | varchar(15) | YES | MUL | NULL | |
| country_region | varchar(50) | YES | | NULL | |
| web_page | longtext | YES | | NULL | |
| notes | longtext | YES | | NULL | |
| attachments | longblob | YES | | NULL | |
+-----------------+-------------+------+-----+---------+----------------+
另外table里面的数据是
mysql> select city , first_name,last_name from employees;
+----------+------------+----------------+
| city | first_name | last_name |
+----------+------------+----------------+
| Seattle | Nancy | Freehafer |
| Bellevue | Andrew | Cencini |
| Redmond | Jan | Kotas |
| Kirkland | Mariya | Sergienko |
| Seattle | Steven | Thorpe |
| Redmond | Michael | Neipper |
| Seattle | Robert | Zare |
| Redmond | Laura | Giussani |
| Seattle | Anne | Hellung-Larsen |
+----------+------------+----------------+
我想了解如何找到来自不同城市的平均人数。
到目前为止,我有
mysql> select city,count(city) from employees group by city;
+----------+-------------+
| city | count(city) |
+----------+-------------+
| Bellevue | 1 |
| Kirkland | 1 |
| Redmond | 3 |
| Seattle | 4 |
+----------+-------------+
我还有
SELECT SUM(inner_count_city) from
(
SELECT city AS inner_city,
COUNT(*) AS inner_count_city
FROM employees
GROUP BY inner_city
) temp_table;
+-----------------------+
| SUM(inner_count_city) |
+-----------------------+
| 9 |
+-----------------------+
由于以下原因,我正在努力推进这项工作。
- 我无法执行 AVG(COUNT(city)) - 无法执行两个聚合函数
- 我也不知道,如何除以城市总数(= 9)。
- 不确定我是否应该使用 unions 或 joins 或子查询。
我正在尝试做类似
的事情- select 城市,inner_count_city / 总和 (inner_count_city) 来自 ..
您可以在外部查询中应用 AVG
聚合函数:
select avg(cnt)
FROM (select count(city) as cnt
from employees
group by city) as t
要获取每个城市的人口百分比,您可以使用以下查询:
select city, count(city) * 100.0 / total_count as cnt
from employees
cross join (select count(*) as total_count from employees) AS t
group by city, total_count
SQL一次只支持一个聚合;对于多个聚合,您需要多个 subqueries/CTEs。如果你想要平均个城市的人口,那么你就差不多了:
SELECT AVG(inner_count_city * 1.0) from
FROM (SELECT city AS inner_city, COUNT(*) AS inner_count_city
FROM employees
GROUP BY inner_city
) c;
请注意,SQL 服务器对整数进行整数运算。所以 1 和 2 的平均值是 1,而不是 1.5。因此 * 1.0
.
您也可以在没有子查询的情况下执行此操作:
SELECT COUNT(*) * 1.0 / COUNT(DISTINCT city)
FROM employees;