MySQLday03(JSON类型,算术运算符,比较运算符,逻辑运算符,位运算符,运算符的优先级,字符串函数,数值函数,日期和时间函数,流程函数,JSON函数,窗口函数)
JSON类型
JSON是js中的一种数据交换格式。
JSON类型比字符串类型有如下优点:
JSON数据类型会自动的校验是否为JSON格式,如果不是JSON格式数据则会报错。
MySQL中内置了JSON数据类型的一些函数,可以方便的提取各类数据,可以修改特定制。
优化的存储格式,存储在JSON列中的JSON数据类型被转换成内部的存储格式,允许快速读取。
JSON支持的数据类型:NUMBER,STRING,BOLLEAN,NULL,ARRAY,OBJECT共六种,可以是这六种的任意组合。
BOOLEAN:true/false
NULL:null
字符串和日期类型:用双引号
ARRAY:用括号()引起来
OBJECT:KV,要用大括号{}引起来
注意:JSON大小写敏感,常见的null,true,false必须是小写才合适。
算术运算符
MySQL中支持的算术运算符:
+:加法
-:减法
*:乘法
/,DIV:除法(取商)
%,MOD:取模(取余)
注意:在除法运算或者取模运算时,当除数为0,将是非法除数,返回结果为null;
比较运算符
“=”运算符:用于比较运算符两侧的操作数是否相等,相等则为1,否则为0,注意:null不能用与“=”比较。
“<>”运算符:和“=”相反, 如果两侧操作数不相等为1,相等则为0。同样null不能用于“<>”比较。
“<=>”运算符:和“=”类似,在操作数相等时为1,不相等为0,可以用于null比较。
”<”运算符:当左侧操作数小于右侧操作数时,其返回值为1,否则其值为0。
“<=”运算符:当左侧操作数小于等于右侧操作数时,其返回值为1,否则返回值为0。
“>”运算符:当左侧操作数大于右侧操作数时,其返回值为1,否则返回值为0。
”>=”运算符:当左侧操作大于等于右侧操作数时,其返回值为1,否则返回值为0。
“between”运算符:使用格式“ x between a and b”,当x大于等于a且小于等于b时,返回1,否则为0。
”IN“运算符使用的格式为”a IN(value1,value2...)“,当a的值存在于列表中时,则整个比较表达式返回的值为1,否则返回0。
”IS NULL“运算符的使用格式为”a IS NULL“,当a的值为NULL,则返回值为1,否则返回值为0。
”IS NOT NULL“运算符的使用格式为”a IS NOT NULL“,当a的值为不为NULL,则返回值为1,否则返回值为0。
”LIKE“运算符的使用格式为”a LIKE %123%“,当a中含有字符串”123“时,则返回值为1,否则返回值0。
”REGEXP“运算符的使用格式为”str REGEXP str_pat“,当字符串中含有str_pat相匹配的字符串,则返回值为1,否则返回0。
逻辑运算符
MySQL支持的逻辑运算符:
“NOT”或“!”表示逻辑非
“AND”或“&”表示逻辑与
“OR”或“||”表示逻辑或
“XOR”表示逻辑异或
位运算符
MySQL中支持的位运算符:
“&”:位于,对多个操作数的二进制位做逻辑与操作。
“!” 位或:对多个操作数的二进制位做逻辑或操作。
“^” 位异或:对操作数的二进制位做异或操作 。
“~” 位取反:对操作数的二进制位做NOT操作。
“>>” 位右移:对左操作数向右移动右操作数指定的位数。
“<<” 位左移:对左操作数向左移动右操作烽指定的位数。
运算符的优先级
字符串函数
数值函数
日期和时间函数
流程函数
select ename,deptno, case deptno when 10 then '10号部门' when 20 then '20号部门' else '不是10也不是20号部门' end '部门' from emp;
JSON函数
json_doc:表示json数据
path 表示key $.name
val :值
在mysql是可以创建变量: set @变量名 = 值;
注意:json_contains()中的第二个参数,如果是数字,则需要''来包裹,如果是字符,必须要'“”'来包裹!
窗口函数
- ROW_NUMBER():
- row_number()后面的over是关键字,用来指定函数执行的窗口范围,如果后面什么都不写,则意味着窗口包含所有行,窗口:函数在所有行上进行计算;如果不为空,则支持以下4种语法:
- window_name:给窗口指定一个别名,如果SQL中涉及的窗口较多,采用别名则更清晰易读;
- partition子句:窗口按照哪些字段进行分组,窗口函数在不同的分组上分别执行;
- order by子句:按照哪些字段进行排序,窗口函数将按照排序后的记录顺序进行编号,既可以和partition子句配合使用,也可以单独使用;
- frame子句:frame是当前分区的一个子集,子句用来定义子集的规则,通常用来作为滑动窗口使用。
- 基于行
- 基于范围
- RANK()/DENSE_RANK():
- rank()/dense_rank()这两个函数与row_number()非常类似,只是在出现重复值时处理逻辑有所不同。
- PERCENT_RANK()/CUME_DIST():
- percent_rank()和cume_dist()这两个函数都是计算数据分布的函数,percent_rank()和之前的rank()函数相关,每行按照以下公式进行计算:
- (rank-1)/(rows-1),其中,rank为rank()函数产生的序号,rows为当前窗口的记录总行数。
- 相比percent_rank(),cume_dist()函数的应用场景更多,它的作用是分组内小于等于rank值的行数/分组内的总行数(统计大于等于当前订单金额的订单数,占总订单数的比例)。
- percent_rank()和cume_dist()这两个函数都是计算数据分布的函数,percent_rank()和之前的rank()函数相关,每行按照以下公式进行计算: