0.前言
Sakila 可以作為數據庫設計的參考,也可作為實驗數據。本例是用作數據分析學習的實驗數據。
The Sakila sample database was developed by Mike Hillyer, a former member of the MySQL AB documentation team, and is intended to provide a standard schema that can be used for examples in books, tutorials, articles, samples, and so forth. Sakila sample database also serves to highlight the latest features of MySQL such as Views, Stored Procedures, and Triggers.
1.實驗環境
方法一:安裝 MySQL 時選擇 FULL 完全安裝
安裝 MySQL 時選擇 FULL 完全安裝,默認安裝了 Sakila sample database

方法二:下載后導入
下載地址:
解壓后得到三個文件:
- sakila-schema.sql 文件包含創建 Sakila 數據庫的結構:表、視圖、存儲過程和觸發器
- sakila-data.sql 文件包含:使用 INSERT 語句填充數據及在初始數據加載后,必須創建的觸發器的定義
- sakila.mwb 文件是一個 MySQL Workbench 數據模型,可以在 MySQL 的工作台打開查看數據庫結構。
導入參考: http://dev.mysql.com/doc/sakila/en/sakila-installation.html
shell> mysql -u root -p
mysql> SOURCE C:/temp/sakila-db/sakila-schema.sql;
mysql> SOURCE C:/temp/sakila-db/sakila-data.sql;
2.數據結構
Sakila 樣例數據庫包括 16 張表格,7 個視圖,3 個 Stored Procedures,3 個 Functions,6 個 Triggers。英文描述點開相應連接即可查看。
總覽:

關系圖:

3.視圖
actor_info 視圖提供了所有演員的列表及所演的電影,電影按 category 分組.
actor → film_actor → film → film_category → category
- actor_id: 代理主鍵用於唯一標識表中的每個演員
- first_name: 演員的名字
- last_name: 演員的姓氏
- last_update: 該行已創建或最近更新的時間

客戶列表,firstname和lastname連接成fullname,將 address, city, country 集成在一個視圖里
customer → address → city → country
- stomer_id: 代理主鍵用於唯一標識表中的每個客戶
- store_id: 一個外鍵,確定客戶所屬的 store。
- first_name: 客戶的名字
- last_name: 客戶的姓氏
- email: 客戶的電子郵件地址
- address_id: 使用在地址 表的外鍵來確定客戶的地址
- active: 表示客戶是否是活躍的客戶
- create_date: 顧客被添加到系統中的日期。使用 INSERT 觸發器自動設置。
- last_update: 該行已創建或最近更新的時間

每個電影種類的銷售額
payment → rental → inventory → film → film_category → category

每個商店的 manager 及銷售額。
payment → rental → inventory → store → staff
store 表列出了系統中的所有商店 。
store 使用外鍵來標識工作人員和地址;在員工、客戶、庫存表被作為外鍵使用。
- store_id: 代理主鍵唯一標識的商店
- manager_staff_id: 使用外鍵來標識這家商店的經理
- address_id: 使用外鍵來確定這家店的地址
- last_update: 該行已創建或最近更新的時間

工作人員的列表
工作人員表列出了所有的工作人員,包括電子郵件地址,登錄信息和圖片信息 。
工作人員表是指使用外鍵來標識存儲和地址表;在出租、支付和商店表中作為外鍵。
- staff_id: 代理主鍵唯一標識的工作人員
- first_name: 工作人員的名字
- last_name: 工作人員的姓氏
- address_id: 工作人員的地址在地址表的外鍵
- picture: 工作人員的照片,使用了 BLOB 屬性
- email: 工作人員的電子郵件地址
- store_id: 工作人員所在的商店,用外鍵標識
- active: 是否是活躍的工作人員。
- username: 用戶名,由工作人員用來訪問租賃系統
- password: 工作人員訪問租賃系統所使用的密碼。使用了 SHA1 函數
- last_update: 該行已創建或最近更新的時間
- active: 是否有效,刪除時設置為 False

4.數據分析
最具有購買潛力的顧客:
從600位顧客中去發現和找出最具有購買潛力的顧客,找出他們的郵箱地址和聯系方法,並給他們發送郵件進行感謝,以保持該部分用戶的持續購買欲望,增加用戶的滿意度,以此來保持商品的銷售量。
0.數據獲取
根據customer、payment兩個表進行數據篩選,獲得顧客編號:customer.customer_id 顧客編號;計算總消費金額;最后根據顧客消費總金額降序排列。

具體代碼:
SELECT
customer1.customer_id 顧客編號,
CONCAT( customer1.`first_name`, CONCAT( " ", customer1.`last_name` ) ) AS '顧客名',
FORMAT(sum(payment.amount),2) AS '消費金額'
FROM
customer1,
payment
WHERE
customer1.customer_id = payment.customer_id
GROUP BY
CONCAT( customer1.`first_name`, CONCAT( " ", customer1.`last_name` ) )
ORDER BY
FORMAT(sum(payment.amount),2)+0 DESC
1.連接顧客姓名
通過篩選address_id連接customer和address兩表得到顧客的編號、地址、電話,然后通過顧客的編號升序排列。

具體代碼:
SELECT
CONCAT( customer1.`first_name`, CONCAT( " ", customer1.`last_name` ) ) AS 顧客姓名,
customer1.customer_id 顧客編號,
address.address 顧客地址,
address.phone 顧客電話,
customer1.email
FROM
customer1 ,
address
WHERE
customer1.address_id=address.address_id
GROUP BY
CONCAT( customer1.`first_name`, CONCAT( " ", customer1.`last_name` ) )
ORDER BY
customer1.customer_id+0 ASC
2.結果分析
通過表一得到散點圖:

根據數據分析我們可以看到顧客KARL SEAL的消費金額221.55是600位顧客中消費總金額最高的一位,他便是最有潛力的顧客,然后我們可以通過表二去得到他的聯系信息。
通過散點圖我們可以分析到大多數的顧客消費總金額分布在120元上下,所以我們以120元為界,將消費總金額在120元以上顧客列為有購買潛力的顧客,從表二尋找他們的聯系方式,批量對他們發送郵件進行感謝。
