SQL 数据分析知识点
1 sql 语句的执行顺序
select *
from xxx join xxx
where ...
group by ...
having ...
order by ...
limit ...;
执行顺序:
- from xxx join xxx:获取数据源
- where:过滤数据源
- group by:数据分组
- select:查询数据
- having:对查询出来的数据再过滤
- order by:对结果数据排序
- limit:显示数据条数
2. 表连接方式
纵向链接
2.1 union、union all
适用结构相同的表联结成一张大表
select *
from A
union
select *
from B
- union all:联结所有数据
- union:去重联结(所有列的值相同才算相同)
横向链接
2.2 join、inner join
内连接:返回两个表共同的行
select *
from table1
join table2
on table1.column_name=table2.column_name;
2.3 left join
左连接:以表 1 为基础,匹配表 2 的相同行
select *
from table1
left join table2
on table1.column_name=table2.column_name;
2.4 right join
右连接:以表 2 为基础,匹配表 1 的相同行
select *
from table1
right join table2
on table1.column_name=table2.column_name;
2.5 full outer join
全连接:返回全部数据,可以理解为左连接和右连接的结合
mysql 没有全连接
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');
日期时间格式符:
- 年份, 数字形式,4位数:%Y
- 年份, 数字形式 (2位数):%y
- 月份名称 (January..December):%M
- 月份, 数字形式 (00..12):%m
- 月份,数字形式(0..12):%c
- 该月日期, 数字形式 (00..31):%d
- 该月日期, 数字形式(0..31):%e
- 带有英语后缀的该月日期 (0th, 1st, 2nd, 3rd, ...):%D
- 小时(00..23):%H
- 小时(01..12):%h
- 小时 (01..12):%I
- 小时 (0..23):%k
- 小时 (1..12):%l
- 分钟,数字形式 (00..59):%i
- 秒 (00..59):%S
- 秒 (00..59):%s
- 微秒 (000000..999999):%f
- 上午(AM)或下午( PM):%p
- 时间 , 12小时制 (小时hh:分钟mm:秒数ss 后加 AM或PM):%r
- 时间 , 24小时制 (小时hh:分钟mm:秒数ss):%T
- 工作日的缩写名称 (Sun..Sat):%a
- 月份的缩写名称 (Jan..Dec):%b
- 周 (00..53), 其中周日为每周的第一天:%U
- 周 (00..53), 其中周一为每周的第一天 :%u
- 周 (01..53), 其中周日为每周的第一天 ; 和 %X同时使用:%V
- 周 (01..53), 其中周一为每周的第一天 ; 和 %x同时使用:%v
- 一年中的天数 (001..366):%j
- 工作日名称 (周日..周六):%W
- 一周中的每日 (0=周日..6=周六):%w
- 该周的年份,其中周日为每周的第一天, 数字形式,4位数;和%V同时使用:%X
- 该周的年份,其中周一为每周的第一天, 数字形式,4位数;和%v同时使用:%x
- ‘%’文字字符:%%
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常用字符串函数