SQL99与SQL92的部分不同点

自然连接

自然连接相当于SQL92的等值连接。

SQL92 的写法

SELECT player_id, a.team_id, player_name, height, team_name 
FROM player as a, team as b 
WHERE a.team_id = b.team_id

SQL99 的写法

SELECT player_id, team_id, player_name, height, team_name 
FROM player 
NATURAL JOIN team

在 SQL99 中用 NATURAL JOIN 替代了 WHERE player.team_id = team.team_id。

ON连接

ON 连接用来指定我们想要的连接条件,针对上面的例子,它同样可以帮助我们实现自然连接的功能:

SELECT player_id, player.team_id, player_name, height, team_name 
FROM player 
JOIN team ON player.team_id = team.team_id

也可以 ON 连接进行非等值连接,比如我们想要查询球员的身高等级,需要用 player 和 height_grades 两张表:

SELECT p.player_name, p.height, h.height_level
FROM player as p 
JOIN height_grades as h
ON height BETWEEN h.height_lowest AND h.height_highest

USING连接

当我们进行连接的时候,可以用 USING 指定数据表里的同名字段进行等值连接

SELECT player_id, team_id, player_name, height, team_name 
FROM player JOIN team USING(team_id)

相当于:

SELECT player_id, player.team_id, player_name, height, team_name 
FROM player 
JOIN team ON player.team_id = team.team_id

外连接

SQL99 的外连接包括了三种形式:

  1. 左外连接:LEFT JOIN 或 LEFT OUTER JOIN
  2. 右外连接:RIGHT JOIN 或 RIGHT OUTER JOIN
  3. 全外连接:FULL JOIN 或 FULL OUTER JOIN

这里不介绍了,都是常用的使用方法。

自连接

SQL92 的写法:

SELECT b.player_name, b.height 
FROM player as a , player as b 
WHERE a.player_name = '布雷克 - 格里芬' and a.height < b.height

SQL99 的写法:

SELECT b.player_name, b.height 
FROM player as a JOIN player as b 
ON a.player_name = '布雷克 - 格里芬' and a.height < b.height

建议

SELECT ...
FROM table1
    JOIN table2 ON table1 和 table2 的连接条件
        JOIN table3 ON table2 和 table3 的连接条件
for t1 in table1:
    for t2 in table2:
       if condition1:
           for t3 in table3:
              if condition2:
                  output t1 + t2 + t3

SQL99标准。推荐这么写,因为更有层次。

除了一些常见的语法问题,还有一些关于连接的性能问题需要你注意:

1. 控制连接表的数量

多表连接就相当于嵌套 for 循环一样,非常消耗资源,会让 SQL 查询性能下降得很严重,因此不要连接不必要的表。在许多 DBMS 中,也都会有最大连接表的限制。

2. 在连接时不要忘记 WHERE 语句

多表连接的目的不是为了做笛卡尔积,而是筛选符合条件的数据行,因此在多表连接的时候不要忘记了 WHERE 语句,这样可以过滤掉不必要的数据行返回。

3. 使用自连接而不是子查询

我们在查看比布雷克·格里芬高的球员都有谁的时候,可以使用子查询,也可以使用自连接。一般情况建议你使用自连接,因为在许多 DBMS 的处理过程中,对于自连接的处理速度要比子查询快得多。你可以这样理解:子查询实际上是通过未知表进行查询后的条件判断,而自连接是通过已知的自身数据表进行条件判断,因此在大部分 DBMS 中都对自连接处理进行了优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tzzt01

您的支持是我坚持下去的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值