目录
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