在对跨多个表格的数据进行组合时有时很难搞清楚要使用哪一个SQL句法我将在这里对将多个表格中的查询合并至单一声明中的常用方式进行阐述
在这篇文章中的样本查询符合SQL ISO标准不是所有的数据库生产商都遵循这项标准而且很多厂商采取的提升措施会带来一些意料不到的后果如果你不确定你的数据库是不是支持这些标准你可以参看生产厂商的有关资料
SELECT
一个简单的SELECT声明就是查询多个表格的最基本的方式你可以在FROM子句中调用多个表格来组合来自多个表格的结果这里是一个它如何工作的实例
SELECT lumn lumn FROM table table WHERE lumn = lumn;
这个实例中我使用点号(lumn)来指定专栏来自哪一个表格如果所涉及的专栏只在一个参考的表格中出现你就不需要加入完整的名称但是加入完整名称会对可读性起到帮助
在FROM子句中表格之间由逗号来分隔你可以加入所需的任意多的表格尽管一些数据库有一个在引入正式的JOIN声明之前他们可以有效地处理的内容这方面的限制这个将在下面谈到
这个句法是一个简单的INNER JOIN一些数据库将它看成与一个外部的JOIN是等同的WHERE子句告知数据库哪一个区域要做关联而且它返回结果时就像列出的表格在给定的条件下组合成一个单独的表格一样值得注意的是你的比较条件并不需要与你作为结果组返回的专栏相同在上面的例子中lumn和lumn用来组合表格但是返回的却是lumn
你可以在WHERE子句中使用AND关键字来将这个功能扩展至多于两个的表格你还可以使用这样的表格组合来限制你的结果而不用实际地从每个表格返回专栏在下面的例子中table与table匹配但是我没有从table返回任何东西来显示我只是确保来自table的有关专栏存在于table之中注意此例中table需要在FROM子句中被引用
SELECT lumn lumn FROM table table table WHERE lumn = lumn AND lumn = lumn;
然而要注意的是这个查询多个表格的方式是一个暗指的JOIN你的数据库可能对事物进行不同的处理这取决于它所使用的优化引擎而且忽略对与WHERE子句的相关特性的定义将会给你带来不愿看到的结果例如从余下的查询中返回与每一个可能的结果相关的专栏的rogue域就像在CROSS JOIN之中一样
如果你习惯于你的数据库处理这种类型的声明的方式且你只对两个或是少数几个表格进行组合一个简单的SELECT声明就可以达到目的
JOIN
JOIN的工作方式与SELECT声明是相同的它从不同的表格中返回一个带有专栏的结果组在暗含的JOIN之上使用外部JOIN的优势是对你的结果组的更好的控制而且还可能在涉及很多个表格的情况下提升性能表现
JOIN的类型有几种LEFTRIGHTFULL OUTERINNER和CROSS你所使用的类型是由你想要看到的结果所决定的例如使用LEFT OUTER JOIN将会从列出的第一个表格中返回所有有关的行而同时如果没有信息与第一个表格相关的话将潜在地从所列出的第二个表格中加入行
在这里INNER JOIN和暗含的JOIN是不同的INNER JOIN将只返回那些在两个表格中都有数据的行
对第一个SELECT查询使用如下JOIN声明
SELECT lumn lumn FROM table INNER JOIN table
ON lumn = lumn;
子查询
子查询或叫子选择声明是在一个查询中将结果组作为资源使用的一个途径他经常被用来对结果进行限制或定义而不是运行多个查询或操纵应用软件之中的数据有了子查询你可以参考表格来决定数据的内含或是在一些情况下返回一个专栏而这个专栏是一个子选择的结果
下面的例子中使用了两个表格一个表格中包含了我想要返回的数据而另一个表格则给出一个比较点来确定什么数据是我确实感兴趣的
SELECT column FROM table WHERE EXISTS ( SELECT column FROM table WHERE lumn = lumn );
子查询很重要的一个方面就是性能表现便利性是有代价的它取决于你所使用的表格和声明的大小数量和复杂性还有你可能会允许你的应用软件做处理工作每一个查询在被主查询作为资源使用之前都将被完整地单独处理如果可能的话创造性地使用JOIN声明可以以较少的滞后时间提供出相同的信息