别名是一种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,但是数据表则不能用这种方法赋予别名。
自连接(self join)是一种用在单个、规范化数据表上的JOIN语句类型。从本质上说,你可以用自连接方法获得表内各列之间的层次关系。你必须用别名把表描述为自身的两个虚拟的实例,然后就可以把它们连接起来。
这里举个使用自连接技术的常用示例。假设有一个职员表,其中列出了公司所有的职员及其管理这些职员的上级经理。采用自连接之后,你就可以通过一个查询实现数据关联,否则你只能编写代码循环处理数据。
再举个使用自连接的例子。假设你在追踪一个开发项目,项目任务布置在了一个数据表里。这个表内还包含了其他一些有关信息,比如TaskID列中就保存各行唯一的编号,
DependenceID列则保存必须在当前任务开始之前完成的任务的任务号。
为了列出任务及其依附关系,你可以采用如下所示的自连接方法:
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,也就是各行相关信息的说明。采用自连接的话,你可以用单一表内的数据创建数据内层次关系的自引用表示。
除了ON子句之外,你还可以用USING子句执行等连接(equi-join),也就是使得表内某列的值同其连接表的列值相等。你还可以用这些语句连接多个列,这样做对你嵌套JOIN子句的操作特别有用。
用ON子句可以指定表列的名字,也就是说你可以比较两个表的数据哪怕列的名字并不匹配。为了对多个列进行检索,你应该用AND关键词组合检索标准(请参考下一节的JOIN顺序)。
在采用USING子句的情况下,列名必须相同,而且必须存在于连接的两个表内。假如你用多列进行连接,则应该用逗号把列名隔开。以下就是USING子句基本用法示例:
SELECT * FROM User INNER JOIN Event USING (userid);
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语句和数据库的用法,别名、自连接和嵌套连接语句通常有助于实现数据库的规范化。
欢迎评论或投稿