Sql连接查询的几种方式

多表连接查询是使用Sql的基本操作,但连接的方式却有多种,熟练使用这些连接方式能够简化Sql语句,提高数据库运行效率。

在学习连接查询之前,先建立2个表作为例子:

TAB1

COL1

COL2

1

TAB1_1

2

TAB1_2

3

TAB1_3

TAB2

COL1

COL3

1

TAB2_1

2

TAB2_2

4

TAB2_4

5

TAB2_5

连接可以在select 语句的from子句和where子句中建立,也可以利用join关键字在from子句中建立,在from子句中指出连接时有助于将连接操作与where子句中的查询条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

SQL-92标准所定义的FROM子句的连接语法格式为:

  FROM join_table join_type join_table

  [ON (join_condition)]

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

join_type指出连接类型,可以有以下类型:

1joininner join(内连接)

内连接使用比较运算符比较被连接列的列值,列出与连接条件匹配的数据行。

Sql语句如:

    select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1 inner join tab2 t2 on t1.col1=t2.col1 (其中“inner”可省略)

也可以写为:

    select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1, tab2 t2 where t1.col1=t2.col1

结果为:

T1_COL1

COL2

T2_COL1

COL3

1

TAB1_1

1

TAB2_1

2

TAB1_2

2

TAB2_2

 

2left joinleft outer join(左外连接)

返回符合连接条件的行,而且还包括左表中的所有数据行,左表中不符合连接条件的行的其余字段为空。

Sql语句如:

    select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1 left outer join tab2 t2 on t1.col1=t2.col1 (其中“outer”可省略)

也可以写为:

    select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1, tab2 t2 where t1.col1=t2.col1(+)

结果为:

T1_COL1

COL2

T2_COL1

COL3

1

TAB1_1

1

TAB2_1

2

TAB1_2

2

TAB2_2

3

TAB1_3

 

 

 

3right joinright outer join(右外连接)

返回符合连接条件的行,而且还包括右表中的所有数据行,右表中不符合连接条件的行的其余字段为空。

Sql语句如:

    select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1 right outer join tab2 t2 on t1.col1=t2.col1 (其中“outer”可省略)

也可以写为:

    select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1, tab2 t2 where t1.col1(+)=t2.col1

结果为:

T1_COL1

COL2

T2_COL1

COL3

1

TAB1_1

1

TAB2_1

2

TAB1_2

2

TAB2_2

 

 

4

TAB2_4

 

 

5

TAB2_5


4full joinfull outer join(全外连接)

返回符合连接条件的行,而且还包括左、右两个表中的所有数据行,两个表中不符合连接条件的行的其余字段为空。

Sql语句如:

    select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1 full outer join tab2 t2 on t1.col1=t2.col1 (其中“outer”可省略)

结果为:

T1_COL1

COL2

T2_COL1

COL3

1

TAB1_1

1

TAB2_1

2

TAB1_2

2

TAB2_2

3

TAB1_3

 

 

 

 

4

TAB2_4

 

 

5

TAB2_5

 

5natural join(自然连接)

要求有同名同数据类型的列名,隐含了这样列的相等连接,并删除连接表中的重复列。联接中使用的列不能有限定词。

Sql语句如:

    select * from tab1 natural join tab2

结果为:

COL1

COL2

COL3

1

TAB1_1

TAB2_1

2

TAB1_2

TAB2_2

可以与select * from tab1 t1 inner join tab2 t2 on t1.col1=t2.col1对照其中的区别。

6cross join(笛卡尔积)

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

Sql语句如:

    select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1 cross join tab2 t2

也可以写为:

    select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1, tab2 t2 where t1.col1(+)=t2.col1

结果为:

T1_COL1

COL2

T2_COL1

COL3

1

TAB1_1

1

TAB2_1

1

TAB1_1

2

TAB2_2

1

TAB1_1

4

TAB2_4

1

TAB1_1

5

TAB2_5

2

TAB1_2

1

TAB2_1

2

TAB1_2

2

TAB2_2

2

TAB1_2

4

TAB2_4

2

TAB1_2

5

TAB2_5

3

TAB1_3

1

TAB2_1

3

TAB1_3

2

TAB2_2

3

TAB1_3

4

TAB2_4

3

TAB1_3

5

TAB2_5


本文转载自: http://tsun7263.blog.163.com/blog/static/2398795200692535153936/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sql调优的几种方式包括以下几点: 1. 避免使用select *:使用具体的字段代替*,只返回使用到的字段,避免不必要的回表操作,提高查询性能。 2. 用union all代替union:在多表查询时,如果不需要去重的结果集,可以使用union all代替union,避免进行排序和去重的操作,提高查询效率。 3. 小表驱动大表:在多表关联查询时,尽量将小表作为驱动表,减少查询的数据量,提高查询性能。 4. 批量操作:通过使用批量插入、批量更新等方式,减少数据库的交互次数,提高操作效率。 5. 多用limit:在查询结果较大的情况下,使用limit限制返回的数据量,避免不必要的数据传输,提高查询速度。 6. 控制in值太多:当in语句的值过多时,会增加查询的复杂度和开销。可以考虑使用join或者临时表来替代in语句。 7. 增量查询:通过记录上一次查询的最大值或最小值,只查询新增的数据,避免全表扫描,提高查询效率。 8. 高效的分页:使用limit和offset来实现分页查询,避免查询所有数据后再进行分页操作。 9. 用连接查询代替子查询:在需要查询多个表的情况下,使用连接查询可以减少查询次数,提高查询效率。 10. 控制join数量:过多的join操作会增加查询的复杂度和开销,尽量减少join操作的数量。 11. 控制索引的数量:合理地创建和使用索引,避免过多的索引导致性能下降。 12. 选择合理的字段类型:根据数据的特点和需求,选择合适的字段类型,避免不必要的空间浪费和性能损失。 13. 提升group by的效率:尽量减少group by操作的复杂度,使用索引覆盖或者优化查询语句,提高group by的效率。 14. 索引优化:合理地创建和使用索引,根据查询的需求,选择适当的列作为索引,提高查询性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值