SQL语句的使用技巧--01(JOIN)

目录

 

1.SQL语句分类

  2.如何正确使用JOIN

  3.与JOIN相关的技巧


1.SQL语句分类

    

  2.如何正确使用JOIN

 

   表:

  •  内连接:

  •   外连接之Left Outer Join:

  左外连接的两种使用场景,注意地位中优化了 NOT IN,因为他避免了使用它。

  

    例子:

 

  •  外连接之 Right Outer Join:

  

  •    外连接之全连接:

   

     mysql中如何使用full join呢?UNION ALL

   

   

   UNION 连接的两个表,结构必须完全一样,字段的顺序也必须一样,不然报错

  •    交叉连接没有连接关键词

   

     

  3.与JOIN相关的技巧

  •   1.使用join来更新表

       

      最容易想到的是这种:

       

      这样更新会抛出错误,因为mysql不能更新在From从句中出现的表,解决办法是使用join:

      

  •     2. 使用join来优化子查询

       

       

  •      3. 使用join来优化聚合查询

     

 

    这个问题是分组后统计每组的最大值的问题, 

    最容易想到的就是使用子查询:

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_kills  c WHERER b.user_id=c.user_id

)

   使用join优化:

 

   OK,现在我要查询每门课程的最高成绩


SELECT a.COURSE_NO, a.id ,a.CORE
FROM hand_student_core a 
JOIN hand_student_core b 
ON a.COURSE_NO =b.COURSE_NO
GROUP BY a.COURSE_NO, a.id
HAVING a.CORE = MAX(b.CORE)
  •    4.如何实现分组选择

      场景:找出每个角色杀怪最多的前两个日期

     

        场景:取出每门课程成绩最高的两名同学。

       思路:首先需要根据课程号进行分组,得到如下的表:

SELECT  a.* 
FROM hand_student_core a 
GROUP BY   
a.COURSE_NO

  

  group分组之后只会有一条数据,即该字段相同的记录只会显示一行,除非你后面跟的字段的值是唯一 ,才会全部显示,group by 通常会用于统计 如 count( ) sum() 等,计算 一组数据的情况。

那我们让他全部显示:

SELECT 
 a.* 
FROM hand_student_core a   
GROUP BY   
a.COURSE_NO,a.id

  

 剩下的事情就是排序,或者说找到每个分数在组里面的排序

SELECT a.STUDENT_NO, a.COURSE_NO, CORE ,(SELECT 
                                                  COUNT(*) 
						   FROM hand_student_core b 
						   WHERE a.COURSE_NO=b.COURSE_NO 
						   AND a.CORE<=b.CORE) AS cnt
FROM hand_student_core a 

GROUP BY a.COURSE_NO,a.id

 

  接下来就可以任意取前几名,然后连表查询

SELECT STUDENT_NO, COURSE_NO, CORE FROM (
SELECT a.STUDENT_NO, a.COURSE_NO, CORE ,(SELECT 
                           COUNT(*) 
					FROM hand_student_core b 
					WHERE a.COURSE_NO=b.COURSE_NO 
				    AND a.CORE<=b.CORE) AS cnt
FROM hand_student_core a 

GROUP BY a.COURSE_NO,a.id) c
WHERE c.cnt<=2

  

     

    

  

    

  

   

发布了217 篇原创文章 · 获赞 70 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/103942078