SQL中之笛卡儿积问题及多表连接操作

(scott账户)

 

SELECT * FROM scott.dept;–4
SELECT * FROM scott.emp;–14

/**
笛卡尔积
外连接(等值连接)
他接连(非等值连接)
自连接
*/

–笛卡尔积
–当查询数据经常没应用连接条件,会意识到有涉嫌数据
–4*14=56
SELECT * FROM scott.dept,scott.emp;

–注意:多表连接查询一定要带关联条件,否则就见面油然而生笛卡尔积
–总结:多表连接第一步就是是寻觅关系条件
–emp.deptno = dept.deptno
–student.clazz_id = clazz.id
–多表连接的关联条件时N-1

–内连接(等值连接)
SELECT *
FROM scott.dept,scott.emp
WHERE scott.dept.deptno = scott.emp.deptno
AND scott.emp.empno = ‘7369’;

SELECT *
FROM scott.dept,scott.emp
WHERE scott.dept.deptno = scott.emp.deptno;

–以别名简化开发
SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno
AND e.empno = ‘7369’;

SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno;

–筛选查询的排
–查询e表所有列 和 d表dname列,d表loc列
SELECT e.*, d.dname,d.loc
FROM scott.emp e,scott.dept d
WHERE d.deptno = e.deptno;

–内连接(等值连接) 标准sql的写法
SELECT *
FROM scott.dept d INNER JOIN scott.emp e
ON d.deptno = e.deptno;

–相同的结果 from where语句
SELECT *
FROM scott.dept,scott.emp
WHERE scott.dept.deptno = scott.emp.deptno;

–外连接(非等值连接)
SELECT * FROM scott.dept;–4
SELECT * FROM scott.emp;–14

–查询所有单位和员工信息
SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno;

–因为单位40没有员工,当用等值连接时,部门40底音信没有显示
–左外连接:+号在右手,左边的数据如果所有示,如果右边没有同左侧表数据匹配的,则补null
SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno(+);

–右外连接:+号在左,右边的多少如果周显示,如果左边没有跟右侧数据匹配的,则补null
SELECT *
FROM scott.dept d,scott.emp e
WHERE e.deptno(+) = d.deptno;

–注意:+号的外连接写法只发Oracle支持

–标准sql语句
–左外连接
SELECT *
FROM scott.dept d LEFT OUTER JOIN scott.emp e
ON d.deptno = e.deptno;

–右外连接
SELECT *
FROM scott.emp e RIGHT OUTER JOIN scott.dept d
ON d.deptno = e.deptno;

SELECT *
FROM scott.dept d RIGHT OUTER JOIN scott.emp e
ON d.deptno = e.deptno;

–全外连接
–左边的表和右边的发明数据都使全出示,如果无对号入座的,则补null
SELECT *
FROM scott.dept d FULL OUTER JOIN scott.emp e
ON d.deptno = e.deptno;

SELECT *
FROM scott.dept d LEFT OUTER JOIN scott.emp e
ON d.deptno = e.deptno;

–自连接(重要,面试经常出现)
/**
每当emp中的各一个员工都发温馨的mgr(经理),并且每一个营本人为是店铺之员工,
经营本人也发出和好的经理。下面我们要用每一个职工好的名跟经的讳都找出来。
这时我们该怎么开吧?
*/
SELECT * FROM scott.emp;
–empno ename mgr mgrname
–7369 SMITH 7902 FORD
–empno ename mgr mgrname
–7902 FORD 7566 JONES

–多表连接
–最抢备份一摆设表数据的措施,注意,该法就是备份数据,不复制约束
CREATE TABLE tb_emp AS SELECT * FROM scott.emp;
SELECT * FROM tb_emp;
SELECT * FROM scott.emp;

–e的员工编号 e的职工姓名 e的经纪编号 t的员工姓名
SELECT e.empno,e.ename,e.mgr,t.ename
FROM scott.emp e,scott.tb_emp t
WHERE e.mgr = t.empno
AND e.empno = ‘7369’;

–自连接
SELECT e.empno,e.ename,e.mgr,t.ename
FROM scott.emp e,scott.emp t
WHERE e.mgr = t.empno
AND e.empno = ‘7369’;

/**
打连接(self join)是SQL语句被常要为此到之总是方式,
以自连接可以拿自身表的一个镜像当作另一个表来对待,
虽用一律摆表看成多张表来开连接,从而会拿走一些非同寻常的数量。
根本之远在当吃为与一个表明指定两单不等的别名。
这么便会透过当一如既往摆表内寻找到彼此关联的数量重复找到有持续关系的数目。
*/

相关文章