mysql特有语法_MySQL详细的基础语法
常用函数
IFNULL,ISNULLMySQL详细基础语法
SELECT IFNULL(null, 1);
ifnull1.png
SELECT IFNULL(0, 1);
ifnull2.png
SELECT IF('', 1), HEX('');
-- HEX()函数可将数字或者字符串转换为16进制格式的字符串
ifnull3.png
SELECT ISNULL(NULL),ISNULL(0),ISNULL(1/0);
isnull.png
NULL的特点
null只能用is NULL比较,和数值、字符串等进行比较都没有结果集。'<=>'是MySQL特有的判断符号。叫等价于。
SELECT 1=1,NULL=NULL,1=NULL,1<>NULL,NULL is NULL;
null.png
SELECT 1<=>1,NULL<=>NULL,1<=>NULL,1 IS NOT NULL,NULL IS NOT NULL;
null1.png
时间函数now,sysdate
Now() 返回的是语句执行的时间,而sydate()返回的是实时的时间戳
SELECT now(),sleep(2),now();
time.png
SELECT sysdate(),sleep(2),sysdate();
time1.png
time2.png
该写方案如下
time3.png
时间函数实际优化案例(CURDATE()函数为返回当前的日期)
time4.png
字符串处理函数RPAD(),LPAD(),RTRIM(),LTRIM(),TRIM(),CONCAT()
str.png
RPAD/LPAD 数据库某列要保证某个长度,不足的使用特定字符右/左填充
RTRIM、LTRIM和TRIM是去除字段值得空字符
CONCAT字符串合并函数
日期类型的特性
MySQL日期类型不需要使用日期函数转换,只要按照日期类型格式编写即可,其他数据库则必须进行转换
date.png
使用日期格式转化后
date2.png
BETWEEN IN
字符类型不能使用between, 性能较差
between.png
可以将字符类型的between转化为in查询,性能较好
between1.png
也可以使用union all改写
SELECT * FROM dept_emp2 WHERE dept_no = 'd003' AND emp_no = 10005
UNION ALL
SELECT * FROM dept_emp2 WHERE dept_no = 'd004' AND emp_no = 10005
UNION ALL
SELECT * FROM dept_emp2 WHERE dept_no = 'd005' AND emp_no = 10005
between2.png
like的基本用法和特点
使用like对字符类型的列进行模糊查询,最好把%写在后面,如‘aa%’。这样可以使用一些索引。而且尽量使用字段代替*来减少查询面积
日期类型一定不能用like查询 无法使用索引 查询某一时间段的数据可以使用between and
选择率
对优秀的选择率的说明
如下2个SQL中去除重复值后越接近count(*)选择率越高
change.png
OR
使用OR的时候必须两边加括号 否则结果完全不一样 OR条件如果复杂的情况 可以适当考虑union all分离
对于相同的列 or条件等同于in
SELECT * FROM employees WHERE (emp_no = 10001 OR emp_no = 10002 OR emp_no = 10003);
or.png
OR优化
DESC SELECT
mci.PRODUCT_ID,
mci.PRODUCT_CODE,
mci.PRODUCT_NAME,
mci.PRODUCT_LOGO,
mci.SHOP_NAME,
mci.IS_ENABLE,
mci.CATEGORY_N01,
mci.CATEGORY_N02,
mci.CATEGORY_N03,
ccv2_1.CATEGORYNAME CATEGORY_N01_NAME,
ccv2_2.CATEGORYNAME CATEGORT_N02_NAME,
ccv2_3.CATEGORYNAME CATEGORY_N03_NAME,
mci.THIRD_STORE_COMMISSION,
mci.COMMODITY_TYPE
FROM
mall_ccmmodity_info AS mci
LEFT JOIN comnodity_category_v2 AS ccv2_1 ON ccv2_1.UNIQUE_NO = mci.CATEGORY_N01
LEFT JOIN comnodity_category_v2 AS ccv2_2 ON ccv2_2.UNIQUE_NO = mci.CATEGORY_N02
LEFT JOIN comnodity_category_v2 AS ccv2_3 ON ccv2_3.UNIQUE_NO = mci.CATEGORY_N03
LEFT JOIN (
SELECT
pprod.PRODOCT_ID,
COUNT( 0 ) count
FROM
promotion_product pprod
INNER JOIN promotion_info pinfo ON pinfo.PROMOTION_ID = pprod.PROMOTION_ID
AND pprod.IS_ENABLE = 1
AND pinfo.IS_ENABLE = 1
AND pinto.BELONG_T0 = 1
AND pinto.END_TIME >= NOW( )
AND NOT ( pinfo.ONSHELVE_TIME > '2018-06-30 00:00:' OR pinfo.END_TIME < '2017-12-06 17:00:00' )
GROUP BY
pprod.PRODOCT_ID
) AS pc ON pc.PRODUCT_ID = mci.PRODUCT_ID
WHERE
mci.IS_ENABLE = 0
AND mci.COMMODITY_TYPE IN ( '1', '5', '6' )
AND ( pc.count = 0 OR pc.count IS NULL )
LIMIT 0,
5;
执行计划如下
or1.png
分析上面的执行计划可以发现,在derived2这个位置,类型是all,发生了全表扫描,并且没有auth_key产生。注意pc.count = 0 OR pc.count IS NULL这个SQL,去掉之后执行计划就变成如下
or2.png
产生了auth_key所以优化的关键点在于pc.count = 0 OR pc.count IS NULL这个位置,所以优化SQL如下
```mysql
DESC SELECT
mci.PRODUCT_ID,
mci.PRODUCT_CODE,
mci.PRODUCT_NAME,
mci.PRODUCT_LOGO,
mci.SHOP_NAME,
mci.IS_ENABLE,
mci.CATEGORY_N01,
mci.CATEGORY_N02,
mci.CATEGORY_N03,
ccv2_1.CATEGORYNAME CATEGORY_N01_NAME,
ccv2_2.CATEGORYNAME CATEGORT_N02_NAME,
ccv2_3.CATEGORYNAME CATEGORY_N03_NAME,
mci.THIRD_STORE_COMMISSION,
mci.COMMODITY_TYPE
FROM
mall_ccmmodity_info AS mci
LEFT JOIN comnodity_category_v2 AS ccv2_1 ON ccv2_1.UNIQUE_NO = mci.CATEGORY_N01
LEFT JOIN comnodity_category_v2 AS ccv2_2 ON ccv2_2.UNIQUE_NO = mci.CATEGORY_N02
LEFT JOIN comnodity_category_v2 AS ccv2_3 ON ccv2_3.UNIQUE_NO = mci.CATEGORY_N03
LEFT JOIN (
SELECT
pprod.PRODOCT_ID,
COUNT( 0 ) count
FROM
promotion_product pprod
INNER JOIN promotion_info pinfo ON pinfo.PROMOTION_ID = pprod.PROMOTION_ID
AND pprod.IS_ENABLE = 1
AND pinfo.IS_ENABLE = 1
AND pinto.BELONG_T0 = 1
AND pinto.END_TIME >= NOW( )
AND NOT ( pinfo.ONSHELVE_TIME > '2018-06-30 00:00:' OR pinfo.END_TIME < '2017-12-06 17:00:00' )
GROUP BY
pprod.PRODOCT_ID
) AS pc ON pc.PRODUCT_ID = mci.PRODUCT_ID
WHERE
mci.IS_ENABLE = 0
AND mci.COMMODITY_TYPE IN ( '1', '5', '6' )
AND case when pc.count is null then 0 else pc.count end = 0
LIMIT 0,
5;
```
执行计划如下
or3.png
优化前为7s,优化后为0.029s
or优化案例2
优化前的SQL如下
DESC SELECT
COUNT( t2.store_id )
FROM
lp_liquidator t1
INNER JOIN lp_liquidator_store t2 ON t1.liquidator_id = t2.liquidator_id
LEFT JOIN lp_store_bank t3 ON t2.store_id = t3.store_id
LEFT JOIN lp_witness_bind_bank t4 ON t4.lp_store_id = t2.store_id
WHERE
t4.bank_card_user = '洪哥'
OR t3.username = '洪哥';
执行计划如下
or4.png
查询耗时15s
根据条件复杂时可考虑使用union替换or的原则,优化SQL如下
```mysql
DESC SELECT
COUNT( t2.store_id )
FROM
(
SELECT
t2.store_id
FROM
lp_liquidator t1
INNER JOIN lp_liquidator_store t2 ON t1.liquidator_id = t2.liquidator_id
LEFT JOIN lp_store_bank t3 ON t2.store_id = t3.store_id
WHERE
t3.username = '洪哥' UNION
SELECT
t2.store_id
FROM
lp_liquidator t1
INNER JOIN lp_liquidator_store t2 ON t1.liquidator_id = t2.liquidator_id
LEFT JOIN lp_witness_bind_bank t4 ON t2.store_id = t4.lp_store_id
WHERE
t4.bank_card_user = '洪哥'
) b;
```
优化后,执行计划如下
or5.png
SUBQUERY(子查询)
SUBQUERY按照出现的位置可以分为INLINE VIEW SUBQUERY,SCALA SUBQUERY, IN EXISTS使用的SUBQUERY
INLINE VIEW SUBQUERY 用在FORM后面的子查询 相当于临时表
MySQL想要使用这种类型的子查询,需要满足如下条件
如果subquery不包含集合函数 union all,union,limit等关键字。查看执行计划,保证该subquery第一个执行或者不出现temp file,file sort等
如果包含上述关键字的subquery必须保证第一个执行,否则对性能有重大影响。原因是当数据量很大时,要尽量减少auth_key的数量,否则产生太大auth_key会严重影响速度
鼓励第二种情况下的subquery 且保持一个subquery
SCALA SUBQUERY(标量子查询) 是放在select和from之间的subquery
这种subquery相当于函数
但是这种subquery因为运行返回行数多 所以最好不要再返回行数多的query中运行 并且必须要有很好的索引
标量子查询一定也写在最外面
subquery.png
如果没有良好的索引,并且要对处于业务高峰的语句进行优化,下面有如下例子
subquery1.png
由于标量子查询只能返回一条数据或者空,则优化代码如下
subquery2.png
$\color{red}{优化前查询较慢的原因如下: 先忽略子查询,语句为}$
```mysql
select t1.emp_no from t1 limit 100;
```
$\color{red}{这样会得到100行数据,之后的执行操作就是双重for循环。假如子查询的结果集为200行。外层循环1次内层循环就要循环200次,并且就算在第一次循环时就满足了e.emp_no=t1.emp_no条件后续循环一样会执行,不会停止。这样就造成了没必要的循环操作。加上limit后,找到满足条件的之后,循环就会停止,进入第二次循环,这样就大大提升了效率。}$
2. 这种子查询不会是最后结果集 往往可以和left join互相替换
在外层查询结果较少,join连接的表row很大,并且需要进行group by操作的时候,将left join改写成标量子查询后,往往可以提升效率
3. SCALA SUBQUERY可进行分页查询
IN 和 NOT IN
in和not in 相当于or条件
In 和not in不能识别NULL,并且not in的条件中绝对不能有NULL,否则永远没有查询结果如下图中以in为实例
in.png
将语句进行改写,使用or进行查询,查询条件改为id等价于null反而可以查询出结果。如下图
in1.png
使用in查询时,参数类型要保持一致,否则会导致索引无法使用
。
in2.png
not in语句改写left join示例
not in语句如下
SELECT * FROM t_order WHERE emp_no NOT IN (SELECT emp_no FROM employees WHERE emp_no > 20000);
改写后的语句如下
SELECT t.emp_no,s.emp_no FROM t_order t
LEFT JOIN (SELECT emp_no FROM employees WHERE emp_no > 20000) s ON t.emp_no=s.emp_no
WHERE s.emp_no IS NULL
AND t.emp_no IS NOT NULL;
EXISTS和NOT EXISTS
exists 和 not exists最大的区别是可以允许条件为null,实例如下图
exists.png
Limit
主要用于分页优化空间在于延迟join方式的优化
实例如下,源语句
SELECT * FROM employees e ORDER BY first_name LIMIT 100000 , 0;
优化后语句
SELECT a.* FROM (
SELECT first_name,emp_no FROM employees e ORDER BY first_name LIMIT 100000 , 0
) s straight_join employees a WHERE s.emp_no=a.emp_no;
Union, union all中不能使用limit
如下图所示
limit.png
为了避免这种操作,我们可以对查询语句进行如下优化,将原先的查询变为子查询进行优化
limit1.png
in + limit是不支持的
例如
limit2.png
解决办法也同样事改写成子查询绕过即可
SELECT t1.emp_no FROM t1 WHERE t1.emp_no in
(
SELECT b.emp_no FROM (
SELECT e.emp_no FROM employees e WHERE e.emp_no BETWEEN 10001 AND 11000 LIMIT 1000
) b
) LIMIT 5
当然还可以使用join进行改写,语句如下
SELECT t1.emp_no FROM t1 JOIN
(
SELECT DISTINCT a.emp_no FROM (
SELECT e.emp_no FROM employees e WHERE e.emp_no BETWEEN 10001 AND 11000 LIMIT 1000
) a
) e ON t1.emp_no = e.emp_no limit 5
执行计划如下
limit3.png
mysql特有语法_MySQL详细的基础语法相关推荐
- python基础语法有哪些-Python基础语法知识有哪些?
相信大家都听过Python除了不会生孩子,基本上无所不能的段子,这一定程度上反映了目前Python编程语言的火爆程度和广泛应用.然而,对于许多零基础的Python学习者来说,常常会遇到无从学起,找不到 ...
- python编程语法-Python编程入门——基础语法详解
今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...
- python编程if语法-Python编程入门基础语法详解经典
原标题:Python编程入门基础语法详解经典 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_number = ...
- python编程语法-Python编程入门——基础语法详解(经典)
今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...
- python基础语法合集-Python基础语法合集.zip
[实例简介]精心整理的Python基础语法合集,变量,循环,输入输出等等都有,主要是知道概念和怎么用的 如果打开文件后有文字变成符号的,先把字体改为宋体就正常了 [实例截图] [核心代码] 目录 了解 ...
- python3基础语法-Python3的一些基础语法介绍和理解
作者:心叶 时间:2018-04-23 22:18 此处长期维护一些对帮助快速使用python3的一些基础语法,方便日常算法练习使用. 控制语法 break 语句可以跳出 for 和 while 的循 ...
- python基础编程语法-Python编程入门——基础语法详解
今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...
- python基础编程语法-Python编程入门——基础语法详解(经典)
今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...
- python编程语法教程-Python编程基础语法快速入门
1. 课程咨询加老师助理微信:助理1微信: chenjinglei88 ,助理2微信: omf6757 2. 决定购买并想得到陈敬雷老师亲自指导(课程或自己项目难题均可)加老师微信: chenjing ...
最新文章
- 爬虫图片href是html图片,python爬虫取图片详解,
- 在应用程序中宿主MEF
- 列举Python中常见的内置函数
- 2019标杆案例复盘(上):数字化——金融政企篇
- 计算机考到贴吧的试题,2014年全国计算机二级VB上机考试试题七
- Bailian4077 出栈序列统计【卡特兰数】(vijos P1122)
- 高德地图GPS经纬度转高德经纬度
- wireshark提取流量包中的文件_Wireshark抓取的数据包文件提取
- 软件安全开发 - 流程规范
- TP-LINK 忘记密码 - 恢复出厂设置
- UT2012学习笔记
- STM32F103c8t6点灯
- PB云存储系统问世 解决数据中心能耗问题
- Ubuntu安装虚拟机
- Visual Studio 各个版本之间的功能比较
- 重学scala:scala面向对象编程之类与对象
- 第二十五章《图书管理系统》第1节:图书管理系统简介
- python身份证号码共18位_18位身份证校验
- AI综述专栏 | 朱松纯教授浅谈人工智能:现状、任务、构架与统一
- 怎么在html中创建单选按钮?
热门文章
- mysql根据id删除数据sql语句_sql delete根据id删除数据库
- 让一个图片填满一个控件_如何在Android中实现一个全景图控件(二)
- python怎么验证两个json是不是一样_比较Python中的两个JSON树
- 2021年全国大学生电子设计竞赛重新启动通知及进度安排
- Linux!为何他一人就写出这么强的系统?
- 数据采集串口通信系统verilog设计和仿真
- 码云上传代码添加标签_[Android] 发布码云(Gitee)项目到JitPack(最全完整流程)
- php程序怎么调试,你是怎么调试PHP代码的
- 常州彪马机器人_PUMA560型机器人
- photos怎么改成中文_Win10怎么设置中文语言?Win10设置语言为中文的方法图解