返回 date1 到 date2 之间相隔的 part 值,part 是用于指定的相隔的年或月或日等
分组
分组后,只能查询 分组的列 和 聚合列
运行顺序:from -> join… on… -> where -> group by -> select -> having -> order by -> limit
-- 1. 查询员工分布的居住地,以及每个居住地有多少名员工,显示 员工大于等于 40 的居住地
SELECT
location, count(id) as empnumber
FROM
employee
GROUP BY
location
HAVING
empnumbe r>= 40
-- 2. 查询所有薪水在 10000 以上的员工的分布的居住地,然后仅得到聚集地大于 30 的结果
SELECT
location, count(id) as empnumber
FROM
employee
WHERE
salary >= 10000
GROUP BY
location
HAVING
count(id) >= 30
练习
-- 1. 查询腾讯每个部门的员工数量
SELECT
d.`name`, COUNT(e.id) as number
FROM
company as c
INNER JOIN department as d on c.id = d.companyId
INNER JOIN employee as e on d.id = e.deptId
WHERE
c.`name` like '%腾讯%'
GROUP BY
d.id, d.`name`;
-- 2. 查询每个公司的员工数量
SELECT c.`name`, COUNT(e.id) as number
FROM company as c INNER JOIN department as d on c.id = d.companyId
INNER JOIN employee as e on d.id = e.deptId
GROUP BY c.id, c.`name`
-- 3. 查询所有公司 5 年内入职的居住在万家湾的女员工数量
SELECT
c.`name`,
CASE
WHEN r.number is NULL THEN 0
ELSE r.number
END as number
FROM
company c
LEFT JOIN (
SELECT
c.id,
c.`name`,
COUNT(e.id) as number
FROM
company as c
INNER JOIN department as d on c.id = d.companyId
INNER JOIN employee as e on d.id = e.deptId
WHERE
TIMESTAMPDIFF(YEAR,e.joinDate,CURDATE()) <= 5 AND e.location like '%万家湾%'
GROUP BY
c.id, c.`name`
) as r on c.id = r.id
-- 4. 查询腾讯所有员工分布在哪些居住地,每个居住地的数量
SELECT
e.location,
count(e.id) as empnumber
FROM
company as c
INNER JOIN department as d on c.id = d.companyId
INNER JOIN employee as e on d.id = e.deptId
WHERE
c.`name` LIKE '%腾讯%'
GROUP BY
e.location
-- 5. 查询员工人数大于 200 的公司信息
SELECT
*
FROM
company
WHERE
id in (
SELECT
c.id
FROM
company as c
INNER JOIN department as d on c.id = d.companyId
INNER JOIN employee as e on d.id = e.deptId
GROUP BY
c.id, c.`name`
HAVING
count(e.id) >= 200
)
-- 6. 查询腾讯公司里比它平均工资高的员工
SELECT
e.*
FROM
company as c
INNER JOIN department as d on c.id = d.companyId
INNER JOIN employee as e on d.id = e.deptId
WHERE
c.`name` LIKE '%腾讯%'
AND
e.salary > (
-- 查询腾讯的平均薪资
SELECT
avg(e.salary)
FROM
company as c
INNER JOIN department as d on c.id = d.companyId
INNER JOIN employee as e on d.id = e.deptId
WHERE
c.`name` LIKE '%腾讯%'
)
-- 7. 查询腾讯所有名字为两个字和三个字的员工对应人数
SELECT
CHAR_LENGTH(e.`name`) as 姓名长度,
COUNT(E.ID) as 员工数量
FROM
company as c
INNER JOIN department as d on c.id = d.companyId
INNER JOIN employee as e on d.id = e.deptId
WHERE
c.`name` LIKE '%腾讯%'
GROUP BY
CHAR_LENGTH(e.`name`)
HAVING
姓名长度 in (2, 3)
-- 8. 查询每个公司每个月的总支出薪水,并按照从低到高排序
SELECT
c.`name`,
SUM(e.salary) as sumofsalary
FROM
company as c
INNER JOIN department as d on c.id = d.companyId
INNER JOIN employee as e on d.id = e.deptId
GROUP BY
c.id, c.`name`
ORDER BY
sumofsalary