MYSQL技巧汇总

函数

IFNULL

IFNULL(expression_1,expression_2);
  1. 如果 expression_1 不为 NULL,则 IFNULL 函数返回 expression_1; 否则返回 expression_2 的结果

  2. 应避免在 WHERE 子句中使用 IFNULL 函数,因为它会降低查询的性能。

  3. 如果要检查值是否为 NULL,则可以在 WHERE 子句中使用 IS NULL 或 IS NOT NULL

    sql:函数:ifnull()

    sql 中的 if()和 ifnull() 的用法和区别

COALESCE

COALESCE(value,…)是一个可变参函数,可以使用多个参数。

作用:接受多个参数,返回第一个不为 NULL 的参数,如果所有参数都为 NULL,此函数返回 NULL;当它使用 2 个参数时,和 IFNULL 函数作用相同。

SELECT IFNULL(NULL,'test'); //test
SELECT IFNULL('wang','test');   //wang
SELECT IFNULL(NULL,NULL);   //NULL

SELECT COALESCE('wang','test'); //wang
SELECT COALESCE(NULL,'test');       //test
SELECT COALESCE('wang','test','test1','test2'); //wang
SELECT COALESCE(NULL,NULL,NULL,'test2');    //test2
SELECT COALESCE(NULL,NULL,NULL,NULL);   //NULL

mysql 的 coalesce 使用技巧

mysql COALESCE 函数

IF

IF( expr1 , expr2 , expr3 )
  1. expr1 的值为 TRUE,则返回值为 expr2;expr1 的值为 FALSE,则返回值为 expr3

    SQL 中 if 条件语句详解

JOIN

  1. on 比 where 起作用更早,,先根据 on 条件进行多表的连接操作,生成一个临时表再通过 where 来筛选

    SQL 中 join 操作后面的 on 与 where 的区别

    SQL 连接(JOIN)

    转:left join 和 left outer join 的区别

    MYSQL技巧汇总_第1张图片
    sql-join.png

CONCAT

  1. 将多个字符串连接成一个字符串。
concat(str1, str2,...)

返回结果为连接参数产生的字符串,如果有任何一个参数为 null,则返回值为 null。

  1. 返回结果为连接参数产生的字符串并且有分隔符,如果有任何一个参数为 null,则返回值为 null。
  concat(str1, seperator,str2,seperator,...)

sql:concat 字符连接

SQL 里的 concat() 以及 group_concat() 函数的使用

CONCAT_WS()

  1. 和 concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符(concat_ws 就是 concat with separator)
concat_ws(separator, str1, str2, ...)

说明:第一个参数指定分隔符。需要注意的是分隔符不能为 null,如果为 null,则返回结果为 null。

DATE_FORMAT

DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。

DATE_FORMAT(date,format)

MySQL DATE_FORMAT() 函数

实例

DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')
DATE_FORMAT(NOW(),'%m-%d-%Y')
DATE_FORMAT(NOW(),'%d %b %y')
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')

结果

2019-07-23 10:00:00
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635

DATE_ADD

向日期添加指定的时间间隔

DATE_ADD(date,INTERVAL expr type)

MySQL DATE_ADD() 函数

实例
向 "OrderDate" 添加 2 天,这样就可以找到付款日期

SELECT OrderId,DATE_ADD(OrderDate,INTERVAL 2 DAY) AS OrderPayDate FROM Orders

在会议结束日期加上清理时限得到清理截止日期

DATE_ADD(end_time, INTERVAL clean_limit HOUR)

selectKey


    
        
        
            SELECT LAST_INSERT_ID()
        
        insert into t_user (username,password,create_date) values(#{username},#{password},#{createDate})
    

insert 主键返回 selectKey 使用

解析

insert 主键返回 selectKey 使用

choose + when + otherwise

有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用 if 标签时,只要 test 中的表达式为 true,就会执行 if 标签中的条件。MyBatis 提供了 choose 元素。if 标签是与(and)的关系,而 choose 是或(or)的关系。

choose 标签是按顺序判断其内部 when 标签中的 test 条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的 sql。类似于 Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default



动态 SQL 选择查询 choose +when+ otherwise

MySQL 中标签的用法

MYBATIS-动态 SQL 的 IF、CHOOSE、WHEN、OTHERWISE、TRIM、WHERE、SET、FOREACH 使用(各种标签详解), 以及实体间关系配置

CURDATE()

CURDATE() 函数返回当前的日期。

CURDATE()

下面是 SELECT 语句:

SELECT NOW(),CURDATE(),CURTIME()

结果类似:

NOW() CURDATE() CURTIME()
2008-12-29 16:25:46 2008-12-29 16:25:46

COUNT

  1. count(1) and count(*)

从含义上讲,count(1) 与 count() 都表示对全部数据行的查询。count() 包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为 NULL ;count(1) 用 1 代表代码行,在统计结果的时候,不会忽略列值为 NULL 。

  1. count(1) 与 count(字段)

count(1) 统计表中所有记录数,NULL 值记录并不会被忽略;而 count(字段) 会统计该字段在表中出现的次数,忽略字段为 NULL 值的记录数。

  1. count(*) 和 count(1) 和 count(列名) 区别

执行效率上:
列名为主键,count(列名) 会比 count(1) 快 ;
列名不为主键,count(1) 会比 count(列名) 快 ;
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count() ;
如果有主键,则 select count(主键)执行效率最优;
如果表只有一个字段,则 select count(
)最优。

count(1)与 count(*)


    and apply_period_start =]]> #{startTime}


    and apply_period_end  #{endTime}

[Sql 使用关键字`<[图片上传失败...(image-7bf805-1571814259550)]

SQL 使用[CDATA[]]来代替转义字符大于小于号;

ORDER BY N

含义:

sql 语句中 order by 1 或者 order by 2...order by N

其实 1 表示第一个栏位,2 表示第二栏位;

依此类推,当表中只有 2 个栏位时,oder by 3 就会出错,这个跟 order by 列名没有什么区别,不过在特殊情况下还是很有用的.

注意:

ORDER BY ASC 应该没有这样写法,ORDER BY 后面不是字段就是数字;

可以 ORDER BY 1 ASC 或者 ORDER BY COL1 ASC ;

ASC 表示按升序排序,DESC 表示按降序排序

order by 1 含义

ORDER BY expression

实现特殊排序

实例:将价格为 0 的排在最前面

order by price = '0' desc, operator,network_bandwidth asc

mysql order by 中使用表达式来实现一些特殊的排序

mysql 正序查询并且 0 排在最后

ON DUPLICATE KEY UPDATE

先声明一点,ON DUPLICATE KEY UPDATE 为 Mysql 特有语法,这是个坑

语句的作用,当 insert 已经存在的记录时,执行 Update

ON DUPLICATE KEY UPDATE 用法与说明

INSTR

mysql 进行模糊查询时,可使用内部函数 instr,替代传统的 like 方式,并且速度更快。

instr(field, str) 函数,第一个参数 field 是字段,第二个参数 str 是要查询的串,返回串 str 的位置,没找到就是 0

select * from book where INSTR( book_name , "经" ) > 0

mysql INSTR 函数用法

SUBSTR

用来截取数据库某个字段中的一部分。

substr(string,start,length)

string 参数:必选。数据库中需要截取的字段。

start 参数:必选。正数,从字符串指定位子开始截取;

负数,从字符串结尾指定位子开始截取;

0,在字符串中第一个位子开始截取。1,同理。(特殊)

length 参数:可选。需要截取的长度。缺省,即截取到结束位置。

substr('123456',3,2);  结果是--34
substr('123456',-3,2);  结果是--45
substr('123456',0,2);  特殊,与下同
substr('123456',1,2);  结果同为--12

SQL 函数--substr()

TO_DAYS

TO_DAYS 函数 返回一个天数! 啊哈?什么天数? 从年份 0 开始的天

实例:查询仅今天的数据

select * from 表名 where to_days(时间字段名) = to_days(now());

TO_DAYS 函数 (SQL)

Sql 中的时间函数 TO_DAYS

AS

数据库中 as 主要作用是起别名,常规来说都可以省略,但是为了增加可读性,不建议省略。

[SQL]as 的是否可以省略的问题

convert('column' USING 'gbk)

按中文首字母排序

实例

order by convert(company_name using gbk) asc

MySql 内置方法 之 CONVERT ('column' USING 'gbk') 转换编码(对中文字符进行排序)

FIND_IN_SET

有时候数据库的字段中,会有某些字符用','拼接在一起的,需要查询某个 id 是否存在这个字符时,可以直接用

select * from table where FIND_IN_SET('116', bulletin_record);
MYSQL技巧汇总_第2张图片
find_in_set.png

sql 函数 FIND_IN_SET 的使用

SQL 语句中 FIND_IN_SET(str,strlist)的使用

UNION & UNION ALL

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

SQL UNION 和 UNION ALL 操作符

SELECT INTO FROM

mysql 不支持 select into form 这种语法

错误代码:1327 Undeclared variable 备份表名

可用如下方法去替换:

方法 1:

CREATE TABLE bk(SELECT * FROM USER);

方法 2:

CREATE TABLE bk LIKE user;
INSERT INTO bk SELECT * FROM  user;

MySQL 不支持 SELECT INTO FROM 语句解决方法

SQL SELECT INTO 语句

你可能感兴趣的:(MYSQL技巧汇总)