左,右,內連接 統計記錄數 子查詢 聚合函數 查詢產品分類

--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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章