六、MYSQL学习过程问题记录
一、MySQL数据库建表时用引号的问题

在创建mysql表时,表名和字段名外面的符号 ` 不是单引号,而是英文输入法的反单引号,同键盘~同一位置。
为了避免你的表名和字段名 和数据库SQL中的关键字冲突。但也可以不加
二、MySQL语句中包含group by 和join on 时的顺序问题
今天在做每日一练时,查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩 。思路是采用join on 两表联查。但是在第一次两表联查时报错

仔细看sql语句发现没错呀,然后换了一种写法,join student表 on sc表。这时就对了。

原因:sql语句中 group by、where、Having、from、join on 等这些有执行先后顺序
参考链接:https://blog.csdn.net/mine_song/article/details/70185744
顺序:
ON
JOIN
WHERE
GROUP BY
WITH CUBE 或 WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
一、group by
group by主要用于分组,达到对数据的分类更加精确。 group by中存在的列必须是有效的列(即为表的列字段)。同时若在select 中存在,必须在group by中列出,不能使用别名。 group by必须位于where 后,order by前;此外一般与order by一起使用。 group by 会对Null进行单独分组,若为一行则单独一组,若多行,则多行为一组。
二、与having,where的比较
5. 使用group by 后,若想进行再次筛选可以使用having。
6. having是在分组后进行筛选;where是在执行条件后再分组。
7. having对一组数据进行操作;where是对行进行操作。
8.
三、与order by的比较
-**在使用group by时,一般与order by同时使用,执行顺序为:
先group by ,然后order by。
四、在SQL中执行的顺序
1. 先连接from后的数据源(若有join,则先执行on后条件,再连接数据源)。
2. 执行where条件
3. 执行group by
4.执行having
5.执行order by
6.最后select 输出结果。
三、MySQL语句中group by 和max()函数同时使用
场景描述:查询每个部门薪水最高得员工信息
场景分析:
1、查询每个部门——》根据部门使用group by 分组;
2、薪水最高——》对薪水使用max()函数,max(薪水)得到最高薪水。
产生的问题:
如:
部门1 员工1 2000
部门1 员工2 3000
此时由于group by 分组后按照顺序只取第一行记录,即:部门1 员工1 2000,而max()函数是根据相同的部门取薪水中最大值,得到3000。相当于把部门1 员工1 2000 中的2000替换为3000。导致查询的结果有问题。
解决方法:查询时增加一个limit 99999999即可,
如:
描述
结果语句:
SELECT * FROM ( SELECT dept_no, dept_emp.emp_no, salary FROM dept_emp LEFT JOIN salaries ON salaries.emp_no = dept_emp.emp_no ORDER BY salary DESC LIMIT 9999999 ) AS a GROUP BY a.dept_no ORDER BY a.dept_no ASC;
例题参考:https://www.nowcoder.com/practice/4a052e3e1df5435880d4353eb18a91c6?tpId=82&&tqId=29764&rp=1&ru=/activity/oj&qru=/ta/sql/question-ranking
问题参考:https://www.jianshu.com/p/650e1f20a0a9

浙公网安备 33010602011771号