學習初期,有目標學習有效果,同事給了幾個題,這樣有目標的去練習學習;
題目如下:
使用 PostgreSQL 數據庫
使用語句創建表和字段
1. 新增訂單表 和 物流表
訂單表:訂單號、訂單數量、商品名稱、商品型號、售價、訂單生成時間
物流表:物流號、省、市、區、地址、收貨人、手機號
2.訂單表和物流表使用用訂單號進行關聯
3.查詢所銷售商品的金額總和
4.按訂單時間倒序排列所有訂單
5.查詢消費金額最多的省
6.創建一個自定義函數返回物流表中的所有省數據,並調用自定義函數查詢所有省數據;
以上的內容,涉及到了建表,建字段,插入數據,查詢,自定義函數的使用;
練習后結果如下:
1. 新增訂單表 和 物流表
訂單表:訂單號、訂單數量、商品名稱、商品型號、單價、訂單生成時間
物流表:物流號、省、市、區、地址、收貨人、手機號
2.訂單表和物流表使用用訂單號進行關聯
1和2,用以下語句實現;注意字段語句后面都帶有逗號;‘,’
create table order_master( // 建訂單表:表名為 order_master
id int primary key not null unique, // 訂單號:表中第一個字段名為:id;primary key 代表設置字段 id為主鍵; not null 代表 字段不可為空,unique 代表 字段唯一不可重復;
number int not null, // 訂單數量:表中第二個字段名為:number; not null 代表 字段不可為空;
goodsname text not null, // 商品數量:表中第三個字段名為:goodsname; not null 代表 字段不可為空;
goodstype text not null, // 商品型號:表中第四個字段名為:goodstype; not null 代表 字段不可為空;
goodsprice money not null, // 單價:表中第五個字段名為:goodsprice; not null 代表 字段不可為空;
loaddate date not null // 訂單生成時間:表中第六個字段名為:loaddate; not null 代表 字段不可為空;
)
create table logistics ( // 建物流表:表名為 logistics
Logistics varchar not null, // 物流號:表中第一個字段名為:Logistics ;varchar 字段類型; not null 代表 字段不可為空;
province text not null, // 省:表中第二個字段名為:province ;text字段類型; not null 代表 字段不可為空;
city text not null, // 市:表中第三個字段名為:city;text字段類型; not null 代表 字段不可為空;
area text not null, // 區:表中第四個字段名為:area;text字段類型; not null 代表 字段不可為空;
address text not null, // 地址:表中第五個字段名為:address ;text字段類型; not null 代表 字段不可為空;
consignee text not null, // 收貨人:表中第六個字段名為:consignee ;text字段類型; not null 代表 字段不可為空;
phonenumber char(11) not null, // 電話:表中第七個字段名為:phonenumber ;char(11)字段類型,且11位; not null 代表 字段不可為空;
id_d INT references ORDER_MASTER(ID) // 表中 id_d字段,int類型,與 ORDER_MASTER表中的字段(ID)為外鍵
)
3.查詢所銷售商品的金額總和
金額總和=訂單數量*售價,再求所有訂單號的結果總和
select sum(number*goodsprice) from order_master;
4.按訂單時間倒序排列所有訂單
語法例子:SELECT column-list FROM table_name [WHERE condition] [ORDER BY column1, column2, .. columnN] [ASC | DESC];
用 DESC 表示按倒序排序(即:從大到小排序) ---降序排列
用 ACS 表示按正序排序(即:從小到大排序)---升序排列
最終語句:
select * from order_master order by loaddate DESC; //order by 按照xxx排序;按照時間倒序排列;
5.查詢消費金額最多的省
首先,兩個表用left join,合並成一個表來展示內容;
select * from order_master left join logistics on order_master.id= logistics.id_d;
合並之后,我們來計算消費金額,消費金額=number*goodsprice
因為每個訂單,至是單省的銷售情況,所以這里要消費金額最多的省,
首先,相同省份的消費金額,要加起來展示,所以這里是:sum(number*goodsprice)
第二步:消費金額最多的省,也就是要按照金額進行倒序排列;這里有兩個關鍵詞,一個是按照省份來分組,一個是按照金額多少來排序;
所以用到 group by province; order by 消費金額;
第三步:經過第二步擴展后,語句如下 ,這里用到了一個別名的概念,詳細見下面的說明部分;
select sum(number*goodsprice) as je from order_master t left join logistics a on id = a.id_d group by province order by je desc;
這里金額是按照排序顯示出來了,但是沒有省份數據,現在加上省份的數據
第四步:增加省份數據;
這個還在嘗試中,后面成功了補上來;
select concat (concat(province),concat(sum(number*goodsprice)) ) as je from order_master t left join logistics a on id = a.id_d group by province order by je desc;
用到了concat
結果:
跟預期有點差別,最好是分成兩個字段展示,繼續研究,回頭補上;
說明:
這里用到了別名這個概念; 這里je是金額的別名=sum(number*goodsprice)
order_master 別名:t; logistics 別名: a;
說明:這里首先把兩個表合並一下,利用order_master表的id=logistics表的id_d;其中 id 是order_master的主鍵,id_d 是logistics表的外鍵;且他兩對應;
首先合並使用的是left join
left join 使用方法如下:select * from order_master left join logistics on order_master.id= logistics.id_d;
這里注意:把order_master表也就是左表,返回加入(join)到logistics表中;依據是兩個表的主外鍵;
注意點2:在id和id_d這里,表名.id=表名.id_d,表名和字段名中間,有個點兒;
語法:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
6.創建一個自定義函數返回物流表中的所有省數據,並調用自定義函數查詢所有省數據;
說明:
create or replace function ss() // 建一個名字為ss的自定義函數
returns varchar as // returns 理解為返回一個xxxx類型的結果;xxxx是返回的字段的類型,我這里是varchar的;
$$ // 理解為固定寫法
select province from logistics; // 從logistics表里獲取省份數據;
$$ LANGUAGE SQL; // 理解為固定寫法
---------------------------以上,就是完成了一個自定義函數設定;設定了一個名字是ss的自定義函數,這個函數的返回值是varchar型的,返回的內容就是 從logistics表里獲取省份數據;
select * from ss(); // 調用自定義函數,查詢所有的省數據;
執行結果:
這里有個說明:
關於 SETOF ,這個加到returns后面,如下;如果不加SETOF,則返回查詢結果的第一條數據,加上之后,返回所有數據;
關於多次執行:因為執行一次之后,就已經建立了ss的自定義函數,所以這里如果繼續執行這段內容,就會提示已經有了ss的自定義函數了,這里就改個名字,然后執行就可以了;
create or replace function ss1()
returns setof varchar as
$$
select province from logistics;
$$ LANGUAGE SQL;
select * from ss1();
執行結果: