连接查询
又称多表查询,当查询结果来自多张数据表的时候,就需要用到连接查询。
建一个新库包含两张表实验(ta:id,age字段,tb:id,name,ta_id):
create table ta(id int,age int);
create table tb(id int,name varchar(4),ta_id int);
insert into ta(id,age) values(1,12);
insert into ta(id,age) values(2,22);
insert into ta(id,age) values(3,32);
insert into ta(id,age) values(4,42);
insert into ta(id,age) values(5,52);
insert into ta(id,age) values(6,62);
insert into tb(id,name,ta_id) values(1,'任波涛',2);
insert into tb(id,name,ta_id) values(2,'田兴伟',1);
insert into tb(id,name,ta_id) values(3,'唐崇俊',3);
insert into tb(id,name,ta_id) values(4,'夏铭睿',8);
insert into tb(id,name,ta_id) values(5,'包琪',1);
insert into tb(id,name,ta_id) values(6,'夏雨',10);
insert into tb(id,name,ta_id) values(7,'夏铭雨',10);
insert into tb(id,name,ta_id) values(8,'白芳芳',6);
写法
select name,age from ta,tb where tb.ta_id=ta.id;
具体看连接查询前,先看看连接查询的分类:
- 内连接
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接
- 右外连接
- 全外连接
- 交叉连接
等值连接
简单说明就是:表之间用=连接
分析一下:select name,age from ta,tb where tb.ta_id=ta.id;它的执行过程呢,和上面笛卡尔积一样,只是在结果集中进行了条件筛选,满足 tb.ta_id=ta.id条件的留下,不满足的丢弃。
案例
查询员工名和对应的部门名
select last_name, department_name from employees,departments
where employees.department_id=departments.department_id;
用表名来限定字段,太长,不方便,在实际运用中,我们一般使用别名来限定的!
select last_name, department_name from employees e,departments d
where e.department_id=d.department_id;
案例
查询有奖金的员工名以及所属部门名
select last_name, department_name from employees e,departments d
where e.department_id=d.department_id and e.commission_pct is not null; #在等值查询的基础上添加查询条件!
案例
查询每个城市的部门个数
select count(*) as 个数,city from departments d,locations l
where d.location_id = l.location_id
group by city; #等值查询的基础上加分组查询
案例
查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
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;
案例
查询每个工种的工种名和员工个数,并且按照员工个数排序降序
select job_title,count(*)
from employees e,jobs j
where e.job_id=j.job_id
group by job_title
order by count(*) desc; #和排序组合使用
案例
查询员工名,部门名和所在城市名
select last_name,department_name,city
from employees e,department d,locations l
where e.department_id=d.department_id
and
d.location_id=l.location_id;#时间三个数据表的连接查询