PostgreSQL-建表-查詢-自定義函數--(一)


學習初期,有目標學習有效果,同事給了幾個題,這樣有目標的去練習學習;

題目如下:

 使用 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();

 執行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM