基础知识+函数
- select&from
- select 字段名 from 数据表中
- select distinct 字段名 from 表名 对xxx数据去重
- 可直接进行计算公式
- select xxx as A 将xxx命名为A (as可去除)
- select * from 表名 查询表所有列
- select 字段名 from 数据表中
- Union 和 Union all(牛客网刷题学习到)
- 在两个select字段中间加入
- Union
- 去重,后面可加order by
- Union all
- 不去重,后面可加order by
- Union
- 在两个select字段中间加入
- where
- select 字段名from 表名[where 字段名 运算符 值]
- and、or和not为逻辑运算符
- and :一般用于组合两个及以上表达式,要求同时满足多个查询条件
- or:一般用于组合两个及以上表达式,要求满足多个查询条件中的一个
- 区别UNION ALL ,or去重,UNION ALL不去重
- not:not一般和与其他连用例如not in,用于条件取反
- and和not可以一起使用,但是默认and优先级高于or,可以使用括号来界定优先级
- beteween xx and xx(小在前)
- in
- 用于查询指定条件范围内的数据,一般为in (xxx,xxx,......),用括号将条件括起来
- is null
- 用于查询空值(NULL),空值不同于0,也不同于null字符串,有些要用=‘null’
- xxx like 'a'和xxx='a'的区别
- like为模糊查询
- =为精确查询
- 通配符
- select 字段名from 表名[where 字段名 运算符 值]
- order by
- select 字段名from 表名[where 表达式][order by 字段名 asc|desc]
- 不写和 asc默认升序
- desc为降序
- select 字段名from 表名[where 表达式][order by 字段名 asc|desc]
- limit
- select 字段名from 表名[where 表达式][order by 字段名 asc|desc][limit [位置偏移量,]行数]
- limit 3
- 1-3行
- 查询结果返回前n行
- limit 3,4
- 4-7行(3+1)-(3+4)行
- 查询结果返回第x+1行开始的n行到x+n行
- limit 3
- select 字段名from 表名[where 表达式][order by 字段名 asc|desc][limit [位置偏移量,]行数]
- 聚合函数&group by
- 聚合函数
- select 字段名1 from 表名[where 表达式][group by 字段名1][order by 字段名 asc|desc][limit [位置偏移量,]行数]
- 依据相同字段值分组后进行聚合运算,常和聚合函数联用
- having
- select 字段名from 表名[where 表达式][group by 字段名][having 表达式][order by 字段名 asc|desc][limit [位置偏移量,]行数]
- having 表达式 限定分组聚合后的查询行必须满足的条件
- having核心子句是可选项,使用该子句是为了对group by分组后的数据进行筛选
- select 字段名from 表名[where 表达式][group by 字段名][having 表达式][order by 字段名 asc|desc][limit [位置偏移量,]行数]
- 其他函数
- 【数学函数】
- round(x,y)——四舍五入函数
- round函数对x值进行四舍五入,精确到小数点后y位
- y为负值时,保留小数点左边相应的位数为0,不进行四舍五入
- 例如:round(3.15,1)返回3.2,round(14.15,-1)返回10
- round(x,y)——四舍五入函数
- 【字符串函数】
- concat(s1,s2,...)——连接字符串函数
- concat函数返回连接参数s1、s2等产生的字符串
- 任一参数为null时,则返回null
- 例如:concat('My',' ','SQL')返回My SQL,concat('My',null,'SQL')返回null
- replace(s,s1,s2)——替换函数
- replace函数使用字符串s2代替s中所有的s1
- 例如:replace('MySQLMySQL','SQL','sql')返回MysqlMysql
- left(s,n)、right(s,n)&substring(s,n,len)——截取字符串一部分的函数
- left函数返回字符串s最左边n个字符
- right函数返回字符串s最右边n个字符
- substring函数返回字符串s从第n个字符起取长度为len的子字符串,n也可以为负值,则从倒数第n个字符起取长度为len的子字符串,没有len值则取从第n个字符起到最后一位
- 例如:left('abcdefg',3)返回abc,right('abcdefg',3)返回efg,substring('abcdefg',2,3)返回bcd,substring('abcdefg',-2,3)返回fg,substring('abcdefg',2)返回bcdefg
- concat(s1,s2,...)——连接字符串函数
- 【数据类型转换函数】
- cast(x as type)——转换数据类型的函数
- cast函数将一个类型的x值转换为另一个类型的值
- type参数可以填写char(n)、date、time、datetime、decimal等转换为对应的数据类型
- cast(x as type)——转换数据类型的函数
- 【日期时间函数】
- year(date)、month(date)&day(date)——获取年月日的函数
- date可以是年月日组成的日期,也可以是年月日时分秒组成的日期时间
- year(date)返回日期格式中的年份
- month(date)返回日期格式中的月份
- day(date)返回年日期格式中的日份
- 例如:year('2021-08-03')返回2021,month('2021-08-03')返回8,day('2021-08-03')返回3
- date_add(date,interval expr type)&date_sub(date,interval expr type)——对指定起始时间进行加减操作
- date用来指定起始时间
- date可以是年月日组成的日期,也可以是年月日时分秒组成的日期时间
- expr用来指定从起始时间添加或减去的时间间隔
- type指示expr被解释的方式,type可以可以是以下值
- 主要使用红框中的值
- date_add函数对起始时间进行加操作,date_sub函数对起始时间进行减操作
- 例如:date_add('2021-08-03 23:59:59',interval 1 second)返回2021-08-04 24:00:00,date_sub('2021-08-03 23:59:59',interval 2 month)返回2021-06-03 23:59:59
- datediff(date1,date2)——计算两个日期之间间隔的天数
- datediff函数由date1-date2计算出间隔的时间,只有date的日期部分参与计算,时间不参与
- 例如:datediff('2021-06-08','2021-06-01')返回7,datediff('2021-06-08 23:59:59','2021-06-01 21:00:00')返回7,datediff('2021-06-01','2021-06-08')返回-7
- date_format(date,format)——将日期和时间格式化
- date_format函数根据format指定的格式显示date值
- 可以换使用的格式有
- 例如:date_format('2018-06-01 16:23:12','%b %d %Y %h:%i %p')返回Jun 01 2018 04:23 PM,date_format('2018-06-01 16:23:12','%Y/%d/%m')返回2018/01/06
- year(date)、month(date)&day(date)——获取年月日的函数
- 【条件判断函数】——根据满足不同条件,执行相应流程
- if(expr,v1,v2)
- 如果表达式expr是true返回值v1,否则返回v2
- 例如:if(1<2,'Y','N')返回Y,if(1>2,'Y','N')返回N
- case when
- case expr when v1 then r1 [when v2 then r2] ...[else rn] end
- 例如:case 2 when 1 then 'one' when 2 then 'two' else 'more' end 返回two
- case后面的值为2,与第二条分支语句when后面的值相等相等,因此返回two
- case when v1 then r1 [when v2 then r2]...[else rn] end
- 例如:case when 1<0 then 'T' else 'F' end返回F
- 1<0的结果为false,因此函数返回值为else后面的F
- case expr when v1 then r1 [when v2 then r2] ...[else rn] end
- if(expr,v1,v2)
- 【数学函数】
- 窗口函数
- 窗口函数over([partition by 字段名] [order by 字段名 asc|desc])
- 【语法讲解】
- over()中两个子句为可选项,partition by指定分区依据,order by指定排序依据---order by一定要有
- 【排序窗口函数】
- rank()over()
- 排序1.1.3.4
- dense_rank()over()
- 排序1.1.2.3
- row_number()over()
- 排序1.2.3.4
- rank()over()
- 【偏移分析函数】
- lag(字段名,偏移量[,默认值])over()
- 向上取
- lag(confirmed,1)over(partition by name order by whn
- 昨天的总数
- (confirmed - lag(confirmed,1)over(partition by name order by whn))
- 今天的总数减昨天的总数=当天confirmed人数
- lead(字段名,偏移量[,默认值])over()
- 向下取
- lag(字段名,偏移量[,默认值])over()
- 【语法讲解】
- 窗口函数over([partition by 字段名] [order by 字段名 asc|desc])
- 表连接(尝试用excel理解)
- 内连接
- select 字段名
- from 表名1 inner join 表名2 on 表名1.字段名 = 表名2.字段名
- 注意内连接inner可以省略,直接使用join默认为内连接
- 左连接
- select 字段名
- from 表名1 left join 表名2 on 表名1.字段名 = 表名2.字段名
- 右连接
- select 字段名
- from 表名1 right join 表名2 on 表名1.字段名 = 表名2.字段名
- 内连接
- 子查询
- 子查询本身就是一段完整的查询语句,然后用括号英文括号()包裹嵌套在主查询语句中,子查询可以多层嵌套
遇到新的没学习到的函数会不断更新
学习途径:B站大师兄MySQL课程,牛客网刷题