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