Oracle9i的简化SQL语法(含连接)Oracle对Oracle9i SQL 做了一些很重要的改进,包括一些令人兴奋的新特点,支持1:5的数量级和ISO99中的SQL标准。
作为Oracle的补充,它包括以下新的TABLE JOIN的句法结构:CROSS IN——它在两个表格中创建了一个卡迪尔列,就象是在Oracle8i中没写WHERE 时那样。
NA TURAL JOIN——这是一个很有用的Oracle9i的句法,它通过从WHERE子句中移动连接标准来改善SQL的稳定性USING子句——它可以通过名字来具体指定连接ON子句——这个句法允许在两个表格中为连接具体指定栏目的名头LEFT OUTER JOIN——它返回表格中左边的行和右边的数值,如果没有搭配的行的话,则返回空//我刚才试过了,left (outer) join等这种连接的语法,在oracle9i的版本中开始支持了,我在oracle中试了一下,是可以的,所以可以放心地用连接了。
也就是说在oracle9中,以下两种方法都是正确的:select * from test,test1 where test.ID(+) = test1.ID;select * from test1 left join test on test1.ID = test.ID;RIGHT OUTER JOIN——它返回表格中右边的行和左边的数值,如果没有搭配的行的话,则返回空FULL OUTER JOIN——它返回的是两个表格中所有的行,用空填满每一个空格。
这在Oracle8i中则没有相应的此种句法大多数改进都是为了让那些非Oracle的请求以快速的进入Oracle数据库而引进的,并且必须记住这些只是句法上的不同,ISO99标准并没有给Oracle9i SQL带来任何新的功能。
The CROSS JOIN在Oracle中,CROSS JOIN产生了一个“卡迪尔的产物(Cartesian product)”,就象是在连接两个表格时忘记加入一个WHERE子句一样select last_name,dept_idfrom emp,depts;在Oracle9i中,我们使用CROSS JOIN 来达到相同的结果select last_name.dept_idfrom empCROSS JOIN dept;NA TURAL JOIN我喜欢NATURAL JOIN的原因在于它能够通过在两个表格中配对的栏目的名头来自动的检查join。
它同时还简化了Oracle9i SQL,由于where子句仅仅只能过滤谓语,当然,NATURAL JOIN要求在每一个表格中的栏目的名字相同。
很有意思的是,这种特性甚至在没有主要的或是外来的关键词作为参考是也能起作用Oracle8i,Select book_title, sum(quantity)From book, salesWhere book.book_id = sales.book_idgroup by book_title;Oracle9iSelect book_title, sum(quantity)from booknatural join salesgroup by book_title;Oracle9i的简化SQL语法USING子句假如几个栏目有同样的名字,而你又不想用所有的这些栏目来连接的时候,你就可以用USING子句。
在USING子句中所列的栏目的句子中不会有任何的修饰词,包括where子句也不会有。
Oracle8iselect dept_id, cityfrom departments, locationswhere departments.location_id = location.location_id;Oracle9iselect department_name, cityfrom departmentsJOIN locationsUSING (location_id);ON子句ON子句被用于当在两个表格中的栏目名字不搭配时来连接表格。
而连接条件就是where子句中的过滤条件Oracle8iselect department_name, cityfrom department, locationwhere department.location_id = location.loc_id;Oracle9iselect department_name, cityfrom department dJOIN location lON (d.location_id = l.id);[小结]Cross Join 笛卡尔乘积Natural Join它能够通过在两个表格中配对的栏目的名头来自动的检查join。
前提条件必须是两个字段名必须一样,所以当两个表中的两个字段名是一样时,可以直接用Natural Join 来处理,也省了写连接的条件。
如果两个表之间有两个字段相同,如ID,Name则用Natural Join时,则都会作为连接条件.USING子句假如几个栏目有同样的名字,而你又不想用所有的这些栏目来连接的时候,你就可以用USING子句。
//在using子句中,不能加natural关键字在采用USING子句的情况下,列名必须相同,而且必须存在于连接的两个表内。
假如你用多列进行连接,则应该用逗号把列名隔开。
以下就是USING子句基本用法示例:SELECT * FROM User INNER JOIN Event USING (userid);//这句SQL是正确的。
我在Oracle中试过了。
也就是说如下两种是正确的:select * from test1 inner join test2 using(a,b);select * from test1 join test2 using(a,b);//对于这种情况,inner可以省略。
注意:这里的几个栏目有同样的名子是指:例如:两个表之间都有ID和Name两个字段,但我们只想通过ID来进行连接时,用using子句ON子句ON子句被用于当在两个表格中的栏目名字不搭配时来连接表格。
而连接条件就是where 子句中的过滤条件为了有效地处理数据查询,同时也为了能设计出良好的数据库结构,我们必须掌握SQL连接(join)语句的作用。
除了连接语句的基本语法之外,我们还应该了解其他的若干连接概念,比如别名(aliasing)、自连接和ON子句等,这些概念对你掌握连接和数据引用方面的知识大有裨益。
别名不只是连接别名是一种SQL语言特性,采用别名技术使得用户可以在查询中创建表或者列的快捷引用符号。
它还可以在处理自连接时派上用场,这个功能我随后就要说到。
别名的一般格式是table_name.column_name AS alias,//as 可以省略你可以通过分配给别名的句柄来引用别名项。
在很复杂的JOIN语句中,别名的出现令一些数据要素变得更易于阅读,同时简化了信息的输入操作。
下例所示就是别名的一典型用法:SELECT pany_name AS coname, Ind.industry_name AS indnameFROM Company AS Co LEFT JOIN Industry AS IndON Co.industry_id = Ind.industry_idWHERE coname LIKE ‘%Tech%’ AND indname = ‘Computing’;?//我认为这句SQL是错误的,语法根本就通不过。
注意,AS关键词是可选的;不过,为了语意清晰的目的我还是建议你采用这个关键词。
自连接只能用到一个表自连接(self join)是一种用在单个、规范化数据表上的JOIN语句类型。
从本质上说,你可以用自连接方法获得表内各列之间的层次关系。
你必须用别名把表描述为自身的两个虚拟的实例,然后就可以把它们连接起来。
这里举个使用自连接技术的常用示例。
假设有一个职员表,其中列出了公司所有的职员及其管理这些职员的上级经理。
采用自连接之后,你就可以通过一个查询实现数据关联,否则你只能编写代码循环处理数据。
再举个使用自连接的例子。
假设你在追踪一个开发项目,项目任务布置在了一个数据表里。
这个表内还包含了其他一些有关信息,比如TaskID列中就保存各行唯一的编号,DependenceID列则保存必须在当前任务开始之前完成的任务的任务号。
为了列出任务及其依附关系,你可以采用如下所示的自连接方法:SELECTCurrent.task_descr AS Task,Previous.task_descr AS DependenceFROM Project AS CurrentLEFT JOIN Project AS PreviousON Current.DependenceID = Previous.TaskID;以上的语句执行后会产生两个列,它们分别是Task和Dependence,也就是各行相关信息的说明。
采用自连接的话,你可以用单一表内的数据创建数据内层次关系的自引用表示。
连接多列的USING和ON子句除了ON子句之外,你还可以用USING子句执行等连接(equi-join),也就是使得表内某列的值同其连接表的列值相等。
你还可以用这些语句连接多个列,这样做对你嵌套JOIN子句的操作特别有用。
用ON子句可以指定表列的名字,也就是说你可以比较两个表的数据哪怕列的名字并不匹配。
为了对多个列进行检索,你应该用AND关键词组合检索标准(请参考下一节的JOIN 顺序)。
在采用USING子句的情况下,列名必须相同,而且必须存在于连接的两个表内。
假如你用多列进行连接,则应该用逗号把列名隔开。
以下就是USING子句基本用法示例:SELECT * FROM User INNER JOIN Event USING (userid);//我试了一下,在SQL Server中不行。
控制JOIN顺序JOIN语句中不需要使用括号,但是在牵扯到两个或者两个以上数据表的情况下你可以用括号来改变JOIN语句的执行顺序。
通常情况下JOIN语句是从左到右执行的(以他们出现在查询中的顺序)或者在执行前由数据库的查询优化器确定。
某些数据库,比如SQL Server、Oracle和DB2也支持JOIN HINT关键词概念。
这些关键词插入到JOIN语句中来控制JOIN的处理顺序。
比方说,MERGE JOIN就会在处理其他连接之前把两个表连接在一起。
HASH JOIN会把一个表连接到已经被执行过的JOIN语句的结果。
使用JOIN HINT会导致系统的性能大大降低,不过好在这些操作都留给DBA来处理了。
你可以采用替代的方法,比如用括号控制JOIN的执行顺序。