仓酷云

标题: MYSQL网页编程之跟我学SQL:(四)查询多个表格 [打印本页]

作者: 海妖    时间: 2015-1-16 22:35
标题: MYSQL网页编程之跟我学SQL:(四)查询多个表格
“MySQL实际上是一个数据库家族,你可以从选择一个并将其配置成可以满足你的大多数情况,”开源顾问公司Ethiqa的总裁如此表示,“因此,你可以在开始的时候选择一个小巧的版本产品,以后再根据需要来对其进行性能或大小上的扩展。”在对跨多个表格的数据举行组应时,偶然很难弄分明要利用哪个SQL句法。我将在这里对将多个表格中的查询兼并至单一声明中的经常使用体例举行论述。

在这篇文章中的样本查询切合SQL92ISO尺度。不是一切的数据库临盆商都遵守这项尺度,并且良多厂商接纳的提拔措施会带来一些料想不到的成果。假如你不断定你的数据库是否是撑持这些尺度,你能够参看临盆厂商的有关材料。

SELECT

一个复杂的SELECT声明就是查询多个表格的最基础的体例。你能够在FROM子句中挪用多个表格来组合来自多个表格的了局。这里是一个它怎样事情的实例:

SELECTtable1.column1,table2.column2FROMtable1,table2WHEREtable1.column1=table2.column1;

这个实例中,我利用点号(table1.column1)来指定专栏来自哪个表格。假如所触及的专栏只在一个参考的表格中呈现,你就不必要到场完全的称号,可是到场完全称号会对可读性起到匡助。

在FROM子句中表格之间由逗号来分开,你能够到场所需的恣意多的表格,只管一些数据库有一个在引进正式的JOIN声明之前他们能够无效地处置的内容这方面的限定,这个将鄙人面谈到。

这个句法是一个复杂的INNERJOIN。一些数据库将它当作与一个内部的JOIN是同等的。WHERE子句告诉数据库哪个地区要做联系关系,并且它前往了局时,就像列出的表格在给定的前提下组分解一个独自的表格一样。值得注重的是,你的对照前提其实不必要与你作为了局组前往的专栏不异。在下面的例子中,table1.column1和table2.column1用来组合表格,可是前往的倒是table2.column2。

你能够在WHERE子句中利用AND关头字来将这个功效扩大最多于两个的表格。你还可使用如许的表格组合来限定你的了局而不必实践地从每一个表格前往专栏。鄙人面的例子中,table3与table1婚配,可是我没有从table3前往任何器材来显现。我只是确保来自table1的有关专栏存在于table3当中。注重此例中table3必要在FROM子句中被援用。

SELECTtable1.column1,table2.column2FROMtable1,table2,table3WHEREtable1.column1=table2.column1ANDtable1.column1=table3.column1;

但是,要注重的是,这个查询多个表格的体例是一个暗指的JOIN。你的数据库大概对事物举行分歧的处置,这取决于它所利用的优化引擎。并且,疏忽对与WHERE子句的相干特征的界说将会给你带来不肯看到的了局,比方从余下的查询中前往与每个大概的了局相干的专栏的rogue域,就像在CROSSJOIN当中一样。

假如你习气于你的数据库处置这类范例的声明的体例,且你只对两个或是多数几个表格举行组合,一个复杂的SELECT声明就能够到达目标。

JOIN

JOIN的事情体例与SELECT声明是不异的,它从分歧的表格中前往一个带有专栏的了局组。在暗含的JOIN之上利用内部JOIN的上风是对你的了局组的更好的把持,并且还大概在触及良多个表格的情形下提拔功能体现。

JOIN的范例有几种:LEFT,RIGHT,FULLOUTER,INNER和CROSS。你所利用的范例是由你想要看到的了局所决意的。比方,利用LEFTOUTERJOIN将会从列出的第一个表格中前往一切有关的行,而同时假如没有信息与第一个表格相干的话将潜伏地从所列出的第二个表格中到场行。

在这里INNERJOIN和暗含的JOIN是分歧的,INNERJOIN将只前往那些在两个表格中都无数据的行。

对第一个SELECT查询利用以下JOIN声明:

SELECTtable1.column1,table2.column2FROMtable1INNERJOINtable2
ONtable1.column1=table2.column1;



子查询
子查询,或哨子选择声明,是在一个查询中将了局组作为资本利用的一个路子。他常常被用来对了局举行限定或界说,而不是运转多个查询或利用使用软件当中的数据。有了子查询,你能够参考表格来决意数据的内含,或是在一些情形下,前往一个专栏,而这个专栏是一个子选择的了局。

上面的例子中利用了两个表格。一个表格中包括了我想要前往的数据,而另外一个表格则给出一个对照点来断定甚么数据是我的确感乐趣的。

SELECTcolumn1FROMtable1WHEREEXISTS(SELECTcolumn1FROMtable2WHEREtable1.column1=table2.column1);

子查询很主要的一个方面就是功能体现。便当性是有价值的,它取决于你所利用的表格和声明的巨细,数目和庞大性,另有你大概会同意你的使用软件做处置事情。每个查询在被主查询作为资本利用之前,都将被完全地独自处置。假如大概的话,制造性地利用JOIN声明能够以较少的滞后工夫供应出不异的信息。

JOIN声明和子查询
关于JOINS的更具体的论述和有关的理念,请参阅把握毗连的一些观点。关于子查询的更多内容,请参阅利用SQL子选择来兼并查询。
下面我将描述五个不使用MySQL的响亮理由。
作者: 简单生活    时间: 2015-1-19 17:45
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
作者: 蒙在股里    时间: 2015-1-27 07:26
记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
作者: 第二个灵魂    时间: 2015-2-5 04:09
SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)
作者: 小女巫    时间: 2015-2-11 04:10
比如日志传送、比如集群。。。
作者: 精灵巫婆    时间: 2015-3-1 21:15
总感觉自己还是不会SQL
作者: 分手快乐    时间: 2015-3-10 23:47
另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);
作者: 再现理想    时间: 2015-3-17 16:10
无法深入到数据库系统层面去了解和探究
作者: admin    时间: 2015-3-24 11:49
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。




欢迎光临 仓酷云 (http://www.ckuyun.com/) Powered by Discuz! X3.2