SQL笔记

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行,和最初的那个一样。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值