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常用字符串函数

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容