86标准SQL与92标准SQL用法区别
86标准SQL与92标准SQL用法区别
数据库还时间了ANSL SQL/92标准的链接语法, 在书中建议在使用Oracle 9i及更高版本时,应该使用SQL/92标准的语法;在使用Oracle 8i 及更低版本时,应该使用SQL/86标准的语法。 -----《Oracle Database 10g SQL 开发指南》
86标准sql是传统的表连接写法,就是直接将表写在FROM后边,将表连接条件与过滤条件都写在WHERE后边。
92标准SQL是采用JOIN的表连接方法。分为LEFT JOIN,RIGHT JOIN,INNER JOIN,每一种JOIN方法都可以使用86版SQL转化得到相应写法,但并不是完全相同。
下面举例说下两种表连接的用法:
测试数据:
create table a (id integer,name varchar(20));
create table b (id integer,name varchar(20));
create table c (id integer,name varchar(20));
insert into a values(1,'a1');
insert into a values(2,'a2');
insert into a values(3,'a3');
insert into a values(4,'a4');
insert into a values(5,'a5');
insert into b values(2,'b2');
insert into b values(3,'b3');
insert into b values(4,'b4');
insert into b values(5,'b5');
insert into b values(6,'b6');
insert into c values(1,'c1');
insert into c values(2,'c2');
insert into c values(3,'c3');
insert into c values(4,'c4');
1: 等值连接 INNER JOIN
SQL> select a.id,a.name,b.id,b.name,c.id,c.name
2 from a inner join b on a.id=b.id
3 inner join c on a.id=c.id ;
ID NAME ID NAME ID NAME
--------- -------------------- ---------- -------------------- ---------- ----
2 a2 2 b2 2 c2
3 a3 3 b3 3 c3
4 a4 4 b4 4 c4
以上92版SQL 与以下86版SQL结果相似;
select a.id,a.name,b.id,b.name,c.id,c.name
from a ,b ,c
where a.id=b.id
and a.id=c.id
2:左连接 left join
先看92两种写法得到的结果对比一下。
SQL> select a.id,a.name,b.id,b.name,c.id,c.name
2 from a left join b on a.id=b.id
3 left join c on b.id=c.id ;
ID NAME ID NAME ID NAME
---------- -------------------- ---------- -------------------- ---------- -----
---------------
2 a2 2 b2 2 c2
3 a3 3 b3 3 c3
4 a4 4 b4 4 c4
1 a1
5 a5 5 b5
SQL> select a.id,a.name,b.id,b.name,c.id,c.name
2 from a left join b on a.id=b.id
3 left join c on a.id=c.id ;
ID NAME ID NAME ID NAME
---------- -------------------- ---------- -------------------- ---------- -----
---------------
2 a2 2 b2 2 c2
3 a3 3 b3 3 c3
4 a4 4 b4 4 c4
5 a5 5 b5
1 a1 1 c1
两种写法都是左连接,唯一不同的就是与表C进行连接时的连接条件不同。但得到的结果却完全不同。
在处理C表时,数据库判定左接连基准表的依据是ON 后边的连接条件。对于第一个SQL(b.id=c.id),C表是和处理过的B表的结果集进行
连接,从B表得到结果集中ID取值为2,3,4,5 。以此为结果为基准再与C表进行连接,因此,从C表中得到的符合条件数据的ID为2,3,4
对于第二个SQL,C表是和A表进行连接,因为自始至终A表都是左连接中的基准表,所以表中的数据量不变,C表再与之进行左连接时得到的结果集中的ID为1,2
,3,4
对于以上两种SQL的写法,分别可以用以下写法代替
第一条SQL:
select a.id,a.name,b.id,b.name,c.id,c.name
from a ,b ,c
where a.id=b.id(+)
and b.id=c.id(+)
第二条SQL
select a.id,a.name,b.id,b.name,c.id,c.name
from a ,b ,c
where a.id=b.id(+)--b表和a表进行左连接,以a表为准,称为左连接。注意哦,(+)是放在右边的
and a.id=c.id(+)--c表和a表进行左连接,以a表为准
3:右连接
92版SQL写时,只需将LEFT换成RIGHT就可以了。 86版SQL,只需改变下(+)的位置不可以了。
4:92版sql中的where条件与ON条件
86版中的连接条件与过滤条件都放在WHERE条件后边了。
但92版SQL中,连接条件放在ON 后边,过滤条件放在WHERE 后边。
注意区分,以下两个SQL得到的结果是不同的:
SQL> select a.id,a.name,b.id,b.name
2 from a left join b on a.id=b.id
3 and b.id>2 ;
ID NAME ID NAME
---------- -------------------- ---------- ----------
3 a3 3 b3
4 a4 4 b4
5 a5 5 b5
1 a1
2 a2
SQL> select a.id,a.name,b.id,b.name
2 from a left join b on a.id=b.id
3 where b.id>2 ;
ID NAME ID NAME
---------- -------------------- ---------- -----
3 a3 3 b3
4 a4 4 b4
5 a5 5 b5
虽然是相同的条件,但 放的位置不同,得到的结果不同。
对于第一个SQL。 b.id>2 是在进行表连接的时候对B表的数据进行过滤。
但对于第二个SQL, b.id>2 是对结果集进行过滤。
以上两种SQL的写法对应到86版SQL时的写法是:
select a.id,a.name,b.id,b.name
from a ,b
where a.id=b.id(+)
and b.id>2
它是与第二个SQL的结果保持一至的(这个地方一直怀疑,应该是数据库根据不同情况来应用b.id>2为驱动条件还是过滤条件,试验了发多数据,都没有得到是把 b.id>2当作驱动条件来使用的,都是当成过滤条件)。
原文地址:
http://hi.baidu.com/420350501/blog/item/dd5344f15d010c3cbd3109fc.html
86标准SQL与92标准SQL用法区别的更多相关文章
- 关于Oracle SQL/82标准和SQL/92标准
在ORACLE9i之前,oracle语法基础是SQL/86标准,9i及之后的版本中支持SQL/92标准.基表信息:products.purchases和product_types SQL> se ...
- go标准库的学习-database/sql
参考:https://studygolang.com/pkgdoc 导入方式: import "database/sql" sql包提供了保证SQL或类SQL数据库的泛用接口. 使 ...
- 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击
第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击 sql注入攻击 也就是黑客通过表单提交的地方,在表单里输入了sql语句,就是通过SQL语 ...
- SQL Server 2008各版本介绍区别(包含企业版 开发者版 标准版 Web版 工作组版 Express版 Compact版)
SQL Server 2008分为SQL Server 2008企业版.标准版.工作组版.Web版.开发者版.Express版.Compact 3.5版,其功能和作用也各不相同,其中SQL Serve ...
- SQL Server 中 GO 的用法(转)
本科里学了那么多年SQL Server一直看到书上各种SQL语句中间夹杂着那么几个看似毫无意义的GO,看着就让人莫名,问老师,老师一般只会告诉你,不要理他,这个东西没用的.但是个性纠结并且有轻微强迫症 ...
- sql事务(Transaction)用法介绍及回滚实例
sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...
- 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题
SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...
- sql语句中charindex的用法 可用于截取字符串
使用CHARINDEX和PATINDEX函数来搜索文字列和字符串.这两个函数是如何运转的,解释他们的区别.同时提供一些例子,通过这些例子,你可以可以考虑使用这两个函数来解决很多不同的字符搜索的问题. ...
- SQL SERVER 中 GO 的用法2
具体不废话了,请看下文详解. 1 2 3 4 5 6 7 8 9 10 use db_CSharp go select *, 备注=case when Grade>=90 then '成绩 ...
随机推荐
- go module
前言 go 1.5 引进了vendor管理工程依赖包,但是vendor的存放路径是在GOPATH底下,另外每个依赖还可以有自己的vendor,通常会弄得很乱,尽管dep管理工具可以将vendor平级化 ...
- python 基础 9.2 mysql 事务
一. mysql 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如,你操作一个数据库,公司的一个员工离职了,你要在数据库中删除它的资料,也要删除该人员相关的,比如邮箱,个人资产等 ...
- 【BZOJ2597】[Wc2007]剪刀石头布 最小费用流
[BZOJ2597][Wc2007]剪刀石头布 Description 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之 ...
- 计算机网络--DNS
1.域名系统DNS(domain name system)是因特网使用的命名系统,用来把便于人们时用的机器名字转换为IP地址.因特网的域名系统DNS被设计成一个联机分布式数据库系统,并采用客户服务器方 ...
- 流畅python学习笔记:第十七章:并发处理二
本章讨论python3.2引入的concurrent.futures模块.future是中文名叫期物.期物是一种对象,表示异步执行的操作 在很多任务中,特别是处理网络I/O.需要使用并发,因为网络有很 ...
- main方法的参数
敲例子的时候无意中把主方法的参数给落下了,当时没有发现,保存之后就去编译,运行了,通常情况下编译没有错误那胜利就在掌握之中了,没想到这次我竟然在"不一般"的行列中,编译无误,运行出 ...
- JS性能优化——DOM编程
浏览器中的DOM 天生就慢 DOM是个与语言无关的API,它在浏览器中的接口却是用JavaScript实现的.客户端脚本编程大多数时候是在个底层文档打交道,DOM就成为现在JavaScript编码中 ...
- 微信小程序开发:学习笔记[7]——理解小程序的宿主环境
微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器
- 6 《锋利的jQuery》Ajax的应用(略。)
Ajax的优势 1.不需要插件支持 2.优秀的用户体验 3.提高web程序的性能(传输数据的方式,按需发送) 4.减轻服务器和带宽的负担 Ajax的不足 1.浏览器对XMLHttpRequest对象支 ...
- P4474 王者之剑
P4474 王者之剑 题目大意 n*m的带权网格,任意选择起点开始时刻为0秒.以下操作,每秒按顺序执行 在第i秒开始的时候,在方格(x,y)上,获得(x,y)的值 在偶数秒,周围四格的值清零 每秒可选 ...