第六節:如何檢索資料
在本節中,我們將介紹如何使用SQL語句檢索數據庫中的資料,具體包括選擇特定列、排序、條件過濾以及組合排序等操作。我們以一個名為
student
的表格為例,演示不同的檢索方法。
初始表格 student
student_id | name | major | score |
---|---|---|---|
1 | 小白 | 英語 | 50 |
2 | 小黃 | 生物 | 90 |
3 | 小綠 | 歷史 | 70 |
4 | 小藍 | 英語 | 80 |
5 | 小黑 | 化學 | 20 |
檢索目標表格
1. 選取目標列 name
, major
SELECT `name`, `major` FROM `student`;
結果:
name | major |
---|---|
小白 | 英語 |
小黃 | 生物 |
小綠 | 歷史 |
小藍 | 英語 |
小黑 | 化學 |
2. 依照特定列 score
,對目標列進行排序(順序)
SELECT `name`, `major`, `score` FROM `student` ORDER BY `score`;
結果:
name | major | score |
---|---|---|
小黑 | 化學 | 20 |
小白 | 英語 | 50 |
小綠 | 歷史 | 70 |
小藍 | 英語 | 80 |
小黃 | 生物 | 90 |
3. 依照特定列 score
,對目標列進行排序(倒序)
SELECT `name`, `major`, `score` FROM `student` ORDER BY `score` DESC;
結果:
name | major | score |
---|---|---|
小黃 | 生物 | 90 |
小藍 | 英語 | 80 |
小綠 | 歷史 | 70 |
小白 | 英語 | 50 |
小黑 | 化學 | 20 |
4. 組合排序,依照特定列 score
, student_id
先后對目標列進行排序
SELECT * FROM `student` ORDER BY `score`, `student_id`;
結果:
student_id | name | major | score |
---|---|---|---|
5 | 小黑 | 化學 | 20 |
1 | 小白 | 英語 | 50 |
3 | 小綠 | 歷史 | 70 |
4 | 小藍 | 英語 | 80 |
2 | 小黃 | 生物 | 90 |
5. WHERE
多條件限定情況
SELECT * FROM `student`
WHERE `major` IN('生物', '歷史', '英語');
或者
SELECT * FROM `student`
WHERE `major` = '生物' OR `major` = '歷史' OR `major` = '英語';
結果:
student_id | name | major | score |
---|---|---|---|
1 | 小白 | 英語 | 50 |
2 | 小黃 | 生物 | 90 |
3 | 小綠 | 歷史 | 70 |
4 | 小藍 | 英語 | 80 |
第七節:案例:創建公司數據庫
本案例展示了如何創建一個包含員工、部門、客戶以及員工與客戶關系的公司數據庫。
創建數據表
1. Employee 表
CREATE TABLE `employee`(`emp_id` INT PRIMARY KEY,`name` VARCHAR(20),`birth_date` DATE,`sex` VARCHAR(1),`salary` INT,`branch_id` INT,`sup_id` INT
);
2. Branch 表
CREATE TABLE `branch`(`branch_id` INT PRIMARY KEY,`branch_name` VARCHAR(20),`manager_id` INT,FOREIGN KEY (`manager_id`) REFERENCES `employee`(`emp_id`) ON DELETE SET NULL
);
外鍵 (
manager_id
) 對應employee
(emp_id
3. Customer 表
CREATE TABLE `customer`(`cust_id` INT PRIMARY KEY,`name` VARCHAR(50),`address` VARCHAR(100),`phone` VARCHAR(15)
);
4. Works_With 表
CREATE TABLE `works_with`(`emp_id` INT,`cust_id` INT,`total_sales` DECIMAL(10, 2),PRIMARY KEY (`emp_id`, `cust_id`),FOREIGN KEY (`emp_id`) REFERENCES `employee`(`emp_id`) ON DELETE CASCADE,FOREIGN KEY (`cust_id`) REFERENCES `customer`(`cust_id`) ON DELETE CASCADE
);
插入數據
讓我們插入一些數據以便更好地演示如何進行查詢。
插入 Employee 表數據
INSERT INTO `employee` (`emp_id`, `name`, `birth_date`, `sex`, `salary`, `branch_id`, `sup_id`)
VALUES
(1, 'Alice', '1985-01-15', 'F', 50000, 1, NULL),
(2, 'Bob', '1975-03-22', 'M', 60000, 1, 1),
(3, 'Charlie', '1990-07-18', 'M', 55000, 2, NULL);
插入 Branch 表數據
INSERT INTO `branch` (`branch_id`, `branch_name`, `manager_id`)
VALUES
(1, 'HQ', 1),
(2, 'Branch 1', 3);
插入 Customer 表數據
INSERT INTO `customer` (`cust_id`, `name`, `address`, `phone`)
VALUES
(1, 'Customer A', '123 Main St', '555-1234'),
(2, 'Customer B', '456 Elm St', '555-5678');
插入 Works_With 表數據
INSERT INTO `works_with` (`emp_id`, `cust_id`, `total_sales`)
VALUES
(1, 1, 2000.00),
(2, 1, 1500.00),
(2, 2, 3000.00);
復雜查詢示例
0. 圖片案例查詢
獲取公司數據
基本語法案例:
-- 1.取得所有員工資料SELECT * FROM `employee`;-- 2.取得所有客戶資料SELECT * FROM `client`;-- 3.按薪水低到高取得員工資料SELECT * FROM `employee` ORDER BY `salary`;-- 4.取得薪水前3高的員工SELECT * FROM `employee` ORDER BY `salary` DESC LIMIT 3;-- 5.取得所有員工的名子SELECT `name` FROM `employee`;-- 6.取得所有員工的性別,篩除重復值SELECT DISTINCT `sex` FROM `employee`;
聚合函數
基本語法案例:
-- aggregate functions聚合函數-- 1.取得員工人數SELECT COUNT(`emp_id`) FROM `employee`;-- 2.取得所有出生於 1970-01-01之後的女性員工人數SELECT COUNT(`emp_id`) FROM `employee` WHERE `birth_data` > '1970-01-01' AND `sex` = 'F';-- 3.取得所有員工的平均薪水 SELECT AVG(`salary`) FROM `employee`;-- 4.取得所有員工薪水的總和SELECT SUM(`salary`) FROM `employee`;-- 5.取得的最高薪水SELECT MAX(`salary`) FROM `employee`;-- 6.取得的最低薪水SELECT MIN(`salary`) FROM `employee`;
wildcards 萬用字符
基本語法案例:
-- wildcards萬用字符% 代表多個字元,_代表一固字元-- 1.取得電話號碼尾數是335的客戶SELECT * FROM `client` WHERE `phone` LIKE '%335';-- 2.取得姓艾的客戶SELECT * FROM `client` WHERE `client_name` LIKE '艾%';-- 3.取得生日在12月的員工SELECT * FROM `employee` WHERE `birth_data` LIKE '____-12%';
union 聯合
基本語法案例:
-- 1. 員工名子 union 客戶名子SELECT `name` FROM `employee` UNIONSELECT `client_name` FROM `client`;-- 2. 員工id + 員工名子 union 客戶id + 客戶名子SELECT `emp_id`, `name` FROM `employee`UNIONSELECT `client_id`, `client_name` FROM `client`;-- 3.員工薪水 union 銷售金額SELECT `salary` AS `total_money` FROM `employee`UNIONSELECT `total_sales` FROM `works_with`;
合并的字符類型要求一致
join 連接
-- join 連接-- 取得所有部門經理的名子SELECT `emp_id`, `name` FROM `employee` JOIN `branch`ON `employee`.`emp_id` = `branch`.`manager_id`;-- LEFT JOIN 左連接 空缺為NULL-- RIGHT JOIN 右連接 空缺為NULL
JOIN連接時通過
.
來標定屬性的表歸屬
subquery 子查詢
-- subquery子查韻-- 1.找出研發部門經理名子SELECT `name` FROM `employee` WHERE `emp_id` = (SELECT `manager_id` FROM `branch` WHERE `branch_name` = '研發');-- 2.找出對單一位客戶銷售金額超過50000的員工名子SELECT `name` FROM `employee` WHERE `emp_id` IN (SELECT `emp_id` FROM `works_with` WHERE `total_sales` > 50000);
on delete
Branch
CREATE TABLE `branch`(`branch_id` INT PRIMARY KEY,`branch_name` VARCHAR(20),`manager_id` INT,FOREIGN KEY (`manager_id`) REFERENCES `employee`(`emp_id`) ON DELETE SET NULL);
表示:在刪除表單時
employee
(emp_id
)若缺失, (manager_id
) 賦值為NULL
注意刪除時,主鍵不能為NULL
Works_with
CREATE TABLE `works_with`(`emp_id` INT,`client_id` INT,`total_sales` INT,PRIMARY KEY(`emp_id`, `client_id`),FOREIGN KEY (`emp_id`) REFERENCES `employee`(`emp_id`) ON DELETE CASCADE,FOREIGN KEY (`client_id`) REFERENCES `client` (`client_id`) ON DELETE CASCADE);
表示:在刪除表單時
employee
(emp_id
)若無對應, 對應行直接刪除
1. 查詢每個員工的總銷售額
SELECT e.`name` AS `employee_name`,SUM(w.`total_sales`) AS `total_sales`
FROM `employee` e
JOIN `works_with` w ON e.`emp_id` = w.`emp_id`
GROUP BY e.`name`;
結果:
employee_name | total_sales |
---|---|
Alice | 2000.00 |
Bob | 4500.00 |
2. 查詢每個部門的經理姓名
SELECT b.`branch_name`,e.`name` AS `manager_name`
FROM `branch` b
JOIN `employee` e ON b.`manager_id` = e.`emp_id`;
結果:
branch_name | manager_name |
---|---|
HQ | Alice |
Branch 1 | Charlie |
3. 查詢特定員工負責的客戶信息
假設我們想查詢Bob(
emp_id
= 2)負責的客戶信息:
SELECT c.`name` AS `customer_name`,c.`address`,c.`phone`,w.`total_sales`
FROM `customer` c
JOIN `works_with` w ON c.`cust_id` = w.`cust_id`
WHERE w.`emp_id` = 2;
結果:
customer_name | address | phone | total_sales |
---|---|---|---|
Customer A | 123 Main St | 555-1234 | 1500.00 |
Customer B | 456 Elm St | 555-5678 | 3000.00 |
如何使用Python與MySQL進行集成,并展示一些更復雜的查詢和數據處理操作。
以公司數據庫為例,如何編寫Python代碼來查詢數據、進行數據分析,并將結果可視化。
使用Python與MySQL進行集成的詳細示例
1. 安裝 mysql-connector-python
庫
首先,確保你安裝了 mysql-connector-python
庫。可以使用以下命令進行安裝:
2. 連接MySQL數據庫并執行查詢
以下是一個詳細的Python示例,展示如何連接到MySQL數據庫,執行查詢并處理結果:
import mysql.connectordef connect_to_database():# 建立數據庫連接conn = mysql.connector.connect(host='localhost',user='root',password='your_password',database='your_database')return conndef fetch_employee_sales():# 連接數據庫conn = connect_to_database()cursor = conn.cursor()# 查詢每個員工的總銷售額query = """SELECT e.name AS employee_name,SUM(w.total_sales) AS total_salesFROM employee eJOIN works_with w ON e.emp_id = w.emp_idGROUP BY e.name;"""cursor.execute(query)# 獲取查詢結果results = cursor.fetchall()# 處理查詢結果for row in results:print(f"Employee: {row[0]}, Total Sales: {row[1]}")# 關閉游標和連接cursor.close()conn.close()if __name__ == "__main__":fetch_employee_sales()
3. 數據分析和可視化
使用Python中的Pandas庫進行數據分析,并使用Matplotlib或Seaborn進行可視化。
首先,確保安裝Pandas和Matplotlib:
pip install pandas matplotlib
然后,我們可以擴展上述示例,使用Pandas讀取查詢結果并進行可視化:
import mysql.connector
import pandas as pd
import matplotlib.pyplot as pltdef connect_to_database():# 建立數據庫連接conn = mysql.connector.connect(host='localhost',user='root',password='your_password',database='your_database')return conndef fetch_employee_sales():# 連接數據庫conn = connect_to_database()cursor = conn.cursor()# 查詢每個員工的總銷售額query = """SELECT e.name AS employee_name,SUM(w.total_sales) AS total_salesFROM employee eJOIN works_with w ON e.emp_id = w.emp_idGROUP BY e.name;"""cursor.execute(query)# 獲取查詢結果并轉換為Pandas DataFrameresults = cursor.fetchall()df = pd.DataFrame(results, columns=['Employee', 'Total Sales'])# 關閉游標和連接cursor.close()conn.close()return dfdef visualize_sales(df):# 使用Matplotlib進行可視化plt.figure(figsize=(10, 6))plt.bar(df['Employee'], df['Total Sales'], color='skyblue')plt.xlabel('Employee')plt.ylabel('Total Sales')plt.title('Employee Total Sales')plt.show()if __name__ == "__main__":df = fetch_employee_sales()visualize_sales(df)
高級數據處理和可視化
1. 查詢每個部門的總銷售額以及部門經理的姓名
如何在Python中執行此查詢,并將結果進行可視化。
def fetch_branch_sales():# 連接數據庫conn = connect_to_database()cursor = conn.cursor()# 查詢每個部門的總銷售額以及部門經理的姓名query = """SELECT b.branch_name,SUM(w.total_sales) AS total_sales,e.name AS manager_nameFROM branch bJOIN employee e ON b.manager_id = e.emp_idJOIN employee emp ON b.branch_id = emp.branch_idJOIN works_with w ON emp.emp_id = w.emp_idGROUP BY b.branch_name, e.name;"""cursor.execute(query)# 獲取查詢結果并轉換為Pandas DataFrameresults = cursor.fetchall()df = pd.DataFrame(results, columns=['Branch', 'Total Sales', 'Manager'])# 關閉游標和連接cursor.close()conn.close()return dfdef visualize_branch_sales(df):# 使用Matplotlib進行可視化plt.figure(figsize=(12, 6))branches = df['Branch']sales = df['Total Sales']managers = df['Manager']bars = plt.bar(branches, sales, color='lightgreen')# 在圖表上添加部門經理的姓名for bar, manager in zip(bars, managers):yval = bar.get_height()plt.text(bar.get_x() + bar.get_width()/2, yval + 1000, manager, ha='center', va='bottom')plt.xlabel('Branch')plt.ylabel('Total Sales')plt.title('Total Sales by Branch and Manager')plt.show()if __name__ == "__main__":df = fetch_branch_sales()visualize_branch_sales(df)
2. 創建銷售記錄表并插入數據
CREATE TABLE `sales_record`(`record_id` INT PRIMARY KEY,`emp_id` INT,`sale_date` DATE,`amount` DECIMAL(10, 2),FOREIGN KEY (`emp_id`) REFERENCES `employee`(`emp_id`) ON DELETE CASCADE
);INSERT INTO `sales_record` (`record_id`, `emp_id`, `sale_date`, `amount`)
VALUES
(1, 1, '2023-01-15', 2000.00),
(2, 2, '2023-02-20', 1500.00),
(3, 2, '2023-03-10', 3000.00),
(4, 1, '2023-03-25', 2500.00);
如果這對您有所幫助,希望點贊支持一下作者! 😊



[ 詳細全文-點擊查看](
)