Oracle(sql)文盲大扫除思维导图系列——多表连接查询子查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle(sql)文盲大扫除思维导图系列——多表连接查询子查询相关的知识,希望对你有一定的参考价值。

继续上图

技术分享

一些demo

--通过连接运算符可以实现多个表查询,连接是关系数据库模型的主要特点。
--在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。
--一般来说,连接查询比嵌套查询的效率高一点。所以,在Transact-SQL中推荐使用这种方法。
select * from emp;
select * from dept;
select * from salgrade;

--先来看内连接,内连接是最典型和最常用的连接运算,内连接通常通过连接谓词或运算符(如join on,natural join,cross join,=,>=,<=,in,not in,等)
--将两张表的列组合在一起,产生新的结果表。
--内连接包括:等值连接、非等值连接、自然连接、交叉连接(笛卡尔积连接A*B)

--等值连接,表之间的连接是通过相等的字段值连接起来的查询称为等值连接查询
--SQL1992,在where子句中进行多表连接
select ename,dname from emp,dept where emp.deptno = dept.deptno;
--SQL1999,使用join ... on ..的方式进行表连接 
select ename,dname from emp join dept on (emp.deptno = dept.deptno);

--非等值连接,在等值查询的连接条件中不使用等号,而使用其它比较运算符就构成了非等值连接查询。
--可以使用的比较运算符有:> 、>、=、 <、 <=、 !=, 还可以使用BETWEEN…AND 之类的谓词
--SQL1992,在where子句中进行多表连接
select ename,grade from emp,salgrade where sal between losal and hisal;
select ename,grade from emp,salgrade where sal >= losal and sal <= hisal;
--SQL1999,使用join ... on ..的方式进行表连接
select ename,grade from emp join salgrade on (sal between losal and hisal);
select ename,grade from emp join salgrade on (sal >= losal and sal <= hisal);

--自然连接,自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。
select emp.ename,dept.dname from emp natural join dept;
--这里我们并没有指定连接的条件,实际上oracle为我们自作主张的将,emp中的deptno和dept中的deptno做了连接,
--类似等值连接,区别在于自然连接会去重,而等值连接则不。

--交叉连接,交叉连接即返回这两个表的笛卡尔积
select * from emp cross join dept;

--外连接,外连接和内连接的主要区别在于:内连接只查询满足连接条件的记录,而外连接则将不能产生连接的数据也查询出来
--外连接可依据连接表保留左表, 右表或全部表的行而进一步分为左外连接, 右外连接和全连接

--右外连接,保留右边表不能产生连接的记录(多余的记录)
select ename, dname from emp e right join dept d on (e.deptno = d.deptno);

--左外连接,保留左边表不能产生连接的记录(多余的记录)
select e1.ename, e2.ename from emp e1 left join emp e2 on (e1.mgr = e2.empno);

--全外链接,把左边右边没不能产生连接的记录都查询出来
select ename, dname from emp e full join dept d on (e.deptno = d.deptno);

--自连接,为同一张表起不同的别名,然后当成两张表来用。自连接既可以用内连接,也可以用外连接。
select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr = e2.empno);
select e1.ename,e2.ename from emp e1 right join emp e2 on (e1.mgr = e2.empno);
select e1.ename,e2.ename from emp e1 left join emp e2 on (e1.mgr = e2.empno);

--不用组函数,用自连接实现求最高薪水
--(1)先求出每一个员工比他薪水薪水少的员工
select e1.ename,e1.sal from emp e1 join emp e2 on (e1.sal < e2.sal);
--(2)去重
select distinct e1.ename,e1.sal from emp e1 join emp e2 on (e1.sal < e2.sal);
--(3)不在(2)中查询的结果中的就是最高薪水
select distinct sal from emp where sal not in
    (select distinct e1.sal from emp e1 
  join emp e2 
on (e1.sal < e2.sal)
);


--子查询,子查询本质上是嵌套进其他SELECT,UPDATE,INSERT,DELETE语句的一个被限制的SELECT语句
select max(sal) from emp;
select ename,sal from emp where sal =(select max(sal) from emp);

select t1.ename,t1.deptno from emp t1 join (
select deptno,max(sal) max_sal from emp group by deptno) t2
on(t1.deptno = t2.deptno and t1.sal = t2.max_sal)

 

今天先到这里。

 

以上是关于Oracle(sql)文盲大扫除思维导图系列——多表连接查询子查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 从入门到精通系列 - 思维导图计划

2020年Java多线程与并发系列22道高频面试题(附思维导图和答案解析)

mysql总结思维导图

mybatis思维导图,让mybatis不再难懂

MyBatis 思维导图,让 MyBatis 不再难懂

SQL注入思维导图