MySQL学习笔记-基础:分组查询、连接查询
分组查询
目的:为了将数据分组
语法:
select 分组函数,列(次列出现在后面的group by里)
from 表
[where 筛选条件 ]
group by 分组列表
[order by子句]
条件分组
案例:
- 查询每个工种的最高工资
SELECT MAX(salary),job_id FROM employees GROUP BY job_id; - 查询每个位置上的部门个数
COUNT(*),location_id FROM departments GROUP BY location_id;
添加条件 - 查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id
FROM employees
WHERE email LIKE ‘%a%’
GROUP BY department_id; - 查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id; - 查询哪个部门的员工个数>2(分组后的筛选)
首先查询每个部门的员工个数,然后对结果进行筛选
SELECT COUNT(* ),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;#having用于分组后的查询,即原始表中没有相应字段 - 查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
分组筛选小结,分组查询的筛选可以分为分组前的筛选和分组后的筛选,两者的主要区别在于筛选条件,分组前通过原始表,分组后通过分组后的结果集作为筛选。
按表达式或函数分组
案例:
- 按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
SELECT COUNT(),LENGTH(last_name) len_name
FROM employees
GROUP BY LENGTH(last_name)
HAVING COUNT()>5;
按多个字段分组
- 查询每个部门每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY job_id,department_id;
也可以添加排序,排序放在最后。
连接查询
当查询的数据涉及到多个表时,需要用到连接查询。要避免笛卡尔乘积,需要添加连接条件。
按功能分类:
- 内连接
等值连接、非等值连接、自连接 - 外连接
- 交叉连接
sql92标准(仅支持内连接)
- 等值连接
案例1:查询员工名和对应的公寓名
SELECT last_name,department_name
FROM employees,departments
WHERE employees.department_id=departments.department_id;
案例2:为表取别名,取了别名后不能再使用原来的表名来限定,表的顺序可更换
查询员工名、工种号、工种名
SELECT e.last_name,e.job_id,j.job_title
FROM employees e,jobs j
WHERE e.
job_id=j.
job_id;
案例3:可以加筛选
查询有奖金的员工名、部门名
SELECT last_name,department_name
FROM employees,departments
WHERE employees.department_id=departments.department_id
AND employees.
commission_pctIS NOT NULL;
案例3:可以加分组
查询每个城市的部门个数
SELECT COUNT(*) 个数,city
FROM departments d,locations l
WHERE d.
location_id=l.
location_id
GROUP BY city;
案例4:可以加排序
查询工种名并按人数降序
SELECT job_title,COUNT()
FROM employees e,jobs j
WHERE e.
job_id=j.
job_id
GROUP BY job_title
ORDER BY COUNT() DESC;
案例5:三表连接
查询员工名、部门名和所在的城市
SELECT last_name,department_name,city
FROM employees e,departments d,locations l
WHERE e.
department_id=d.department_id
AND d.
location_id=l.
location_id;
- 非等值连接
即连接条件不为=时
案例1:查询员工的工资和工资级别
select salary,grade_level
from employees e,job_grades g
where salary between g.lowest_sal and g.highest_sal;
- 自连接
在同一个表里做连接
案例:查询员工名和上级的名称
SELECT e.employee_id,e.
last_name,m.
employee_id,m.
last_name
FROM employees e, employees m
WHERE e.
manager_id=m.
employee_id;
sql99
语法:
select 查询列表
from 表1 别名
【连接类型】join 表2 别名
on 连接条件
[where 筛选条件]
…
- 内连接:inner
等值连接:
案例1:查询员工名,部门号
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.
department_id=d.
department_id;
案例2:查询名字中包含e的员工名和工种名(添加筛选)
SELECT last_name,job_title
FROM employees e
INNER JOIN jobs j
ON e.
job_id=j.
job_id
WHERE e.
last_nameLIKE ‘%e%’;
案例3:三表连接:查询员工名,部门名,公众名,并按部门名降序
SELECT last_name,department_name,j.
job_title
FROM employees e
INNER JOIN departments d ON e.
department_id=d.
department_id
INNER JOIN jobs j ON e.
job_id=j.
job_id
ORDER BY d.
department_nameDESC;
非等值连接
案例1:查询员工的工资级别
SELECT salary,grade_level
FROM employees e
INNER JOIN job_grades g
ON e.
salaryBETWEEN g.lowest_sal AND g.highest_sal;
自连接
案例1:查询员工的名字,上级的名字
SELECT e.last_name,m.
last_name
FROM employees e
INNER JOIN employees m
ON e.
manager_id=m.
employee_id;
- 外连接
用于查询一个表有的字段,另一个表没有
特点1:外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,则显示匹配的值,如果没有和它匹配的,则显示null
左外:left 指的是left join左边的是主表
右外:right 指的是right join右边的是主表
全外:full
案例1:查询男朋友 不在男神表的女神名
使用左外连接
SELECT b.name,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.
boyfriend_id=bo.
id
WHERE bo.id IS NULL;
案例2:查询哪个部门没有员工
使用左外连接
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.
department_id=e.
department_id
WHERE e.
employee_id=NULL;
案例3:mysql不支持
全外连接=内连接的结果+表1中有表2没有+表1中没有表2中有的
- 交叉连接:cross
相当于笛卡尔乘积
多表查询案例:
- 查询编号>3的女神的男朋友的信息,如果有则列出详细,如果没有,则用null填充
SELECT b.id,b.name,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id
=bo.id
WHERE b.id
>3; - 查询哪个城市没有部门
SELECT city
FROM departments d
RIGHT OUTER JOIN locations l
ON d.location_id
=l.location_id
WHERE d.department_id
IS NULL;
- MySQL学习笔记 3:子查询、连接、运算符和函数
- Mysql学习笔记九——内连接、左连接、右连接查询
- MySQL学习笔记-子查询和连接
- (MYSQL学习笔记2)多表连接查询
- MySQL学习笔记(二)_基础查询
- MySQL 基础架构 1. 一条SQL查询语句的执行过程(个人学习笔记)
- php学习笔记(二)php与mysql连接与用php发送SQL查询
- MySQl 子查询,左右连接,多表连接学习笔记
- MySQL学习笔记5:子查询与连接
- [MySQL]学习笔记- 用户行为表中,查询每个人的一条最新行为(分组 排序 取时间最大的一条记录)
- MySQL学习笔记(二)__基础查询
- Go学习笔记之连接MySQL基础
- MySQL学习笔记9:连接查询
- Mysql学习笔记(二):子查询与连接
- MySQL学习笔记(八)_sql92之内连接查询
- Mysql学习(慕课学习笔记9)查询、分组
- mysql学习笔记之连接查询与子查询
- 46.笔记 MySQL学习——将子查询改写为连接
- Mysql学习笔记二——基础查询where练习
- MySQL学习笔记(七)_分组查询