SQL中的笛卡儿积问题和多表连接操作

(scott账户)

 

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

/**
笛Carl积
内连接(等值连接)
外接连(非等值连接)
自连接
*/

–笛Carl积
–当查询数据时没有运用连接条件,会意识到所有关乎数据
–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语句中时时要用到的连接情势,
运用自连接可以将自身表的一个镜像当作另一个表来对待,
即将一张表看成多张表来做连接,从而可以拿到部分非正规的数码。
重在之处在于为同一个表指定多个不等的别名。
诸如此类就能透过在一张表内寻找到互相关系的数目再找到有继承关系的数码。
*/

相关文章