SQL太難學不會?教你如何零基礎快速入門

數據分析那些事
20 min readSep 16, 2019
unsplash

有好多朋友私訊我說想看SQL的學習文章,雖然Excel、python現在比SQL受歡迎,但我還是覺得得開始著手寫SQL了。想了很久SQL的文章應該從什麼角度來切入,最後決定透過對比Excel,來學習SQL,所以這是寫給新人的SQL學習文章。

什麼是SQL

SQL(Structured Query Language)是一種資料庫的結構化查詢語言,常用的關係型數據庫由MySQL,SQL Server,Oracle,Access等。

那麼什麼是資料庫呢?簡而言之就是存儲資料的倉庫,Excel為什麼不算資料庫呢,因為它能夠存儲的資料量真的太小了,Excel2016到底是1048576行,意思是它最多存儲104萬條資料,但你要真存104萬條資料在Excel裡估計電腦不宕也殘廢。現在大數據時代資料動輒百萬/千萬,所以需要資料庫來幫忙。

總結一下,SQL就是對存儲在資料庫中的資料進行查詢等操作的一種語言,所以你知道了,SQL本身是一種語言,如果你有語言學習的基礎,那麼學起SQL來就簡單多了,沒有也沒關係,我們對比Excel,學習SQL。

小數

為什麼要學SQL

資料分析崗位的招聘,不管是哪個段位(級別)的,熟練使用SQL都是必備技能,所以,學起來把!

怎麼學SQL

推薦實體書《Oracle PL/SQL必知必會》和《深入淺出MySQL》,所有系統的學習都是建立在書本之上,作為網上教程,W3School、MySQL菜鳥教程都很不錯,至於其他的視頻教程,就不推薦了,感覺大同小異,主要在於自己的理解與實操上。

博客來

具體實操,可以直接下載MySql/ SQL Server/Access用戶端進行本地操作,但是有個問題,你可能沒有資料來源,需要自己創建表。

用戶端和用戶端之間也大有不同,MySQL用戶端是命令列的形式,而Access是微軟旗下介面很類似Excel的資料庫,對於沒有語言基礎的同學來說可能更友好一些,至少它有個介面。

網上線上練習的話推薦SQLZoo來練習,這是一個網頁版的題庫,個人感覺對於新手來說SQLZoo比安裝那些資料庫用戶端要友好的多。

基本概念的理解

庫、表、欄、行的含義、資料類型。

一個資料庫裡包含至少一個表,一個表裡包含至少一個列。庫可以理解為一個Excel工作簿,表就是其中的一張sheet表,列就是表中的一個欄位。

之前在講Excel獲取資料的時候提到過在Excel裡資料類型其實可以劃分成兩大類:數值型和字元型。在SQL中也差不多,除了字元型和數值型以外還有日期和時間類型的資料,具體將在下一小節中介紹。

你需要理解每張表包含了哪些列欄位,這些欄位都是什麼含義,欄位存儲資料的格式是什麼樣的,有了這些概念以後方可進行查詢的操作。

下載MySQL與安裝

本系列將在MySQL用戶端上進行操作講解,MySQL用戶端的下載和安裝並不難,基本上是一路默認下來。

Google MySQL,進入MySQL官網。

在官網介面中向下滑,找到community社區版,點進去

第一個Conmunity Server,點Download

進入下載頁面往下滑,注意,這裡我們要選擇.msi的安裝方式,點藍色背景框的go to download page,不要選擇下載下面的.zip的檔包,zip需要自行配置,很複雜,稍微配置不好就用不了,msi就直接圖形化配置一路預設即可。

進入下載頁面往下滑,注意,這裡我們要選擇.msi的安裝方式,點藍色背景框的go to download page,不要選擇下載下面的.zip的檔包,zip需要自行配置,很複雜,稍微配置不好就用不了,msi就直接圖形化配置一路預設即可。

點進去後選擇第二個離線下載就好

等待網頁下載完,下載完以後點開運行,一路next,最後點擊execute安裝,等一會安裝完了,繼續next。

還是一路next,一直到需要配置密碼的部分,輸入密碼,別忘了,繼續next,到executeLinux 系統下

Next一路南下,直到要輸入上面配置的密碼,然後接著next.

全部安裝配置完成以後,我們在開始功能表裡就可以找到並打開MySQL用戶端

輸入密碼回車鍵,就登入了。

我們再來驗證一下好使不好使,輸入show database; 就展示出了系統存的資料庫。

如果對命令列介面感到難過的同學,可以直接去搜MySQL的題庫,線上做題,或者用Access,圖形化的介面,介面很類似Excel,對小白很友好,且也是可以用SQL語句的,如下圖所示。但是學都學了,技多不壓身是吧。

MySQL的常見語法

幾個語法是要注意的:

分號(;)結束一條SQL語句

不區分大小寫,習慣性地關鍵字一般大寫

單引號(‘’)用來限定字元

Linux 系統下

透過以下命令來檢查MySQL伺服器是否啟動:

ps -ef | grep mysqld

如果MySql已經啟動,以上命令將輸出mysql進程清單, 如果mysql未啟動,你可以使用以下命令來啟動mysql伺服器:

root@host# cd /usr/bin
./mysqld_safe &

如果你想關閉目前運行的 MySQL 伺服器, 你可以執行以下命令:

root@host# cd /usr/bin
./mysqladmin -u root -p shutdown
Enter password: ******

創建用戶

mysql> INSERT INTO user
(host, user, password,
select_priv, insert_priv, update_priv)
VALUES (‘localhost’, ‘yonghuming’,
PASSWORD(‘mima’), ‘Y’, ‘Y’, ‘Y’) ; — Y 代表賦予 N 代表不賦予

作業系統Windows

進入windows安裝mysql的bin目錄執行操作

#啟動mysql伺服器
net start mysql — 要以管理員的身分登入cmd

#關閉
net stop mysql

#登入
mysql -h 主機位址 -u 用戶名 -p 使用者密碼

或者mysql -u用戶名 -p密碼

#退出
exit

#MySql用戶管理

#修改密碼:

mysql>use mysql ;

mysql>update user set password=PASSWORD(‘new_password’) where user=’root’;

mysql>flush privileges ;

mysql>quit

#增加用戶
#格式:grant 權限 on 資料庫.* to 用戶名@登錄主機 identified by ‘密碼’

如,增加一個使用者user1密碼為password1,讓其可以在本機上登錄, 並對所有資料庫有查詢、插入、修改、刪除的許可權。首先用以root用戶連入mysql,然後鍵入以下命令:
grant select,insert,update,delete on *.* to user1@localhost Identified by “password1”;
如果希望該用戶能夠在任何機器上登陸mysql,則將localhost改為”%”。
如果你不想user1有密碼,可以再打一個命令將密碼去掉。
grant select,insert,update,delete on mydb.* to user1@localhost identified by “”;

grant all privileges on wpj1105.* to sunxiao@localhost identified by ‘123’; #all privileges 所有權限

資料庫的基本操作

#顯示資料庫
show databases ; — 一定要加分號 代表一句話結束,否則無效

#判斷是否存在資料庫taotao,有的話先刪除
drop database if exists taotao ;

#創建資料庫
create database taotao;

#刪除資料庫
drop database taotao;

#使用該資料庫
use taotao;

#顯示資料庫中的表
show tables;

#先判斷表suibian是否存在,存在先刪除
drop table if exists suibian;

#創建表
create table xinxi(
id int auto_increment primary key,
name varchar(50),
sex varchar(20) default ‘男’ check(sex=‘男’ or sex=’女’),
date varchar(50) not null ,
content varchar(100)
)default charset=utf8;

創建索引

這是最基本的索引,它沒有任何限制。它有以下幾種創建方式:

CREATE INDEX indexName ON mytable(username(length));

如果是CHAR,VARCHAR類型,length可以小於欄位實際長度;如果是BLOB和TEXT類型,必須指定 length。

修改表結構(添加索引)

ALTER table tableName ADD INDEX indexName(columnName)

創建表的時候直接指定

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

INDEX [indexName] (username(length))

);

#刪除表
drop table xinxi; — 表頭以及資訊都刪除

delete from xinxi ; — 刪除表內部的資料資訊

#查看表的結構
describe xinxi; — 可以簡寫為desc xinxi ;

#插入資料
insert into xinxi values(‘10’,’石鐘’,’男’,’2001–10–1',’描述介紹’);

insert into xinxi values(‘11’,’石不棄’,’男’,’2006–10–1',’描述介紹’);

insert into xinxi values(‘12’,’陶陶’,’男’,’2007–10–1',’描述介紹’);

insert into xinxi values(‘13’,’陶蘇雨’,’女’,’2008–10–1',’描述介紹’);

insert into xinxi values(‘14’,’陶陶2',’男’,’2009–10–1',’描述介紹’);

#查詢表中的資料
select * from xinxi ; — 查詢表所有資訊學
select id,name from xinxi; — 查詢表的id 、name

#修改某一條資料
update xinxi set sex=’女’ where id= ‘12’;

#刪除資料
delete from xinxi where id=’14' ;

# and 且
select * from xinxi where date>’2001–1–2' and date<’2007–12–1';

# or 或
select * from xinxi where date<’2006–11–2' or date>’2008–1–1';

#between
select * from xinxi where date between ‘2006–1–2’ and ‘2007–12–1’;

#in 查詢制定集合內的資料
select * from xinxi where id in (‘11’,’13');

#排序 asc 昇冪 desc 降冪
select * from xinxi order by id asc ; — 默認昇冪 asc 昇冪

select * from xinxi order by id desc ; — 降冪

#分組查詢 #彙總函式
select max(id),name,sex from xinxi group by sex; — 通過sex分組,查詢不同組最大的id

select min(date) from ;

select avg(id) as ‘求平均’ from xinxi ;

select count(*) from xinxi ; #統計表中總數

select count(sex) from xinxi ; #統計表中性別總數 若有一條資料中sex為空的話,就不予以統計~

select sum(id) from xinxi ;

#查詢第i條以後到第j條的資料(不包括第i條)
select * from xinxi limit 2,5 ; — 顯示3–5條資料

create table xinxi2 (
id int primary key auto_increment, # 主鍵 自增長
name varchar(10) not null,
sex varchar(50) , #DEFAULT ‘男’ ,
age int unsigned, #不能為負值(如為負值 則默認為0)
sno int unique #不可重複
);

#修改表的名字
alter table 老表名 rename to 新表明
alter table xinxi rename to xinxin ;

#向表中增加一個欄位(列)
alter table 表名 add column 列名 type ; — alter table tablename add(column 列名 type);
alter table xinxi add column 家庭地址 varchar(20) not null ;

#刪除某一列

alter table 表名 drop column 列名 ;

alter table xinxi drop column 家庭住址 ;

#修改表中某個欄位的名字
alter table 表名 change 老列名 新列名 type ; #修改一個表的欄位名
alter table xinxi change 家庭住址 住址 varchar(50) ;

#修改某列的資料類型

alter table xinxi modify column 住址 char(100) comment ‘注釋’;

#表kecheng增加列shuxue
alter table kecheng add(shuxue varchar(20));
#表kecheng修改列test
alter table kecheng modify shuxue char(20) not null;
#表kecheng修改列test 預設值
alter table kecheng alter shuxue set default ‘system’;
#表kecheng去掉test 預設值
alter table kecheng alter shuxue drop default;

#表kecheng 增加主鍵
alter table kecheng add primary key (id) ;

#表kecheng 刪除主鍵
alter table kecheng drop primary key;

#用文本方式將資料裝入資料庫表中(例如D:/mysql.txt)
load data local infile “D:/mysql.txt” into table MYTABLE;

#導入.sql文件命令(例如D:/mysql.sql)

source d:/mysql.sql;

#或者 /. d:/mysql.sql;

資料類型

整型

tinyint(m)

1個位元組 範圍(-128~127)

smallint(m)

2個位元組 範圍(-32768~32767)

mediumint(m)

3個位元組 範圍(-8388608~8388607)

int(m)

4個位元組 範圍(-2147483648~2147483647)

bigint(m)

8個位元組 範圍(+-9.22*10的18次方)

浮點型

float(m,d)

單精確度浮點型 8位元精度(4位元組) m總個數,d小數位

double(m,d)

雙精度浮點型 16位元精度(8位元組) m總個數,d小數位

定點數

浮點型在資料庫中存放的是近似值,而定點類型在資料庫中存放的是精確值。

decimal(m,d) 參數 m<65 是總個數,d❤0 且 d<m 是小數位。

字串

char(n)

固定長度,最多255個字元

varchar(n)

可變長度,最多65535個字元

tinytext

可變長度,最多255個字元

text

可變長度,最多65535個字元

mediumtext

可變長度,最多2的24次方-1個字元

longtext

可變長度,最多2的32次方-1個字元

日期時間類型

date

日期 ‘2008–12–2’

time

時間 ‘12:25:36’

datetime

日期時間 ‘2008–12–2 22:06:44’

timestamp

自動存儲記錄修改時間

二進位資料

  • 1._BLOB和_text存儲方式不同,_TEXT以文本方式存儲,英文存儲區分大小寫,而_Blob是以二進位方式存儲,不分大小寫。
  • 2._BLOB存儲的資料只能整體讀出。
  • 3._TEXT可以指定字元集,_BLO不用指定字元集。

Mysql的約束

MYSQL中,常用的幾種約束:

約束類型:

主鍵

外鍵

唯一

非空

自增

預設值

關鍵字:

primary key

foreign key

unique

not null

auto_increment

default

1、主鍵約束 primary key

主鍵約束相當於 唯一約束 + 非空約束 的組合,主鍵約束列不允許重複,也不允許出現空值。

每個表最多只允許一個主鍵,建立主鍵約束可以在列級別創建,也可以在表級別創建。

當創建主鍵的約束時,系統預設會在所在的列和列組合上建立對應的唯一索引。

— 基本模式
create table temp(
id int primary key,
name varchar(20)
);

— 組合模式
create table temp(
id int ,
name varchar(20),
pwd varchar(20),
primary key(id, name)
);

— 刪除主鍵約束
alter table temp drop primary key;

— 添加主鍵約束
alter table temp add primary key(id,name);

— 修改主鍵約束
alter table temp modify id int primary key;

2、外鍵約束 foreign key

外鍵約束是保證一個或兩個表之間的參照完整性,外鍵是構建於一個表的兩個欄位或是兩個表的兩個欄位之間的參照關係

— 基本模式
— 主表
create table temp(
id int primary key,
name varchar(20)
);

— 副表
create table temp2(
id int,
name varchar(20),
classes_id int,
foreign key(id) references temp(id)
);


— 多列外鍵組合,必須用資料表層級條件約束語法
— 主表
create table classes(
id int,
name varchar(20),
number int,
primary key(name,number)
);

— 副表
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/*表級別聯合外鍵*/
foreign key(classes_name, classes_number) references classes(name, number)
);


— 刪除外鍵約束
alter table student drop foreign key student_id;


— 增加外鍵約束
alter table student add foreign key(classes_name, classes_number) references classes(name, number);

3、 唯一約束unique

唯一約束是指定table的列或列組合不能重複,保證資料的唯一性。

唯一約束不允許出現重複的值,但是可以為多個null。

同一個表可以有多個唯一約束,多個列組合的約束。

在創建唯一約束時,如果不給唯一約束名稱,就默認和列名相同。

唯一約束不僅可以在一個表內創建,而且可以同時多表創建組合唯一約束。

— 創建表時設定,表示用戶名、密碼不能重複
create table temp(
id int not null ,
name varchar(20),
password varchar(10),
unique(name,password)
);


— 添加唯一約束
alter table temp add unique (name, password);


— 修改唯一約束
alter table temp modify name varchar(25) unique;

— 刪除約束
alter table temp drop index name;

4、非空約束 not null 與 預設值 default

非空約束用於確保當前列的值不為空值,非空約束只能出現在表物件的列上。

Null類型特徵:

所有的類型的值都可以是null,包括int、float 等資料類型

— 創建table表,ID 為非空約束,name 為非空約束 且預設值為abc
create table temp(
id int not null,
name varchar(255) not null default ‘abc’,
sex char null
);


— 增加非空約束
alter table temp
modify sex varchar(2) not null;

— 取消非空約束
alter table temp modify sex varchar(2) null;

— 取消非空約束,增加預設值
alter table temp modify sex varchar(2) default ‘abc’ null;複製錶:

第一、只複製表結構到新表

create table 新表 select * from 舊表 where 1=2 ;

或者 create table 新表 like 舊表 ;

第二、複製表結構及資料到新表

create table 新表 select * from 舊表 ;

這篇主要是針對一些從來沒有接觸過或者剛接觸sql的new boy,算是科普一下,具體想要更深入學習sql的,可以在評論區向我回饋,或者直接加入我的臉書圈子,裡面會有更多關於資料分析相關的好文分享。

>>>

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。follow我的臉書,期待你與我的互動!

--

--

數據分析那些事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/