|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
要高效地处理查询和数据库设计,你必须对SQL连接声明有较好的了解。在基本的逻辑句法之外,还有一些关于连接和简便数据参考方面的概念,例如别名,自连接和ON子句。
别名不只是做连接
别名是一个SQL功能,他允许你在一个查询中为表格或专栏创建一个速记符号,他在处理自连接时也可以很便利地使用,这一点我会在后面提到。
一个别名通用的格式是table_name.column_name AS alias,他允许你通过指派的处理器来参照已别名化的项目。在非常复杂的JOIN声明中,别名使得阅读和录入变得很容易。
下面这个例子是典型的别名使用:
SELECT Co.company_name AS coname, Ind.industry_name AS indname
FROM Company AS Co LEFT JOIN Industry AS Ind
ON Co.industry_id = Ind.industry_id
WHERE coname LIKE ‘%Tech%’ AND indname = ‘Computing’;
注意AS关键字是任选的,然而我建议使用他从而更加清楚。而且,专栏可以使用格式alias = table_name.column_name来别名化,但表格不能这样来别名化。
自连接只使用一个表格
自连接是一种在单一标准化表格上使用的JOIN声明,实质上,你可以使用自连接在一个表格内获得行与行之间的等级关系。你必须使用别名作为表格的两个实例来描述表格,然后将其连接起来。
使用自连接的实例可以体现在列有所有雇员和经理的员工表格中,自连接允许你与单一查询建立联合,否则你就不得不在代码中处理一个循环。
使用自连接的另一个实例是在包含工作任务的表格中追踪一个开发项目,在其他信息中,表格里包括一个TaskID专栏,他的每一行都有一个唯一的数字;一个DependenceID专栏,其中包括在现有任务可以开始之前必须完成的任务的ID。
得到任务和其附属的列表,你可以使用如下连接:
SELECT
Current.task_descr AS Task,
Previous.task_descr AS Dependence
FROM Project AS Current
LEFT JOIN Project AS Previous
ON Current.DependenceID = Previous.TaskID;
这个声明会在两个专栏中得到结果,标注为Task和Dependence且每一行里都具有相关信息。通过使用自连接,你可以使用来自单一表格的数据来创建一个内建载数据自身内部的等级的参照描述。
USING和ON子句可以在多个专栏做连接
除了ON子句,你还可以使用USING子句来实现一个等连接,他与连接表格中从一个表格到一个专栏的值相等。你也可以使用这两个声明来连接多个专栏,这在你构筑JOIN声明时会很方便使用。
在ON子句中你可以指定专栏名称,这意味着你可以对两个专栏名不相配的表格中的数据进行比较,要在多个专栏上实现一个搜索行为,需要用AND关键字来分隔条件(见下段的使用实例)。
在USING子句中,专栏名必须一致,并必须在要连接的两个表格中都要存在。如果你使用多个专栏做连接,用逗号分隔专栏名。下面是USING子句句法的基本实例:
SELECT * FROM User INNER JOIN Event USING (userid);
控制JOIN的顺序
JOIN声明中并不要求做插入,但你可以在涉及多于两个表格时使用插入来改变JOIN声明的顺序。通常地,JOIN声明或者从左至右处理(以在查询中出现顺序为序),或者由数据库查询优化器在执行前决定。
一些数据库,如SQL Server, Oracle和DB2也支持JOIN HINT关键字的概念。这些关键字被插入到JOIN声明中来控制JOIN被处理的顺序。例如,一个MERGE JOIN会在处理其他连接之前将两个表格连接在一起。HASH JOIN会将一个表格和一个已经被执行的JOIN声明的结果连接在一起。JOIN HINT会导致数据库性能的极端低下并应留给DBA处理。
你的另一个选择是使用插入来控制JOIN的执行顺序,下面是使用实例,其中Catalog, Product和Color是表格:
SELECT Catalog.item, Catalog.item_color, Product.item, Color.color_name
FROM Catalog
FULL OUTER JOIN ( Product CROSS JOIN Color )
ON Catalog.item = Product.item
AND Catalog.item_color = Color.color_name;
成为数据库专家
JOIN声明可以有效地找到你所需要的信息并避免带来麻烦。通过使用上面提到的概念,你可以逐渐掌握JOIN声明和数据库的使用。总的来说,别名,自连接和JOIN声明的使用会帮助你成为标准化数据库的专家。
< |
|