mysql自连接 多表_Mysql(2.4) 多表连接、等值连接、自连接、(左、右、全)外连接...

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

A表 m行 x列

B表 n行 y列

结果:A×B m*n行 x+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

3072ee44b17c

多表连接

WHERE 限定条件

限制歧义列名

在使用多个表时,可以用表名作为前缀来限制列

通过使用表前缀可以提高性能

通过使用列的别名可以区分来自不同表 但是 名字相同的列

//查询 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 :最先执行 定义查询结果集的结构

决定表的结构

其他每次传输数据

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

3072ee44b17c

内连接(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

3072ee44b17c

右外连接:(GRIGHT OUTER JOIN)

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

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

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

3072ee44b17c

自连接

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

//自连接

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值