内容简介:直入主题:我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象?
直入主题:
我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象?
使用内连接,查询数据
问题:找不到SCOTT员工了,只有13条数据,这显然不合理;这就是内连接的缺点
-- 内连接:只显示匹配的数据
-- 外连接:显示匹配的数据,还显示(部分或者全部)不匹配的数据,那就是显示(全部)的数据
(1)左外连接: left join
特点:左表全部显示,包括不匹配的数据,右表进行匹配显示
(2)右外连接: right join
右表全部显示,包括不匹配的数据,左表进行匹配显示
(3)全外连接
左表和右表的数据都会显示,包括不匹配的数据
注意:在oracle中支持 full join
在mysql中不支持全外连接,但是,可以通过 union 连接左外连接和右外连接,达到全外连接的效果
(4)自连接
思路:将一张表看做两张表 下级表 上级表
举例:显示没有上级的员工(king)
知识扩展:
三表查询:
就是先查两张表,将查出的结果看成一张表,然后跟第三张表进行联合查询,本质还是两表查询
准备工作:先添加一张薪资等级表
第一步:连接emp和dept表
查询员工的编号、姓名、薪水、部门编号、部门名称
第二步:连接第三张表
-- 查询员工的编号、姓名、薪水、部门编号、部门名称、薪水等级
至此,全部的表连接讲解完毕!
欢迎留言,指出问题,有则改之无则加勉
下面,分享所有的SQL语句:
create table DEPT ( DEPTNO int(2) not null, DNAME VARCHAR(14), LOC VARCHAR(13) ); alter table DEPT add constraint PK_DEPT primary key (DEPTNO); create table EMP ( EMPNO int(4) primary key, ENAME VARCHAR(10), JOB VARCHAR(9), MGR int(4), HIREDATE DATE, SAL double(7,2), COMM double(7,2), DEPTNO int(2) ); alter table EMP add constraint FK_DEPTNO foreign key (DEPTNO) references DEPT (DEPTNO); create table SALGRADE ( GRADE int primary key, LOSAL double(7,2), HISAL double(7,2) ); create table BONUS ( ENAME VARCHAR(10), JOB VARCHAR(9), SAL double(7,2), COMM double(7,2) ); commit; insert into DEPT (DEPTNO, DNAME, LOC) values (10, 'ACCOUNTING', 'NEW YORK'); insert into DEPT (DEPTNO, DNAME, LOC) values (20, 'RESEARCH', 'DALLAS'); insert into DEPT (DEPTNO, DNAME, LOC) values (30, 'SALES', 'CHICAGO'); insert into DEPT (DEPTNO, DNAME, LOC) values (40, 'OPERATIONS', 'BOSTON'); commit; insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10); commit; insert into SALGRADE (GRADE, LOSAL, HISAL) values (1, 700, 1200); insert into SALGRADE (GRADE, LOSAL, HISAL) values (2, 1201, 1400); insert into SALGRADE (GRADE, LOSAL, HISAL) values (3, 1401, 2000); insert into SALGRADE (GRADE, LOSAL, HISAL) values (4, 2001, 3000); insert into SALGRADE (GRADE, LOSAL, HISAL) values (5, 3001, 9999); commit;
-- 一、内连接 -- 交叉连接 cross JOIN -- 笛卡尔积现象 SELECT * FROM emp CROSS JOIN dept; -- 使用using,只显示指定的同名字段 SELECT * FROM emp e CROSS JOIN dept d USING (deptno); -- 使用on,指定不同名的字段 SELECT * FROM emp e CROSS JOIN dept d ON(e.deptno = d.deptno); -- natural join 自然连接 所有同名列只显示一次 SELECT * FROM emp NATURAL JOIN dept; -- 二、外连接 -- 左外连接 emp左表,dept 右表,左表全部显示,包括没有数据的列 SELECT * FROM emp e -- 左表 LEFT JOIN dept d -- 右表 on(e.deptno = d.deptno); -- 右外连接 emp左表, dept右表,右表全部显示,包括没有数据的列 SELECT * FROM emp e -- 左表 RIGHT JOIN dept d -- 右表 on(e.deptno = d.deptno); -- 全外连接 ,oracle支持,mysql不支持 -- 可以通过关键字union进行解决,左表和右表的无对应数据列都会显示 SELECT * FROM emp e LEFT JOIN dept d on(e.deptno = d.deptno); UNION SELECT * FROM emp e RIGHT JOIN dept d on(e.deptno = d.deptno); -- 三、三表查询 SELECT * FROM emp; SELECT * FROM dept; SELECT * FROM salgrade; -- 第一步,先查两张表 SELECT e.empno,e.ename,e.sal,d.deptno,d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno; -- 第二步,连接第三张表 SELECT e.empno, e.ename,e.sal,d.deptno,d.dname,sg.grade FROM emp e JOIN dept d ON e.deptno = d.deptno JOIN salgrade sg ON e.sal BETWEEN sg.losal AND sg.hisal; -- 四、自连接 -- 不是所有表都可以进行自连接,只有表中的两列有关联关系,才可以进行自连接查询 -- 将自身分解成两张表 SELECT e.empno,e.ename,e.mgr,m.empno,m.ename FROM emp e LEFT JOIN emp m ON e.mgr = m.empno;
以上所述就是小编给大家介绍的《清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 3分钟干货之如何提高数据库SQL语句执行速度?(上)
- MySQL 建表语句转 PostgreSQL 建表语句全纪录
- Go语言开发-过程式编程-通信和并发语句-Select语句
- SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化
- Python 条件语句
- Python 循环语句
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
可计算性和计算复杂性
朱一清 / 国防工业出版社 / 2006-4 / 18.0
本书深入浅出地介绍了研究可计算性的四个主要模型以及四个模型彼此之间的关系:介绍了计算复杂性的基本概念和重要的研究方法与一些研究成果。内容涉及递归函数、图灵机、λ演算、马尔可夫算法、计算复杂度的分类、NP完全理论、非一致复杂性等。分述于十章,书中附有习题。 本书可作为广大有志于突破计算复杂性研究僵局——“P=NP?”的科技工作者,计算机科学和元计算机科学工作者,数学和元数学工作者以及大......一起来看看 《可计算性和计算复杂性》 这本书的介绍吧!