MySQL查询—连接查询(内连接查询/外连接查询/自连接查询)

在查询过程中,如果有多张表,加入使用合并查询,就会产生笛卡尔积,回展示所有组合结果

所谓笛卡尔积:两个集合A集合和B集合的所有组合情况(在夺标查询时,需要消除无效的笛卡尔积)

那么如何消除笛卡尔积呢?本博客先来分享一个连接查询

1、内连接查询:两张表交集的部分

1.1、隐式内连接:

SELECT 字段列表 FROM 表1,表2 WHERE 条件;

1.2、显式内连接:

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,'人事部');

MySQL查询—连接查询(内连接查询/外连接查询/自连接查询)_第1张图片MySQL查询—连接查询(内连接查询/外连接查询/自连接查询)_第2张图片

1.3、举个栗子:查询员工姓名,及关联的部门名称

1.3.1、隐式内连接:

#分析一下:我们并不是想查到所有的部门,而是只是要固定的人的部门信息
#那么就让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;

MySQL查询—连接查询(内连接查询/外连接查询/自连接查询)_第3张图片

1.3.2、显式内连接:

#2、查询每一个员工的姓名,及关联的部门的名称(显式内连接实现) INNER JOIN ...ON...
                                        
SELECT a.name, b.name from emp_new a INNER JOIN dept b ON a.dept_id=b.id;

MySQL查询—连接查询(内连接查询/外连接查询/自连接查询)_第4张图片

2、外连接查询:左表或者右表的全部,以及交集部分

2.1、左外连接:查询左表的所有数据,以及两张表交集部分的数据

SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 条件;

2.2、右外连接:查询右表的所有数据,以及两张表交集部分的数据

SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON 条件;

2.3、举个例子:

2.3.1、查询emp表的所有数据,和对应的部门信息(左外连接)

#-----表结构: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;

MySQL查询—连接查询(内连接查询/外连接查询/自连接查询)_第5张图片

2.3.2、查询dept表的所有数据,和对应的员工信息(右外连接)

#可以发现人事部是没人的,但是也被查出来了,所以说右外连接是将dept的全部信息以及与左表相交的部分进行展示
SELECT b.* ,a.* from emp_new a RIGHT JOIN dept b on a.dept_id=b.id;

MySQL查询—连接查询(内连接查询/外连接查询/自连接查询)_第6张图片

3、自连接查询:当前表与自身的连接查询,自连接必须使用表别名

SELECT 字段列表 FROM 表1 别名 JOIN 表1 别名 ON 条件;

 举个例子:

3.1、查询员工及其所属领导的名字;

#我们将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;

MySQL查询—连接查询(内连接查询/外连接查询/自连接查询)_第7张图片

3.2、查询所有员工 emp,及其领导的名字,将没有领导的也查出来了

select a.name '员工',b.name '领导' from emp_new a LEFT JOIN emp_new b ON a.managerid=b.id;

MySQL查询—连接查询(内连接查询/外连接查询/自连接查询)_第8张图片

你可能感兴趣的:(数据库,mysql,linux)