15.多表查询--内连接

1. 合并结果集

  • 只要从多张表查出来的数据的结果集列数和类型相同,就能合并
  • UNION ALL 不去重
SELECT deptno, dname FROM dept
UNION ALL
SELECT empno, ename FROM emp
  • UNION 去重
SELECT deptno, dname FROM dept
UNION
SELECT empno, ename FROM emp

内连接

1. 笛卡尔积
  • 直接查询2张表会产生笛卡尔积,即a表的每条数据都要匹配一次b表的每条数据,那么总数据就是 a表数据条数 * b表数据条数,这里面的有许多数据都不是我们需要的
SELECT * FROM emp, dept
笛卡尔积.png
  • 这里截取了12条数据,只有3条数据是我们需要的,条件就是emp.deptno = dept.deptno, 所以我们就可以用这个条件来去除笛卡尔积
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno
去除笛卡尔积后的结果.png

2. 多表取指定列,以及表别名

  • 在多表中取出指定列来得到一个结果集,需要指定表名
  • 如查询员工名字、工作、工资、部门
SELECT emp.ename, emp.job, emp.sal, dept.dname 
FROM emp, dept
WHERE emp.deptno = dept.deptno
查询多表指定列.png
  • 有些时候,因为命名规范会造成表名过长,我们可以给表取别名来简化sql语句
SELECT e.ename, e.job, e.sal, d.dname 
FROM emp e, dept d
WHERE e.deptno = d.deptno
内连接的3种写法
  1. 方言, 只在mysql数据库中生效,也就是上面我们用的写法
SELECT * FROM 表1, 表2 WHERE表1.xx = 表2.xx
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno
  1. 标准: sql规范
SELECT * FROM 表1 INNER JOIN 表2 ON 表1.xx = 表2.xx
SELECT * FROM emp INNER JOIN dept ON emp.deptno = dept.deptno
  1. 自然:根据2张表中列名相同的列进行自动匹配
SELECT * FROM 表1 NATURAL JOIN 表2 
SELECT * FROM emp NATURAL JOIN dept

你可能感兴趣的:(15.多表查询--内连接)