做数据分析的,为什么要写SQL?
没有数据的情况下,我们分析数据就像是巧妇难为无米之炊。因此,为了进行数据分析,我们必须获取数据。而大多数情况下,数据都存放在数据库中,这时候我们就必须要学会SQL取数了。
除了一部分公司专人专岗,有人帮你查好数据发你做分析,大部分情况还是需要你自己取数的。
本次我们沿用之前《极简统计学入门》的“MVP”思路,用三节的内容梳理一下SQL(基于MySQL8.0),整个系列框架如下
第1节 SQL简介与基础知识 SQL简介 SQL查询基础之DDL、DML、DQL SQL数据类型 SQL查询的执行顺序
第2节 窗口分析函数 窗口函数 分析函数
第3节 SQL近N日登录与连续登录N日问题 连续登录N天的用户数量
第4节 近N日留存的用户数及留存率 近N日留存的用户数及留存率
1. SQL简介
我们知道,SQL(结构化查询语言)是一种数据库语言,按照功能分类,有DDL、DQL、DML、DCL、TCL 五大类型,简单了解一下它们分别是做什么用的:
(1)DDL(Data Definition Language)
DDL是数据定义语言,主要用来定义或者改变表的结构。例如:create、alter、drop、truncate等语句。
(2)DQL(Data Query Language)
DQL是数据查询语言,主要用来从表中检索数据。例如:select语句。
(3)DML(Data Manipulation Language)
DML是数据操作语言,主要用来对数据库里表中的数据进行操作。例如:insert、delete、update等语句。
(4)DCL(Data Control Language)
DCL是数据控制语言,主要用来设置或更改数据库用户或角色对数据的访问权限。例如:grant、revoke等语句。
(5)TCL(Transaction Control Language)
TCL是事务控制语言,主要用来控制事务。例如:COMMIT、ROLLBACK等语句。
了解了以上分类,我们简单回顾一下其中DDL、DML、DQL的基础语法(有基础的可直接跳过看SQL查询与执行顺序)
2. SQL基础之DDL、DML、DQL
① 数据定义语言 (DDL)
定义数据库当中的对象 (库、表) 关键字: create、delete、alter、show
创建数据库
创建数据库 create database 数据库名创建指定字符集的数据库 create database 数据库名 charset set 字符集编码创建一个数据库(先判断数据库是否已存在,如果不存在则进行创建) create database if not exist数据库名
查看数据库
查询所有数据库名称
show database;
查询指定数据库的字符集 并显示创建语句
show create database 数据库名;
删除数据库
删除指定数据库
drop database 数据库名;
删除指定数据库,如果不存在则不删除
drop database 数据库名 if exist;
进入指定数据库
use 数据库名;
创建表
create table 表名(字段名 字段类型)
create table table_name
(
column_1 int null,
column_2 int null
);
复制表
只复制结构
create table 新表名 like 被复制的表名;
执行上述语句后,将创建一个名为table2的新表,其结构与table1完全相同,但不会复制table1中的任何数据。
复制结构和数据
create table 新表名 as select * from 被复制的表名;
上述语句将创建一个名为table2的新表,其结构和数据与table1完全相同。
查询表
查询库里面有哪些表
show tables;
查询表的结构
describe 表名;
查询指定表的创建语句
show create table 表名;
修改表
给表添加 (多个) 字段
alter table 表名 add column (字段名 字段类型,字段名 字段类型);
修改表字段的数据类型
alter table 表名 modify column 字段名 字段类型;
修改表字段的字段名
alter table 表名 change column 旧字段名 新字段名 字段类型;
删除一个字段
alter table 表名 drop column 字段名;
修改表名
alter table 表名 rename 新表名;
② 数据操作语言 (DML)
操作数据 (增、删、改) 关键字: insert、delete、update
添加数据
指定列名添加
insert into 表名 (字段名1,字段名2) values(数值1,数值2);
全部列的添加
insert into 表名 values (数值1,···,最后一个数值);
一次性插入多条数据
insert into 表名 values
(数值1_1,数值2_1···,最后一个数值n_1),
(数值1_2,数值2_2···,最后一个数值n_2),
(数值1_n,数值2_n···,最后一个数值n_n);
删除数据
删除表的指定数据
delete from 表名 where 字段名 = 字段值;
truncate 删除全表的数据
truncate table 表名;
drop 删除全表(包括定义和数据。)
drop table 表名;
drop、truncate、delete 三者的区别
drop用于删除数据库对象,包括定义和数据。truncate用于删除表中的所有数据,但保留表的定义。delete用于删除表中的行,可以根据条件删除特定的数据,并且可以回滚。
修改数据
修改指定字段数据
update 表名 set 字段名 = 数据值 where 字段名 = 数据值;
同时修改多个字段
update 表名 set 字段名1=数据值1,字段名2=数据值2 where 字段名 = 数据值;
在基础数据上进行修改(某列的值减去3)
update 表名 set 字段名1 = 字段名1 -3;
③ 数据库查询语言 (DQL)
查询数据
查询表中所有数据
select * from 表名;
查询表的指定列
select 字段名1, 字段名2 from 表名;
指定别名查询
select 字段名 as 别名 from 表名;
常量列查询
select 字段名 as 自定义名字,临时常量 as 别名 from 表名;
合并列查询
select 字段名 as 自定义名字,(字段 1 + 字段2) as 别名 from 表名;
条件查询 (跟在 where 后面的关键字) 条件运算符
< # 小于
> # 大于
<= # 小于等于
>= # 大于等于
<> # 不等于
!= # 不等于
between…and… # 在……范围内
in # 包括
like # 模糊查询
is null # 是否为空
and # 且
or # 或
not # 非
模糊查询
select * from 表名 where 字段名 like "关键词";
select * from 表名 where 字段名 like "%hello%";
select * from 表名 where 字段名 like "%_大学%";
聚合查询
max():获取查询后结果的最大值
select max(字段名) from 表名;
min():获取查询后结果的最小值
select min(字段名) from 表名;
avg():获取查询后结果的平均值
select avg(字段名) from 表名;
sum():获取查询后结果的总和
select sum(字段名) from 表名;
count():获取查询后结果的总记录数
select count (字段名) from 表名;
排序查询关键字: order by 默认是升序 asc,降序 desc
select *
from table_class
order by id desc;
分组查询关键字:group by
统计每个班级有多少人
select class_name,count(*)
from table_class
group by class_name;
统计班级人数大于2个人的班级
select class_name,count(*)
from table_class
group by class_name
having count (*)>=2;
内连接查询
两张表交叉后并且过滤后的数据查询 (交集)关键字: inner join
select *
from table_a a
inner join table_b b
on a.aid = b.bid;
左 (外) 连接查询
左表 (table_a) 的记录将会全部表示出来,而右表 (table_b) 只会显示符合搜索条件的记录,右表记录不足的地方均为 NULL 关键字: left join。
select *
from table_a a
left join table_b b
on a.a_id = b.b_id;
右 (外) 连接查询
左表 (a_table) 只会显示符合搜索条件的记录,而右表 (b_table) 的记录将会全部表示出来,左表记录不足的地方均为 null 关键字: right join
select *
from table_a a
right join table_b b
on a.a_id = b.b_id;
结果合并
(select colum_1,colum_2,...,colum_n
from table_a)
union
(select colum_1,colum_2,...,colum_n
from table_b)
两个select语句具有相同的列数和相似的数据类型。如果列数不匹配,可以使用null或者空字符串填充缺失的列
使用 union 时,数据完全相同的记录,将会被合并,由于合并比较耗时,一般不直接使用 union 进行合并,而是采用 union all进行合并。
(select id,name from table_a
order by id)
union all
(select id,name from table_b
order by id);
#没有排序效果
(select id,name from table_a )
union all
(select id,name from table_b )
order by id;
#有排序效果
子查询
将一个 SQL 语句的查询结果 (单列数据) 作为另一个 SQL 语句的查询条件。
select *
from table_a
where id_a in
(select id_b
from table_a);
好了,以上内容,我们简单回顾了一下SQL的基本函数,下面我们开始正式内容:
如果你接触过不同编程语言就会发现,任何编程语言的学习,都离不开3个最基本的核心要素,数据类型、流程控制、函数
数据类型是用来描述数据的性质和特征的,它决定了数据在计算和处理过程中的行为和规则。常见的数据类型包括整数、浮点数、字符串、日期等。简而言之,数据类型就是你将要操作的东西具有什么样的特点。
流程控制是指通过条件判断和循环等方式,控制程序按照一定的顺序执行不同的操作步骤。它决定了数据的处理流程,包括判断条件、循环次数、分支选择等。简而言之,流程控制解决的问题就是你要操作这个东西的基本流程是什么。
函数是一段预先定义好的代码,用于执行特定的操作或计算。它接受输入参数,并返回一个结果。函数可以用来对数据进行各种计算、转换、筛选等操作,以满足特定的需求。简而言之,函数解决的问题就是你要怎么样才能可复用地操作这一类东西。
SQL极简教程系列我们重点讨论数据类型与函数,下面我们先来看第一个核心要素:
3. 数据类型
① 整数类型
| 整数类型 | 用途 | 范围 |
|---|---|---|
| tinyint | 用于存储小整数值 | -128到127,即()到() |
| smallint | 用于存储较小的整数值 | -32768到32767 ,即()到() |
| mediumint | 用于存储中等大小的整数值 | -8388608到 8388607 ,即()到() |
| int | 用于存储普通大小的整数值 | -2147483648到2147483647,即 ()到() |
| bigint | 用于存储大整数值 | -9223372036854775808到9223372036854775807,即 () 到 () |
② 浮点类型
| 浮点类型 | 用途 | 范围 |
|---|---|---|
| float | 用于存储单精度浮点数值 | -3.402823466E+38到-1.175494351E-38,0,1.175494351E-38到3.402823466E+38 |
| double | 用于存储双精度浮点数值 | -1.7976931348623157E+308到-2.2250738585072014E-308,0,2.2250738585072014E-308到1.7976931348623157E+308 |
③ 字符串类型
| 数据类型 | 用途 | 特点 |
|---|---|---|
| char | 用于存储固定长度的字符串 | 存储的字符串长度固定,最多可以存储255个字符 |
| varchar | 用于存储可变长度的字符串 | 存储的字符串长度可变,最多可以存储65535个字符 |
| binary | 用于存储二进制数据 | 存储的数据以二进制形式存储,最多可以存储255个字节 |
| varbinary | 用于存储可变长度的二进制数据 | 存储的数据以二进制形式存储,长度可变,最多可以存储65535个字节 |
| text | 用于存储较长的文本数据 | 存储的文本数据长度可变,最多可以存储65535个字符 |
| blob | 用于存储较大的二进制数据 | 存储的二进制数据长度可变,最多可以存储65535个字节 |
④ 日期类型
| 数据类型 | 用途 | 范围 |
|---|---|---|
| date | 用于存储日期值 | '1000-01-01'到'9999-12-31' |
| time | 用于存储时间值 | '-838:59:59'到'838:59:59' |
| datetime | 用于存储日期和时间值 | '1000-01-01 00:00:00'到'9999-12-31 23:59:59' |
| timestamp | 用于存储日期和时间值,自动更新 | '1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC |
| year | 用于存储年份值 | 1901到2155 |
如果上面内容看明白了,恭喜你已经学会了如何描述你要操作的对象的特点了,接着我们看第二个核心问题:函数。一般无外乎针对字符串的函数、针对日期的函数、针对数值运算的函数、以及操作数据转化的函数:


雷达卡

















京公网安备 11010802022788号







