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

(scott账户)

 

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

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

–笛Carl积
–当查询数据时从没接纳连接条件,会查出所有涉及数据
–4*14=56
SELECT * FROM scott.dept,scott.emp;

–注意:多表连接查询一定要带关联条件,否则就会现出笛Carl积
–总结:多表连接第一步就是找关系条件
–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
Oracle,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语句中时常要用到的连日形式,
行使自连接能够将自身表的一个镜像当作另一个表来对待,
即将一张表看成多张表来做连接,从而可以获取部分出奇的多寡。
首要之处在于为同一个表指定多少个不等的别名。
诸如此类就能通过在一张表内寻找到互相关系的多寡再找到有延续关系的数据。
*/

相关文章