一、多表查询/关联查询(联合查询)
在多个表中,一起完成查询操作。
能支持多表查询的核心就是,在A表中的一个字段,与B表中的一个字段是同一个字段。
这同一个字段,就将A表与B表关联了起来。
1.1 什么是关联查询
关联查询:两个或者多个表,一起查询。
前提条件: 这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。
1.2 关联查询(两表查询)的结果,一共有7种。
A表与B表,做查询,一共有7种场景。
(看起来花里胡哨的还挺唬人,不过这不重要)
本质就是2张表,拥有一个共同的字段(将这两个表串起来)
在平面上,将A表与B表平铺在一起。A表在左侧,B表在右侧。
左连接,就是以左侧A表为主,然后去B表里查对应数据。
右连接,就是以右侧B表为主,然后去A表里查对应数据。
在实际中,内联结和左联结应该是使用最多的,右连接与全外联结很少见的。
对初学者来说,在这里迷惑的原因是去记这些概念,这是没必要的,我们只要在实际中抱着问题去用一次就可以完全掌握了。
(1) A ∩ B
A表中的数据,能在B表中找到对应的记录
B表中的数据,能在A表中找到对应的记录。
(2)A + A ∩ B
取A表的全部数据,和B表中,能在A表中找到对应记录的数据。
(3)A - A ∩ B
只取A表中独有的数据(在B表中不存在的)
(4)B - A ∩ B
(5)A∪B
二、 具体实现2表查询
2.1 创建2张关联的表
create table dept (dept1 int ,dept_name varchar(11));
create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int);
insert into dept values
(101,'财务'),
(102,'销售'),
(103,'IT技术'),
(104,'行政');
insert into emp values
(1789,'张三',35,'1980/1/1',4000,101),
(1674,'李四',32,'1983/4/1',3500,101),
(1776,'王五',24,'1990/7/1',2000,101),
(1568,'赵六',57,'1970/10/11',7500,102),
(1564,'荣七',64,'1963/10/11',8500,102),
(1879,'牛八',55,'1971/10/20',7300,103);
2.2 通过内/外连接实现2表查询。
本质就是2张表,拥有一个共同的字段(将这两个表串起来)
在平面上,将A表与B表平铺在一起。A表在左侧,B表在右侧。
左连接,就是以左侧A表为主,然后去B表里查对应数据。
右连接,就是以右侧B表为主,然后去A表里查对应数据。
在实际中,内联结和左联结应该是使用最多的,右连接与全外联结很少见的。
对初学者来说,在这里迷惑的原因是去记这些概念,这是没必要的,我们只要在实际中抱着问题去用一次就可以完全掌握了。
(1) 内连接 inner join
(2) 外连接 outer join
左外连接 left outer join 或 left join
右外连接 right outer join 或 right join
全外连接 full outer join 或 full join
但是mysql不支持全外连接。
MySql使用关键字union 合并其他的查询结果,实现全外连接的效果。
2.2.1 等值连接
模板:
SELECT * FROM 表A,表B WHERE A.x=B.y AND 条件 ...;
举例:
SELECT emp.NAME, dept.dept_name
FROM emp,dept
WHERE emp.dept2 = dept.dept1
2.2.2 内连接
SELECT * FROM A JOIN B ON 关联关系 WHERE 条件;
【左外连接】:
SELECT * FROM A LEFT JOIN B ON 关联关系 WHERE 条件;
【右外连接】:
SELECT * FROM A RIGHT JOIN B ON 关联关系 WHERE 条件;