1. 程式人生 > >SQL server 多表查詢與檢視的使用

SQL server 多表查詢與檢視的使用

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 ;