SQL 链接查询、按日期分组、按时间段分组

所用数据表:用户,钱包,订单

一、from子查询

--查询钱包里金额大于30000
select * from Users where exists (select User_ID from Wallets where Money > 30000 and User_ID = Users.ID)
select * from Users where ID in (select User_ID from Wallets where Money > 30000)

二、链接查询

  内连接(inner join)外连接(left/right/full outer join)交叉链接(coress join)

1. 内连接

 分为显式链接和隐式链接的,返回连接表中符合连接条件和查询条件的数据行

显示:表 inner join 表 on 链接条件

select * from Users inner join Wallets on Users.ID = Wallets.User_ID where  Money > 30000

隐式:from 表1,表2 on 链接条件

select * from Wallets,Users where Wallets.User_ID=Users.ID and Money > 10000

2. 外连接

 a. 左链接:以左边为基准,全部查询右边没有匹配的值显示为空

--用户ID为3,4,5的没有钱包数据
select * from  Users left outer join Wallets  on  Users.ID = Wallets.User_ID

 b. 右链接:和左连接相反,以右边为基准左边表的字段为空

select * from  Wallets right outer join Users on  Users.ID = Wallets.User_ID 

 c. 全链接:左右全部连接没有对应值得字段为空

select * from Users full outer join Wallets on Users.ID = Wallets.User_ID where User_ID is null or Users.ID is null

3. 交叉链接:表1的每一行记录都会连接表2的每一行记录

--等于User表* Wallet表(笛卡儿积)
select * from Users cross join Wallets where Users.ID = 3

三、分组查询

--根据年月
select convert(varchar(7),CreatTime,120)日期,COUNT(*) 次数,sum(Money)总数 from Orders
group by convert(varchar(7),CreatTime,120)
--根据年月日
select convert(varchar(10),CreatTime,120)日期,COUNT(*) 次数,sum(Money)总数 from Orders
group by convert(varchar(10),CreatTime,120)
--或者
select YEAR(CreatTime) 年,month(CreatTime) 月,COUNT(*) 次数,sum(Money)总数 from Orders
group by month(CreatTime),YEAR(CreatTime)
order by 年,月 asc
--根据时间段每3个小时一组
select CONVERT(varchar(11),convert(varchar(2),datename(hh,CreatTime) / 3 *3)+':00~'+convert(varchar(2),row_number() over(order by datename(hh,CreatTime) / 3)*3-1)+':59') 时间段
,COUNT(*)次数,sum(Money)总数 from Orders
group by datename(hh,CreatTime) / 3

猜你喜欢

转载自www.cnblogs.com/haosit/p/10543831.html