技术开发 频道

Transact--SQL高级查询

  【IT168技术文档】

  Transact--SQL高级查询(一)

  多表查询和笛尔儿积

  到目前为止,我们所用的都是单个表查询,但是在更多的情况的下,需要对多个表进行同时查询,这时可以把多个表的名字全部填写在from子句中。

  比如:查询出每个职工的姓名,学历,所在部门名称.由于我们需要的结果来自于两个表,所以必须用多表查询: select 姓名,学历,部门名称,负责人 from work,部门 [分析为什么是错误的]

  原因:问题出在对表格连接条件的限制上.在上面的语句中,没能对表格连接条件作任何限制,所以sql会在work表中每取出一条记录,就与部门表中的所有记录组合一次,那么假设work表有m条记录,而部门表中有n条记录,则得出的结果为m*n条记录这就是笛尔儿积,所以笛尔儿积返回的大多数的结果是冗余的、无用的,所以应该避免笛尔儿积的产生。

  解决笛尔儿积的方法:事实上由于笛尔儿积是因为两个表的连接条件没有限制造成的,所以只要我们对两个表的连接进行条件限制,就可以避免笛尔儿积的产生.可以通过一个where子句,来连接两个表的公共的字段就可以了。

  所以将上面的语句改成:

select 姓名,学历,部门名称,负责人 from work,部门 where work.部门编号=部门.部门编号

  使用表格的别名

  1. 当使用多个表进行查询时,如果有两个表中有相同的列,应该指明选中的是哪个表中的列。比如在work表检索出在address表中都有的职工的职工号,姓名,学历,基本工资:

select 职工号,姓名,学历,基本工资 from work,address where work.职工号=address.职工号

  上面的语句是错误的,原因是对于work和address表都有职工号,姓名列,所以应该指明是哪个表的职工号和姓名. 改成:

select work.职工号,work.姓名,学历,基本工资 from work,address where work.职工号=address.职工号

  或者:

select address.职工号,address.姓名,学历,基本工资 from work,address where work.职工号=address.职工号

  想一想:为什么对于学历,基本工资没有指明表名:即:work.学历,work.基本工资[只有一个表有这些列]

  2. 允许使用别名来访问表.

  格式:

         表名 as 别名 或者    表名 别名

   例如:上面的语句可改写成:

select w.职工号,w.姓名,学历,基本工资 from work as w,address as a where w.职工号=a.职工号

         上面的语句中在from中引用两个表,并且为表work指明了别名w,为表address指明了别名a,所以就可以用w来代表work表,用a来代表address表.或者省略as直接改成:

select w.职工号,w.姓名,学历,基本工资 from work w,address a where w.职工号=a.职工号
0
相关文章