在查询过程中,如果有多张表,加入使用合并查询,就会产生笛卡尔积,回展示所有组合结果
所谓笛卡尔积:两个集合A集合和B集合的所有组合情况(在夺标查询时,需要消除无效的笛卡尔积)
那么如何消除笛卡尔积呢?本博客先来分享一个连接查询
SELECT 字段列表 FROM 表1,表2 WHERE 条件;
SELECT 字段列表 FROM 表1 (INNER) JOIN 表2 ON 条件;
两者区别:虽然执行结果是一样的,但是显式内连接比隐式内连接性能更好
建立表格
create table emp_new(
id int auto_increment comment 'id' primary key ,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
enterdate date comment '入职时间',
managerid int comment '直属领导id',
dept_id int comment '部门id'
)comment '员工表';
insert into emp_new(id, name, age, job, salary, enterdate, managerid, dept_id)
VALUES (1,'金庸',66,'总裁',20000,'2000-01-01',null,5),
(2,'张无忌',20,'项目经理',12500,'2005-12-05',2,1),
(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),
(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),
(5,'常遇春',43,'开发',10500,'2004-09-07',3,1),
(6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1),
(7,'灭绝',60,'财务总监',8500,'2002-09-12',1,3),
(8,'周芷若',19,'会计',4800,'2006-06-02',7,3),
(9,'丁敏君',23,'出纳',5250,'2009-05-12',7,3),
(10,'赵敏',20,'市场部总监',12500,'2002-02-05',1,2),
(11,'鹿杖客',56,'职员',3750,'2006-12-05',10,2),
(12,'鹤笔翁',19,'职员',3750,'2006-05-25',10,2),
(13,'方东白',19,'职员',5500,'2002-11-05',10,2),
(14,'张三丰',88,'销售总监',14000,'2003-06-15',1,4),
(15,'俞莲舟',38,'销售',4600,'2003-07-05',14,4),
(16,'宋远桥',40,'销售',4600,'2004-09-18',14,4),
(17,'陈友谅',42,null,2000,'2010-06-16',1,null);
create table dept(
id int auto_increment comment 'ID' primary key ,
name varchar(50) not null comment '部门名称'
)comment '部门表';
insert into dept (id, name) values(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办'),(6,'人事部');
#分析一下:我们并不是想查到所有的部门,而是只是要固定的人的部门信息
#那么就让emp_new表里面的外键dept_id=dept表里面的id即可
#内连接查询
#1、查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
#-----表结构:emp dept
#-----连接条件emp_new.dept_id=dept.id
SELECT a.name, b.name from emp_new a ,dept b where a.dept_id=b.id;
#2、查询每一个员工的姓名,及关联的部门的名称(显式内连接实现) INNER JOIN ...ON...
SELECT a.name, b.name from emp_new a INNER JOIN dept b ON a.dept_id=b.id;
SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 条件;
SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON 条件;
#-----表结构:emp dept
#-----连接条件emp_new.dept_id=dept.id
#可以发现第17条数据虽然没有部门,但是也被查出来了,也就是包含了emp_new表的所有信息
select a.*,b.name from emp_new a LEFT JOIN dept b on a.dept_id=b.id;
#可以发现人事部是没人的,但是也被查出来了,所以说右外连接是将dept的全部信息以及与左表相交的部分进行展示
SELECT b.* ,a.* from emp_new a RIGHT JOIN dept b on a.dept_id=b.id;
SELECT 字段列表 FROM 表1 别名 JOIN 表1 别名 ON 条件;
举个例子:
#我们将emp_new看成两张表
SELECT a.name, b.name FROM emp_new a JOIN emp_new b ON a.managerid=b.id;
SELECT A.name,A.job,B.name ,B.job from emp_new A JOIN emp_new B ON A.managerid=B.id;
select a.name '员工',b.name '领导' from emp_new a LEFT JOIN emp_new b ON a.managerid=b.id;