一、Example
1)、为查询到的数据分类给出序号
SELECT
(@i := CASE WHEN @pre_字段名 = 要分类的字段名 THEN @i + 1 ELSE 1 END ) rownum,
( @pre_字段名 := 要分类的字段名 )
FROM
表名 c ,(SELECT @i := 0, @pre_brand := '') AS a
WHERE 条件
例:
2)、知道出生日期求年龄:
(year(now())-year(birthDate)-1) + ( DATE_FORMAT(birthDate,
'%m%d') <= DATE_FORMAT(NOW(),
'%m%d') ) as age
3)、多条数据随机取出其中100条
SELECT * FROM pl_msg WHERE id >= ((SELECT MAX(id) FROM pl_msg)-(SELECT MIN(id) FROM pl_msg)) * RAND() + (SELECT MIN(id) FROM pl_msg) LIMIT 100
4)、多表合并
表A,表B,表C,如下图:
实现结果:
SQL语句:
select concat('P',cast(p.provinceID as char)) as id, p.name as text,0 as pid,'false' as leaf from ts_province p union
select concat('C',cast(c.cityID as char)) as id, c.name as text,concat('P',cast(c.father as char)) as pid,'false' as leaf from ts_city c union
select concat('A',cast(a.areaID as char)) as id, a.name as text,concat('C',cast(a.father as char)) as pid,'false' as leaf from ts_area a
二、MYSQL的内连接,外链接
假如有2个表,分别为表A,表B,如下图:
1)、内连接:SELECT * FROM A INNER JOIN B on A.id = B.id,为两个表的交集
,
结果为:
2)、外连接又分为以下几种:
左联:select * from A left join B on A.id=B.id,以左边的表为主表
,
结果为:
3)、右联:select * from A right join B on A.id=B.id;以右边表为主表
,
结果为:
全外链接:select * from A FULL OUTER JOIN B on A.id=B.id;将数据全部查出来
结果为:
三、函数总结
1)、数学函数
a、ABS(X):求绝对值 SELECT ABS(-1); # 1
b、MOD(N,M)、N%M:求N除以M的余数 SELECT MOD(5,3);SELECT 5%3; # 2 2
DIV:整除 SELECT 7 DIV 2; # 3
c、FLOOR(X):求小于X的最大整数 SELECT FLOOR(1.23);SELECT FLOOR(-1.23); # 1 -2
d、CEIL(X),CEILING(X):求大于X的最小整数 SELECT CEIL(1.23);SELECT CEIL(-1.23); # 2 -1
SELECT CEILING(1.23);SELECT CEILING(-1.23); # 2 -1
e、ROUND(X):四舍五入返回一个整数 SELECT ROUND(1.23);SELECT ROUND(1.53);SELECT ROUND(-1.23);SELECT ROUND(-1.53); # 1 2 -1 -2
ROUND(X,D):则四舍五入运行返回小数 SELECT ROUND(2.125,2);SELECT ROUND(2.0,2); # 2.13 2
TRUNCATE(X,D):不四舍五入,直接取到X的D位小数 SELECT TRUNCATE(2.251,2);SELECT TRUNCATE(2.256,2); # 2.25 2.25
f、SIGN(X):如果X是正数则返回1,为0则返回0,为负数则返回-1
SELECT SIGN(2);SELECT SIGN(0);SELECT SIGN(-3); # 1 0 -1
g、SQRT(X):求X的平方根 SELECT SQRT(16);SELECT SQRT(0);SELECT SQRT(-16); # 4 0 null
h、POW(X,Y)、POWER(X,Y):求X的Y次幂 SELECT POW(2,3); SELECT POWER(2,3); # 8 8
i、EXP(X)(ex):返回值e(自然对数的底)的X次方 SELECT EXP(2); # 7.38905609893065
LN(X)/LOG(X)(logex):返回X的自然对数(logex=a,x=ea) SELECT LN(7.38905609893065); # 2
LOG(B,X)(logBx):返回X任意底B的对数 SELECT LOG(2,4); # 2
LOG2(X)、LOG10(X):返回X以2、10为底的对数 SELECT LOG2(4);SELECT LOG10(100); # 2 2
j、PI():返回圆周率 SELECT PI(); # 3.141593
k、度数与弧度的关系:X°的弧度为X/180*π(90°=0.5π)
SIN(X)、COS(X)、TAN(X):求X(X为弧度)的正弦、余弦、正切
ASIN(X)、ACOS(X)、ATAN(X):求X的反正弦、反余弦、反正切,ASIN(X)、ACOS(X),如果X不在-1到1直接则返回null
ATAN2(Y,X):返回两个变量X和Y的反正切值,类似于求Y/X的反正切
COT(X):返回X的余切
l、RAND(N):返回一个0~1之前的随机浮点数,当N有值时,则产生一个可重复的数值
2)、字符串函数
a、ASCII(str):返回字符串str最左边字符的ASCII代码值(十进制)
SELECT ASCII('2');SELECT ASCII('bx');SELECT ASCII('b'); # 50 98 98
b、CONCAT(str1,str2,...):连接字符串 SELECT CONCAT('he','ll','o'); # hello
c、LENGTH(str):返回字符串长度 SELECT LENGTH('hello'); # 5
d、LOCATE(substr,str)、INSTR(str,substr):返回字符串substr在字符串str第一次出现的位置,如果没有则返回0
SELECT LOCATE('he','hello');SELECT LOCATE('heo','hello');SELECT LOCATE('l','hello'); # 1 0 3
SELECT INSTR('hello','he');SELECT INSTR('hello','heo');SELECT INSTR('hello','l'); # 1 0 3
LOCATE(substr,str,pos):从第pos个位置(起始位置为1)算起,字符串substr在str第一次出现的位置,如果没有则返回0
SELECT LOCATE('l','hello',3);SELECT LOCATE('l','hello',4);SELECT LOCATE('l','hello',5); # 3 4 0
e、LEFT(str,len)、RIGHT(str,len):从最左/右边算起,显示len个字符,若len<=0则不显示,若len大于str本身长度则显示str本身
SELECT LEFT('hello',2);SELECT RIGHT('hello',2); # he lo
f、SUBSTR(str,pos):从第pos个位置到最后一个位置显示str SELECT SUBSTR('hello',2); # ello
g、TRIM([remstr FROM] str):删除字符串str前后缀的remstr字符串,如果前半部分省略,则去除前后空格
SELECT TRIM('o' FROM 'ohelloo');SELECT TRIM(' hello '); # hell hello('hello')
LTRIM(str),RTRIM(str):删除最左/右边的空格 SELECT LTRIM(' hello ');SELECT RTRIM(' hello ');
# hello ('hello ') hello(' hello')
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str):删除指定首尾/首/尾字符
SELECT TRIM(BOTH ',' FROM ',,hello,,'); # hello
SELECT TRIM(LEADING ',' FROM ',,hello,,'); # hello,,
SELECT TRIM(TRAILING ',' FROM ',,hello,,'); # ,,hello
h、REPLACE(str,from_str,to_str):将to_str代替from_str并输出新的str SELECT REPLACE('hello','h','H'); # Hello
i、REPEAT(str,count):重复count次输出str,若str为空或者count<=0则输出空 SELECT REPEAT('hello',2); # hellohello
j、REVERSE(str):颠倒字符串顺序并输出 SELECT REVERSE('hello'); # olleh
k、INSERT(str,pos,len,newstr):将str中第pos个位置到len个字符替换成newstr字符串并输出
SELECT INSERT('hello',2,4,'i'); # hi
3)、日期和时间函数
a、DAYOFWEEK(date):返回date当天是星期几(1=星期日,2=星期一,3=星期二...,7=星期六)
SELECT DAYOFWEEK('2018-3-17'); # 7
WEEKDAY(date):返回date当天是星期几(0=星期一,1=星期二..,5=星期六,6=星期日)
SELECT WEEKDAY('2018-3-17'); # 5
DAYNAME(date):返回date当天星期的名字 SELECT DAYNAME('2018-3-17'); # Saturday
MONTHNAME(date):返回date月份的名字 SELECT MONTHNAME('2018-3-17'); # March
QUARTER(date):返回date当前的季度(1~4)SELECT QUARTER('2018-3-17'); # 1
b、DAYOFMONTH(date):返回date的月份中的日期(1~31)SELECT DAYOFMONTH('2018-2-9'); # 9
c、DAYOFYEAR(date):返回date在当年的日数(1~366)SELECT DAYOFYEAR('2018-2-9'); # 40
d、MONTH(date):返回date的月数(1~12) SELECT MONTH('2018-3-9'); # 3
e、YEAR(date):返回date的年数(1000~9999) SELECT YEAR('18-3-17'); # 2018
f、HOUR(time)、MINUTE(time)、SECOND(time):返回time的小时(0~23)/分钟(0~59)/秒数(0~59)
SELECT HOUR('18:17:39');SELECT MINUTE('18:17:39');SELECT SECOND('18:17:39'); # 18 17 39
g、WEEK(date[,mode]):model代表每一周的第一天(0:有星期日就为一周,1:有星期一就为一周)
SELECT WEEK('2018-2-5',0);SELECT WEEK('2018-2-5',1); # 5 6
h、DATE_ADD(date,INTERVAL expr unit)、DATE_SUB(date,INTERVAL expr unit):日期的加减,精确到秒
SELECT DATE_ADD('2018-2-2 18:17:39',INTERVAL 1 YEAR); # 2019-02-02 18:17:39
SELECT DATE_SUB('2018-2-2 18:17:39',INTERVAL 1 YEAR); # 2017-02-02 18:17:39
SELECT DATE_ADD('2018-2-2 18:17:39',INTERVAL 2 MONTH); # 2018-04-02 18:17:39
SELECT DATE_SUB('2018-2-2 18:17:39',INTERVAL 2 MONTH); # 2017-12-02 18:17:39
SELECT DATE_ADD('2018-2-2 18:17:39',INTERVAL 2 DAY); # 2018-02-04 18:17:39
SELECT DATE_SUB('2018-2-2 18:17:39',INTERVAL 2 DAY); # 2018-01-31 18:17:39
SELECT DATE_ADD('2018-2-2 18:17:39',INTERVAL 2 HOUR); # 2018-02-04 20:17:39
SELECT DATE_SUB('2018-2-2 18:17:39',INTERVAL 2 HOUR); # 2018-02-04 16:17:39
SELECT DATE_ADD('2018-2-2 18:17:39',INTERVAL 2 MINUTE); # 2018-02-02 20:19:39
SELECT DATE_SUB('2018-2-2 18:17:39',INTERVAL 2 MINUTE); # 2018-02-02 18:15:39
SELECT DATE_ADD('2018-2-2 18:17:39',INTERVAL 2 SECOND); # 2018-02-02 18:19:41
SELECT DATE_SUB('2018-2-2 18:17:39',INTERVAL 2 SECOND); # 2018-02-02 18:17:37
YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND,MINUTE_SECOND
SELECT DATE_ADD('2018-2-2 18:17:39',INTERVAL '1:1' YEAR_MONTH); # 2019-03-02 18:17:39
SELECT DATE_SUB('2018-2-2 18:17:39',INTERVAL '1:1' YEAR_MONTH); # 2017-01-02 18:17:39
i、CURDATE(),CURTIME(),NOW():以不同格式显示当前日期时间
SELECT CURDATE();SELECT CURTIME();SELECT NOW(); # 2018-03-15 18:58:29 2018-03-15 18:58:29
SELECT CURRENT_DATE();SELECT CURRENT_TIME();SELECT CURRENT_TIMESTAMP(); # 2018-03-15 18:58:29 2018-03-15 18:58:29
j、字符串转日期 data_format
data_format('2019年-08月-20日 09:29:10','%y%m%d %H:%i:s') ——19/08/20 09:29:10
4)、条件判断函数
a、select case [条件] when [结果] then [返回值] when [返回值] then [返回值] else [返回值] end:当查询的条件符合
某个特定结果时返回对应的值,在case后加‘BINARY’可区分大小写
select case 11 when 1 then 'one' when 2 then 'two' else 'more' end; # more
select case BINARY 'A' when 'a' then 1 when 'b' THEN 2 end; # null
select case 'A' when 'a' then 1 when 'b' then 2 end; # 1
select case when [条件] then [返回值1] else [返回值2] end:当查询条件结果正确时返回值1,错误则返回2
select case when 1>0 then 'true' else 'false' end; # true
b、IF(expr1,expr2,expr3):如果expr1条件成立则返回expr2,否则返回expr3
select IF(1>0,'true','flase'); # true
c、STRCMP(expr1,expr2):如果字符串相同,STRCMP()返回0,如果第一参数根据当前的排序次序小于第二个,返回-1,否则返回1
SELECT STRCMP('abc','abc');SELECT STRCMP('bbc','abc');SELECT STRCMP('aabc','bbc'); # 0 1 -1
5)、系统信息函数
a、VERSION():查询数据库版本号 select VERSION(); # 5.6.3
b、CONNECTION_ID():返回数据库的连接次数 select CONNECTION_ID(); # 41
v、DATABASE()、SCHEMA():返回当前数据库名
d、USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()、CURRENT_USER:返回当前用户
e、CHARSET(str):返回字符串str的字符集 select CHARSET('rr'); # utf8
f、COLLATION(str):返回字符串str的字符排列方式 select COLLATION('rr'); # utf8_general_ci
g、LAST_INSERT_ID():返回最后生成的AUTO_INCREMENT值 https://www.cnblogs.com/duanxz/p/3862356.html
6)、加密函数
a、PASSWORD(str)、MD5(str)、SHA(str)(加密长度40)、SHA1(str)(加密长度40):数据不同方式加密
SELECT PASSWORD('a'); # *667F407DE7C6AD07358FA38DAED7828A72014B4E
SELECT MD5('a'); # 0cc175b9c0f1b6a831c399e269772661
SELECT SHA('a'); # 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
SELECT SHA1('a'); # 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
ENCODE(str,pass_str):用pass_str作为密码加密str
DECODE(crypt_str,pass_str):解密crypt_str(使用函数encode加密的结果), pass_str用作密码
SELECT ENCODE('a','12'); # :
SELECT DECODE(':','12'); # a
7)、其他函数
a、FORMAT(X,D):对数字X进行四舍五入并保留D位小数
SELECT FORMAT(2.605,2); # 2.61