您的位置:首页 > 其它

左,右,内连接 统计记录数 子查询 聚合函数 查询产品分类

2015-08-15 14:41 393 查看
--1)内连接,必须保证的是内连接的数据一定相等的才会查询出来。
select 用户表.用户ID, 用户表.用户名称, 角色表.角色名称
from 用户表 inner join 角色表
on 用户表.角色ID = 角色表.角色ID

--2)左连接
-- 作用:保证左边表的数据全部出现,而关联的这个表的数据满足相等的条件下才会显示。
-- left join
select 用户表.用户ID, 用户表.用户名称, isnull(角色表.角色名称,'无分类') as 分类名称
from 用户表 left join 角色表
on 用户表.角色ID = 角色表.角色ID

--补充;如果某个字段查询出的结果为null值,那么可以把null值替换一个默认值。
--isnull(字段,默认值)

--3)右连接
--作用:保证连接的右边的表的数据全部出现,而关联的表的数据只有满足相等的条件才会显示。
select 用户表.用户ID, 用户表.用户名称, isnull(角色表.角色名称,'无分类') as 分类名称
from 用户表 right join 角色表
on 用户表.角色ID = 角色表.角色ID

--补充:convert转换函数,
--语法:convert(转换的类型,转换的字段)

--4)统计记录数,count函数统计,count(可以是某个具体的字段,也可以是*)
--1.首先第一步,查询出在挂号信息表里查询某个科室下的挂号人数      T_.....是代表表名
Select count(*) as 挂号人数
From T_Registration tr inner join T_Department td
On tr.DepartmentId = td.DepartmentId
Where td.DepartmentName='外科'

--)清空数据,不写日志操作记录
truncate table 表名(t_sublist)
truncate table 表名(t_recipe)

--5)把两个查询的结果作为临时表存放,然后通过这两个临时表去计算
declare @begintime datetime--开始执行的时间
@endtime datetime, --执行结束时间
select @begintime =GETDATE()

Select t1.dname as 科室, (t1.挂号人数-t2.看病人数) as 等待人数
From  (Select td.DepartmentName as dname, count(*) as 挂号人数
From T_Registration tr inner join T_Department td
On tr.DepartmentId = td.DepartmentId
group by td.DepartmentName) as t1,
(Select tp.DepartmentName as dname, count(*) as 看病人数
From T_Recipe tc inner join T_Doctor td
On tc.DoctorId = td.DoctorId
inner join T_Department tp
On td.DepartmentId = tp.DepartmentId
group by tp.DepartmentName) as t2
Where   t1.dname = t2.dname
and  t1.dname='外科'
print '消耗时间:'+convert(varchar(20),datediff(millisecond  ,@begintime, GETDATE()))  -- 打印输出时间

--用子查询来获取等待人数--
Select m.DepartmentName,count(distinct t.RegistrationId) as 等待人数
From T_Registration t inner join T_Department m
on t.DepartmentId = m.DepartmentId
Where t.RegistrationId not in (Select r.RegistrationId
From T_Recipe r
inner join T_Doctor c
on r.DoctorId = c.DoctorId
inner join T_Department d
on c.DepartmentId = d.DepartmentId
Where d.DepartmentName='外科'
)
and m.DepartmentName = '外科'
Group By m.DepartmentName

--6)聚合函数,首先分组
select
from 表名
where 判断条件
group by 分组条件(按照什么分组)
--分组条件一定要出现在查询的显示列中--
select 分类表.分类名称, count(*)
from 产品表 left join 分类表
on 产品表.分类ID = 分类表.分类ID
group by 产品表.分类名称

--重点:1)如果有分组条件,那么分组条件必须在显示列中,也就是在select后面
2)如果有聚合函数(比如count,avg,sum等),
且聚合函数前有显示列,那么该显示列必须出现在分组条件中。

use Test
go
--要求要查询出产品分类为水果和服饰
Select 分类ID
From 分类表
Where 分类表.分类名称 = '水果' or 分类表.分类名称='服饰'

Select 分类ID
From 分类表
Where 分类表.分类名称 in('水果','服饰')
--用in表示.
Select *
From 产品表
Where 分类ID in (Select 分类ID
From 分类表
Where 分类表.分类名称 = '水果'
or 分类表.分类名称='服饰')
--用exists关键字
Select *
From 产品表
Where exists (Select * From 分类表
Where 分类表.分类ID=产品表.分类ID
and  分类表.分类名称 in('水果','服饰'))
--查询出产品不为水果和服饰
Select *
From 产品表
Where not exists (Select * From 分类表
Where 分类表.分类ID=产品表.分类ID
and  分类表.分类名称 in('水果','服饰'))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: