1.分组查询
可以将数据使用group by子句将表中的数据分成若干组;
语法规则:
SELECT column,group_function(column)
From table
[where condition]
[group by group_by_expression]
[order by column];
# 1.where一定要放在from后面
# 2.from之前只能出现分组函数和需要分组的字段
案例1:查询每个工种的平均工资;
每个工种:就是按照工种进行分组;
平均工资:使用分组函数avg()
SELECT avg(salary),job_id from employee group by job_id;
2.连接查询
2.1 内连接
2.1.1 等值连接
SELECT a.column1, b.column2, c.column3...
FROM table a,table b...
WHERE a.column1=b.column2
[AND b.column1=c.column3];
#原理是用一张表去匹配另一张表中条件相同的数据;
#查询出的结果为两张表的交集部分;
案例1:查询部门名和对应的员工名;
SELECT last_name,department_name
FROM employees emp,departments dept
WHERE emp.department_id=dept.department_id;
实例2:查询有奖金的每个部门的部门名和部门领导编号和该部门的最低工资
select d.department_name,d.manager_id,min(e.salary)
from departments d,employees e
where d.department_id=e.department_id
and e.commission_pct is not null
group by d.department_name,d.manager_id;
2.1.2 非等值连接
在等值连接的基础上将等值条件换成其他的匹配条件;
2.1.3 自连接
当某张表中存在特殊的字段使得该表可以实现自己连接自己的情况;
实例1:查询员工名以及上级的名称
select e.employee_id 员工ID,e.last_name 员工姓名,m.manager_id 上司ID,m.last_name 上司姓名
from employees e,employees m
where e.manager_id=m.employee_id;
2.1.4 SQL99中的内连接 INNER(常用+重点)
语法规则如下:
select 查询列表
from 表1 别名1
inner join 表2 别名2
on 连接条件
[where 筛选条件]
[后续也可以加分组、排序、筛选等条件]
2.1.4.1 内连接之等值连接
实例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_name like "_e%";
实例3:查询员工名、部门名、工种名,并按照部门名降序排列;
select last_name,department_name,job_title
from employees e
inner join department d on e.department_id=d.department_id
inner join jobs j on e.job_id=j.job_id
order by department_name desc;
2.2 外连接
一般用来查询一个表中有,而另一个表中没有的数据;
外连接分为主表和从表,
A. 左外连接中,left join左边的是主表
B. 右外连接中,right join右边的是主表
主从表之间进行匹配,匹配的原则是:
用主表中的一条来以此匹配从表中的每一条,若筛选条件相同,则显示筛选结果。若筛选条件不同,主表字段照常显示,而从表的字段显示为null
;
2.2.1 左外连接 LEFT [OUTER]
语法规则如下:
select 查询列表
from 表1 别名1 LEFT[OUTER]
join 表2 别名2
on 连接条件
[where 筛选条件]
[后续也可以加分组、排序、筛选等条件]
实例1:查询没有员工存在的部门;
select d.department_name
from departments d
left join employees e
on d.department_id=e.departmed.department_name,nt_id
where e.employee_id is null;
2.2.2 右外连接 RIGHT [OUTER]
语法规则如下:
select 查询列表
from 表1 别名1 RIGHT[OUTER]
join 表2 别名2
on 连接条件
[where 筛选条件]
[后续也可以加分组、排序、筛选等条件]
右外连接的语法规则和匹配规则与左外连接相同,只不过是主从表的位置发生了变化;
2.2.3 全外连接 FULL[OUTER]
语法规则如下:
select 查询列表
from 表1 别名1 FULL[OUTER]
join 表2 别名2
on 连接条件
[where 筛选条件]
[后续也可以加分组、排序、筛选等条件]
MYSQL不支持全外连接。
2.3 交叉连接 CROSS
语法规则如下:
select 查询列表
from 表1 别名1 CROSS
join 表2 别名2
on 连接条件
[where 筛选条件]
[后续也可以加分组、排序、筛选等条件]
他的结果是实现笛卡尔乘积的一张超大型的表;