函数
IFNULL
IFNULL(expression_1,expression_2);
如果 expression_1 不为 NULL,则 IFNULL 函数返回 expression_1; 否则返回 expression_2 的结果
应避免在 WHERE 子句中使用 IFNULL 函数,因为它会降低查询的性能。
-
如果要检查值是否为 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 )
-
expr1 的值为 TRUE,则返回值为 expr2;expr1 的值为 FALSE,则返回值为 expr3
SQL 中 if 条件语句详解
JOIN
-
on 比 where 起作用更早,,先根据 on 条件进行多表的连接操作,生成一个临时表再通过 where 来筛选
SQL 中 join 操作后面的 on 与 where 的区别
SQL 连接(JOIN)
转:left join 和 left outer join 的区别
CONCAT
- 将多个字符串连接成一个字符串。
concat(str1, str2,...)
返回结果为连接参数产生的字符串,如果有任何一个参数为 null,则返回值为 null。
- 返回结果为连接参数产生的字符串并且有分隔符,如果有任何一个参数为 null,则返回值为 null。
concat(str1, seperator,str2,seperator,...)
sql:concat 字符连接
SQL 里的 concat() 以及 group_concat() 函数的使用
CONCAT_WS()
- 和 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
- count(1) and count(*)
从含义上讲,count(1) 与 count() 都表示对全部数据行的查询。count() 包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为 NULL ;count(1) 用 1 代表代码行,在统计结果的时候,不会忽略列值为 NULL 。
- count(1) 与 count(字段)
count(1) 统计表中所有记录数,NULL 值记录并不会被忽略;而 count(字段) 会统计该字段在表中出现的次数,忽略字段为 NULL 值的记录数。
- 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);
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 语句