MySQL数据分析常用函数方法

SQL 数据分析知识点

1 sql 语句的执行顺序

select *
from xxx join xxx
where ...
group by ...
having ...
order by ...
limit ...;

执行顺序:

  1. from xxx join xxx:获取数据源
  2. where:过滤数据源
  3. group by:数据分组
  4. select:查询数据
  5. having:对查询出来的数据再过滤
  6. order by:对结果数据排序
  7. limit:显示数据条数

2. 表连接方式

纵向链接

2.1 union、union all

适用结构相同的表联结成一张大表

select *
from A
union
select *
from B
  1. union all:联结所有数据
  2. union:去重联结(所有列的值相同才算相同)

横向链接

2.2 join、inner join

内连接:返回两个表共同的行


2022-01-14-18-37-22.png
select *
from table1
join table2
on table1.column_name=table2.column_name;

2.3 left join

左连接:以表 1 为基础,匹配表 2 的相同行


2022-01-14-18-42-19.png
select *
from table1
left join table2
on table1.column_name=table2.column_name;

2.4 right join

右连接:以表 2 为基础,匹配表 1 的相同行


2022-01-14-18-42-37.png
select *
from table1
right join table2
on table1.column_name=table2.column_name;

2.5 full outer join

全连接:返回全部数据,可以理解为左连接和右连接的结合
mysql 没有全连接


2022-01-14-18-35-11.png
select *
from table1
full outer join table2
on table1.column_name=table2.column_name;

3. 窗口函数

常用于组内排序,具体写法如下

<窗口函数> over (partition by <分组的列名>
                order by <排序的列名>)

窗口函数可以用 rank 相关函数或者聚合函数

3.1 rank, dense_rank, row_number

select *,
   rank() over (order by 成绩 desc) as ranking,
   dense_rank() over (order by 成绩 desc) as dese_rank,
   row_number() over (order by 成绩 desc) as row_num
from 班级表
  • rank:如果有并列名次的行,会占用下一名次的位置(1,1,3)
  • dense_rank:如果有并列名次的行,不占用下一名次的位置(1,1,2)
  • row_number:不考虑并列名次(1,2,3)

3.2 sum. avg, count, max, min

select *,
   sum(成绩) over (order by 学号) as current_sum,
   avg(成绩) over (order by 学号) as current_avg,
   count(成绩) over (order by 学号) as current_count,
   max(成绩) over (order by 学号) as current_max,
   min(成绩) over (order by 学号) as current_min
from 班级表

4.时间函数

当前日期+时间(date + time)函数:now()

select now();

当前时间戳函数:current_timestamp()

select current_timestamp();

日期或时间转换为字符串 函数:date_format(date,format), time_format(time,format)

  • date_format(datetime,formatting) 可以格式日期和时间(例如 YYYY-MM-DD HH:MM:SS)和(HH:MM:SS)
  • time_format(datetime,formatting) 只可以格式时间(HH:MM:SS)
select date_format('2021-01-01 10:10:10', '%Y%m%d%H%i%s');
select time_format('10:10:10', '%H%i%s');

日期时间格式符:

  1. 年份, 数字形式,4位数:%Y
  2. 年份, 数字形式 (2位数):%y
  3. 月份名称 (January..December):%M
  4. 月份, 数字形式 (00..12):%m
  5. 月份,数字形式(0..12):%c
  6. 该月日期, 数字形式 (00..31):%d
  7. 该月日期, 数字形式(0..31):%e
  8. 带有英语后缀的该月日期 (0th, 1st, 2nd, 3rd, ...):%D
  9. 小时(00..23):%H
  10. 小时(01..12):%h
  11. 小时 (01..12):%I
  12. 小时 (0..23):%k
  13. 小时 (1..12):%l
  14. 分钟,数字形式 (00..59):%i
  15. 秒 (00..59):%S
  16. 秒 (00..59):%s
  17. 微秒 (000000..999999):%f
  18. 上午(AM)或下午( PM):%p
  19. 时间 , 12小时制 (小时hh:分钟mm:秒数ss 后加 AM或PM):%r
  20. 时间 , 24小时制 (小时hh:分钟mm:秒数ss):%T
  21. 工作日的缩写名称 (Sun..Sat):%a
  22. 月份的缩写名称 (Jan..Dec):%b
  23. 周 (00..53), 其中周日为每周的第一天:%U
  24. 周 (00..53), 其中周一为每周的第一天 :%u
  25. 周 (01..53), 其中周日为每周的第一天 ; 和 %X同时使用:%V
  26. 周 (01..53), 其中周一为每周的第一天 ; 和 %x同时使用:%v
  27. 一年中的天数 (001..366):%j
  28. 工作日名称 (周日..周六):%W
  29. 一周中的每日 (0=周日..6=周六):%w
  30. 该周的年份,其中周日为每周的第一天, 数字形式,4位数;和%V同时使用:%X
  31. 该周的年份,其中周一为每周的第一天, 数字形式,4位数;和%v同时使用:%x
  32. ‘%’文字字符:%%

5.字符串函数

lower(str):将字符串参数值转换为全小写字母后返回

select lower('SQL');

upper(str):将字符串参数值转换为全大写字母后返回

select upper('sql');

concat(str1, str2,...):将多个字符串参数首尾相连后返回

  • 如果有任何参数为null,则函数返回null
  • 如果参数是数字,则自动转换为字符串
select concat('S','Q','L');

concat_ws(separator,str1,str2,...):将多个字符串参数以给定的分隔符 separator 首尾相连后返回

  • 如果有任何参数为null,则函数不返回null,而是直接忽略它
select concat_ws(';','First name','Second name','Last name');

substr(str,pos):截取从 pos 位置开始到最后的所有 str 字符串
substr(str, pos, len):截取 str 字符串,从 pos 位置开始的 len 个字符

  • mysql 中的起始位置 pos 是从1开始的
  • 如果为正数,就表示从正数的位置往下截取字符串(起始坐标从1开始)
  • 如果起始位置 pos 为负数,表示从倒数第几个开始截取
select substring('hello world',5);
o world
select substr('hello world',-5);
world

length(str):返回字符串的存储长度

  • 编码方式不同字符串的存储长度不同
select length('sql');

char_length(str):返回字符串中的字符个数

select char_length('sql');

format(X,D,locale):以格式 ‘#,###,###.##’ 格式化数字 X,D 指定小数位数,locale 指定国家语言(默认的 locale 为 en_US)

select format(12332.123456, 4),format(12332.2,0);
 12,332.1235             |     12,332     

left(str, len):返回最左边的len长度的子串

select left('chinaitsoft',5);

right(str, len):返回最右边的len长度的子串

select right('chinaitsoft',5);

ltrim(str),rtrim(str):去掉字符串的左边或右边的空格

select  ltrim('   barbar   ') rs1, rtrim('   barbar   ') rs2;

repeat(str, count):将字符串 str 重复 count 次后返回

select repeat('SQL',3);

reverse(str):将字符串 str 反转后返回

select reverse('abcdef');

引用

通俗易懂的学会:SQL窗口函数
mysql format时间格式化说明
MySQL常用字符串函数

你可能感兴趣的:(MySQL数据分析常用函数方法)