资源描述:
《sql语句的良好编写方法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、SQL语句的良好编写方法Author:InthirtiesDate:2008-11-211.涉及到多个表的JOIN语句的写法很多开发人员对于涉及到多个表的JOIN语句,不知道如何下手,以及好何写出一个效率好的JOIN语句来,在这里,我根据我的一些经验,给出一些建议供大家参考:(1)了解一个SELECT语句的结构通常,一个SELECT语句的结构是这样的:SELECTselect_column_list---------step_4FROMtable_list---------step_1WHEREj
2、oin_condition---------step_2ANDpredicates---------step_3ORDERBYorderby_clause---------step_5(2)SELECT语句的书写顺序通常情况下,SELECT语句的结构都是如我上面所描述的那样,大家在写SQL语句时,不妨先写好框架,如:先写SELECT语句的一些关键字:SELECT*FROMWHEREORDERBY框架写好后,我们再逐步加精.书写的顺序按上图我标的顺序:n第一步,先写查询所要涉及到的表,不管有多少个表
3、,我们先把表名列上去,为了后面语句的简洁,可以给表加上别名,如果有同一个表要使用几次,则要使用不同的别名来标识,或者容易产生岐义:SELECT*FROMpm_usera,pm_companyb…pm_usercWHEREORDERBYn写好table_list后,我们开始来定义JOIN的连接条件,注意,对于涉及到多个表的连接,我们一定要避免不定义连接条件的情况,因为这会产生迪卡尔连接(CartesianJoins)SELECT*FROMpm_usera,pm_companyb…pm_userc….
4、表列表WHEREa.compid=b.compid……连接条件ORDERBYn当所有的连接条件都定义好了以后,我们要再检查一下,看是否有其中的两个表完全没有定义连接条件的,这在JOIN的表很多的情况下,大家很容易犯的错误。一个好的检测方法是:书写好SQL后,在pl/sqldeveloper中按F5键查看执行计划,当SQL的执行计划中有出现关键字为Cartesian的操作时,就表示我们不小心产生了一个迪卡尔连接,要回去再REVIEW一下我们定义的连接条件n写好连接条件后,接下来,我们就可以在WHER
5、E子句中接着写过滤条件(我们把它称之为predicates),即有具体值,能过滤掉一部分记录的WHERE条件。通常,良好的编写习惯是将过滤条件写在WHERE子句的最下部,这样,SQL引擎在对表进行连接操作时,会先过滤掉参与连接的表的一部分记录,这样,参与连接的数据集就会少一点,从而连接操作的成本也小一点:SELECT*FROMpm_usera,pm_companyb…pm_userc….表列表WHEREa.compid=b.compid……连接条件Anda.userid=123456and…….过
6、滤条件ORDERBYn写好过滤条件后,基本上WHERE子句就写完了,接着我们就可以来定义查询字段列表了(select_column_list),即查询执行完后我们想要看到的字段。如果有同名的字段,可以定义字段别名(如下例中的a.name和b.name)SELECTa.userid,a.nameasusername,b.nameascompany_name…查询字段列表FROMpm_usera,pm_companyb…pm_userc….表列表WHEREa.compid=b.compid……连接条件
7、Anda.userid=123456and…….过滤条件ORDERBYn定义ORDERBY子句。ORDERBY即排序字段。因为排序操作通常是一个SELECT语句的最后一步操作,所以,通常,ORDERBY子句也可以放到最后来写,如果查询字段列表中有定义别名,排序字段中也可以使用表名(如下例中的username):SELECTa.userid,a.nameasusername,b.nameascompany_name…查询字段列表FROMpm_usera,pm_companyb…pm_userc….表
8、列表WHEREa.compid=b.compid……连接条件Anda.userid=123456and…….过滤条件ORDERBYa.userid,username….排序字段经过上面这些步骤,基本上,一个SELECT语句就完成了。(2)良好性能JOIN语句的写法下面介绍一下如何写一个执行性能良好的JOIN语句<1>尽量写平级的连接,不要写嵌套的连接什么是平级的连接呢?平级的连接是指连接的表都在同一级的查询结构,如下例的表,即为平级的连接:SELECTa.userid,a.name