MySQL常见用法

一、时间类

1.1 DATE_SUB() 函数

DATE_SUB() 函数从日期减去指定的时间间隔。参考

常见用法:

  • 查询一天前:
    select * from table where DATE_SUB(CURDATE(), INTERVAL 1 DAY) <= date(column_time);
    
  • 查询一周前:
    select * from table where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(column_time);
    
  • 查询一个月前:
    select * from table where DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= date(column_time);
    
  • 查询一天后:
    select * from table where DATE_SUB(CURDATE(), INTERVAL -1 DAY) >= date(column_time);
    
1.2 NOW(), CURDATE(), CURTIME(), DATE()函数

获取时间

  • SELECT NOW(), CURDATE(), CURTIME()
  • SELECT DATE(NOW())
1.3 实战
SELECT column_list FROM table_name WHERE expired_date = CURDATE();

如果expired_date列包含日期和时间部分,则应使用DATE()函数仅提取日期部分并将其与当前日期进行比较:

SELECT column_list FROM table_name WHERE DATE(expired_date) = CURDATE();

二、统计类


三、字符类

3.1 LOCATE()函数
  • 语法1:LOCATE(substr, str)

    返回子串 substr 在字符串 str 的第一个出现的位置(从1开始算)。如果 substr 不在 str 中,则返回值为0 。

    SELECT LOCATE('bar', 'foobarbar'); // 4
    
  • 语法2:LOCATE(substr, str, pos)

    第二个语法返回子符串 substr 在字符串 str ,从 pos 处开始的第一次出现的位置。如果 substr 不在 str 中,则返回值为0。

3.2 concat()函数

语法:concat(str1, str2, …)

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

select concat('11','22','33'); // 112233
select concat('11','22',null); // NULL
3.3 concat_ws()函数

语法:contcat_ws(separator,str1,str2,…)

contcat_ws() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
注意:如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。

select concat_ws(',','11','22','33'); // 11,22,33
select concat_ws(null ,'11','22','33'); // NULL

和MySQL中concat函数不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL。

select concat_ws(',','11','22',NULL); // 11,22
3.4 group_concat()函数

语法:group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])

以id分组,把name字段的值打印在一行,逗号分隔(默认):

select id,group_concat(name) from aa group by id;

以id分组,把name字段的值打印在一行,分号分隔:

select id,group_concat(name separator ';') from aa group by id;

以id分组,把去冗余的name字段的值打印在一行,逗号分隔:

select id,group_concat(distinct name) from aa group by id;

以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序:

select id,group_concat(name order by name desc) from aa group by id;
3.5 repeat()函数

语法:repeat(str, int)

用来复制字符串,如下’ab’表示要复制的字符串,2表示复制的份数:

select repeat('ab',2); // abab
3.6 REPLACE()函数

语法:REPLACE(str, from_str, to_str)

将str中所有出现的from_str替换为to_str。str可以是字段名。

select *, replace(address,'区','呕') AS rep from test_tb;

四、判断类

4.1 case when方法

统计字段中特定值的数量:

select sum(case when name = "张三" or name = "李四" then 1 when age >= 18  then 1 else 0 end) as NAMSUM from xxx_table;

注意:多个when…then都会执行,结果是取并集,而不是直接累加,也不是只执行其中一个when…then。(如果要严格上的判断,可以用【IF语句】,基本类似编程语言中的if…elseif…else)

4.2 IFNULL()函数

语法:IFNULL(expression_1,expression_2);

如果expression_1不为NULL,则IFNULL函数返回expression_1; 否则返回expression_2的结果。IFNULL函数根据使用的上下文返回字符串或数字。

SELECT IFNULL(1,0); -- returns 1
SELECT IFNULL('',1); -- returns ''
SELECT IFNULL(NULL,'IFNULL function'); -- returns IFNULL function
4.3 IF语句

如果要返回基于TRUE或FALSE条件的值,而不是NULL,则应使用IF函数。

  • IF语句

    IF expression THEN 
    	statements;
    END IF;
    
  • IF ELSE语句

    IF expression THEN
    	statements1;
    ELSE
    	statements2;
    END IF;
    
  • IF ELSEIF ELSE语句

    IF expression1 THEN
       statements1;
    ELSEIF expression2 THEN
       statements2;
    ...
    ELSE
       statementsx;
    END IF;