SQL server 多表查詢與檢視的使用
阿新 • • 發佈:2019-02-06
use Saijie
create table goods1(
商品編號 int primary key identity(1,1),--主鍵,自增
商品名稱 varchar(20) unique, --唯一鍵
商品價格 decimal(5,1) check(商品價格>0),
);
drop table member
create table member(
會員編號 int primary key identity(100,1),
會員姓名 varchar(20),
性別 varchar(4) default('女')
);
drop table orders
create table orders(
訂單編號 int primary key identity(0000000,1),
會員編號 int foreign key references member(會員編號),
商品編號 int foreign key references goods1(商品編號),
下單時間 smalldatetime,
數量 int
);
insert into goods1 values('棒棒糖',0.5);
insert into goods1 values('奶茶',1.0);
insert into goods1 values('可口可樂',3.5);
insert into goods1 values('雪碧',3.0);
insert into goods1 values('怡寶',2.0);
insert into goods1 values('鉛筆',1.0);
insert into goods1 values('酸奶',3.5);
insert into goods1 values('啤酒',3.0);
insert into goods1 values('紙巾(袋裝)',1.0);
insert into goods1 values('紙巾(卷)',3.0);
insert into goods1 values('信紙',2.0);
insert into goods1 values('水性筆',3.5);
insert into goods1 values('橡皮擦',1.0);
select * from goods1
insert into member values('文雅','女');
insert into member values('李雙龍','男');
insert into member values('賀志玉','女');
insert into member values('黃成','男');
insert into member values('蔡文鵬','男');
insert into member values('王豔芳','女');
select * from member
insert into orders values (100,1,getdate(),12);
insert into orders values (102,1,getdate()-1,1);
insert into orders values (100,2,getdate()+1,12);
insert into orders values (102,4,getdate()-1,1);
insert into orders values (100,7,getdate(),12);
insert into orders values (101,10,getdate(),4);
insert into orders values (103,9,getdate(),9);
insert into orders values (105,6,getdate()-1,17);
select * from orders ;
/*建立檢視*/
create view test2 as
SELECT dbo.goods1.*, dbo.goods1.商品編號, dbo.goods1.商品名稱, dbo.goods1.商品價格, dbo.member.會員編號, dbo.member.會員姓名, dbo.orders.訂單編號,
dbo.orders.下單時間
FROM dbo.goods1 INNER JOIN
dbo.orders ON dbo.goods1.商品編號 = dbo.orders.商品編號 INNER JOIN
dbo.member ON dbo.orders.會員編號 = dbo.member.會員編號
select * from test2;
--查詢最近三天銷售額佔前兩位的商品編號,名稱及銷售額
select top 2 商品編號,商品名稱,sum(商品價格*數量) as 銷售額 from test2
group by 商品編號, 商品名稱 order by 銷售額 desc;
--多表查詢
--1. 交叉查詢:查詢原理:將A表,B表中d資料相互交叉組合,一共有M*N種結合結果。
--1.1 隱式交叉查詢:
select goods1.商品編號, 商品名稱, 商品價格, 數量,下單時間 from goods1,orders where 會員編號=100;
--1.2 顯式交叉查詢
select goods1.商品編號,商品名稱,商品價格,數量,下單時間 from goods1 cross join orders;
--2. 內連結查詢:查詢原理:將A表,B表中的資料根據某種條件連結起來,
--將符合條件的資料查詢顯示
--2.1 隱式內連結查詢
select 會員編號 ,goods1.商品編號,商品名稱,商品價格,數量,下單時間 from goods1,orders where goods1.商品編號=orders.商品編號
and 會員編號=101;
--2.2 顯式內連結查詢
select goods1.商品編號, 商品名稱,商品價格,數量,下單時間 from goods1 inner join orders on goods1.商品編號=orders.商品編號
where 會員編號=102;
--左連結查詢:查詢原理:以左邊的表為主,右邊的表為輔,將左表和右邊中的資料根據某種條件連結起來,
--將符合條件的資料查詢顯示。
select goods1.商品編號, 商品名稱,商品價格,數量,下單時間 from goods1 left join orders on goods1.商品編號=orders.商品編號 where 會員編號=103;
--查詢銷售額佔前兩位的商品編號,名稱及銷售額
select top 2 goods1.商品編號,商品名稱,sum(商品價格*數量) as 消費總額 from goods1 inner join orders on goods1.商品編號=orders.商品編號
group by goods1.商品編號 ,商品名稱 order by 消費總額 desc;
--查詢會員單次消費的總額
select 會員編號,sum(商品價格*數量) as 消費總額 from goods1 inner join orders on goods1.商品編號=orders.商品編號
group by 商品名稱 , 會員編號 ;
--查詢會員消費的總額
select 會員編號,sum(商品價格*數量) as 消費總額 from goods1 inner join orders on goods1.商品編號=orders.商品編號
group by 會員編號 ;
--查詢最近兩天天銷售額佔前兩位的商品編號,名稱及銷售額
select top 2 goods1.商品編號,商品名稱,sum(商品價格*數量) as 消費總額 from goods1 inner join orders
on goods1.商品編號=orders.商品編號 where 下單時間 between GETDATE()-2 and GETDATE()
group by goods1.商品編號,商品名稱 order by 消費總額 desc;
--查詢如下資訊:
/* 1.查詢某人的消費總額 */
select sum(商品價格*數量) as 消費總額 from goods1 left join orders
on goods1.商品編號=orders.商品編號 where 會員編號=101;
/* 2.查詢每個人的消費總額,按照會員編號排序 */
select 會員編號,sum(商品價格*數量) as 消費總額 from goods1 inner join orders on goods1.商品編號=orders.商品編號
group by 會員編號 ;
/* 3.查詢某個時間段的消費總額 */
select 會員編號,sum(商品價格*數量) as 消費總額 from goods1 inner join orders
on goods1.商品編號=orders.商品編號 where 下單時間 between GETDATE()-2 and GETDATE()
group by 會員編號 order by 消費總額 desc;
/* 4.查詢某人購買次數最多的商品名稱 */
select 商品名稱, max(數量) as 數量 from goods1 left join orders
on goods1.商品編號=orders.商品編號 where 會員編號=101 group by 商品名稱;
/* 5.查詢某個商品的銷售額 */
select 商品名稱,sum(商品價格*數量) as 銷售額 from goods1 left join orders
on goods1.商品編號=orders.商品編號 where goods1.商品編號=10 group by 商品名稱;
/* 6.查詢每個商品的銷售額,按照商品銷售額排序,商品編號排序 */
select goods1.商品編號 ,商品名稱, sum(商品價格*數量) as 銷售額 from goods1 left join orders
on goods1.商品編號=orders.商品編號 group by goods1.商品編號, 商品名稱 order by 銷售額 desc ,goods1.商品編號 asc ;
create table goods1(
商品編號 int primary key identity(1,1),--主鍵,自增
商品名稱 varchar(20) unique, --唯一鍵
商品價格 decimal(5,1) check(商品價格>0),
);
drop table member
create table member(
會員編號 int primary key identity(100,1),
會員姓名 varchar(20),
性別 varchar(4) default('女')
);
drop table orders
create table orders(
訂單編號 int primary key identity(0000000,1),
會員編號 int foreign key references member(會員編號),
商品編號 int foreign key references goods1(商品編號),
下單時間 smalldatetime,
數量 int
);
insert into goods1 values('棒棒糖',0.5);
insert into goods1 values('奶茶',1.0);
insert into goods1 values('可口可樂',3.5);
insert into goods1 values('雪碧',3.0);
insert into goods1 values('怡寶',2.0);
insert into goods1 values('鉛筆',1.0);
insert into goods1 values('酸奶',3.5);
insert into goods1 values('啤酒',3.0);
insert into goods1 values('紙巾(袋裝)',1.0);
insert into goods1 values('紙巾(卷)',3.0);
insert into goods1 values('信紙',2.0);
insert into goods1 values('水性筆',3.5);
insert into goods1 values('橡皮擦',1.0);
select * from goods1
insert into member values('文雅','女');
insert into member values('李雙龍','男');
insert into member values('賀志玉','女');
insert into member values('黃成','男');
insert into member values('蔡文鵬','男');
insert into member values('王豔芳','女');
select * from member
insert into orders values (100,1,getdate(),12);
insert into orders values (102,1,getdate()-1,1);
insert into orders values (100,2,getdate()+1,12);
insert into orders values (102,4,getdate()-1,1);
insert into orders values (100,7,getdate(),12);
insert into orders values (101,10,getdate(),4);
insert into orders values (103,9,getdate(),9);
insert into orders values (105,6,getdate()-1,17);
select * from orders ;
/*建立檢視*/
create view test2 as
SELECT dbo.goods1.*, dbo.goods1.商品編號, dbo.goods1.商品名稱, dbo.goods1.商品價格, dbo.member.會員編號, dbo.member.會員姓名, dbo.orders.訂單編號,
dbo.orders.下單時間
FROM dbo.goods1 INNER JOIN
dbo.orders ON dbo.goods1.商品編號 = dbo.orders.商品編號 INNER JOIN
dbo.member ON dbo.orders.會員編號 = dbo.member.會員編號
select * from test2;
--查詢最近三天銷售額佔前兩位的商品編號,名稱及銷售額
select top 2 商品編號,商品名稱,sum(商品價格*數量) as 銷售額 from test2
group by 商品編號, 商品名稱 order by 銷售額 desc;
--多表查詢
--1. 交叉查詢:查詢原理:將A表,B表中d資料相互交叉組合,一共有M*N種結合結果。
--1.1 隱式交叉查詢:
select goods1.商品編號, 商品名稱, 商品價格, 數量,下單時間 from goods1,orders where 會員編號=100;
--1.2 顯式交叉查詢
select goods1.商品編號,商品名稱,商品價格,數量,下單時間 from goods1 cross join orders;
--2. 內連結查詢:查詢原理:將A表,B表中的資料根據某種條件連結起來,
--將符合條件的資料查詢顯示
--2.1 隱式內連結查詢
select 會員編號 ,goods1.商品編號,商品名稱,商品價格,數量,下單時間 from goods1,orders where goods1.商品編號=orders.商品編號
and 會員編號=101;
--2.2 顯式內連結查詢
select goods1.商品編號, 商品名稱,商品價格,數量,下單時間 from goods1 inner join orders on goods1.商品編號=orders.商品編號
where 會員編號=102;
--左連結查詢:查詢原理:以左邊的表為主,右邊的表為輔,將左表和右邊中的資料根據某種條件連結起來,
--將符合條件的資料查詢顯示。
select goods1.商品編號, 商品名稱,商品價格,數量,下單時間 from goods1 left join orders on goods1.商品編號=orders.商品編號 where 會員編號=103;
--查詢銷售額佔前兩位的商品編號,名稱及銷售額
select top 2 goods1.商品編號,商品名稱,sum(商品價格*數量) as 消費總額 from goods1 inner join orders on goods1.商品編號=orders.商品編號
group by goods1.商品編號 ,商品名稱 order by 消費總額 desc;
--查詢會員單次消費的總額
select 會員編號,sum(商品價格*數量) as 消費總額 from goods1 inner join orders on goods1.商品編號=orders.商品編號
group by 商品名稱 , 會員編號 ;
--查詢會員消費的總額
select 會員編號,sum(商品價格*數量) as 消費總額 from goods1 inner join orders on goods1.商品編號=orders.商品編號
group by 會員編號 ;
--查詢最近兩天天銷售額佔前兩位的商品編號,名稱及銷售額
select top 2 goods1.商品編號,商品名稱,sum(商品價格*數量) as 消費總額 from goods1 inner join orders
on goods1.商品編號=orders.商品編號 where 下單時間 between GETDATE()-2 and GETDATE()
group by goods1.商品編號,商品名稱 order by 消費總額 desc;
--查詢如下資訊:
/* 1.查詢某人的消費總額 */
select sum(商品價格*數量) as 消費總額 from goods1 left join orders
on goods1.商品編號=orders.商品編號 where 會員編號=101;
/* 2.查詢每個人的消費總額,按照會員編號排序 */
select 會員編號,sum(商品價格*數量) as 消費總額 from goods1 inner join orders on goods1.商品編號=orders.商品編號
group by 會員編號 ;
/* 3.查詢某個時間段的消費總額 */
select 會員編號,sum(商品價格*數量) as 消費總額 from goods1 inner join orders
on goods1.商品編號=orders.商品編號 where 下單時間 between GETDATE()-2 and GETDATE()
group by 會員編號 order by 消費總額 desc;
/* 4.查詢某人購買次數最多的商品名稱 */
select 商品名稱, max(數量) as 數量 from goods1 left join orders
on goods1.商品編號=orders.商品編號 where 會員編號=101 group by 商品名稱;
/* 5.查詢某個商品的銷售額 */
select 商品名稱,sum(商品價格*數量) as 銷售額 from goods1 left join orders
on goods1.商品編號=orders.商品編號 where goods1.商品編號=10 group by 商品名稱;
/* 6.查詢每個商品的銷售額,按照商品銷售額排序,商品編號排序 */
select goods1.商品編號 ,商品名稱, sum(商品價格*數量) as 銷售額 from goods1 left join orders
on goods1.商品編號=orders.商品編號 group by goods1.商品編號, 商品名稱 order by 銷售額 desc ,goods1.商品編號 asc ;