sql 连接查询

来源:互联网 发布:动态表情图片制作软件 编辑:程序博客网 时间:2024/05/14 00:59

(sql新手上路,请多多指教。第一次写博客!!!)


连接查询:涉及两个以上的表的查询。常见连接查询:

(1)等值与非等值连接查询

(2)自然连接查询

(3)自身连接查询

(4)外连接查询

(5)复合条件连接查询

测试表:

(1)persons

(2)orders

1. 等值与非等值连接查询

连接查询的where子句中用来连接两个表的条件称为连接条件/连接谓语,基本格式:

[<表名1>.]<列名1>  <比较运算符>  [<表名2>.]< 列名2>

当比较运算符为‘=’时是等值连接,其它运算符为非等值连接。如:

select * from persons p, orders o where p.p_id = o.p_id;

连接条件中,各字段类型必须是可比的,字段名称不一定相同。

2. 自然连接查询

是一种特殊的等值连接,要求两个关系比较的分量必须是相同的属性组,并且将结果集中重复的属性列去掉(保留一个)。

实现方式:

(1)上述等值连接中去除重复列(明确返回字段)

select p.p_id,first_name,last_name,adress,city,o_id,order_no from persons p, orders o where p.p_id = o.p_id;

(2)natural join (oracle)

不需要手动进行匹配,如果两个关系中有一个或多个相同名称的分量时,oracle会自动匹配这些分量。如:

select * from persons natural join orders;

注意:

如果两个关系中的分量名称一样,但是类型不一样,同时也不能隐式转换,那么就会报错;如果可以进行隐式转换(转换成功),则连接成功。

建议:

具有相同含义的字段,不要设计为不同类型。

(3)join using

和(2)中的natural join相对,natural join不能指定连接分量(即两个关系有多个相同的分量时,会根据所有相同分量进行连接),join using可以指定其中的某个或多个作为连接分量。

select * from persons join orders using(p_id);

如果指定多个相同分量的话,可以在括号中添加,用‘,’做分隔符。

注意:

如果在select返回列表中明确连接分量,则不能指定该分量属于那个表,即:

select persons.p_id from persons join orders using(p_id);

提示如下错误:

natural 和 using是不能同时出现的。

3. 自身连接查询

除了两个不相同的表可以连接之外,也可以和自身连接。如:

select * from tablename t1, tablename t2 where t1.col1=t2.col2;

4. 内连接

普通连接,会从结果集中删除与其他被连接表不匹配的行,也就是说内连接可能会丢失连接表信息。(只有满足连接条件的元组才会输出)

select * from persons p inner join orders o on p.p_id=o.p_id;

select * from persons p join orders o on p.p_id=o.p_id;

persons表中id=2的元组和orders表中没有匹配,被丢弃。

5. 外连接(可以使用using,简化join on)

(1)左外连接

从结果集中保留左表的所有元组(即使与被连接表不匹配的元组,也保留),不匹配的元组,右表字段值为null。

select * from persons left join orders on persons.p_id=orders.p_id;

(2)右外连接

从结果集中保留右表的所有元组(即使与连接表不匹配的元组,也保留),不匹配的元组,左表字段值为null。

select * from persons right join orders on persons.p_id=orders.p_id;

(3)全量连接

结果集中保留两个连接表的所有元组。

select * from persons full join orders on persons.p_id=orders.p_id;

6. 复合条件连接查询

在上面的where子句中只有一个连接条件。where子句可以有多个连接条件,即复合条件连接,连接条件之间通过and关键字连接。除了两个表连接,自身连接,还可以两个以上的表进行连接,后者通常称为多表连接。



0 0