數據產品經理必備之SQL基礎

11 評論 20414 瀏覽 242 收藏 26 分鐘

SQL語言是用于訪問和處理數據庫的標準的計算機語言,本文將從基本語法和高級語法兩方面來介紹SQL語言。

數據產品經理從字面上看包含“數據”和“產品經理”兩方面,是產品經理領域中更加細分的數據領域??梢?,“數據”之于“數據產品經理”的重要性。

在不同的公司數據產品經理可能會出現不同的名稱,比如“數據產品經理”、“大數據產品經理”、“數據平臺產品經理”、“產品經理(數據方向)”,但不管是什么樣的名稱,我們從招聘網站上面查閱數據產品經理的職位描述,看到該領域的產品經理所需要的素質和技能是類似的。

在阿里巴巴、百度、京東等互聯網公司的數據產品經理職位描述中我們反復看到招聘信息中有關于求職者掌握SQL的描述,可見在數據產品經理領域SQL已經是和PPT、Excel一樣成為數據產品經理必不可少的技能。

那么為什么數據產品經理需要掌握SQL呢?

因為數據產品經理需要經常和數據打交道,而掌握SQL能夠獲取數據,只有擁有了數據才能進一步進行數據探索設計數據產品。

SQL語言是用于訪問和處理數據庫的標準的計算機語言,下面我們將從基本語法和高級語法兩方面來介紹SQL語言。

SQL 基本語法

1. 操作數據庫

(1)創建數據庫

語法格式:

CREATE DATABASE [IF NOT EXISTS] <數據庫名>[[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校對規則名>];

語法說明:

  • <數據庫名>:創建數據庫的名稱。數據庫名稱必須符合操作系統的文件夾命名規則。
  • IF NOT EXISTS:在創建數據庫之前進行判斷,只有該數據庫目前尚不存在時才能執行操作。此選項可以用來避免數據庫已經存在而重復創建的錯誤。
  • [DEFAULT] CHARACTER SET:指定數據庫的默認字符集。
  • [DEFAULT] COLLATE:指定字符集的默認校對規則。

示例:

創建數據庫database_name

create database database_name;

(2)刪除數據庫

語法格式:

DROP DATABASE [ IF EXISTS ] <數據庫名>

語法說明:

  • <數據庫名>:指定要刪除的數據庫名。
  • IF EXISTS:用于防止當數據庫不存在時發生錯誤。
  • DROP DATABASE:刪除數據庫中的所有表格并且同時刪除數據庫。使用此語句時一定要慎重和小心,以免出現錯誤刪除。如果要使用 DROP DATABASE,需要獲得數據庫 DROP 權限。

示例:

刪除數據庫database_name

drop database database_name;

(3)修改數據庫

語法格式:

ALTER DATABASE [數據庫名] { [ DEFAULT ] CHARACTER SET <字符集名> | [ DEFAULT ] COLLATE <校對規則名>}

語法說明:

  • ALTER DATABASE 用于更改數據庫的全局特性。這些特性存儲在數據庫目錄的 db.opt 文件中。
  • 使用 ALTER DATABASE 需要獲得數據庫 ALTER 權限。
  • 數據庫名稱可以忽略,此時語句對應于默認數據庫。
  • CHARACTER SET 子句用于更改默認的數據庫字符集。

示例:

修改數據庫database_name

alter database database_name rename to database_new_name;

(4)查看數據庫

語法格式:

SHOW DATABASES [LIKE ‘數據庫名’];

語法說明:

  • LIKE 從句是可選項,用于匹配指定的數據庫名稱。LIKE 從句可以部分匹配,也可以完全匹配。
  • 數據庫名由單引號’ ‘包圍。

示例:

查看所有數據庫

show databases;

(5)使用數據庫

語法格式:

USE <數據庫名>

示例:

使用數據庫database_name

use database_name;

2. 操作數據表

(1)創建數據表

語法格式:

CREATE TABLE <表名> ([表定義選項])[表選項][分區選項];

其中,[表定義選項]的格式是:<列名1> <類型1> [,…] <列名n> <類型n>

語法說明:

  • CREATE TABLE:用于創建給定名稱的表,必須擁有表CREATE的權限。
  • <表名>:指定要創建表的名稱,在 CREATE TABLE 之后給出,必須符合標識符命名規則。表名稱被指定為 databaseb_name.table_name,以便在特定的數據庫中創建表。無論是否有當前數據庫,都可以通過這種方式創建。在當前數據庫中創建表時,可以省略 db-name。如果使用加引號的識別名,則應對數據庫和表名稱分別加引號。例如,’mydatabaseb’.’mytable’ 是合法的,但 ‘mydatabaseb.mytable’ 不合法。
  • <表定義選項>:表創建定義,由列名(column_name)、列的定義(column_definition)以及可能的空值說明、完整性約束或表索引組成。
  • 默認的情況是,表被創建到當前的數據庫中。若表已存在、沒有當前數據庫或者數據庫不存在,則會出現錯誤。

示例:

創建了表table_name,包含類型為int的id列

create table table_name(id int);

(2)修改數據表

語法格式:

ALTER TABLE <表名> [修改選項];

其中,[修改選項]的格式是:

{ ADD COLUMN <列名> <類型>

| CHANGE COLUMN <舊列名> <新列名> <新列類型>

| ALTER COLUMN <列名> { SET DEFAULT <默認值> | DROP DEFAULT }

| MODIFY COLUMN <列名> <類型>

| DROP COLUMN <列名>

| RENAME TO <新表名> }

示例:

修改數據表table_name使其添加name列

alter table table_name add name varchar(30);

(3)刪除數據表

語法格式:

DROP TABLE [IF EXISTS] <表名> [ , <表名1> , <表名2>] …

語法說明:

  • <表名>:被刪除的表名。DROP TABLE 語句可以同時刪除多個表,用戶必須擁有該命令的權限。
  • 表被刪除時,所有的表數據和表定義會被取消,所以使用本語句要小心。
  • 表被刪除時,用戶在該表上的權限并不會自動被刪除。
  • 參數IF EXISTS用于在刪除前判斷刪除的表是否存在,加上該參數后,在刪除表的時候,如果表不存在,SQL 語句可以順利執行,但會發出警告(warning)。

示例:

刪除數據表table_name

drop table table_name;

3. 操作數據

(1)插入數據

語法格式:

INSERT INTO <表名> [ <列名1> [ , … <列名n>] ] VALUES (值1) [… , (值n) ];

語法說明:

  • <表名>:指定被操作的表名。
  • <列名>:指定需要插入數據的列名。若向表中的所有列插入數據,則全部的列名均可以省略,直接采用 INSERT<表名>VALUES(…) 即可。
  • VALUES 或 VALUE 子句:該子句包含要插入的數據清單。數據清單中數據的順序要和列的順序相對應。

示例:

insert into table_name (id)values (1);

(2)刪除數據

語法格式:

DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]

語法說明:

語法說明如下:

  • <表名>:指定要刪除數據的表名。
  • ORDER BY 子句:可選項。表示刪除時,表中各行將按照子句中指定的順序進行刪除。
  • WHERE 子句:可選項。表示為刪除操作限定刪除條件,若省略該子句,則代表刪除該表中的所有行。
  • LIMIT 子句:可選項。用于告知在控制命令被返回數據前被刪除行的最大值。

示例:

刪除表table_name中全部數據

delete from table_name;

(3)修改數據

語法格式:

UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ] [ORDER BY 子句] [LIMIT 子句]

語法說明:

  • <表名>:用于指定要更新的表名稱。
  • SET 子句:用于指定表中要修改的列名及其列值。其中,每個指定的列值可以是表達式,也可以是該列對應的默認值。如果指定的是默認值,可用關鍵字 DEFAULT 表示列值。
  • WHERE 子句:可選項。用于限定表中要修改的行。若不指定,則修改表中所有的行。
  • ORDER BY 子句:可選項。用于限定表中的行被修改的次序。
  • LIMIT 子句:可選項。用于限定被修改的行數。

示例:

更新所有行的id列為0

update table_name set id=0

(4)查詢數據

語法格式:

SELECT {* | <字段列名>}

[

FROM <表 1>, <表 2>…

[WHERE <表達式>

[GROUP BY <group by definition>

[HAVING <expression> [{<operator> <expression>}…]]

[ORDER BY <order by definition>]

[LIMIT[<offset>,] <row count>]

]

語法說明:

  • {*|<字段列名>}包含星號通配符的字段列表,表示查詢的字段,其中字段列至少包含一個字段名稱,如果要查詢多個字段,多個字段之間要用逗號隔開,最后一個字段后不要加逗號。
  • FROM <表 1>,<表 2>…,表 1 和表 2 表示查詢數據的來源,可以是單個或多個。
  • WHERE 子句是可選項,如果選擇該項,將限定查詢行必須滿足的查詢條件。
  • GROUP BY< 字段 >,該子句用于按照指定的字段分組。
  • [ORDER BY< 字段 >],該子句用于指定按什么樣的順序顯示查詢出來的數據,可以進行的排序有升序(ASC)和降序(DESC)。
  • [LIMIT[<offset>,]<row count>],該子句用于指定 每次顯示查詢出來的數據條數。

示例:

查詢表中全部記錄

select * from table_name;

SQL 高級語法

1. 操作符

操作符是一個保留字或字符,用于指定條件或者聯接多個條件。常見操作符有比較操作符、邏輯操作符、算術操作符。

(1)比較操作符

比較操作符是指等于=、不等于<>、大于>、小于<、大于等于>=、小于等于<=

示例:

id = 1;id <> 1;id >1;id <1;id >=1;id <=1;

(2)邏輯操作符

邏輯操作符包括與NULL值比較 IS NULL、位于兩個值之間BETWEEN、與指定列表比較IN、與類似的值比較LIKE、多個條件與連接AND、多個條件或連接OR

示例:

id is null;id between ‘0’ and ’10’; id in (‘0′,’1′,’10’);id like ‘123%’;id > 10 and id <20; ;id = 10 or id =20;

(3)算術操作符

算術操作符有加法+、減法—、乘法*、除法/,支持組合使用

示例:

where col1 + col2 > ’20’;where col1 – col2 > ’20’;where col1 * 10 > ’20’;where (col1 / 10) > ’20’;

2. 連接

(1)內連接

語法格式:

SELECT <列名1,列名2 …>

FROM <表名1> INNER JOIN <表名2> [ ON子句]

語法說明:

  • <列名1,列名2…>:需要檢索的列名。
  • <表名1><表名2>:進行內連接的兩張表的表名。

示例:

select id,name from table1 inner join table2 on table1.cid=table2.cid;

(2)全連接

語法格式:

SELECT <列名1,列名2 …>

FROM <表名1>FULL JOIN <表名2> [ ON子句]

語法說明:

  • <列名1,列名2…>:需要檢索的列名。
  • <表名1><表名2>:進行全連接的兩張表的表名。

示例:

select id,name from table1 full join table2 on table1.cid=table2.cid;

(3)左連接

語法格式:

SELECT <列名1,列名2 …>

FROM <表名1>LEFT JOIN <表名2> [ ON子句]

語法說明:

  • <列名1,列名2…>:需要檢索的列名。
  • <表名1><表名2>:進行左連接的兩張表的表名。

示例:

select id,name from table1 left join table2 on table1.cid=table2.cid;

(4)右連接

語法格式:

SELECT <列名1,列名2 …>

FROM <表名1> RIGHT JOIN <表名2> [ ON子句]

語法說明:

  • <列名1,列名2…>:需要檢索的列名。
  • <表名1><表名2>:進行右連接的兩張表的表名。

示例:

select id,name from table1 right join table2 on table1.cid=table2.cid;

3. 視圖

視圖是一個虛擬表,包含一系列帶有名稱的列和行數據,但視圖并不是數據庫真實存儲的數據表。存儲在數據庫中的查詢操作 SQL 語句定義了視圖的內容,列數據和行數據來自于視圖查詢所引用的實際表,引用視圖時動態生成這些數據。視圖的結構形式和表一樣,可以進行查詢、修改、更新和刪除等操作。

(1)創建視圖

語法格式:

CREATE VIEW <視圖名> AS <SELECT語句>

語法說明:

  • <視圖名>:指定視圖的名稱。該名稱在數據庫中必須是唯一的,不能與其他表或視圖同名。
  • <SELECT語句>:指定創建視圖的 SELECT 語句,可用于查詢多個基礎表或源視圖。

示例:

create view view_name as select * from table_name;

(2)查看視圖

語法格式:

DESCRIBE <視圖名>;

語法說明:

  • <視圖名>:查看的視圖名稱。該名稱在數據庫中必須是唯一的,不能與其他表或視圖同名。

示例:

describe view_name;

(3)修改視圖

語法格式:

ALTER VIEW <視圖名> AS <SELECT語句>

語法說明:

  • <視圖名>:指定視圖的名稱。該名稱在數據庫中必須是唯一的,不能與其他表或視圖同名。
  • <SELECT 語句>:指定修改視圖的 SELECT 語句,可用于查詢多個基礎表或源視圖。

示例:

alter view view_name as select * from table_name;

(4)刪除視圖

語法格式:

DROP VIEW <視圖名1> [ , <視圖名2> …]

語法說明:

  • <視圖名>:指定刪除的視圖名稱。

示例:

drop view view_name;

4. 索引

索引是一種十分重要的數據庫對象。索引是數據庫性能調優技術的基礎,常用于實現數據的快速檢索。對表建立一個索引,在列上創建了索引之后,查找數據時可以直接根據該列上的索引找到對應記錄行的位置,從而快捷地查找到數據。索引存儲了指定列數據值的指針,根據指定的排序順序對這些指針排序。

(1)創建索引

語法格式:

CREATE <索引名> ON <表名> (<列名> [<長度>] [ ASC | DESC])

此外,還可以在CREATE TABLE 、ALTER TABLE時創建索引

語法說明:

  • <索引名>:指定索引名。一個表可以創建多個索引,但每個索引在該表中的名稱是唯一的。
  • <表名>:指定要創建索引的表名。
  • <列名>:指定要創建索引的列名。通??梢钥紤]將查詢語句中在 JOIN 子句和 WHERE 子句里經常出現的列作為索引列。
  • <長度>:可選項。指定使用列前的 length 個字符來創建索引。使用列的一部分創建索引有利于減小索引文件的大小,節省索引列所占的空間。在某些情況下,只能對列的前綴進行索引。索引列的長度有一個最大上限字節數,如果索引列的長度超過了這個上限,就只能用列的前綴進行索引。另外,BLOB 或 TEXT 類型的列也必須使用前綴索引。
  • ASC|DESC:可選項。ASC指定索引按照升序來排列,DESC指定索引按照降序來排列,默認為ASC。

示例:

create index index_name on table_name(column_name,column_name)

(2)刪除索引

語法格式:

DROP INDEX <索引名> ON <表名>

語法說明:

  • <索引名>:要刪除的索引名。
  • <表名>:指定該索引所在的表名。

示例:

drop index index_name on table_name

5. 事務

事務是并發控制的單位,是用戶定義的一個操作序列,主要用于處理操作量大,復雜度高的數據。這些操作要么都做,要么都不做,是一個不可分割的工作單位。通過事務,SQL能將邏輯相關的一組操作綁定在一起,以便保持數據的完整性。

一般來說,事務是必須滿足4個條件(ACID):原子性(Atomicity,又稱為不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱為獨立性)、持久性(Durability)。

(1)開始事務

語法格式:

BEGIN TRANSACTION <事務名稱> |@<事務變量名稱>

語法說明:

  • @<事務變量名稱>是由用戶定義的變量,必須用 char、varchar、nchar 或 nvarchar數據類型來聲明該變量。
  • BEGIN TRANSACTION 語句的執行使全局變量 @@TRANCOUNT 的值加 1。

示例:

begin transaction

(2)提交事務

語法格式:

COMMIT TRANSACTION <事務名稱> |@<事務變量名稱>

語法說明:

COMMIT TRANSACTION語句的執行使全局變量 @@TRANCOUNT 的值減 1。

示例:

commit transaction

(3)撤銷事務

語法格式:

ROLLBACK [TRANSACTION] [<事務名稱>| @<事務變量名稱> | <存儲點名稱>| @ <含有存儲點名稱的變量名>

語法說明:

  • 當條件回滾只影響事務的一部分時,事務不需要全部撤銷已執行的操作??梢宰屖聞栈貪L到指定位置,此時,需要在事務中設定保存點(SAVEPOINT)。保存點所在位置之前的事務語句不用回滾,即保存點之前的操作被視為有效的。保存點的創建通過“SAVING TRANSACTION<保存點名稱>”語句來實現,再執行“ROLLBACK TRANSACTION<保存點名稱>”語句回滾到該保存點。
  • 若事務回滾到起點,則全局變量 @@TRANCOUNT 的值減 1;若事務回滾到指定的保存點,則全局變量 @@TRANCOUNT 的值不變。

示例:

rollback

6. 約束

(1)主鍵約束

主鍵約束是一個列或者列的組合,其值能唯一地標識表中的每一行,這樣的一列或多列稱為表的主鍵,通過主鍵約束可以強制表的實體完整性。

語法格式:

<字段名> <數據類型> PRIMARY KEY [默認值]

示例:

PRIMARY KEY(id)

(2)唯一約束

唯一約束要求該列唯一,允許為空,但只能出現一個空值。唯一約束能夠確保一列或者幾列不出現重復值。

語法格式:

<字段名> <數據類型> UNIQUE

示例:

unique(id)

(3)外鍵約束

外鍵約束用來在兩個表的數據之間建立鏈接,它可以是一列或者多列。一個表可以有一個或多個外鍵。

語法格式:

[CONSTRAINT <外鍵名>] FOREIGN KEY 字段名 [,字段名2,…]

REFERENCES <主表名> 主鍵列1 [,主鍵列2,…]

語法說明:

外鍵名為定義的外鍵約束的名稱,一個表中不能有相同名稱的外鍵;字段名表示子表需要添加外健約束的字段列;主表名即被子表外鍵所依賴的表的名稱;主鍵列表示主表中定義的主鍵列或者列組合。

示例:

foreign key(id)

(4)非空約束

非空約束(NOT NULL)可以通過 CREATE TABLE 或 ALTER TABLE 語句實現。在表中某個列的定義后加上關鍵字 NOT NULL 作為限定詞,來約束該列的取值不能為空。

語法格式:

<字段名> <數據類型> NOT NULL;

示例:

id int(10) not null

(5)檢查約束

檢查約束基于行中其他列的值在特定的列中對值進行限制,用于限制列中的值的范圍。

語法格式:

CHECK <表達式>

語法說明:

<表達式>指的就是 SQL 表達式,用于指定需要檢查的限定條件。

示例:

check(id>0)

小結

SQL語言是結構化查詢語言的簡稱,其具有功能豐富、語言簡潔、靈活易學的優點。從上面的SQL語言的語法介紹中我們可以看出SQL語法接近英語口語,我們很容易學習和上手,希望本篇文章可以幫助到想要學習SQL語言的數據產品經理們,讓數據產品經理日常工作中數據的獲取更加簡單、方便,從而在此基礎上能夠做出更好的數據產品。

 

本文由 @ Eric 原創發布于人人都是產品經理。未經許可,禁止轉載

題圖來自Unsplash,基于CC0協議

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 大家期待已久的《數據產品經理實戰訓練營》終于上線啦!

    本課程非常適合新手數據產品經理,或者想要轉崗的產品經理、數據分析師、研發、產品運營等人群。

    課程會從基礎概念,到核心技能,再通過典型數據分析平臺的實戰,幫助大家構建完整的知識體系,掌握數據產品經理的基本功。

    學完后你會掌握怎么建指標體系、指標字典,如何設計數據埋點、保證數據質量,規劃大數據分析平臺等實際工作技能~

    現在就添加空空老師(微信id:anne012520),咨詢課程詳情并領取福利優惠吧!

    來自廣東 回復
  2. 值得一試

    來自廣東 回復
  3. 用時百度就OK了啊。 ??

    來自江蘇 回復
  4. 請問,數據產品除了sql,基礎產品知識,還有什么需要特別注意的嗎?

    來自北京 回復
    1. 多體驗用戶行為分析產品、BI產品和數據中臺工具產品

      回復
    2. 請問有沒有產品名字啊

      來自菲律賓 回復
    3. 用戶行為分析平臺有神策、GrowingIO等,BI平臺有Tableau、Qlikview、帆軟FineReport,數據中臺可以了解阿里的數據中臺、數瀾、袋鼠云等

      回復
    4. 阿里的數據中臺怎么體驗?需要購買嗎

      來自廣東 回復
  5. !人6nxnnc呢6xc6arcx7zzZxxxcz

    回復
  6. 請問你是在哪里學的呀?現在學習資料太雜了不知如何下手

    來自上海 回復
    1. 入門可以去w3chool看看

      回復