`
csstome
  • 浏览: 1521318 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

从两种SQL表连接写法来了解过去

阅读更多

由朋友提出此类问题
http://topic.csdn.net/u/20090806/09/cd21b02c-e321-46d7-924a-82fd442b0a41.html

select * from a,b where a.id=b.id
select * from a inner join b on a.id=b.id

---这两个哪个好?

其中11楼的回答最为深入。其实这个问题还是有一定的历史原因的,不管你习惯什么样的写法只要知道来龙去脉就不会再被细枝末节来迷惑了。以下观点为个人认识,如有偏差欢迎指正。

简单的说,前者是ansi sql 86标准后者是ansi sql 92标准(*****) ,这个观点最容易被人接受。

什么是ansi?美国国家标准局,iso的重要成员之一,1918年就有了。
什么是ansi sql?就是ansi注意到了sql的生产力,于是规范化了一下。

什么是sql?他是ibm发明的,oracle发扬广大的一门语言。

为什么是两家公司?。
70年代初因为ibm内部各方利益斗争激烈,导致某大牛的研究成果只能以论文方式发表。
70年代末某小公司把此技术用在商业领域就成了oracle,直到n年后ibm db2才出来。

所以,sql不是ansi 发明的,ansi 标准也不能通吃所有数据库平台。

比如下面这个是什么数据库的语法?反正ansi 标准在他那里是报错的。
select * from (a inner join b on a.id=b.id) inner join c on a.id=c.id


那么在ansi86之前的数据库有哪些?oracle和db2是肯定的了。另外还有一些当时的小角色:Informix,dbase系列等。

而sybase的数据库和SQLServer是86年之后出来的,而前面那个奇怪的join语法的access是90后的。

古老的sqlserver和oracle我都没有用过,反正在02年用oracle8i时还不支持ansi 92的inner join,他是97年生的。一直到本世纪发布的oacle9i 才改了过来。用多了t-sql的人会问 left join咋办,where a.id=b.id(+) 就可以了,人家没那么笨的,t-sql以前还有*=这样的表示。


那么这么看貌似ansi的规范力度不够?其实不是,国际标准化也不可能一刀切,在ansi92 当中定义了4个级别,n多条款。大意就是大家符合入门级就行了,其他高级别仅供参考,甚至iso根本不会验证其他级别..而诸如inner join和left join之类的都是过渡级的,囧。


所以我前面打了5个星星的那句话并不是完全正确的,正确的应该是

前者符合ansi 86 标准和ansi 92入门级标准,后者符合ansi92 过渡级标准。

不是oracle8i不符合ansi92,而是没有符合ansi92的高级别规范,而完全实现高级别标准的数据库系统是没有的。

早在oracle7就已经完全符合ansi92了,当然是指入门级,而且他就是ansi92 的模版范例。

--回到上面的话题,这两个哪个好?
性能当然完全一样,区别只是习惯和喜好,但也因为标准级别不同而具有不同的风险。

如果想要优雅而易于维护且不容易写错的代码,当然用高标准的第二种方法。
如果必要考虑风险这个因素,比如涉及到多种平台的迁移或者整合,你应该用第一种,起码在两个表的情况下他还是比较安全的。

----
顺带提一句,ansi标准一直在修订:具体有多少版本就不列举了,我们得到的好处自然是多多的,比如递归、对象、数组、xml等等在各主流数据库的新版本中都陆续实现了

分享到:
评论

相关推荐

    SqlServer触发器写法案例

    根据触发时间的不同,Sql Server 中的触发器主要分为两种类型: 1. **AFTER 触发器**:这种触发器在数据修改(插入、更新或删除)之后执行。它主要用于记录事务日志或进行审计等。 2. **INSTEAD OF 触发器**:...

    MySQL&MS SQLServer驱动及常用数据库JDBC连接写法

    本文将详细介绍MySQL和Microsoft SQL Server这两种广泛应用的关系型数据库的驱动及JDBC连接方法。 首先,MySQL是一款开源、免费的SQL数据库管理系统,广泛应用于Web应用开发。其JDBC驱动程序为`...

    sql中各种连接详解

    **定义:** INNER JOIN是一种最常见的连接方式,它返回两个表中具有匹配值的所有行。如果某一行在其中一个表中没有匹配,则结果集中不会显示该行。 **示例代码:** ```sql CREATE TABLE a (id INTEGER, name ...

    第六章 (6.1)sql多表查询

    这两种写法本质上是等价的,但是使用 `INNER JOIN` 更清晰地表达了意图。 ##### 1.2 非等值连接 非等值连接是指在连接条件中使用除 `=` 之外的其他比较运算符(如 `>`, `, `>=`, `, `<>` 或 `BETWEEN`)来匹配数据...

    内连接与外连接的精简写法

    内连接与外连接的精简写法,可用于sql和hql中,即使hql中两实体不存在实际上的主外键关系,也适用。

    ORACLE数据库SQL优化---表连接类型.docx

    Oracle数据库的SQL优化是数据库管理员和开发人员关注的重要领域,特别是在处理复杂的表连接时。本文主要探讨了Oracle数据库中表连接类型的优化,包括连接顺序、连接方法和访问单表的方法。 1. 表连接顺序: Oracle...

    三表左连接查询的sql语句写法

    在SQL查询中,左连接(LEFT JOIN)是一种重要的联接类型,它用于返回左表(在JOIN语句中首先列出的表)中的所有记录,即使右表(JOIN语句后的表)中没有匹配的记录。如果右表中没有匹配,则结果是NULL。在这个场景中...

    SQL实现两张无关联表的数据列合并在一张结果集中

    - **使用JOIN代替子查询**:如果两个表中的数据量都不大,可以尝试使用INNER JOIN等连接方式来代替子查询,这样可以显著提升查询效率。 - **索引优化**:对于涉及的表和字段,合理建立索引可以极大提高查询速度。 - ...

    SQL左外连接,右外连接,全连接,内连接4种连接的区别[归类].pdf

    SQL中的连接操作是数据库查询中不可或缺的部分,它们用于合并来自两个或更多表的数据。以下是四种主要的连接类型:内连接、左外连接、右外连接和全连接。 1. **内连接(INNER JOIN)**: 内连接是基于两个表之间的...

    SQL内连接及外连接.doc

    例如,以下两种写法是等价的: 隐式内连接: ```sql SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME FROM Orders O, Customers C WHERE O.CustomerID = C.CustomerID ``` 显式内连接: ```sql SELECT O.ID, ...

    sql语句的多表连接查询[定义].pdf

    内连接有两种写法: - `SELECT s.*, g.* FROM student s, grade g WHERE s.id = g.sid;` - `SELECT s.*, g.* FROM student s INNER JOIN grade g ON s.id = g.sid;` 2. 外连接(Outer Join): 外连接分为左外...

    jdbc数据库连接写法

    使用JDBC连接Microsoft SQL Server数据库有两种方式: **方法一(使用jTDS驱动):** ```java // 加载jTDS驱动 Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 连接数据库 Connection ...

    常用数据库JDBC连接写法

    标题与描述均提到了“常用数据库JDBC连接写法”,这明确指出了文章的核心主题——如何使用Java Database Connectivity (JDBC)来连接多种常见的数据库系统。JDBC是一种用于执行SQL语句的Java API,可以为多种关系...

    sql 多表连接查询

    SQL 多表连接查询是指在 SQL 语句中连接多个表,以便从不同表中获取数据。多表连接查询可以分为外连接、内连接、交叉连接等类型。下面详细介绍每种类型的连接查询。 一、外连接 外连接可以分为左连接、右连接、...

    SQL SERVER 表与表之间 字段一对多sql语句写法

    在SQL Server中,处理表与表之间的关系是数据库操作的核心任务之一。特别是在字段一对多的关系中,一个字段在主表中可能...理解这两种方法的原理和适用场景,并结合实际需求进行优化,是有效管理和查询数据库的关键。

    ASP与SQL数据库连接代码.pdf

    本篇将详细解释两种常见的ASP连接SQL数据库的方法以及代码示例。 首先,我们来看第一种写法,这是通过ODBC(Open Database Connectivity)驱动程序直接连接到SQL Server的方式: ```vbscript MM_conn_STRING = ...

    ASP连接SQL数据库.doc

    文档中还提到了两种不同的写法,一种是直接指定驱动和服务器信息,另一种是使用DSN(Data Source Name)。DSN是在系统层面配置好的数据库连接信息,可以直接引用,简化了连接字符串的编写。 - 第一种写法: ```...

Global site tag (gtag.js) - Google Analytics