mysqlJOIN详解及技巧

  • 常见的sql类型
    DDL:数据定义语言
    DCL:数据控制语言
    DML:数据操作语言
    DPL:事务处理语言

  • 正确使用sql的重要性
    增加数据库处理效率,减少应用的相应时间。
    减少数据库服务器负载,增加服务器稳定性。
    减少服务器通讯的网络流量。

  • SQL标准中的join的类型
    内连接(INNER)
    全外连接(FULL OUTER)
    左外连接(LEFT JOIN)
    右外连接(RIGHT JOIN)
    交叉连接(CROSS)

下面举例讲解几种连接用法技巧。
* Inner Join
内连接基于连接谓词将两张表的列组合在一起,产生新的结果表。
!*[ed20da89.png](/images/1.png)

  • Left OUTER Join
    !*[ed20da89.png](/images/2.png)

  • Right OUTER Join
    !*[ed20da89.png](/images/3.png)

  • Full Join
    !*[ed20da89.png](/images/4.png)

  • Cross Join
    交叉连接(笛卡尔连接或叉乘),如果A和B是两个集合,它们的交叉连接就记为:A*B。

select a.'user_name','a.over','b.user_name,b.'over' from user1 corss join user2 b;

技巧:
* 如何更新使用过滤条件中包括自身的表?

update user1 set over=;齐天大圣' where user1.'user_name' in (select b.'user_name' from user1 a inner join user2  b on 
a.'user_name '= b.'user_name');

mysql报错,可以使用连接解决
···
update user1 a join (select b.’user_name’ form user1 a join user2 b
on a.user_name=b.user_name) b on a.user_name=b.user_name set a.over=’齐天大圣’)
“`

  • 使用Join优化子查询
select a.user_name ,a.ober ,(select over form user2 b where a.user_name = b.user_name) as over2 from user1 a;

使用join 优化

select a.user_name ,a.ober,b.ober as over2 from user1 a left join user2 b on a.user_name = b.user_name;
  • 使用Jon优化聚合子查询
select a.user_name,b.timestr,b.kills from user1 a join user_kills b on a.id= b.user_id where b.kills =(select MAX(c.kills )from user_kill c where c.user_id = b.user_id)

优化后
·“`
select a.user_name ,b.timestr,b.kills from user1 a
join user_kills b on a.id = b.user_id
join user_kills c on c.user_id = b.user_id
group by a.user_name,b.timestr,b.kills
having b..kills = MAX(c.kills);


* 如何实现分组选择

WITH tmp AS(
SELECT a.user_name ,b.timestr,b.kills,ROW_NUMBER() ober (partition by a.user_name order by b.kills) cnt
from user1 a join user_kills b on a.id = b.user_id)select *from tmp where cnt<=2;

mysql不支持,改造下即可,如下
···
select  d.user_name,c.timestr,kills from (select user_id,timestr,kills,(select count(*) from user_kills b where b.user_id=a.user_id and a.kills<=b.kills) as cnt from user_kills a group by user_id,timestr,kills)c join user1 d on c.user_id=d.id 
where cnt<=2;

猜你喜欢

转载自blog.csdn.net/qq3399013670/article/details/81451417
今日推荐