当前位置:   article > 正文

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

mysql-连接查询

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

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

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

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

1.1、隐式内连接:

SELECT 字段列表 FROM1,表2 WHERE 条件;

1.2、显式内连接:

SELECT 字段列表 FROM1 (INNER) JOIN2 ON 条件;

两者区别:虽然执行结果是一样的,但是显式内连接比隐式内连接性能更好

建立表格

  1. create table emp_new(
  2. id int auto_increment comment 'id' primary key ,
  3. name varchar(50) not null comment '姓名',
  4. age int comment '年龄',
  5. job varchar(20) comment '职位',
  6. salary int comment '薪资',
  7. enterdate date comment '入职时间',
  8. managerid int comment '直属领导id',
  9. dept_id int comment '部门id'
  10. )comment '员工表';
  11. insert into emp_new(id, name, age, job, salary, enterdate, managerid, dept_id)
  12. VALUES (1,'金庸',66,'总裁',20000,'2000-01-01',null,5),
  13. (2,'张无忌',20,'项目经理',12500,'2005-12-05',2,1),
  14. (3,'杨逍',33,'开发',8400,'2000-11-03',2,1),
  15. (4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),
  16. (5,'常遇春',43,'开发',10500,'2004-09-07',3,1),
  17. (6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1),
  18. (7,'灭绝',60,'财务总监',8500,'2002-09-12',1,3),
  19. (8,'周芷若',19,'会计',4800,'2006-06-02',7,3),
  20. (9,'丁敏君',23,'出纳',5250,'2009-05-12',7,3),
  21. (10,'赵敏',20,'市场部总监',12500,'2002-02-05',1,2),
  22. (11,'鹿杖客',56,'职员',3750,'2006-12-05',10,2),
  23. (12,'鹤笔翁',19,'职员',3750,'2006-05-25',10,2),
  24. (13,'方东白',19,'职员',5500,'2002-11-05',10,2),
  25. (14,'张三丰',88,'销售总监',14000,'2003-06-15',1,4),
  26. (15,'俞莲舟',38,'销售',4600,'2003-07-05',14,4),
  27. (16,'宋远桥',40,'销售',4600,'2004-09-18',14,4),
  28. (17,'陈友谅',42,null,2000,'2010-06-16',1,null);
  29. create table dept(
  30. id int auto_increment comment 'ID' primary key ,
  31. name varchar(50) not null comment '部门名称'
  32. )comment '部门表';
  33. insert into dept (id, name) values(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办'),(6,'人事部');

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

1.3.1、隐式内连接:

#分析一下:我们并不是想查到所有的部门,而是只是要固定的人的部门信息
#那么就让emp_new表里面的外键dept_id=dept表里面的id即可

  1. #内连接查询
  2. #1、查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
  3. #-----表结构:emp dept
  4. #-----连接条件emp_new.dept_id=dept.id
  5. SELECT a.name, b.name from emp_new a ,dept b where a.dept_id=b.id;

1.3.2、显式内连接:

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

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

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

SELECT 字段列表 FROM1 LEFT JOIN2 ON 条件;

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

SELECT 字段列表 FROM1 RIGHT JOIN2 ON 条件;

2.3、举个例子:

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

  1. #-----表结构:emp dept
  2. #-----连接条件emp_new.dept_id=dept.id
  3. #可以发现第17条数据虽然没有部门,但是也被查出来了,也就是包含了emp_new表的所有信息
  4. select a.*,b.name from emp_new a LEFT JOIN dept b on a.dept_id=b.id;

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

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

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

SELECT 字段列表 FROM1 别名 JOIN1 别名 ON 条件;

 举个例子:

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

  1. #我们将emp_new看成两张表
  2. SELECT a.name, b.name FROM emp_new a JOIN emp_new b ON a.managerid=b.id;
  3. SELECT A.name,A.job,B.name ,B.job from emp_new A JOIN emp_new B ON A.managerid=B.id;

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/1015372
推荐阅读
相关标签
  

闽ICP备14008679号