教你怎麼用EXCEL練習SQL
SQL 作為數據分析的入門是必須的。她的語法結構比較簡單,我們需要經常去練習來熟悉她。那如果是在辦公室又不能裝資料庫來練習。用excel 建立資料庫並練習SQL 是最簡單方便的。
工具鏈接請點這裡。密碼為:uzbr
這個Excel SQL 練習工具我是用VBA調用ADO編寫的。所以SQL的語法和用ACCESS做SQL是一樣的。本文分為以下幾個部分。
- 如何使用 Excel SQL 練習工具
- 關係圖與excel資料庫的講解
- SQL練習實例
- 總結
如何使用 Excel SQL 練習工具
1.首先解壓壓縮包到任意文件夾,並得到名為「SQLpractice」的文件夾
2.打開文件里裡面的「SQL practice.xlsm」
3.點擊左上角」允許編輯「(我用的是英文版則點擊"Enable Content")
4. 先在單元格B2中編輯用來查詢的SQL(1.紅色圈中部分),再點擊(2.藍色圈中部分)就可以在左邊區域顯示查詢內容。
我們來看一個簡單的例子:
在B2中輸入SQL並點擊「Run SQL」
就得到了我們的查詢結果:
關係圖與excel資料庫的講解
與我們用的MYSQL 相似。我用excel建立了一個資料庫,但是不同的是預先不用寫好主鍵,外鍵等關係。所以資料庫的完整性不能保證。先打開文件夾中另一個文件"DATABASE.xlsx"。第一個表就是我們的關係圖。(關係是用手繪的...稍微有點丑。。)
ERD:
主鍵與外鍵信息請參照顏色。紅色為主鍵,藍色為外鍵。
SalesOrders 為銷售訂單表。有4個欄位分別為OrderId(銷售訂單號), EmployeeId(銷售員編號), RequreDate(要求到貨日期), Shipdate(實際發貨日)。
SODetails 為銷售訂單詳情。 有3個欄位分別為OrderId(對應SalesOrders中的銷售訂單號),Productid(產品號),Qty(銷售數量)。
PurchaseOrders 為採購訂單。有4個欄位為Poid(採購訂單編號), Employeeid(採購員編號), RequireDate(需求日期),Shipdate(發貨日期)。
PODetails 為採購訂單詳情。有3個欄位為POid(對應PurchaseOrders 中的採購訂單號),Productid(產品號),Qty(採購數量)。
Products 為產品表。 有4個欄位為Prodid(產品號),Name(產品名稱),Price(銷售價格),Cost(採購價格)。
Employees 為員工表。有5個欄位為Empid(員工工號),Name(姓名),Managerid(上司編號),Depid(所屬部門編號),Salary(工資)。
最後一個表為Department 為部門表。 有2個欄位為Depid(部門編號),Name(部門名稱)。
後面的每個數據表為對應資料庫的表。
SQL練習實例
為在工具中寫了11個例子我們來分析下。首先說下在這裡運行SQL有幾個與MYSQL不一樣的地方。
- 調用表需要用中括弧加表名再加上$. 例如 select * from [employees$]
- 使用多次left join, right join 或者inner join時需要加()隔開。例如
select *
from ([table$] t1 left join [table2$] t2 on t1.k1=t2.k1)
left join [table3$] t3 on t3.k1=t1.k1
*註:「[table$] t1」後面t1 為查詢表的簡化標記來方便查詢。
1. 銷售訂單總數。想要得到的查詢結果:
SQL:
SELECT count(orderid) as TotalSO
FROM [salesorders$]
2. 銷售訂單詳情。想要得到的查詢結果(只截取的開頭數據):
SQL:
SELECT so.orderid, emp.name, so.requiredate, so.shipdate ,p.name, sod.qty,p.price,(sod.qty*p.price) as total
from (([salesorders$] so
left join [sodetails$] sod on so.orderid=sod.orderid)
left join [products$] p on p.prodid=sod.productid)
left join [employees$] emp on emp.empid=so.employeeid
3. 產品銷售額排序。 想要得到的查詢結果(只截取的開頭數據):
SQL:
select p.name, sum( (p.price*sod.qty)) as totalvalue
from [sodetails$] sod
left join [products$] p on sod.productid=p.prodid
group by p.name
order by sum( (p.price*sod.qty)) desc
4. 每個銷售訂單凈利潤。 想要得到的查詢結果(只截取的開頭數據):
SQL:
select sod.orderid ,sum ((p.price-p.cost) * sod.qty) as profit
from [sodetails$] sod left join [products$] p on sod.productid=p.prodid
group by sod.orderid
order by sum ((p.price-p.cost) * sod.qty) desc
5. 找出沒有按時寄出的訂單與責任人。想要得到的查詢結果:
SQL:
select orderid, name
from[salesorders$] so
left join [employees$] emp on emp.empid=so.employeeid
where requiredate<shipdate
6. 當前產品庫存量。想要得到的查詢結果:
SQL:
select p.name , sum(t1.qty) as onhand
from [products$] p
left join (
select productid, -qty as qty
from [sodetails$]
union all
select productid, qty
from [podetails$]) t1 on p.prodid=t1.productid
group by p.name
order by sum(t1.qty) desc
7. 每個部門人數。想要得到的查詢結果:
SQL:
select dep.name, count(empid) as num_of_emp from [department$] dep left join [employees$] emp on emp.depid=dep.depid group by dep.name order by count(empid) desc
8. 每個部門裡年收入最高的員工。想要得到的查詢結果:
SQL:
select emp.name, salary, dep.name
from [employees$] emp
left join [department$] dep on emp.depid=dep.depid
where emp.salary = (
select max(salary)
from [employees$] emp2
where emp.depid=emp2.depid)
9. 年收入比他們上司公司高的員工。想要得到的查詢結果:
SQL:
select emp.empid,emp.name, emp.salary,emp2.name
from [employees$] emp
left join [employees$] emp2 on emp.managerid=emp2.empid
where emp.salary>emp2.salary
10. 2015年每個月的採購總額。想要得到的查詢結果:
SQL:
select month(shipdate)& "/2015" as month_of_2015 , sum(qty*cost) as totalcost
from ([purchaseorders$] po
left join [podetails$] pod on po.poid=pod.poid)
left join [products$] p on p.prodid=pod.productid
where year(shipdate)=2015
group by month(shipdate)
11. 銷售員銷量排行榜。想要得到的查詢結果:
SQL:
select emp.name, sum(p.price*sod.qty) as totalsales
from (([salesorders$] so
left join [employees$] emp on emp.empid=so.employeeid)
left join [sodetails$] sod on sod.orderid=so.orderid)
left join [products$] p on sod.productid=p.prodid
group by emp.name
order by sum(p.price*sod.qty) desc
總結
作為SQL練習的一個小結,通過VBA建立excel資料庫熟悉來資料庫的構成,以及學習來常用SQL功能的使用。
有對VBA功能實現感興趣的同學可以私信為。或者需要為幫助寫VBA小程序的也可以聯繫我。
推薦閱讀:
※MySQL入門學習筆記——七周數據分析師實戰作業
※零基礎如何學習SQL——了解select查詢語句
※使用CUDA加速SQL查詢的研究狀況目前如何,未來的發展會怎樣?
※Oracle資料庫在違章表裡面,怎麼找出30天內違章大於3次的人?
※Python3 pandas如何加快SQL Server讀寫速度?