添加首行递增
SELECT
(@i:
=@i+1) as i
,
t
.filed1
,t
.filed2
FROM table1 t
,(select @i:
=0) as it
declare 使用
set @startdate = cast
('2019/02/01' as datetime)
set @a=5
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用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值
True或
False
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 ''' '''
空间函数
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')
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()查询表的行数!