SQL够用教程 - 各职位各行业都应掌握的数据
2022-08-22 14:51:57 0 举报
AI智能生成
各行各业,各个职位的同学,都可以也必须要掌握的SQL数据知识!书不在深,能够用就行;课不在多,用起来才好!
作者其他创作
大纲/内容
觉得不错可以留言需求或者点赞,后续会更新更有用的语法知识!
内容介绍
人群
适合人群:产品经理、各类运营、金融贸易、医药健康等行业从业人员;以及后台、前端、客户端开发人员;
不适合人群:专业数据类开发
特点
基础知识点都整理好了,挨个看就看会了,其实SQL语法简单,只需要有效的看懂语法,基本也就掌握了,效率挺高的
适合入门型,非纯技术人员
如果是纯开发给你整理,一些概念他觉得没必要解释或者解释太深了,你可能看不懂
咱们按需去学习就行了,没必要直接上来就目标SQL大神,而且99%的工作,就是查表。不会让你去创建表。
如果到了需要做中间分析表的进度,那么恭喜你,已经入门了。
SQL入门数据分析
SQL入门
SQL相比于Excel的优势
可以快速访问数据—SQL允许您非常快速地从数据库中存储的数据中获得结果。可以优化代码以快速获取结果。
还有两个优势,当然,这就涉及到创表了,不是重点。不过可以知道一下:
数据库的数据完整性得到保证——只有你希望输入的数据被输入,并且只有特定的用户能够将数据输入到数据库中。
数据很容易共享——多个个人可以访问存储在数据库中的数据,并且数据对于所有用户都是相同的,这使得任何访问数据库的人都可以得到一致的结果。
可以直接从底层相对及时的拿到最真实的业务数据。而让开发导出来给你的数据,很多时候,是有‘坑’的。
坑,其实不是真的别人故意坑你,而是很多很多及其小的细节
任何以数据,你看到的数据未必是真实的数据,比如【日活】,如何定义日活?
日如何定义,时间就是一个问题
来源
数据产生的动作的日期?
数据入库的日期?
用户某些行为的日期?
时间范围
是自然日?
按照数据库每天跑数的日期?
可能是2点,也可能3点;
按照业务要求?
避免跨日对用户行为的割裂,那么可能从凌晨4点作为循环和开始。
活,如何定义?
打开APP时候的任意埋点上报就算?
触发登录验证的隐藏接口的时候再计算?
有任何APP埋点时间就计算?
完成某些特定行为才计算?
完成累计(比如累计几次动作、活跃时长)才计算?
坑,很多,你不懂,你就很难hold住这个业务。
过了一阵数据有问题的时候,老板问你为什么,你说不上来,这个时候可能就要去怪开发给你留‘坑’了。
为了拿到自己最想要的数据,为了能够清晰的理解自己工作的指明灯(各种指标),学习一定的SQL知识,是必须的。
SQL相比于Excel的联系
类似:数据库中的数据存储在类似于Excel电子表格的表中。
区别:在大多数情况下,可以将数据库看作是一堆Excel电子表格。每个电子表格都有行和列。其中,每一行保存关于事务、个人、公司等的数据,而每一列保存关于您所关心的行的某个特定方面的数据,如名称、位置、惟一id等。
区别:同一列中的所有数据必须在数据类型方面匹配。
问题:这意味着,如果在特定列中有一个带字符串的行,
那么整个列可能会更改为文本数据类型。如果您想用这一列做数学计算,这可能非常糟糕!
那么整个列可能会更改为文本数据类型。如果您想用这一列做数学计算,这可能非常糟糕!
优势:一致的列数据类型,是SQL能快速处理数据的主要原因之一
SQL语句
SQL语句可以理解为:‘撰写正确的SQL代码’;语句告诉数据库,你想要对数据进行什么操作
常见语句
CREATE TABLE - 是在数据库中创建新表的语句。
DROP TABLE - 是删除数据库中表的语句。
SELECT - 允许您读取数据并显示数据。这称为查询。
DROP TABLE - 是删除数据库中表的语句。
SELECT - 允许您读取数据并显示数据。这称为查询。
对于我们设定的用户,咱们主要用到的是SELECT语句,方便的从数据库中寻找到自己要的信息;
SQL基础语法知识
最最最最基础语句
SELECT
就如英文意思 - 选择
你想选择出你要的哪些数据
注意点
注意点:用SELECT出来的结果,并不是在数据库中建立了这个新表,他只是把数据结果输出出来
而其实SELECT 也是可以嵌套的,也就是对结果表进行操作
以后会用到
以后会用到
嵌套的查询中的过程表,只存在缓存里面
FROM
就如英文意思 - 来自
你像从哪里筛选(你要的数据)
注意点
你可能常见到FROM database;
但,很多时候也可能看到 FROM database.score_sheet
这个'.' 点是啥意思呢?意思就是从database这个库里的scores_sheet表里去取数
简单理解:一个Excel文件叫database,里面有一页是焦scores_sheet
注意注意注意!我们只能对具体的表进行处理,不可以对库进行处理
每次查询至少有一个SELECT 和 FROM语句;SELECT语句用于放置希望显示数据的列。FROM语句用于放置要从中提取数据的表。
案例
例:SELECT *
FROM database;
FROM database;
这句表示要从database这个表中,拿出所有数据
* 意思就是所有
很多查询语句和环境是优先返回前100行
如果想查询具体的列
查询A列 那么就写:SELECT A
查询A/B/C列 那么就写:SELECT A,B,C
基础语句
LIMIT
就如单词意思 - 限制
限制你想看到多少行数据
使用场景
只想看看这个表的概况,比如表头、每列内容,大概瞟一眼;如果不加LIMIT,用*可能会导致查询时间很长!所以使用LIMIT
限定前几行即可;
限定前几行即可;
案例
SELECT *
FROM database
LIMIT 10;
FROM database
LIMIT 10;
这里代表着就是把所有的行完整显示(*的作用)
从database这个表中
只取最上面的10行
如果你写10000就是前10000行
注意点
LIMIT应该在各个查询条件的最后一行
ORDER BY
就如词组意思 - 以···的顺序
你可以按照某一个列的数值进行排序
就是Excel里面的排序功能,同样的,可以升序和降序
升序:直接使用ORDER BY默认是升序
降序:在ORDER BY xxx 后加DESC降序排列
为啥是DESC?descending(降序)的缩写
使用场景
想看班里前十名的分数怎么办?按照分数进行排序,让大的在前面。
综合运用敲重点:可以用LIMIT只看前十名。
案例
SELECT *
FROM database
ORDER BY score DESC
LIMIT 10;
FROM database
ORDER BY score DESC
LIMIT 10;
注意LIMIT和ORDER BY 顺序
注意点
实际上ORDER BY不会改变表本身,只是对查询结果产生临时影响。
如果你在Excel里面排序,会影响整个表
也记住我们整个语句的第一个单词:SELECT;这也表明了只是筛选而咩有真正更改
可以多条件进行排序,多条件之间有判断的先后顺序
比如ORDER BY A,B,C
那么就会先按列A相同排序
A列值相同的行,再按B列大小进行排序
A/B两列都一样值的行,按照C列大小进行排序
再比如 ORDER BY A,B,C DESC
那么就会先按列A相同排序
A列值相同的行,再按B列大小进行排序
A/B两列都一样值的行,按照C列大小进行倒序排列
WHERE
就如单词意思 - 在···的地方/哪里
你要查找的是怎么样的内容,有哪些条件;这些条件,都放在这个语句下
想象成一个过滤器,通过条件过滤表格
类似于Excel里面的筛选功能
使用场景
想看这次考试数学超过140的怪胎怎么办?那么就对scores进行条件筛选
案例
SELECT name,scores
FROM database
WHERE scores >=140
FROM database
WHERE scores >=140
注意点
逻辑判断符号
既然涉及逻辑判断,就会有判断符号
>
<
>=
<=
=
!=
不等于
上面列的判断不仅是针对数字的,字符串(也就是文字)类型的也能使用,不过要加引号' '
例如:WHERE name='LISA RONG'
这个语句表示找出那个Lisa荣
一定要是单引号!
SELECT A/B AS ab_percent
AS
就如单词意思:如同;像···一样
使用场景
我们想计算大家的总成绩(语文、数学),看看前十名是谁
案例
SELECT name,(chn_scores + math_scores) AS tol_scores
FROM database
ORDER BY tol_scores
LIMIT 10;
FROM database
ORDER BY tol_scores
LIMIT 10;
我们把语文成绩+数学成绩,加起来后,命名新的一列叫做 tol_scores在结果中展示
注意点
之前的操作都是从已有的数据中进行筛选排列,这次经历了一次操作后取出
这个原本不存在的列,及其别名,通常只是临时的,仅在查询期间存在
下一次运行查询并访问此表时,新列将不在其中。
下一次运行查询并访问此表时,新列将不在其中。
计算符号
常见的:+-*/
()
记不记得四则运算的先后循序了?
忘了点这里
逻辑判断集合(基本都是在WHERE中使用的)
LIKE
就如单词意思: 像/如同/符合...的方式
经常和%号进行连用
如果你对office熟悉的话,应该知道搜索的时候,你搜一个词语,这个词语就会高亮。
如果加上一些符号,包含这些词语的句子或者段落就会高亮。
如果加上一些符号,包含这些词语的句子或者段落就会高亮。
%就是起这个作用
放在内容前面,意味着搜索的结果,前面还有内容
放在内容后面,意味着搜索的结果,后面还有内容
使用场景
我们想看看班里姓杨的都有谁
案例
SELECT name
FROM database
WHERE name LIKE '杨%'
FROM database
WHERE name LIKE '杨%'
如果你是想看班级里名字带’光‘的人
就是LIKE '%光'
IN
就如单词意思:在···内;
使用场景
你想知道班里小贤、小布、大力的成绩
案例
方法一
SELECT name,scores
FROM database
WHERE name='小贤' AND name='小布' AND name='大力'
SELECT name,scores
FROM database
WHERE name='小贤' AND name='小布' AND name='大力'
AND就是用来连接不同条件的啦!
方法二
SELECT name,scores
FROM database
WHERE name IN ('小贤','小布','大力')
SELECT name,scores
FROM database
WHERE name IN ('小贤','小布','大力')
NOT
就如单词意思:不
使用场景
是与IN和LIKE联合使用
IN,LIKE是找条件符合的行
在前面加上NOT,我们可以获取不满足特定条件的所有行
我想看班里除了姓杨的同学以外的成绩
案例
SELECT name,scores
FROM database
WHERE name NOT LIKE '杨%'
FROM database
WHERE name NOT LIKE '杨%'
BETWEEN & AND
BETWEEN如词语意思: 在···中间
数学理解就是一个区间
也就是一个取值范围
等同于变量a,A>a>B
使用场景
想看看班里这次有多少人不及格
案例
SELECT name,scores
FROM database
WHERE scores BETWEEN 0 AND 59
FROM database
WHERE scores BETWEEN 0 AND 59
当然你也可以用scores >= 0 AND scores <=59
OR
就如词语意思: 或者
使用场景
想看看大力、小美的成绩
SELECT name,scores
FROM database
WHERE name='大力' or name='小美'
FROM database
WHERE name='大力' or name='小美'
JOIN
简单语法说明
JOIN就如英文意思 - 并入、加入
JOIN的作用:让我们可以一次性从多个表中拿数据。
并且可以附加一些逻辑关系
为什么存在JOIN?本质上这是速度和时间问题。
很多人都会有同样的疑惑:一张表把所有的数据进行保存不就可以了么?
为什么要根据不同的业务、产品、属性对表进行各种区分呢?
为什么要根据不同的业务、产品、属性对表进行各种区分呢?
如果一张表内容太多的话,例如Excel文件如果达到200MB,电脑是不是打开很慢甚至打不开?
所以考虑到效率问题,往往表会根据业务等进行拆分
换句话说未来如果算力无限,那可能也不需要太复杂的表拆分了
事实上编程语言的发展确实和处理器的能力提升有直接关系
例如电商平台,订单表、用户信息表、商品表等往往是分开的,通过一些ID进行关联
合理的数据库设计是很重要的,数据库规范化也是挺重要的数据处理环节。不过这个部分重点介绍SELECT,CREAT以后有机会再说。
JOIN···ON···
就如英文字面意思:以某值为匹配标准,对两个表进行合并
也就是以某个变量为key
使用场景
假设班里成绩有两个表
一个表名student_result,内容是学号:id;英语成绩:eng_result;语文成绩:chn_result;数学成绩:math_result;
另一个表是一个表名student_info,内容有学号:id;姓名:name;性别:sex;体重:weight;身高:height;
你需要查询出整个班级的学生情况+考试成绩
示例
SELECT *
FROM studen_info
JOIN student_result
ON student_info.id = student_result.id
FROM studen_info
JOIN student_result
ON student_info.id = student_result.id
我们可以这么理解,SELECT 子句是指我们希望在结果输出中数据列;
FROM子句指出我们提取数据的表一;JOIN子句后指我们提取数据的表二;
ON是指你期望通过哪个列(也可以理解为变量值),将两个表进行拼接。
FROM子句指出我们提取数据的表一;JOIN子句后指我们提取数据的表二;
ON是指你期望通过哪个列(也可以理解为变量值),将两个表进行拼接。
假如只想要部分合并后的数据,比如只想知道姓名 + 各科成绩呢?
别忘了SELECT是用来控制输出表内容的哦。
别忘了SELECT是用来控制输出表内容的哦。
SELECT student_info.id,student_info.name,student_result.eng_result,student_result.chn_result,student_result.math_result
FROM studen_info
JOIN student_result
ON student_info.id = student_result.id
FROM studen_info
JOIN student_result
ON student_info.id = student_result.id
针对已经JOIN好的表,可以写SELECT studen_info.* 取出合并后,属于student_info 中的所有数据
语法细节
alias
和直接翻译一样:别名
给表格起名字
其实就是缩写成AS
sql查询时,尤其是产品/运营/市场等岗位查询,有明确的目标能实现就行了,如果每次都打student_info 很痛苦
可以给表直接命名,从而简化输入
SELECT si.id,si.name,sr.eng_result,sr.chn_result,sr.math_result
FROM studen_info AS si
JOIN student_result AS sr
ON si.id = sr.id
FROM studen_info AS si
JOIN student_result AS sr
ON si.id = sr.id
其实快速写的时候,AS是可以直接省略掉的,效果一样。
不仅是表,对于取值时候的列也可以
Select t1.column1 AS aliasname, t2.column2 AS aliasname2
FROM tablename AS t1
JOIN tablename2 AS t2
FROM tablename AS t1
JOIN tablename2 AS t2
其他join
直接使用JOIN的时候,其实是使用的INNER JOIN
数学都学过,就是取的并集
根据我们选定的key关键值(就是ON后面接的那个变量),只有两个表都存在这个key且一致,才会取出
也就是表A和表B的对应行必须同时key值存在且一致,该行才会出现在结果表中
只有当行作为两个表之间的匹配项存在时,我们才提取它们。
不一致的行,在结果表中相当于被抛弃了
举例
student_result和student_info这两个表中,我们期望是通过学号id进行匹配
但是学期进行中时,插班了3位同学,这个时候因为这些同学没有参加考试,所以student_result里面是没有相应信息的
SELECT *
FROM studen_info
JOIN student_result
ON student_info.id = student_result.id
FROM studen_info
JOIN student_result
ON student_info.id = student_result.id
这样查询出来的总表中,将没有插班生
我们希望查询出来的表有全班同学,怎么办?
怎么办?
INNER JOIN
最后返回的表,只显示两个表中都存在的行
LEFT JOIN
这种拼接,第一个表表1其实不会变,只是按照条件把表2符合条件的内容跟贴到表一同一行而已
RIGHT JOIN
同上,第二个表表2其实不会变,只是按照条件把表1符合条件的内容都贴到表2的同一行
OUTER JOIN
表一加表二都存在,只是符合条件的行进行了合并而已
注意,合并以后,没有数据列咋办呢?一般都是填充了NULL
而你可以很轻松发现,如果掌握以上语法,简单而基础的数据都可以取了!!!
可以针对自己想要跑的指标,在自己下的MySQL,或者公司的库里,多跑跑自己想要的数据
给自己定个任务吧!
定100个各类型的指标,并自己去取指标和分享给其他人。
经过这样的训练,我相信100行的SQL也不在话下了。
更深度更强的查询方式还有么?当然还有,比如with、having等,但是最实用的,个人经验,以上这些内容就非常非常够用了。毕竟咱们不是专门干数据开发、数据分析的。
如果想要深度讲解,给我留言或者点赞吧,我会持续更新!
一定要记得看延伸知识!对更好的、规范的使用SQL,更好理解表关系和JOIN有好处!
延伸知识
实体关系图,可以更好的帮助你理解表之间的关系,以及用好join
Entity Relationship Diagrams
简称ERD
ERD案例图
PK
primary key 其实代表的就是主键,每个表中都会有且只有一个主键
是说对于这个表中的每一行数据,会有一列对应的数据是唯一值,可以简单理解为这一行的身份证
例如学生信息表中(student_info),学号id就是唯一的
这个主键信息,在表中都是出于第一列的
FK
foreign key 就如名字我们直接翻译:外国钥匙 - 外部钥匙,用这个钥匙(值)可以去其他表,进行外交(匹配取数)
FK 一定是其他表中的PK,正因如此,才能在业务上把两个表的关系建立起来。
FK在每个表中国呢不一定是唯一的
而我们使用JOIN时,就是要找到两个表的PK FK去链接
两个表之间链接,是寻找两表之间的PK FK关系
多个表之间也是一样的,去寻找多个表相互联系的FK PK 关系
SQL代码习惯
在表名、变量名之类的地方不要用空格,但是在语句之间可以尽量用空格。
每段查询最后最好是用分号‘;’,这是一个好习惯,尤其是如果编译器支持多端查询的话;
如果是要看表包含什么,尽量用LIMIT
每段查询最后最好是用分号‘;’,这是一个好习惯,尤其是如果编译器支持多端查询的话;
如果是要看表包含什么,尽量用LIMIT
虽然SQL语法里面不区分大小写
但是尽量语法部分使用大写,从而和表名、列名等进行区分,这是最佳实践
让自己的查询一目了然,全部小写的其实也正常,但是那是工程化的时候用比较好(避免开发异常),但是我们自己写查询用的,尽量大小写要清晰,可阅读性非常重要。
避免表名、变量名中有空格‘ ’
推荐使用下划线‘_’
SQL也有办法去分辨表名空格,但是要在名字两边加上双引号
比如:"database ods"
这样才能查询database ods这个表
当然一般没有人会这么命名表
如果命名直接就是database_ods
使用起来要方便多了!
在查询语句中使用空格‘ ’
SQL查询忽略空格,因此您可以在代码之间添加任意数量的空格和空行,而且查询是相同的
SELECT account_id FROM orders
SELECT account_id
FROM orders
FROM orders
SELECT account_id
FROM orders
FROM orders
前面3种查询效果一样的
不过还是推荐中间都有一个空格,比较美观
语句最后使用分号‘;’
这是一个好习惯,尤其是如果编译器支持多端查询的话;
0 条评论
下一页