目录
一、使用表别名
二、使用不同类型的联结
1.自联结
2.自然联结
3.外部联结
3.使用带聚集函数的联结
4.使用联结和联结条件
一、使用表别名
别名除了用于列名和计算字段外,SQL还允许给表名起别名。
起别名有两个好处:
- 一个是缩短SQL语句;
- 一个是允许在单条select语句中多次使用相同的表。
示例:
输入:select prod_name,prod_desc
from products as p,vendors as v
where p.vend_id = v.vend_id
and prod_price = 4.5;
输出:
from子句中两个表都有别名,products AS p建立p作为products的别名,等等。这使得能使用省写的p而不是全名products。在此例子中,表别名只用于where子句。但是表别名不仅能用于where子句,它还可以用于select的列表、order by子句以及子句的其他部分。
注意:表别名只在查询执行中使用。与列别名不一样,表别名不反悔到客户机。
二、使用不同类型的联结
1.自联结
当在相同的一张表中查询且该表的表名要出现2次在select语句中时使用自联结。即自己和自己联结。
使用子查询:
输入:select prod_id,prod_name
from products
where vend_id =
(select vend_id
from products
where prod_id = 2);
使用自联结:
输入: select p1.prod_id,p2.prod_name
from products as p1,products as p2
where p1.vend_id = p2.vend_id
and p2.prod_id = 2;
输出:
products第一次出现为别名p1,第二次出现为别名p2。select语句使用p1前缀明确的给出所需列的全名,如果不这样,MySQL将返回错误的数据。
自联结和子查询都可以进行在相同的表中进行查询,返回的结果是相同的,但是自联结更快一些。
2.自然联结
自然联结排除多次出现,使每个列只返回一次。
示例:
输入:
select c.*,o.order_num,o.order_date
from customers as c,orders as o
where c.cust_id = o.cust_id
and prod_id = 3;
在这个例子中,通配符只对第一个表使用,所有其他列明确列出,所以没有重复的列被检索出来。
3.外部联结
许多联结将一个表的行与另一个表中的行进行联结,但有时候会需要包含没有关联行的那些行。
联结包含了那些在相关表中没有关联行的行。这种类型的联结被称为外部联结。
示例:
输入:select customers,cust_id,orders.order_num
from customers inner join orders
on customers.cust_id = orders.cust_id;
此处的inner join用来指定表,只不过要用on进行联结而不是where,传递出给on的实际条件与传递给where的相同。
输入:select customers.cust_id,orders.order_num
from customers left outer join orders
on customers.cust_id = orders_id;
以上两个查询语句返回的结果是相同的。
第二条select语句采用了outer join来指定联结的类型(代替where)。但是,与内部联结关联两个表中的行不同的是:外部联结还包括没有关联的行。在使用outer join语法时,必须使用right或left关键字指定包括其所有行的表(right指出的是outer join右边的表,left则相反)。left outer join则是选择from子句中左边的表(customers表)中选择所有行,right outer join 则是选择orders表中的所有行。
注意:在外部联结中可通过颠倒from或where子句中的表的顺序转换为右外部联结。因此,两种类型的外部联结都可以互换使用。
3.使用带聚集函数的联结
聚集函数用来汇总数据。这些函数也可以和联结一起使用。
4.使用联结和联结条件
- 注意所使用的联结类型。一般使用内部联结,但使用外部联结也是有效的
- 保证使用正确的联结条件,否则将返回不正确的数据
- 应该总是提供联结条件,否则会得出笛卡儿积
- 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。但应该在测试它们之前,分别测试每个联结。这将使故障排除更为方便。