感恩笔记之SQL查询功能最简使用模板

感恩笔记之SQL查询功能最简使用模板

第一部分:SQL单表功能

1 语句主要关键字

SELECT     --查询数据列
INTO       --新建数据表
FROM       --查询数据表
WHERE      --筛选数据表结果

ORDER BY   --筛选结果排序   
GROUP BY   --筛选结果分组
HAVING     --筛选分组结果

UNION      --合并查询结果 

2 新增列功能汇总

SELECT   distrint   列名,                            --1.单列去重
                          
         列  AS   新列名,                             --2.列命名
				                          
         函数(列) + 列名 AS  新列名,                   --3.函数+计算式
         
		 CASE WHEN 函数(列) + 列 > 80   THEN  '新增处理'      --4.函数+计算式+条件筛选
              WHEN 条件2               THEN  '新增处理' 
              WHEN 条件3               THEN  '新增处理' 
			  ELSE '新增处理'     --如果以上条件都不满足
              END  as 新列名     
FROM     表名

3 筛选条件汇总

SELECT * FROM 数据表

  WHERE  列名  >,<,=,!=,<>  数值         --1.比较查询=数值和字符
         列名  BETWEEN  500  AND 100    --2.区间查询=数值
         
         列名  IN   ('字符','数值')       --3.批量提取字符
         列名  LIKE                      --4.特定字符查询                         
              LIKE‘%字符%’               --模糊查询                
              LIKE‘字符%’                --精确查询
              LIKE‘_字符%’              --定位查询              
              LIKE‘%[50%]%’             --数字符号查询
              LIKE‘%[^50%]%’            --逆向查询 
               
         列名  is NULL 或 is  NOT  NULL   --处理空值
  
  
--1 in 和like 功能性探索
注意:()和’’对应数字和字符的使用,两个关键字的查询内容都可以是字符或者数字
注意:默认都是字符型数据,如果要进行计算,改成数值型数据

--2 in :①可以多个查询,②可以查询字符和数字,③能一起查,④内容完全对应
select * from 体检信息  where 姓名 IN ('宋秋雨','王复学') 
select * from 电话号码  where 姓名 IN ('13591067891','16604106992') 

--3 like:①可以多个查询,②可以查询数字,③但是要分列查询,④内容可以模糊查询
select * from 体检信息 where  姓名 like '%宋%' or 家属年龄 like '%48%'

--4 like查询套路:筛选字符中的有用信息
--第一步:可乐和雪碧同时存在的数据 
where 列名 like’%可乐%’  and  列名 like’%雪碧%’ 
--第二步:显示可乐的数据和显示雪碧的数据  
where 列名 like’%可乐%’  or   列名 like’%雪碧%’ 
--第三步:在显示可乐和雪碧的数据同时去掉有牙膏字样的数据
where 列名 like’%可乐%’  or 列名 like’%雪碧%’ and 列名 not like’%牙膏%’  :

--5 数据表中空白格解析:
--如果空白格中无数据:但是又不是null 那就代表空白格中的数据为0,
--如果是数值列:可以直接使用where 年龄 !='0' 姓名列不为0的列
--如果是字符的列:就可以用where 姓名  like '%_%' 姓名列不为空的列 

4 其他关键字汇总

--1 Order by 
SELECT   *  
FROM   数据表  
WHERE   查询条件
ORDER BY   列   DESC                        --1.单列排序

SELECT   *  
FROM   数据表  
WHERE   查询条件
ORDER BY   列,列                          --2.多列排序


--2 Group by  
SELECT 列1,COUNT (*)  
FROM   数据表 
GROUP BY   列1                           --1.单列分组求数


SELECT   列1,列2,列3,COUNT (*)  
FROM     数据表 
GROUP BY   列1 ,列2,列3                  --2.多列分组求数


SELECT  列名 , COUNT(求数列)次数 , SUM (求和列)总额    
FROM  数据表
GROUP BY  列名                              --3.分组求数+求和

--说明:在得出分类名称,分类次数后,对分类后每次的数额进行分类求和,
--可以对分组前,同名的机构进行求和验证数额的正确性

5 函数的应用位置

--1、函数在select中使用:建立as列名,后接where查询,不能使用as列名,需用完整函数表达式
--2、函数在where中使用:单独在where中使用必须完整布尔表达式
--3、在order by中使用:可以使用as列名进行排序
--4、在case when中使用:出现在条件表达式中,而case语句出现在select中
--5 函数组合说明:函数结果数字+比较范围
--函数结果数字+计算数字
--函数使用位置说明:
--函数在select中格式 :select  函数名 (列名) from 表名	
--函数在where中格式 : select  *  from 表名    where 函数名(列名)

第二部分:SQL多表功能

1 两表_父子查询和连接查询架构

1 嵌套查询 
select * FROM  父表                               
WHERE  相同列  IN  (SELECT 相同列 FROM 子表)     --1.子表在父表中存在的数据

SELECT * FROM  父表  
WHERE  相同列  NOT IN  (SELECT 相同列 FROM 子表) --2.子表不在附表中存在的数据

--说明:附带属性:用相同字段连接,通过子句属性,显示父句中匹配的数据


2 链接查询
SELECT * FROM   表1 AS a   FULL  JOIN  表2 AS b   --1.两表全部连接,包括空值 
ON  a.相同列=b.相同列                            

SELECT * FROM   表1 AS a   INNER JOIN  表2 AS b   --2.两表有效值链接
ON  a.相同列=b.相同列

SELECT * FROM   表1 AS a   LEFT  JOIN  表2 AS b   --3.以左表为准,包括空值
ON  a.相同列=b.相同列

SELECT * FROM   表1 AS a   RIGHT JOIN  表2 AS b   --4.以右表为准,包括空值
ON  a.相同列=b.相同列

SELECT * FROM   表1 AS a         JOIN  表1 AS b   --5.自连接,同一列分类排序
ON  a.相同列=b.相同列

--说明:连表后去掉重复列名:逐个显示列

2 三表父子查询和连接查询架构

1 三表子查询_重复                          
select * 
from   表1 
where  相同列 in ( select 相同列 
                  from   表2  
                  where  身份证 in ( select 相同列 
                                    from   表3 ))


2 三表子查询_不重复   
select * 
from   表1 
where  相同列 in ( select 相同列 
                  from   表2  
                  where  身份证 not in ( select 相同列 
                                        from   表3 ))
                                        
--说明:三表嵌套,赛选不重复数据,最下一层是not in 上一层是in,这就是一个逻辑反转负负得正的结果       
 
 
3 三表连接_重复 
select * 
from  表1 as a join 表2 as b  on a.表1相同列 = b.表2相同列
               join 表3 as c  on b.表2相同列 = c.表3相同列


4 三表连接_不重复 
select * 
from  表1 as a join 表2 as b  on a.表1相同列 != b.表2相同列
               join 表3 as c  on b.表2相同列 != c.表3相同列

3 多表简便连接

1 二表简便连接
select * 
from   表1 , 表2   
where  表1.相同列 = 表2.相同列 

2 三表简便连接
select  *
from    表1 a, 表2 b, 表3 c
where   a.身份证号=b.身份证号   
 and    b.参合家庭编号=c.参合家庭编号

--说明:三表连接相同,结果正常显示没毛病,如果是显示三表连接不相同的,那么在连接的 = 号就有一个逻辑关系,类似于负负得正的关系

4 子查询组合连接查询

SELECT *  from                                            --1总查询模型

	(select *                                             --2子查询1
	 from   父表1                                          
	 where  表1相同列  in   (select 表1相同列 
                  	        from   子表1   ) )  AS  a
                  	        
JOIN                                                      --3表连接名

	(select *                                             --4子查询2
	 from 父表2                                          
	 where  表2相同列  not in   (select 表2相同列 
                                from  子表2) )  as  b
ON  a.表1相同列 = b.表2相同列                               --5表连接条件


5 多表查询结果处理

--说明:union的功能不仅可以合并相同字段结果,也可以达到去掉重复的结果
--说明:字段必须相同

1 合并结果:列必须相同
SELECT   列1,列2,列3  FROM  数据表  WHERE  
UNION                                       
SELECT  列1,列2,列3  FROM  数据表 WHERE  

2 结果新建表
SELECT   *  
 INTO 新建表名 
   FROM (SELECT  * FROM  表1  
          UNION                            
          SELECT  * FROM  表2) AS  新表名

3 批量合并结果
careate view 视图名 as
select * from 表1
union all
select * from 表2
......其他所有表
--说明:使用union all 上面不能接别的语句,会报错


6 子查询各位置用法

说明:where位置的子查询是最常用的.

--1单句from位置,具体用途待研究
select * from (select 统筹支付,count(*) 次数  --门诊结算金额出现频率前20名
               from T_医院门诊结算单_西丰
               where 统筹支付>0
               group by 统筹支付
               order by 次数 desc)
where rownum<21;
    
 --2union位子 双句子查询,两句结果合并
  select count(*) 
  from (select 身份证号
   		from T_医院门诊结算单_西丰
   		group by 身份证号
        having sum(统筹支付)>0
        
  union  --合并去重
      
  select 身份证号
  from T_医院住院结算单_西丰
  group by 身份证号
  having sum(统筹支付)>0);  
  
--3 from位置 连接查询带子查询
 select * from (查询语句)  join (查询语句)  on 条件连接
 
--4 select位置的子查询
select *,(select 想要在父表显示的列名1 
          from 子表1 
          where 父表.相同列 = 子表1.相同列  ) as 表1 ,
          
         (select 想要在父表显示的列名2 
          from 子表2 
          where 父表.相同列 = 子表2.相同列  ) as 表2
from  父表 
--格式说明:新增列子查询中:select 只能显示一列信息,多了报错,如果想显示多列可以再写一个,where 中设定的条件就是两个表连接的内容
--重点说明:如果是新增的列参与运算,不能用as后的名字,需要用新增的运算格式
 


第三部分:SQL变量功能

1 变量使用基本格式

--1定义变量
declare @查询名称   varchar (50)

--2赋值变量
set @查询名称 = '名称'      

--3使用变量
select 户主姓名1  from  dbo.A三表住院信息  where  户主姓名1 = @查询名称    
select 户主姓名2  from  dbo.B三表门诊信息  where  户主姓名2 = @查询名称    
select 户主姓名3  from  dbo.B三表门诊信息  where  户主姓名3 like @查询名称  


2 视图使用基本格式

create view 视图名 as        --1定义视图名称

select * from 表             --2查询模块

执行:select * from 视图名      --3执行视图


3 存储过程使用基本格式

1_存储过程基础
----------------------------------------------------------------                     
create proc 存储过程名 as    --1定义存储过程

select * from 表            --2查询模块

执行:exec 存储过程名          --3执行存储过程


2_带输入参数_存储过程
----------------------------------------------------------------
create proc 存储过程名                  --1定义存储过程名
            @变量1 int                 --2定义输入变量
            @变量2 char(10)            
as     

select 列1,列2,列3                      --3查询模块
from   表  
where  列1=@变量1                       --4输入变量对接
  and  列2=@变量2

执行1:exec 存储过程名 '列1内容' ,          --5执行输入参数存储过程
                    '列2内容'   

执行2:exec 存储过程名 @变量1='列1内容'
                    @变量2='列2内容'
                     
   
3_带有输入和输出函数的存储过程
----------------------------------------------------------------                                  
                                 一_定义模块

create proc 存储名称                                --1定义存储过程名
            @输入变量名    char(10) ,               --2定义输入变量
            @输出变量名1    char(10)   output  ,    --3定义输出变量
            @输出变量名2   char(10)   output
as   

                                二_查询语句模块          
select    @输出变量名1 = 列名1,                      --4输出变量对接
          @输出变量名2 = 列名2                                
from      查询表                 
where     列名 = @输入变量名                         --5输入变量对接
     
                                三_执行模块

declare   @输出变量名1   char(10) ,                 --1声明输出变量  
          @输出变量名2   char(10)

exec      存储名   '输入参数对接列内容' ,              --2执行带有输出和输出参数的存储过程
          @输出变量名1   output ,
          @输出变量名2   output 
  
print     @输出变量名1                               --3执行输出变量
print     @输出变量名2


4 游标基本格式待整理

    通常情况下,关系数据库中的操作总是对整个记录集产生影响,例如使用SELECT语句检索数据表时,将得到所有满足该语句where子句中条件的记录,而在实际应用过程中,经常需要每次处理一条或者一部分记录。在这种情况下,需要使用游标在服务器内部处理结果集合,他可以有助于识别一个数据集合内部指定的记录,从而可以有选择的按记录执行操作。


( 本章完 )