MySQL 常用函数

mac2024-11-04  11

添加首行递增

SELECT (@i:=@i+1) as i, t.filed1,t.filed2 FROM table1 t ,(select @i:=0) as it

declare 使用

-- declare @startdate datetime 时间处理 set @startdate = cast('2019/02/01' as datetime) -- declare @a int 整型 set @a=5 -- declare @user1 nvarchar(50) 字符串型 set @user1='张三' 统一使用: select @user2 这种方式

EXISTS 是判断是否存在,和in类似,但效率要比in高

SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB') SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB') 这两句效果一样 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值TrueFalse

UUID

SELECT UPPER(UUID()) AS id;

GROUP_CONCAT

select GROUP_CONCAT(t1.we) from t1 where t1.we like '10%'

CASE WHEN

SELECT CASE WHEN salary <= 500 THEN '0-500' WHEN salary > 500 AND salary <= 600 THEN '500-600' ELSE '其它' END '工资等级', COUNT(*) '人数' FROM Table_B ==模糊查询 case when (t2.filter_method = 'like' and t3.fieldtype = 'string') then LOCATE(t2.filter_value,t.code_value) ==字符串连接 case when t.code_value like '%'||t2.filter_value||'%' ==空值判断 case when t2.code_value IS NULL then ''' '''

空间函数

# 返回结果是KM 为单位 select floor(st_distance_sphere( geomfromtext(concat('point(',117.2358,' ',31.805681,')')), geomfromtext(concat('point(',117.235804,' ',31.805672,')')) )) distance from dual

时间

DATEDIFF: select DATEDIFF(minute ,'2017-12-04 22:06:00','2017-12-04 22:10:00'),start_time from table1 t where t.id = '56d7bf913ab147598544b2746512cac3' 时间戳转时间 select UNIX_TIMESTAMP('2012-09-04 18:17:23') 时间转时间戳 select FROM_UNIXTIME(1346753843) 时区转换 SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');0时区转成+10时区 日期格式化 DATE_FORMAT(t.expiration_date ,'%Y-%m-%d') DATE_FORMAT(t.expiration_date ,'%Y-%m-%d %H:%i:%s') DATE_FORMAT %W 星期名字(Sunday……Saturday) %D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) %Y 年, 数字, 4%y 年, 数字, 2%a 缩写的星期名字(Sun……Sat) %d 月份中的天数, 数字(00……31) %e 月份中的天数, 数字(0……31) %m 月, 数字(01……12) %c 月, 数字(1……12) %b 缩写的月份名字(Jan……Dec) %j 一年中的天数(001……366) %H 小时(00……23) %k 小时(0……23) %h 小时(01……12) %I 小时(01……12) %l 小时(1……12) %i 分钟, 数字(00……59) %r 时间,12 小时(hh:mm:ss [AP]M) %T 时间,24 小时(hh:mm:ss) %S 秒(00……59) %s 秒(00……59) %p AM或PM %w 一个星期中的天数(0=Sunday ……6=Saturday ) %U 星期(0……52), 这里星期天是星期的第一天 %u 星期(0……52), 这里星期一是星期的第一天 %% 一个文字“%”。 所有的其他字符不做解释被复制到结果中。

REPLACE

UPDATE tableName SET recordName=REPLACE(recordName,'abc','ddd') //将表tableName中的recordName字段中的 abc 替换为 ddd

CAST

#转字符串: CAST(t.bulletion_id AS CHAR) bulletion_id,

IFNULL

#非空判断: IFNULL(t.title,"") title

COUNT使用

COUNT()是SQL92定义的标准统计行数的语法,所以MySQL对他进行了很多优化,MyISAM中会直接把表的总行数单独记录下来供COUNT()查询,而InnoDB则会在扫表的时候选择最小的索引(可能非主键索引)来降低成本。当然,这些优化的前提都是没有进行where和group的条件查询。

在InnoDB中COUNT()和COUNT(1)实现上没有区别,而且效率一样,但是***COUNT(字段)需要进行字段的非NULL判断,所以效率会低一些。

因为COUNT()是SQL92定义的标准统计行数的语法,并且效率高,所以请直接使用COUNT()查询表的行数!

最新回复(0)