笛卡尔积:是多表查询的数据基础(最全面的拼装)

A表 m行 x列
B表 n行 y列
结果:A×B m*nx+y

  • 按照需求自己处理 emp表和dept表数据之间没有进行匹配
  • 第一个表中的所有行和第二个表中的所有行都发生连接
  • 连接条件被省略;连接条件是无效的
// 查询 emp,dept 表中的数据

SELECT e.empno,e.ename,e.sal,e.comm,e.deptno,d.deptno,d.dname,d.loc
FROM emp e,dept d

多表连接

  • WHERE 限定条件
  • 限制歧义列名
  1. 在使用多个表时,可以用表名作为前缀来限制列
  2. 通过使用表前缀可以提高性能
  3. 通过使用列的别名可以区分来自不同表 但是 名字相同的列
//查询 emp,dept 表中的数据
SELECT e.empno,e.ename,e.sal,e.comm,e.deptno,d.deptno,d.dname,d.loc
FROM emp e,dept d 
WHERE e.deptno = d.deptno
  • SELECT :最先执行 定义查询结果集的结构
  1. 决定表的结构
  2. 其他每次传输数据
  • FROM emp e, dept d:形成m*n循环

FROM 属于内层,把两行合并成一行

  • WHERE:对FROM子句的查询结果集再次过滤

如果 WHERE 为真 执行 SELECT

等值连接:两表用 = 进行连接;多表用 AND,或者 inner Join ON

//查询 emp,dept 表中的数据
SELECT e.empno'员工编号',e.ename'员工姓名',e.sal'工资',d.loc'地址',s.grade'工资等级'
FROM emp e,dept d,salgrade s
WHERE e.deptno = d.deptno and e.sal BETWEEN losal and hisal
ORDER BY s.grade ASC
多表连接
//多表连接
// 查询员工的姓名 部门名称 工作地点 
SELECT e.ename,d.dname,d.loc,l.addreess
FROM emp e
INNER JOIN dept d 
ON e,deptno = d.deptno
INNER JOIN location l
ON d.loc = l.locid

//等值连接
SELECT e.ename,d.dname,d.loc,l.addreess
FROM emp e,dept d,location l
WHERE e.deptno = d.deptno AND d.loc = l.locid

内连接(Inner JOIN ON)

  • On 后边只写两个表的关联条件
  • WHERE写在On后:写限制条件
  • Inner可以省略
SELECT e.ename , e.sal
FROM dept d
INNER JOIN emp e
ON e.deptno = d.deptno
WHERE e.sal > 3000
非等值连接(两张表没有关联条件)
//查询每个员工的姓名 工资 工资等级
SELECT e.ename ,e.sal ,s.grade
FROM emp e,salgrade s
WHERE e.sal between s.losal AND s.hisal

外连接:(OUTER JOIN)

  • 左外连接:(LEFT OUTER JOIN)

将左表符合条件的数据与不符合条件的数据全部查询出来

//LEFT OUTER JOIN 

SELECT e.ename,e.job,e.sal,d.dname
FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno  = d.deptno

//LEFT  JOIN

SELECT e.ename,e.job,e.sal,d.dname
FROM emp e
LEFT  JOIN dept d
ON e.deptno  = d.deptno
  • 右外连接:(GRIGHT OUTER JOIN)

将右表符合条件的数据与不符合条件的数据全部查询出来

  • 全外连接:(FULL OUTER JOIN)(ORACLE 数据库支持,Mysql不支持)

将左右表符合条件的数据与不符合条件的数据全部查询出来

自连接

将一张表当成两张表来看,两张表是一模一样的;表中的数据要有一定的规律

//自连接
SELECT w.ename,m.ename
FROM emp w,emp m
WHERE w.mgr = m.empno

//LEFT OUTER JOIN
SELECT w.ename,m.ename
FROM emp w LEFT OUTER JOIN emp m
ON w.mgr = m.empno

文章来源于互联网:Mysql(2.4) 多表连接、等值连接、自连接、(左、右、全)外连接

发表评论