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

--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('水果','服饰'))                   

发布了25 篇原创文章 · 获赞 1 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章