很可惜 T 。T 您現(xiàn)在還不是作者身份,不能自主發(fā)稿哦~
如有投稿需求,請(qǐng)把文章發(fā)送到郵箱tougao@appcpx.com,一經(jīng)錄用會(huì)有專人和您聯(lián)系
咨詢?nèi)绾纬蔀榇河鹱髡哒?qǐng)聯(lián)系:鳥哥筆記小羽毛(ngbjxym)
做一個(gè)對(duì)世界充滿好奇的人!做數(shù)據(jù)分析就離不開相關(guān)“數(shù)據(jù)”的處理,而應(yīng)用在數(shù)據(jù)分析中常見使用的兩種主要語言是SQL和Python,還由于Excel處理十萬以內(nèi)的數(shù)據(jù)沒有問題,但數(shù)據(jù)過多,處理效率就會(huì)下降,這時(shí)候就需要數(shù)據(jù)庫SQL語句來處理了。SQL作為一種結(jié)構(gòu)化查詢語言,用于與關(guān)系數(shù)據(jù)庫進(jìn)行通信的標(biāo)準(zhǔn)語言,是數(shù)據(jù)分析人員離不開的工具。數(shù)據(jù)分析模型都來自關(guān)系數(shù)據(jù)庫。
在數(shù)據(jù)分析招聘中,SQL也是必考能力之一,現(xiàn)在很多公司都有數(shù)據(jù)庫,都需要學(xué)習(xí)SQL,可以說是基礎(chǔ)技能了,現(xiàn)在是大數(shù)據(jù)時(shí)代,可能公司的數(shù)據(jù)非常之多,大數(shù)據(jù)是未來的趨勢(shì),在工作當(dāng)中用sql還是比較多的。SQL主要體現(xiàn)數(shù)據(jù)查詢、數(shù)據(jù)提取、數(shù)據(jù)監(jiān)測(cè)上,如:
?運(yùn)營需要通過數(shù)據(jù)庫追蹤活動(dòng)效果,通過數(shù)據(jù)反饋即使更改策略~
?產(chǎn)品需要通過數(shù)據(jù)判斷形式,通過數(shù)據(jù)調(diào)整方案~
·······
所以本期,數(shù)據(jù)·領(lǐng)地讀書會(huì)的直播總結(jié),就來跟大家一起來品讀《SQL必知必會(huì)》,總結(jié)一下學(xué)習(xí)SQL的路徑是怎么樣的,這本書也沒有過多闡述數(shù)據(jù)庫基礎(chǔ)理論,而是專門針對(duì)一線軟件開發(fā)人員,直接從SQL SELECT開始,講述實(shí)際工作環(huán)境中最常用和最必需的SQL知識(shí),實(shí)用性極強(qiáng)。通過本書,讀者能夠從沒有多少SQL經(jīng)驗(yàn)的新手,迅速編寫出世界級(jí)的SQL!
在這過程中,建議全程認(rèn)真聽,帶著思考來聽(去看),有任何問題都可以隨時(shí)交流哦!
首先,說下為什么要學(xué)SQL,目前職場(chǎng)中不少的求職崗位都需要會(huì)sql的,尤其是數(shù)據(jù)分析相關(guān)崗位,是必備的能力之一,也是做數(shù)據(jù)分析利器,也是入門必學(xué)。
只要在工作中需要數(shù)據(jù)反饋的,都離不開SQL的使用。一般想通過SQL尋求崗位需要掌握以下幾點(diǎn)就可以了
1)會(huì)利用SQL操作開關(guān)系數(shù)據(jù)庫mysql進(jìn)行查詢
2)數(shù)據(jù)庫的分組、聚合、排序
3)存儲(chǔ)過程
4)對(duì)于增刪改、約束、索引、數(shù)據(jù)庫范式均大致了解即可,不需要深入
再來講講,學(xué)習(xí)SQL的路徑是怎么樣,回憶起來自己從剛開始不會(huì)SQL,到現(xiàn)在SQL 寫的非常熟練,結(jié)合自己學(xué)習(xí)工作的經(jīng)驗(yàn),總結(jié)SQL學(xué)習(xí)路徑,如下:
1)首先,先了解SQL 使用場(chǎng)景,數(shù)據(jù)庫等相關(guān)概念。
只要跟數(shù)據(jù)相關(guān)的工作其實(shí)都可以用到SQL,特別是數(shù)據(jù)量較大的情況下,Excel 處理不了的情況下。
2)其次,學(xué)習(xí)SQL基本的語法,掌握一些簡(jiǎn)單的SQL書寫。
包括select、where、group by、having、order by、delete、insert、join、update等,可以做日常的取數(shù)或簡(jiǎn)單的分析(該水平運(yùn)營、產(chǎn)品等非數(shù)據(jù)崗就夠了);
3)再學(xué)習(xí)掌握并熟練使用SQL高階語法。
比如集合、分組聚合、子查詢、條件邏輯、字符串函數(shù)、算術(shù)函數(shù)、日期時(shí)間函數(shù),并且知道MySQL、Oracle、SQL Server等數(shù)據(jù)庫的語法差異;
4)之后,進(jìn)階學(xué)習(xí)如何優(yōu)化SQL語句,以期達(dá)到最高查詢效率。
了解事務(wù)、鎖、索引、約束、視圖、元數(shù)據(jù)等概念,并且學(xué)會(huì)使用hive sql、spark sql、pymysql等工具,多表查詢,窗口函數(shù)等~
5)最終,需要根據(jù)業(yè)務(wù)需求,將需求轉(zhuǎn)化成SQL。
業(yè)務(wù)理解足夠深,即知道需要用什么樣的數(shù)據(jù)指標(biāo)來分析、解決業(yè)務(wù)問題。比如說,統(tǒng)計(jì)一個(gè)班級(jí)的及格和不及格占比,統(tǒng)計(jì)考試中前20排名,
總之,SQL語言是數(shù)據(jù)分析工具之一,最終是為了服務(wù)于業(yè)務(wù)的。建?這個(gè)認(rèn)知后以及基本的入門知識(shí),之后你需要做的就是練習(xí),練習(xí),在練習(xí)。
《SQL必知必會(huì)》這本書的優(yōu)點(diǎn)是可以快速入門,適合新手小白,語言通俗易懂,讀著不會(huì)犯困。全書200來頁,覆蓋的知識(shí)點(diǎn)也很全:
·了解SQL(SQL基礎(chǔ)概念)
·檢索數(shù)據(jù)(Select語句)
·過濾數(shù)據(jù)(where 子句)
·創(chuàng)建計(jì)算字段(concat函數(shù)、||的用法)
·匯總數(shù)據(jù)(常見的聚合函數(shù),如COUNT、MAX、SUM、AVG等)
·分組數(shù)據(jù)(Groupby、having)
·使用子查詢(in & exits)
·表連接(left join 、right join 、full outer join)
·數(shù)據(jù)增刪改(DDL、DML)
·使用視圖
·使用存儲(chǔ)過程
·使用游標(biāo)
·····
那么,接下來,讓我們來一起回顧一下:
什么是數(shù)據(jù)庫,數(shù)據(jù)庫就是存數(shù)據(jù)管理數(shù)據(jù)的一個(gè)東西系統(tǒng),稱之為數(shù)據(jù)庫管理系統(tǒng)(Database Management System,DBMS),DBMS根據(jù)保存的格式分為5種,
層次數(shù)據(jù)庫(Hierarchical Database,HDB)
關(guān)系數(shù)據(jù)庫(Relational Database,RDB)
面向?qū)ο髷?shù)據(jù)庫(Object Oriented Database,OODB)
XML數(shù)據(jù)庫(XML Database,XMLDB)
鍵值存儲(chǔ)系統(tǒng)(Key-Value Store,KVS),舉例:MongoDB
我們最常用的就是關(guān)系型數(shù)據(jù)庫:
Oracle Database:甲骨文公司的RDBMS
SQL Server:微軟公司的RDBMS
DB2:IBM公司的RDBMS
PostgreSQL:開源的RDBMS
MySQL:開源的RDBMS
數(shù)據(jù)庫中存儲(chǔ)的表結(jié)構(gòu)類似于excel中的行和列,行稱為記錄,它相當(dāng)于一條記錄,列稱為字段,主鍵:是這一列唯一標(biāo)識(shí)表里的每一行,在這一列中沒有重復(fù)的。
SQL是什么呢?SQL是跟數(shù)據(jù)庫交流的語言,用SQL指揮數(shù)據(jù)庫去干這個(gè)干那個(gè),想讓他干啥就干啥。
SQL的語言分三類,這個(gè)大概就了解一下,
第一類:DDL
DDL(Data Definition Language,數(shù)據(jù)定義語言) 用來創(chuàng)建或者刪除存儲(chǔ)數(shù)據(jù)用的數(shù)據(jù)庫以及數(shù)據(jù)庫中的表等對(duì)象。DDL 包含以下幾種指令。
CREATE :創(chuàng)建數(shù)據(jù)庫和表等對(duì)象
DROP :刪除數(shù)據(jù)庫和表等對(duì)象
ALTER :修改數(shù)據(jù)庫和表等對(duì)象的結(jié)構(gòu)
第二類:DML
DML(Data Manipulation Language,數(shù)據(jù)操縱語言) 用來查詢或者變更表中的記錄。變更:DML 包含以下幾種指令。
SELECT :查詢表中的數(shù)據(jù)
INSERT :向表中插入新數(shù)據(jù)
UPDATE :更新表中的數(shù)據(jù)
DELETE :刪除表中的數(shù)據(jù)
第三類:DCL(了解)
DCL(Data Control Language,數(shù)據(jù)控制語言) 用來確認(rèn)或者取消對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行的變更。除此之外,還可以對(duì) RDBMS 的用戶是否有權(quán)限操作數(shù)據(jù)庫中的對(duì)象(數(shù)據(jù)庫表等)進(jìn)行設(shè)定。DCL 包含以下幾種指令。
COMMIT :確認(rèn)對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行的變更
ROLLBACK :取消對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行的變更
GRANT :賦予用戶操作權(quán)限
REVOKE :取消用戶的操作權(quán)限
實(shí)際使用的 SQL 語句當(dāng)中有 90% 屬于 DML,已經(jīng)認(rèn)識(shí)數(shù)據(jù)庫的基本信息了,那我們可以創(chuàng)建一個(gè)數(shù)據(jù)庫。
#創(chuàng)建數(shù)據(jù)庫
-- 語法:CREATE DATABASE < 數(shù)據(jù)庫名稱 > ;
CREATE DATABASE guagua;
創(chuàng)建好數(shù)據(jù)庫之后還需要?jiǎng)?chuàng)建個(gè)表,數(shù)據(jù)是存儲(chǔ)在表里,那就創(chuàng)建一個(gè)學(xué)生的表
#創(chuàng)建表
/*
語法:
CREATE TABLE < 表名 >
( < 列名 1> < 數(shù)據(jù)類型 > < 該列所需約束 > ,
< 列名 2> < 數(shù)據(jù)類型 > < 該列所需約束 > ,
< 列名 3> < 數(shù)據(jù)類型 > < 該列所需約束 > ,
< 列名 4> < 數(shù)據(jù)類型 > < 該列所需約束 > ,
.
.
.
< 該表的約束 1> , < 該表的約束 2> ,……);
*/
CREATE TABLE students(
sid int NOT NULL AUTO_INCREMENT,
sname VARCHAR(100) NOT NULL,
course VARCHAR(32) NOT NULL,
score decimal(18,1) NOT NULL,
sex varchar(10) ,
class varchar(10) NOT NULL,
Sage datetime,
PRIMARY KEY(sid)
) ;
這里可以稍微提一下命名規(guī)則:
書寫規(guī)則:
數(shù)據(jù)庫創(chuàng)建的表中都需要必須指定數(shù)據(jù)類型,如果創(chuàng)建錯(cuò)誤會(huì)出現(xiàn)報(bào)錯(cuò)的情況。
四種最基本的數(shù)據(jù)類型
INTEGER 型:用來指定存儲(chǔ)整數(shù)的列的數(shù)據(jù)類型(數(shù)字型),不能存儲(chǔ)小數(shù)。
CHAR型用來存儲(chǔ)定長字符串,當(dāng)列中存儲(chǔ)的字符串長度達(dá)不到最大長度的時(shí)候,使用半角空格進(jìn)行補(bǔ)足,由于會(huì)浪費(fèi)存儲(chǔ)空間,所以一般不使用。
VARCHAR 型用來存儲(chǔ)可變長度字符串,定長字符串在字符數(shù)未達(dá)到最大長度時(shí)會(huì)用半角空格補(bǔ)足,但可變長字符串不同,即使字符數(shù)未達(dá)到最大長度,也不會(huì)用半角空格補(bǔ)足。
DATE 型用來指定存儲(chǔ)日期(年月日)的列的數(shù)據(jù)類型(日期型)。
指定數(shù)據(jù)類型之后后面還有一個(gè)not null,對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行限制了,我們把這種叫做約束,約束分兩種,一種是非空約束,就是必須輸入數(shù)據(jù),另一種是主鍵約束,代表唯一值,就是剛剛提到的。
AUTO_INCREMENT自增約束:每當(dāng)增加一行時(shí)自動(dòng)增量。每次執(zhí)行一個(gè)INSERT操作時(shí),MySQL自動(dòng)對(duì)該列增量
DEFAULT:默認(rèn)值設(shè)定
表的其他操作可以熟悉一下
# 修改表
-- 添加列 ALTER TABLE < 表名 > ADD COLUMN < 列名 >;
ALTER TABLE students ADD COLUMN aaa VARCHAR(100);
-- 刪除列 ALTER TABLE product DROP COLUMN aaa;
ALTER TABLE students DROP COLUMN aaa ;
# 刪除表
-- 整個(gè)表刪除 DROP TABLE < 表名 > ;
-- 刪除的表是無法恢復(fù)的,只能重新插入,請(qǐng)執(zhí)行刪除操作時(shí)無比要謹(jǐn)慎
-- 清空表TRUNCATE TABLE TABLE_NAME;
-- 優(yōu)點(diǎn):相比drop``/``delete,truncate用來清除數(shù)據(jù)時(shí),速度最快。
# 注意:ALTER TABLE 語句和 DROP TABLE 語句一樣,執(zhí)行之后無法恢復(fù)
創(chuàng)建好數(shù)據(jù)庫了然后可以把數(shù)據(jù)添加到數(shù)據(jù)庫了,這樣要用到insert into¥
# 插入數(shù)據(jù)
-- INSERT INTO <表名> (列1, 列2, 列3, ……) VALUES (值1, 值2, 值3, ……);
# 可以省略列名,會(huì)默認(rèn)按照從左到右的順序賦給每一列,不建議用
insert into students (sname , course, score , sex , class , Sage ) values('趙雷' , '語文', 98 , '男', '一班','1990-12-21');
insert into students (sname , course, score , sex , class , Sage ) values('趙雷' , '數(shù)學(xué)', 34 , '男', '一班','1990-12-21');
insert into students (sname , course, score , sex , class , Sage ) values('趙雷' , '英語', 69 , '男', '一班','1990-12-21');
insert into students (sname , course, score , sex , class , Sage ) values('李四' , '語文', 76 , '女', '二班','1991-12-21');
insert into students (sname , course, score , sex , class , Sage ) values('李四' , '數(shù)學(xué)', 45 , '女', '二班','1991-12-21');
insert into students (sname , course, score , sex , class , Sage ) values('李四' , '英語', 56 , '女', '二班','1991-12-21');
insert into students (sname , course, score , sex , class , Sage ) values('李五' , '語文', 33 , '女', '三班','1994-12-21');
insert into students (sname , course, score , sex , class , Sage ) values('李五' , '數(shù)學(xué)', 56 , '女', '三班','1994-12-21');
insert into students (sname , course, score , sex , class , Sage ) values('李五' , '英語', 88 , '女', '三班','1994-12-21');
#可以使用INSERT … SELECT 語句從其他表復(fù)制數(shù)據(jù)
-- 將學(xué)生表的數(shù)據(jù)復(fù)制到學(xué)生表復(fù)制表中
INSERT INTO students (sname , course, score , sex , class , Sage )
SELECT sname , course, score , sex , class , Sage
FROM students;
執(zhí)行一次 INSERT 語句會(huì)插入一行數(shù)據(jù)。插入多行時(shí),通常需要循環(huán)執(zhí)行 INSERT 語句,數(shù)據(jù)添加好了,想修改數(shù)據(jù)咋辦,update...set...$
# 修改數(shù)據(jù)
/*
UPDATE <表名>
SET <列名> = <表達(dá)式> [, <列名2>=<表達(dá)式2>...];
WHERE <條件>; -- 可選,非常重要。
*/
-- 注意添加 where 條件,否則將會(huì)將所有的行按照語句修改,
-- 把李五的性別改成女的,班級(jí)改成四班
UPDATE students
SET sex = '女', -- 可以講null當(dāng)做一個(gè)值來使用
class = '四班'
WHERE sname = '李五';
-- UPDATE 語句的 SET 子句支持同時(shí)將多個(gè)列作為更新對(duì)象。
# 刪除數(shù)據(jù)
-- 刪除數(shù)據(jù)跟修改數(shù)據(jù)語法相似,delect from <表名> where 條件 (非常重要)
刪除數(shù)據(jù)跟修改數(shù)據(jù)相似就不在重復(fù)說了,重點(diǎn)就是不要忘記where。
1、簡(jiǎn)單查詢
#從表中提取數(shù)據(jù)
select * from students;
select sname from students;
select distinct sname from students;
值得一提的是如果
從表中選取數(shù)據(jù):SELECT <列名>,<列名>,<列名> FROM <表名>;
注意:DISTINCT關(guān)鍵字作用于所有的列,不僅僅是跟在其后的那一列
想從中篩選出符合條件的列用where字句指定查詢數(shù)的條件,where后面要跟條件表達(dá)式
算數(shù)運(yùn)算符:四則運(yùn)算
注意:如果有括號(hào)優(yōu)先處理
還有 is null/is not null
#運(yùn)用
# 查詢及格的信息
select * from students where score>=60;
#查詢出一班和二班里及格的學(xué)生
select * from students where score>=60 and (class='一班' or class='二班' ) ;
-- 其他的方法自行探索
2、聚合查詢
注意:聚合函數(shù)對(duì)null是排除在外的,COUNT(*)除外
COUNT(*)會(huì)得到包含NULL的數(shù)據(jù)行數(shù),而COUNT(<列名>)會(huì)得到NULL之外的數(shù)據(jù)行數(shù)
# 計(jì)算最高分和最低分
select max(score),min(score) from students;
# 計(jì)算里面多少個(gè)學(xué)生
select count(distinct sname) from students;
這些聚合函數(shù)運(yùn)行的時(shí)候計(jì)算的整體的數(shù),那我想分組匯總怎么辦,那就可以用group by。
3、分組
group by
SELECT <列名1>,<列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……;
# 計(jì)算每個(gè)考試科目里面的最高分和最低分
select course,max(score),min(score) from students group by course;
GROUP BY子句必須出現(xiàn)在WHERE子句之后,ORDER BY子句之前。
group by 能不能使用別名,可以,where 不能使用別名
with rollup是用來在分組統(tǒng)計(jì)數(shù)據(jù)的基礎(chǔ)上再進(jìn)行統(tǒng)計(jì)匯總
having:過濾分組
分組統(tǒng)計(jì)之后想再添加條件過濾,那就用到having
# having 過濾分組
# 語文和數(shù)學(xué)考試中最高分和最低分分別是多少
select course,max(score),min(score) from students group by course having course in ('數(shù)學(xué)','語文') ;
where 和having非常類似,唯一的差別是WHERE過濾行,而HAVING過濾分組。HAVING支持所有WHERE操作符。
4、排序
order by:排序
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
ORDER BY <排序基準(zhǔn)列1>, <排序基準(zhǔn)列2>, ……
SQL中的執(zhí)行結(jié)果是隨機(jī)排列的,當(dāng)需要按照特定順序排序時(shí),可已使用ORDER BY子句。
order by中可以使用別名
ps:語句的執(zhí)行順序
1、函數(shù)
函數(shù)大致分為如下幾類:
●算術(shù)函數(shù) (用來進(jìn)行數(shù)值計(jì)算的函數(shù))
●字符串函數(shù) (用來進(jìn)行字符串操作的函數(shù))
●日期函數(shù) (用來進(jìn)行日期操作的函數(shù))
●轉(zhuǎn)換函數(shù) (用來轉(zhuǎn)換數(shù)據(jù)類型和值的函數(shù))
●聚合函數(shù) (用來進(jìn)行數(shù)據(jù)聚合的函數(shù))
算術(shù)函數(shù)
●ABS – 絕對(duì)值
●MOD – 求余數(shù),語法:MOD( 被除數(shù),除數(shù) )
●ROUND – 四舍五入,語法:ROUND( 對(duì)象數(shù)值,保留小數(shù)的位數(shù) )
字符串函數(shù)
●CONCAT – 拼接,語法:CONCAT(str1, str2, str3)
●LENGTH – 字符串長度,語法:LENGTH( 字符串 )
●LOWER – 小寫轉(zhuǎn)換
●REPLACE – 字符串的替換,語法:REPLACE( 對(duì)象字符串,替換前的字符串,替換后的字符串 )
●LETF-從左開始截取字符串,語法:LEFT(被截取字段,截取長度)
●RIGHT-從右開始截取字符串,語法:right(被截取字段,截取長度)
●mid-自定義截取,語法:mid(被截取字段,從那位置開始,截取幾個(gè)字符數(shù))
●SUBSTRING – 截取字符串,substring(被截取字段,從第幾位開始截?。?,substring(被截取字段,從第幾位開始截取,截取長度)
●SUBSTRING_INDEX –按關(guān)鍵字截取字符串,語法:substring_index(被截取字段,分隔符,關(guān)鍵字出現(xiàn)的次數(shù))
●group_concat,字符串分組拼接
# 字符串截取
select substring_index('趙雷-一班-一年級(jí)',"-",1) ; -- 從左邊關(guān)鍵字出現(xiàn)第1次,截取字符串之前所有
select substring_index('趙雷-一班-一年級(jí)',"-",2) ; -- 從左邊關(guān)鍵字出現(xiàn)第2次,截取字符串之前所有
select substring_index('趙雷-一班-一年級(jí)',"-",-1) ; -- 從右邊關(guān)鍵字出現(xiàn)第1次,截取字符串之前
日期函數(shù)
DATE(),返回日期。格式:YYYY-MM-DD
TIME(),返回日期。格式:HH-mm-ss
TIMESTAMP(),返回日期時(shí)間。格式:YYYY-MM-DD HH-mm-ss
NOW()、CURRENT_TIMESTAMP、CURRENT_TIMESTAMP(),返回語句開始執(zhí)行的時(shí)間
SYSDATE() 返回的是這個(gè)函數(shù)執(zhí)行時(shí)候的時(shí)間
select SLEEP(1),NOW(),CURRENT_TIMESTAMP,CURRENT_TIMESTAMP(),SYSDATE();
DATE_FORMAT(),將日期根據(jù)指定的格式返回為對(duì)應(yīng)的字符串
date_sub,時(shí)間減
date_add,時(shí)間加
select SLEEP(1),NOW(),CURRENT_TIMESTAMP,CURRENT_TIMESTAMP(),SYSDATE();
SELECT DATE_FORMAT('2022-01-01 22:00:00','%Y-%m-%d');
SELECT DATE_ADD('2022-01-01 22:00:00',interval 2 day);#往前加兩天
SELECT DATE_ADD('2022-01-01 22:00:00',interval -2 day);#往后加兩天
SELECT DATE_ADD('2022-01-01 22:00:00',interval 2 month);#往前加兩月
其他函數(shù)
like函數(shù),通配符
between,注意:左右兩邊是閉區(qū)間
is null,is not null
in和not in 支持子查詢
case 表達(dá)式
通配符:用來匹配值的一部分的特殊字符,使用通配符就必須使用like
# %通配符:%表示任何字符出現(xiàn)任意次數(shù)
# 匹配李開頭的學(xué)員信息
select * from students where sname like '李%'
# _ 通配符,只匹配單個(gè)字符
# 匹配李某
select * from students where sname like '李_'
case表達(dá)式
#case when then
語法
CASE WHEN <求值表達(dá)式> THEN <表達(dá)式>
WHEN <求值表達(dá)式> THEN <表達(dá)式>
WHEN <求值表達(dá)式> THEN <表達(dá)式>
.
.
.
ELSE <表達(dá)式>
END
# 添加一列及格和不及格
# case函數(shù)
select *,
(case when score >= 60 then '及格' else '不及格' end) from students;
# 行轉(zhuǎn)列,科目放在表頭
select sname,
(case when course ='語文' then score else null end) as '語文',
(case when course ='數(shù)學(xué)' then score else null end) as '數(shù)學(xué)',
(case when course ='英語' then score else null end) as '英語'
from students ;
select sname,
sum((case when course ='語文' then score else null end)) as '語文',
sum((case when course ='數(shù)學(xué)' then score else null end)) as '數(shù)學(xué)',
sum((case when course ='英語' then score else null end)) as '英語'
from students group by sname ;
2、視圖
什么是視圖?虛擬表,視圖是依據(jù)SELECT語句來創(chuàng)建的,所以說是select語句生產(chǎn)的虛擬表叫視圖。
# 創(chuàng)建視圖
CREATE VIEW <視圖名稱>(<列名1>,<列名2>,...) AS
CREATE view st (sname,score)
as
select sname,score from students;
3、子查詢
子查詢指一個(gè)查詢語句嵌套在另一個(gè)查詢語句內(nèi)部的查詢
子查詢的結(jié)果可以作為一個(gè)表,也可以作為一個(gè)過濾條件
# 作為一個(gè)表--嵌套子查詢
select 列名 from
(select 列名 from 表1 where 列 where 表達(dá)式) as 子查詢 -- 結(jié)果作為一個(gè)表
# 作為一個(gè)結(jié)果-- 標(biāo)量子查詢
select 列名 from 表1 where 列名 = (select max(列名) from 表1 )
# 成績(jī)高于平均值
select * from students where score>= (select avg(score) from students )
還有一種是關(guān)聯(lián)子查詢,有關(guān)聯(lián)兩個(gè)字就意味著查詢與子查詢之間存在著聯(lián)系,那么聯(lián)系是如何建立起來的
# 各個(gè)科目中高于該科目的成績(jī)
select sname,course,score from students as a where score>=
(select avg(score) as avg_score from students as b
where a.course=b.course )
關(guān)鍵字:union ,union all,join,iinner join,outer join,left join,right join。
1、上下拼接
用UNION將多條SELECT語句組合成一個(gè)結(jié)果集
注意:UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關(guān)鍵字UNION分隔;
union 是去重,union all 是不去重的,只能使用一條ORDER BY子句,它必須出現(xiàn)在最后一條SELECT語句之后。列需要進(jìn)行對(duì)齊操作。
# union
select 123 as 數(shù)字 union select 456
# 排序
select 123 as 數(shù)字 union select 456 order by 數(shù)字 desc
2、聯(lián)結(jié)
·內(nèi)連接
-- 內(nèi)連結(jié)
FROM
INNER JOIN ON
INNER 關(guān)鍵詞表示使用了內(nèi)連結(jié)
注意:
必須使用 ON 子句來指定連結(jié)條件,在進(jìn)行內(nèi)連結(jié)時(shí) ON 子句是必不可少的,ON 子句是專門用來指定連結(jié)條件的。
SELECT 子句中的列最好按照 表名.列名 的格式來使用。如果兩張表有其他名稱相同的列, 則必須使用上述格式來選擇列名,,否則查詢語句會(huì)報(bào)錯(cuò)。
如果需要在使用內(nèi)連結(jié)的時(shí)候同時(shí)使用 WHERE 子句對(duì)檢索結(jié)果進(jìn)行篩選,則需要把 WHERE 子句寫在 ON 子句的后邊。
where的使用方法:
子查詢,上述查詢作為子查詢, 用括號(hào)封裝起來, 然后在外層查詢?cè)黾雍Y選條件.
on后面加where,查詢的執(zhí)行順序:FROM 子句->WHERE 子句->SELECT 子句,在做完 INNER JOIN … ON 得到一個(gè)新表后, 才會(huì)執(zhí)行 WHERE 子句
select 列 from 表1 inner join 表2 on 列1=列2 where 列條件
select 列 from (select 列 from 表1 inner join 表2 on 列1 = 列2) as 表3
where 列條件
·自然聯(lián)結(jié)NATURAL JOIN
會(huì)按照兩個(gè)表中都包含的列名來進(jìn)行等值內(nèi)連結(jié),此時(shí)無需使用 ON 來指定連接條件。使用自然連結(jié)還可以求出兩張表或子查詢的公共部分。
SELECT * FROM 表1 NATURAL JOIN 表2
·外連接
LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對(duì)應(yīng)匹配的記錄。
RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒有對(duì)應(yīng)匹配的記錄。
左右聯(lián)結(jié)最終要的一個(gè)點(diǎn)是選要把哪張表作為主表,使用 LEFT 時(shí) FROM 子句中寫在左側(cè)的表是主表,使用 RIGHT 時(shí)右側(cè)的表是主表。
-- 左連結(jié)
FROM
LEFT JOIN ON -- 右連結(jié)
FROM
RIGHT JOIN ON -- 全外連結(jié),mysql不支持全外聯(lián)結(jié)
FROM
FULL JOIN ON -- 交叉連結(jié),CROSS JOIN(笛卡爾積)
FROM
CROSS JOIN
什么是笛卡爾積: 就是使用集合 A 中的每一個(gè)元素與集合 B 中的每一個(gè)元素組成一個(gè)有序的組合。
沒有了ON子句的限制,會(huì)對(duì)左表和右表的每一行進(jìn)行組合。
窗口函數(shù)稱之為OLAP,對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)分析處理,常規(guī)的SELECT語句都是對(duì)整張表進(jìn)行查詢,而窗口函數(shù)可以讓我們有選擇的去某一部分?jǐn)?shù)據(jù)進(jìn)行匯總、計(jì)算和排序。
窗口函數(shù)的通用公式:
<窗口函數(shù)> OVER ([PARTITION BY <列名>] ORDER BY <排序用列名>)
紅色的地方可以省略,最關(guān)鍵的是PARTITON BY,PARTITON英文是分割的意思,可以理解為PARTITON BY是用來分組,這個(gè)分組的意思是表中哪些行是一組。
order by是用來排序的,決定在窗口內(nèi),哪些規(guī)則是來排序的
1、排序類的窗口函數(shù)
RANK函數(shù):如果存在相同位次的記錄,則會(huì)跳過之后的位次,1134...
DENSE_RANK函數(shù):即使存在相同位次的記錄,也不會(huì)跳過之后的位次。11234
ROW_NUMBER函數(shù):連續(xù)位次,依次排序不會(huì)重復(fù),1233
# 英語成績(jī)排名
select sname
,course
,score
,rank() over (order by score desc) as ranking
,dense_rank() over (order by score desc) as dense_ranking
,row_number() over (order by score desc) as row_num
from students where course='英語';
# 根據(jù)科目進(jìn)行排序
select sname
,course
,score
,rank() over (PARTITION BY course order by score desc) as ranking
,dense_rank() over (PARTITION BY course order by score desc ) as dense_ranking
,row_number() over (PARTITION BY course order by score desc) as row_num
from students
2、聚合函數(shù)使用
出來的結(jié)果是一個(gè)累計(jì)的聚合函數(shù)值,根據(jù)分組情況進(jìn)行累計(jì)計(jì)算,比如求和,平均,最大,最小,計(jì)數(shù)
sum,累計(jì)求和
avg,移動(dòng)平均
count
max
min
elect sname
,course
,score
,sum(score) over ( order by score ) as current_sum
,avg(score) over ( order by score ) as current_avg
,count(*) over ( order by score desc ) as count_
,max(score) over ( order by score desc ) as max_score
,min(score) over ( order by score ) as min_score
from students
# 分組排序
select sname
,course
,score
,sum(score) over ( PARTITION BY course order by score desc ) as current_sum
,avg(score) over ( PARTITION BY course order by course ) as current_avg
,count(*) over ( PARTITION BY course order by score desc) as count_
,max(score) over ( PARTITION BY course order by score desc ) as max_score
,min(score) over (PARTITION BY course order by course ) as min_score
from students
3、移動(dòng)平均
<窗口函數(shù)> OVER (ORDER BY <排序用列名>
ROWS n PRECEDING )
<窗口函數(shù)> OVER (ORDER BY <排序用列名>
ROWS BETWEEN n PRECEDING AND n FOLLOWING)
PRECEDING(“之前”), 將框架指定為 “截止到之前 n 行”,加上自身行FOLLOWING(“之后”), 將框架指定為 “截止到之后 n 行”,加上自身行BETWEEN 1 PRECEDING AND 1 FOLLOWING,將框架指定為 “之前1行” + “之后1行” + “自身”
# 移動(dòng)平均
select sname
,course
,score
,AVG(score) OVER (ORDER BY course
ROWS 2 PRECEDING) AS moving_avg -- 之前2行
,AVG(score) OVER (ORDER BY course
ROWS BETWEEN 1 PRECEDING
AND 1 FOLLOWING) AS moving_avg -- 前一行,后一行
from students
以上就是本次分享的全部?jī)?nèi)容!《SQL必知必會(huì)》一本非常經(jīng)典的數(shù)據(jù)庫書籍,也可以說是自己入門數(shù)據(jù)庫的書。本次分享也是精華整理,本書的講解主要是通過5個(gè)不同表來完成,結(jié)合各種案例來說明SQL的使用細(xì)節(jié)。
那么,數(shù)據(jù)分析人員到底應(yīng)該掌握到SQL到什么程度呢?
其實(shí)不同數(shù)據(jù)分析崗位對(duì)于SQL掌握程度的要求和標(biāo)準(zhǔn)是不同。如偏業(yè)務(wù)分析的數(shù)據(jù)崗數(shù)據(jù)分析師/商業(yè)分析師,對(duì)SQL的掌握也會(huì)有一定要求,不過也不必說一定要十分精通,只要可以從數(shù)據(jù)倉庫里取數(shù)、學(xué)會(huì)一些常見的SQL語句就行,取數(shù)并不是業(yè)務(wù)分析師的主要工作,而且很多人用現(xiàn)成的BI工具,或者是直接Python,雖然也會(huì)需要SQL從數(shù)據(jù)庫中取數(shù),但是不用去考慮復(fù)雜的邏輯。
如果說是做數(shù)據(jù)分析工程師等偏技術(shù)的數(shù)據(jù)崗,必須要去精通SQL了,如復(fù)雜綜合查詢、窗口函數(shù)、多表查詢等都是需要掌握的,而且更好地提高檢索速度對(duì)于業(yè)務(wù)方面來說比較重要。
當(dāng)然在面試中,于轉(zhuǎn)行數(shù)據(jù)分析崗位,對(duì)于SQL是必須的,于產(chǎn)品、運(yùn)營、財(cái)務(wù)等非數(shù)據(jù)崗位,學(xué)會(huì)了是加分項(xiàng)。當(dāng)然,還是那句話,有些東西你用了才知道它有用,不用它永遠(yuǎn)沒用,所以學(xué)習(xí)知識(shí)是比較容易,但是把知識(shí)應(yīng)用到實(shí)際的工作和生活中是比較難的事,需要我們?nèi)?shí)踐,去思考、去練習(xí)。
最后,祝愿大家都能在自己所在的領(lǐng)域內(nèi),保持著好奇心、求知欲、觀察生活,在實(shí)際場(chǎng)景中,要有數(shù)據(jù)驅(qū)動(dòng)產(chǎn)品閉環(huán)的思維,熟悉業(yè)務(wù),時(shí)刻關(guān)注數(shù)據(jù)、保持敏感,成就更好的自己,在可預(yù)見的未來,遇到更好的自己。
后期內(nèi)容我們還有繼續(xù)為大家分享很多的關(guān)于數(shù)據(jù)分析案例以及的數(shù)據(jù)書籍內(nèi)容:數(shù)據(jù)分析項(xiàng)目分享、商業(yè)案例分享、高階書籍分享···
本次分享到此結(jié)束,感謝大家的收聽,我們下期再會(huì)!
本文為作者獨(dú)立觀點(diǎn),不代表鳥哥筆記立場(chǎng),未經(jīng)允許不得轉(zhuǎn)載。
《鳥哥筆記版權(quán)及免責(zé)申明》 如對(duì)文章、圖片、字體等版權(quán)有疑問,請(qǐng)點(diǎn)擊 反饋舉報(bào)
我們致力于提供一個(gè)高質(zhì)量?jī)?nèi)容的交流平臺(tái)。為落實(shí)國家互聯(lián)網(wǎng)信息辦公室“依法管網(wǎng)、依法辦網(wǎng)、依法上網(wǎng)”的要求,為完善跟帖評(píng)論自律管理,為了保護(hù)用戶創(chuàng)造的內(nèi)容、維護(hù)開放、真實(shí)、專業(yè)的平臺(tái)氛圍,我們團(tuán)隊(duì)將依據(jù)本公約中的條款對(duì)注冊(cè)用戶和發(fā)布在本平臺(tái)的內(nèi)容進(jìn)行管理。平臺(tái)鼓勵(lì)用戶創(chuàng)作、發(fā)布優(yōu)質(zhì)內(nèi)容,同時(shí)也將采取必要措施管理違法、侵權(quán)或有其他不良影響的網(wǎng)絡(luò)信息。
一、根據(jù)《網(wǎng)絡(luò)信息內(nèi)容生態(tài)治理規(guī)定》《中華人民共和國未成年人保護(hù)法》等法律法規(guī),對(duì)以下違法、不良信息或存在危害的行為進(jìn)行處理。
1. 違反法律法規(guī)的信息,主要表現(xiàn)為:
1)反對(duì)憲法所確定的基本原則;
2)危害國家安全,泄露國家秘密,顛覆國家政權(quán),破壞國家統(tǒng)一,損害國家榮譽(yù)和利益;
3)侮辱、濫用英烈形象,歪曲、丑化、褻瀆、否定英雄烈士事跡和精神,以侮辱、誹謗或者其他方式侵害英雄烈士的姓名、肖像、名譽(yù)、榮譽(yù);
4)宣揚(yáng)恐怖主義、極端主義或者煽動(dòng)實(shí)施恐怖活動(dòng)、極端主義活動(dòng);
5)煽動(dòng)民族仇恨、民族歧視,破壞民族團(tuán)結(jié);
6)破壞國家宗教政策,宣揚(yáng)邪教和封建迷信;
7)散布謠言,擾亂社會(huì)秩序,破壞社會(huì)穩(wěn)定;
8)宣揚(yáng)淫穢、色情、賭博、暴力、兇殺、恐怖或者教唆犯罪;
9)煽動(dòng)非法集會(huì)、結(jié)社、游行、示威、聚眾擾亂社會(huì)秩序;
10)侮辱或者誹謗他人,侵害他人名譽(yù)、隱私和其他合法權(quán)益;
11)通過網(wǎng)絡(luò)以文字、圖片、音視頻等形式,對(duì)未成年人實(shí)施侮辱、誹謗、威脅或者惡意損害未成年人形象進(jìn)行網(wǎng)絡(luò)欺凌的;
12)危害未成年人身心健康的;
13)含有法律、行政法規(guī)禁止的其他內(nèi)容;
2. 不友善:不尊重用戶及其所貢獻(xiàn)內(nèi)容的信息或行為。主要表現(xiàn)為:
1)輕蔑:貶低、輕視他人及其勞動(dòng)成果;
2)誹謗:捏造、散布虛假事實(shí),損害他人名譽(yù);
3)嘲諷:以比喻、夸張、侮辱性的手法對(duì)他人或其行為進(jìn)行揭露或描述,以此來激怒他人;
4)挑釁:以不友好的方式激怒他人,意圖使對(duì)方對(duì)自己的言論作出回應(yīng),蓄意制造事端;
5)羞辱:貶低他人的能力、行為、生理或身份特征,讓對(duì)方難堪;
6)謾罵:以不文明的語言對(duì)他人進(jìn)行負(fù)面評(píng)價(jià);
7)歧視:煽動(dòng)人群歧視、地域歧視等,針對(duì)他人的民族、種族、宗教、性取向、性別、年齡、地域、生理特征等身份或者歸類的攻擊;
8)威脅:許諾以不良的后果來迫使他人服從自己的意志;
3. 發(fā)布垃圾廣告信息:以推廣曝光為目的,發(fā)布影響用戶體驗(yàn)、擾亂本網(wǎng)站秩序的內(nèi)容,或進(jìn)行相關(guān)行為。主要表現(xiàn)為:
1)多次發(fā)布包含售賣產(chǎn)品、提供服務(wù)、宣傳推廣內(nèi)容的垃圾廣告。包括但不限于以下幾種形式:
2)單個(gè)帳號(hào)多次發(fā)布包含垃圾廣告的內(nèi)容;
3)多個(gè)廣告帳號(hào)互相配合發(fā)布、傳播包含垃圾廣告的內(nèi)容;
4)多次發(fā)布包含欺騙性外鏈的內(nèi)容,如未注明的淘寶客鏈接、跳轉(zhuǎn)網(wǎng)站等,誘騙用戶點(diǎn)擊鏈接
5)發(fā)布大量包含推廣鏈接、產(chǎn)品、品牌等內(nèi)容獲取搜索引擎中的不正當(dāng)曝光;
6)購買或出售帳號(hào)之間虛假地互動(dòng),發(fā)布干擾網(wǎng)站秩序的推廣內(nèi)容及相關(guān)交易。
7)發(fā)布包含欺騙性的惡意營銷內(nèi)容,如通過偽造經(jīng)歷、冒充他人等方式進(jìn)行惡意營銷;
8)使用特殊符號(hào)、圖片等方式規(guī)避垃圾廣告內(nèi)容審核的廣告內(nèi)容。
4. 色情低俗信息,主要表現(xiàn)為:
1)包含自己或他人性經(jīng)驗(yàn)的細(xì)節(jié)描述或露骨的感受描述;
2)涉及色情段子、兩性笑話的低俗內(nèi)容;
3)配圖、頭圖中包含庸俗或挑逗性圖片的內(nèi)容;
4)帶有性暗示、性挑逗等易使人產(chǎn)生性聯(lián)想;
5)展現(xiàn)血腥、驚悚、殘忍等致人身心不適;
6)炒作緋聞、丑聞、劣跡等;
7)宣揚(yáng)低俗、庸俗、媚俗內(nèi)容。
5. 不實(shí)信息,主要表現(xiàn)為:
1)可能存在事實(shí)性錯(cuò)誤或者造謠等內(nèi)容;
2)存在事實(shí)夸大、偽造虛假經(jīng)歷等誤導(dǎo)他人的內(nèi)容;
3)偽造身份、冒充他人,通過頭像、用戶名等個(gè)人信息暗示自己具有特定身份,或與特定機(jī)構(gòu)或個(gè)人存在關(guān)聯(lián)。
6. 傳播封建迷信,主要表現(xiàn)為:
1)找人算命、測(cè)字、占卜、解夢(mèng)、化解厄運(yùn)、使用迷信方式治?。?br /> 2)求推薦算命看相大師;
3)針對(duì)具體風(fēng)水等問題進(jìn)行求助或咨詢;
4)問自己或他人的八字、六爻、星盤、手相、面相、五行缺失,包括通過占卜方法問婚姻、前程、運(yùn)勢(shì),東西寵物丟了能不能找回、取名改名等;
7. 文章標(biāo)題黨,主要表現(xiàn)為:
1)以各種夸張、獵奇、不合常理的表現(xiàn)手法等行為來誘導(dǎo)用戶;
2)內(nèi)容與標(biāo)題之間存在嚴(yán)重不實(shí)或者原意扭曲;
3)使用夸張標(biāo)題,內(nèi)容與標(biāo)題嚴(yán)重不符的。
8.「飯圈」亂象行為,主要表現(xiàn)為:
1)誘導(dǎo)未成年人應(yīng)援集資、高額消費(fèi)、投票打榜
2)粉絲互撕謾罵、拉踩引戰(zhàn)、造謠攻擊、人肉搜索、侵犯隱私
3)鼓動(dòng)「飯圈」粉絲攀比炫富、奢靡享樂等行為
4)以號(hào)召粉絲、雇用網(wǎng)絡(luò)水軍、「養(yǎng)號(hào)」形式刷量控評(píng)等行為
5)通過「蹭熱點(diǎn)」、制造話題等形式干擾輿論,影響傳播秩序
9. 其他危害行為或內(nèi)容,主要表現(xiàn)為:
1)可能引發(fā)未成年人模仿不安全行為和違反社會(huì)公德行為、誘導(dǎo)未成年人不良嗜好影響未成年人身心健康的;
2)不當(dāng)評(píng)述自然災(zāi)害、重大事故等災(zāi)難的;
3)美化、粉飾侵略戰(zhàn)爭(zhēng)行為的;
4)法律、行政法規(guī)禁止,或可能對(duì)網(wǎng)絡(luò)生態(tài)造成不良影響的其他內(nèi)容。
二、違規(guī)處罰
本網(wǎng)站通過主動(dòng)發(fā)現(xiàn)和接受用戶舉報(bào)兩種方式收集違規(guī)行為信息。所有有意的降低內(nèi)容質(zhì)量、傷害平臺(tái)氛圍及欺凌未成年人或危害未成年人身心健康的行為都是不能容忍的。
當(dāng)一個(gè)用戶發(fā)布違規(guī)內(nèi)容時(shí),本網(wǎng)站將依據(jù)相關(guān)用戶違規(guī)情節(jié)嚴(yán)重程度,對(duì)帳號(hào)進(jìn)行禁言 1 天、7 天、15 天直至永久禁言或封停賬號(hào)的處罰。當(dāng)涉及欺凌未成年人、危害未成年人身心健康、通過作弊手段注冊(cè)、使用帳號(hào),或者濫用多個(gè)帳號(hào)發(fā)布違規(guī)內(nèi)容時(shí),本網(wǎng)站將加重處罰。
三、申訴
隨著平臺(tái)管理經(jīng)驗(yàn)的不斷豐富,本網(wǎng)站出于維護(hù)本網(wǎng)站氛圍和秩序的目的,將不斷完善本公約。
如果本網(wǎng)站用戶對(duì)本網(wǎng)站基于本公約規(guī)定做出的處理有異議,可以通過「建議反饋」功能向本網(wǎng)站進(jìn)行反饋。
(規(guī)則的最終解釋權(quán)歸屬本網(wǎng)站所有)