Oracle_SQL(5) 连接和子查询
一、连接join
一般分类:
inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
full join:外连接,返回两个表中的行:left join + right join。
cross join:笛卡尔积,就是第一个表的行数乘以第二个表的行数。
oracle分类:等值连接 =
外连接(左外连接、右外连接、全连接)=(+)
笛卡尔积
update emp set deptno=null where empno=7839;
1.内连接\等值连接
select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno;
select emp.*,dept.*
from emp inner join dept on emp.deptno=dept.deptno;
2.左连接\左外连接
select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+);
select emp.*,dept.*
from emp left join dept on emp.deptno=dept.deptno;
3.右连接\右外连接
select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
select emp.*,dept.*
from emp right join dept on emp.deptno=dept.deptno;
4.外连接\全连接
select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+)
union
select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
select emp.*,dept.*
from emp full join dept on emp.deptno=dept.deptno;
5.笛卡尔积
select emp.*,dept.* from emp,dept;
select emp.*,dept.* from emp cross join dept;
二、子查询
在查询语句的select、from、where部分再嵌入一个查询语句,
这个被嵌入的查询语句称为子查询。
子查询可以被多层嵌套。
1.select子查询
select emp.*,
(select dname from dept where dept.deptno=emp.deptno) as dname
from emp;
2.from子查询
select emp.*,dept1.* from emp,
(select * from dept where dname in ('RESEARCH','SALES')) dept1
where dept1.deptno=emp.deptno;
3.where子查询
select emp.* from emp where emp.deptno in
(select deptno from dept where dname in ('RESEARCH','SALES'));
select emp.* from emp where exists
(select 1 from dept where dept.deptno=emp.deptno
and dname in ('RESEARCH','SALES'));
4.对应的连接查询
select emp.*,dept.* from emp,dept
where dept.deptno=emp.deptno and dname in ('RESEARCH','SALES');
5.总结:一般连接查询效率是最高,但受到数据质量的限制比较多,
且不容易写出sql或sql的健壮性不足。
比如:要查出所有职员的部门名称,用连接查询时需要考虑每个职员是否有部门编号,
如果都有部门编号时,可以用等值连接书写;
如果存在没有部门编号的职员时,就要考虑用外连接,至于时左外连接还是右外连接还和职员表与部门表的位置有关;
这就增加的书写sql的难度,并增加的错误出现的概率。
用select子查询示例的方式书写就不用考虑这些问题,简化的编写sql的难度,
且不用考虑数据的真实情况。
但如果要查询的字段比较多时,select子查询示例的方式又比较低效,
所以需要综合考虑。
在结果正确的前提下考虑sql程序的健壮性、效率。
三、谓词查询
0.in 某列的值属于集合成员中的一个成员
select emp.* from emp where emp.deptno in
(select deptno from dept where dname in ('RESEARCH','SALES'));
1.exists 总存在一个值满足条件
select emp.* from emp where exists
(select 1 from dept where dept.deptno=emp.deptno
and dname in ('RESEARCH','SALES'));
2.not exists 不存在任何值满足条件
select emp.* from emp where not exists
(select 1 from dept where dept.deptno=emp.deptno
and dname in ('RESEARCH','SALES'));
3.any 某列的值满足一个条件即可
select emp.* from emp where emp.deptno = any
(select deptno from dept where dname in ('RESEARCH','SALES'));
4.some 满足集合中的某些值
select emp.* from emp where emp.deptno = some
(select deptno from dept where dname in ('RESEARCH','SALES'));
5.all 某列的值满足子查询中所有值的记录
select emp.* from emp where emp.deptno = all
(select deptno from dept where dname in ('RESEARCH','SALES'));
select * from emp where emp.deptno <
all(select deptno from dept where dname in ('RESEARCH','SALES'));
6.总结:
exists、any、some与in的功能是类似的,not exists、all与not in功能类似;
any、some、all比起in来不方便理解,基本不在实际中使用;
exists和not exists要比in和not in效率高,所以需要重点掌握。
如果对exists和not exists理解有困难的话,
可以先用in和not in写出sql,在按照格式修改为exists和not exists即可。
四、查询结果的并、交、差
1.union 并(去重)
select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+)
union
select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
2.union all 并(不去重)
select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+)
union all
select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
3.intersect 交
select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+)
intersect
select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
等价与等值连接
select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno;
4.minus 差
select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+)
minus
select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
差操作的结果的两个查询的位置有关:
select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno
minus
select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+);
五、子查询对增删改功能的增强
1.批量新增
语法:insert into <表名> (列名,...) 子查询;
insert into dept
(select empno/100 as deptno,ename as dname,ename as loc
from emp where job='MANAGER');
2.批量修改
语法:update <表名> set <列名1>=<表达式1>,... where 子查询;
update emp set sal=sal+500 where deptno in
(select deptno from dept where dname in ('RESEARCH','SALES'));
3.批量删除
语法:delete from <表名> where 子查询;
delete from emp where emp.deptno in
(select deptno from dept where dname in ('RESEARCH','SALES'));
Oracle_SQL(5) 连接和子查询的更多相关文章
- MySQL多表查询之外键、表连接、子查询、索引
MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...
- ylb:SQL 表的高级查询-多表连接和子查询
ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...
- MySQL学习笔记——多表连接和子查询
多表连接查询 # 返回的是两张表的乘积 SELECT * FROM tb_emp,tb_dept SELECT COUNT(*) FROM tb_emp,tb_dept # 标准写法,每个数据库都能这 ...
- 读《程序员的SQL金典》[3]--表连接、子查询
一.表连接-JOIN 1. 自连接实例 查询类型相同的订单信息. SELECT O1 .*,O2.* FROM T_Order O1 JOIN T_Order O2 ON O1 .FTypeId= O ...
- MS sql server 基础知识回顾(二)-表连接和子查询
五.表连接 当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字 ...
- MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- HIVE:用外连接替代子查询
由于hive也支持sql,很多人会把hql跟标准sql进行比较,甚至有的时候会直接套用.hive不支持事务也不支持索引,更不支持追加写,但是对于一般的sql都是能够支持的.但是对于一些子查询确实无法支 ...
- MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- MySQL开发——【联合查询、多表连接、子查询】
联合查询 所谓的联合查询就是将满足条件的结果进行拼接在同一张表中. 基本语法: select */字段 from 数据表1 union [all | distinct] select */字段 fro ...
随机推荐
- 学习JS的心路历程-范围Scope和提升(Hoisting)
在上一篇提到了JS有三种声明变量的方式,分别是var.const及let,var和const let最大区别就是范围(scope)的限制.所以在这一篇我们会详谈何谓范围链及他们的复写优先级. 范围Sc ...
- Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test)
这是因为测试代码时遇到错误,它会停止编译.只需要在pom.xml的<project>里添加以下配置,使得测试出错不影响项目的编译.<build> <plugins> ...
- 关于log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).的问题
解决办法(非长久之计,折中) 将该方法插入到main函数中,可以自行打印日志信息了 BasicConfigurator.configure(); //自动快速地使用缺省Log4j环境.原文链接:htt ...
- 动态代理 JDK动态代理 CGLIB代理
代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法.实际执行的是被代理类的方法. 而AOP,是通过动态代理实现的. 一.简单来说: JD ...
- Java中构造函数传参数在基本数据类型和引用类型之间的区别
Java中构造函数传参数在基本数据类型和引用类型的区别 如果构造函数中穿的参数为基本数据类型,如果在函数中没有返回值,在调用的时候不会发生改变:而如果是引用类型,改变的是存储的位置,所有不管有没有返回 ...
- CSS同时选择器
[CSS同时选择器] 同一个div拥有多个class时,我们可以作多个class作为组合来选择对象.方法就是将多个.className直接连接在一起(中间不能有空格). <p class=&qu ...
- Template literals
[Template literals] Template literals are string literals allowing embedded expressions. You can use ...
- metasploit framework(三):exploit模块
exploit模块 分为主动,被动exploit 主动exploit:攻击者(通常是客户端)主动发起连接请求,然后发送exploit给被攻击者(通常是服务器端) 被动exploit:被攻击者(通常是客 ...
- MySQL 按指定字段自定义列表排序
问题描述 大家都知道, mysql 中按某字段升序排列的 SQL 为 (以 id 为例, 下同): SELECT * FROM `MyTable` WHERE `id` IN (1, 7, 3, 5) ...
- MySQL之开启远程连接
MySQL安装时,默认只能本地连接. mysql -u root -p mysql>use mysql; mysql>select 'host' from user where user= ...