两表连接的SQL语句

两表连接的SQL语句:这两种写法哪种好?现在提倡用哪一种呢?

例如:一个二表连接的SQL,有两种写法:
(1)select A.c1,A.c2,B.c1,B.c2
from table1 A,table2 B
where A.id=B.id

(2)select A.c1,A.c2,B.c1,B.c2
from table1 A join table2 B
on A.id=B.id

哪种写法好呢?现在提倡用哪一种?
你喜欢用哪一种?

我习惯用(1)

---这两个哪个好?

其中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等等在各主流数据库的新版本中都陆续实现了

时间: 2024-12-22 21:00:40

两表连接的SQL语句的相关文章

关于oracle关联表查询的sql语句

问题描述 关于oracle关联表查询的sql语句 现在两张表,分别是表A,表B. 表A: ID CONTENT STARTDATE ENDDATE 1 测试内容1 2014/6/1 2014/6/15 2 测试内容2 2014/5/25 2014/6/30 3 测试内容3 2014/6/8 2014/7/1 4 测试内容4 2014/6/10 2014/6/30 表B: ID A_ID CONTENT MDATE 1 2 测试1 2014/6/5 2 2 测试3 2014/5/3 3 4 测试2

hibernate-hql多表连接的查询语句

问题描述 hql多表连接的查询语句 现在我的数据库里有两张表tbplayer和tbpychar,用hibernate映射的实体类类名是TbPlayer和TbPyChar,现在我想在dao层中用hql语句进行查询,通过两张表里都有的psn字段将两张表连接起来,然后通过tbplayer表中的nickname字段进行查询,请问这个hql语句怎么写,求大神帮忙!!! 解决方案 hql 多表连接查询Hibernate常用查询语句(hql)

DataSet.Relations.Add 两表连接,不能是全连接吗?

问题描述 DataSet.Relations.Add两表连接,不能是全连接吗?好像只有父表和子表,只能左连接,如果父表有2行数据,子表有3行数据,那么连接后的就是2行数据,能否是3行呢?只是父表对应的字段在那行不显示数据? 解决方案 解决方案二:那还叫父表和子表吗,违反了外键约束条件解决方案三:那在程序里的datatable怎么形成全连接,像数据库里的fullouterjoin解决方案四:以后需再关注,现在先帮你顶一下

把多表联查的sql语句转换成linq语句

问题描述 把多表联查的sql语句转换成linq语句 SELECT * FROM [group_product] where proid in(select proid from [group_browsehistory] where memid in(select memid from [group_browsehistory] where proid=12)) 在线等,这个sql语句怎么转换成linq??? 解决方案 from x in group_product where group_br

oracle两表连接查询问题

问题描述 oracle两表连接查询问题 有两张表,一张是个人信息表包括考生姓名,年龄,性别等一系列个人信息和一些其他信息: 第二张表是成绩表,其中也包括部分考生信息和分数: 现在想要在打开成绩表的时候,个人信息字段就已经对应上第一张表了,不需要自己填写, 这个应该怎么实现,代码应该怎么写? 解决方案 http://zhidao.baidu.com/link?url=Rb77btoUtGFpnDID8qotZfN3TTQcPVhzseA4ecOHNZLznZB3bx89MUzJSOR29sNpFM

SQL 多表连接查询实现语句_MsSql

1.理论 只要两个表的公共字段有匹配值,就将这两个表中的记录组合起来. 个人理解:以一个共同的字段求两个表中符合要求的交集,并将每个表符合要求的记录以共同的字段为牵引合并起来. 语法 select * FROM table1 INNER JOIN table2 ON table1 . field1 compopr table2 . field2 INNER JOIN 操作包含以下部分: 部分 说明 table1, table2 要组合其中的记录的表的名称. field1,field2 要联接的字

SQL 多表连接查询实现语句

1.理论 只要两个表的公共字段有匹配值,就将这两个表中的记录组合起来. 个人理解:以一个共同的字段求两个表中符合要求的交集,并将每个表符合要求的记录以共同的字段为牵引合并起来. 语法 select * FROM table1 INNER JOIN table2 ON table1 . field1 compopr table2 . field2 INNER JOIN 操作包含以下部分: 部分 说明 table1, table2 要组合其中的记录的表的名称. field1,field2 要联接的字

mysql批量删除指定前缀的表,批量修改表名的SQL语句

  Select CONCAT( 'drop table ', table_name, ';' )  FROM information_schema.tables  Where table_name LIKE 'uc_%';   注意: like 'uc_%' 其中 uc_是你需要替换的表前缀. 执行查询,会自动生成出 drop table table_name这样的SQL语句. 然后复制 drop语句 可以执行删除的操作了. 这么一来也可以安全的审核一下语句,避免误操作.. 顺便补充一下一个批

mssql数据库中的表、字段sql语句_MsSql

mssql update from 语法 复制代码 代码如下: update a set a.columnname=b.columnname from a,b where b.id=1 1.系统表sysobjects 在数据库中创建的每个对象(例如约束.默认值.日志.规则以及存储过程)都对应一行. 列名 数据类型 说明 name sysname 对象名 id int 对象标识号 xtype char(2) 对象类型.可以是以下对象类型之一: AF = 聚合函数 (CLR) C = CHECK 约