1.MySQL 执行顺序。
先执行where,后执行group by。
所以,having中能放在where中的,就尽量放在where中。而不要放在having中。这样可以先筛选出一些行数,减少group by的工作量。
2.group_concat() 行变列.
例:
SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;
3.执行效率
1)如果太慢。explain,查看执行计划,看其查找的行数。
—— > 改sql的过程中,可以不去执行sql,而是执行explain,看每次修改后,它查询的行数是否减少了。
2)
LEFT JOIN ADDRESS_CODE ac ON cast(s.PROVINCE as char) = ac.CODE
上面这条语句,两个表的编码不一样,所以pycharm和navicat中执行时,都会报编码不一致的错误。但sequel pro中却能执行。(不知道为啥)
修改成:
LEFT JOIN ADDRESS_CODE ac ON cast(s.PROVINCE as char) = cast(ac.CODE as char)
虽然不报错了,但两个小时也不会跑出结果。explain查看执行结果发现,愿语句查找行数4335570,修改后查找行数21601578350。
(行数骤增,这也是为什么一直查不出来了)。所以这种改法不可行。
then:既然是编码问题,想到查这些函数但官方文档,不知道其中能不能传些参数。果然,蒙对了。如下:
https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html
cast()、convert()两个函数、两种改法:
CONVERT(expr USING transcoding_name)
CONVERT(string, CHAR[(N)] CHARACTER SET charset_name)
CAST(string AS CHAR[(N)] CHARACTER SET charset_name)
SELECT CONVERT(latin1_column USING utf8) FROM latin1_table;
SELECT CAST('test' AS CHAR CHARACTER SET utf8);
所以,最终改成下面但内容,就可以了:
LEFT JOIN ADDRESS_CODE ac ON cast(s.PROVINCE as char CHARACTER SET utf8) = ac.CODE
它的执行计划也是查找4336060行,和最初的那个一样。