SQL-更新(场景使用)

SQL场景处理

空值处理方式

--方式一
select * from A where B1 != 1 or B1 is null
--方式二
select * from A where IFNULL(B1,'')  != 1
  • 方式一

    • 这个语句的意思是从表A中选择所有的行,其中满足以下条件之一:

      • 列B1的值不等于1(B1 != 1)

      • 列B1的值为空(B1 is null)

      换句话说,这个查询将返回表A中列B1值不等于1或者为空的所有行。

  • 方式二

    • 这个语句也是从表A中选择所有的行,其中满足以下条件之一:

      • 如果列B1的值不为null且不等于1(IFNULL(B1,'') != 1)

      使用IFNULL函数,如果B1的值为null,则将其替换为空字符串'',然后判断是否不等于1。所以该查询也会返回表A中列B1值不等于1或者为空的所有行。

if函数使用

SELECT 单据号, 医保目录编码, 机构收费项目名称,总金额,超限价金额,IF(自付比例>=1,总金额,超限价金额) as 自费费用 FROM jsmx1
  • 这段代码的作用是从数据表jsmx1中查询出单据号、医保目录编码、机构收费项目名称、总金额、超限价金额以及自费费用(根据自付比例计算得出),并将查询结果返回。

    • **SELECT: 这个关键字指示我们要从数据表中查询哪些字段。**

    • 单据号, 医保目录编码, 机构收费项目名称, 总金额, 超限价金额: 这些是我们要查询的字段名。

    • FROM jsmx1: 这条语句告诉我们从哪个数据表中进行查询。

    • IF(自付比例>=1,总金额,超限价金额) as 自费费用: 这个是对查询结果集中的字段进行处理的部分。它使用了IF条件语句,判断自付比例是否大于等于1,如果是,则将总金额作为自费费用;否则,将超限价金额作为自费费用。as关键字用于给处理后的结果集中的字段起一个别名"自费费用"。

where多字段筛选

SELECT device_id,university,gpa FROM user_profile WHERE (university,gpa) 
IN (SELECT university,MIN(gpa) FROM user_profile GROUP BY university) ORDER BY university
  • 这段代码的作用是从数据表user_profile中查询出每个学校中GPA最低的记录,返回设备ID、学校名称和最低GPA,并按学校名称升序排序。

    • SELECT: 这个关键字指示我们要从数据表中查询哪些字段。

    • device_id,university,gpa: 这些是我们要查询的字段名。

    • FROM user_profile: 这条语句告诉我们从哪个数据表中进行查询。

    • WHERE (university,gpa) IN (SELECT university,MIN(gpa) FROM user_profile GROUP BY university): 这个语句定义了过滤条件,只返回符合条件的记录。这个条件与子查询语句(SELECT university,MIN(gpa) FROM user_profile GROUP BY university)配合使用,表示在user_profile表中,按照university分组,然后取每组中gpa最小的记录,得到一个二元组(university, MIN(gpa))的集合,接着返回user_profile表中在这个集合里面的所有记录。这样就能保证返回的是每个学校中GPA最低的记录。

    • ORDER BY university: 这个语句将结果按university字段升序排序。

# 使用窗口函数 ROW OVER() (PARITITION BY "按那个字段"  ORDER BY "对什么排序" )
SELECT device_id,university,gpa FROM (SELECT device_id,university,gpa,(RANK() over (PARTITION BY university ORDER BY gpa )) as m  FROM user_profile) AS A   WHERE  A.m=1
  • 这段代码的作用是使用窗口函数对数据表user_profile中按学校分组并按GPA排序的数据进行排名,然后返回每个学校中GPA最低的记录,返回设备ID、学校名称和最低GPA。

    • SELECT: 这个关键字指示我们要从数据表中查询哪些字段。

    • device_id,university,gpa: 这些是我们要查询的字段名。

    • FROM: 这条语句告诉我们从哪个数据表中进行查询。在这里,它是一个子查询(SELECT device_id,university,gpa,(RANK() over (PARTITION BY university ORDER BY gpa )) as m FROM user_profile) AS A,用于给每个学校中的记录进行排名。

    • (RANK() over (PARTITION BY university ORDER BY gpa )) as m: 这段代码是使用窗口函数RANK()university字段相同的记录进行排名,PARTITION BY university表示按照university字段进行分组,ORDER BY gpa表示按照gpa字段进行排序,最后将排名结果保存到别名为m的新列中。

    • WHERE A.m=1: 这个条件用于过滤排名为1的记录,即每个学校中GPA最低的记录。

if和ifnull 使用

SELECT age_range,count(*) FROM 
(SELECT IF(IFNULL(age,0)>=25,"25岁及以上","25岁以下") as age_range,device_id FROM  user_profile) AS user_profile
GROUP BY age_range
  • 这段代码的作用是对数据表user_profile中的用户按照年龄进行分组统计,并返回每个年龄范围的记录数。年龄范围划分为"25岁及以上"和"25岁以下"两个范围。

    • SELECT: 这个关键字指示我们要从数据表中查询哪些字段。

    • age_range,count(*): 这些是我们要查询的字段名。age_range是根据用户的年龄划分的范围,count(*)是对每个年龄范围的记录数进行统计。

    • FROM: 这条语句告诉我们从哪个数据表中进行查询。在这里,它是一个子查询(SELECT IF(IFNULL(age,0)>=25,"25岁及以上","25岁以下") as age_range,device_id FROM user_profile) AS user_profile,用于对用户的年龄进行判断并选择相应的年龄范围。

    • IF(IFNULL(age,0)>=25,"25岁及以上","25岁以下") as age_range: 这段代码使用IF函数和IFNULL函数判断用户的年龄是否大于等于25岁,如果是,则返回"25岁及以上",否则返回"25岁以下"。这样就将用户的年龄划分为两个范围。

    • GROUP BY age_range: 这个语句对查询结果按照age_range字段进行分组,将相同年龄范围的记录放在一起。

    • count(*): 这个语句用于统计每个年龄范围的记录数。

SELECT device_id,gender,
CASE 
WHEN  age<20 then '20岁以下' 
WHEN age<25 then '20-24岁' 
WHEN age>=25 then '25岁及以上' 
else '其他' 
END as age_cunt 
FROM user_profile
  • 这段代码的作用是获取数据表user_profile中的设备ID、性别和年龄信息,并将用户的年龄划分为四个范围:"20岁以下"、"20-24岁"、"25岁及以上"和"其他"。

    • SELECT: 这个关键字指示我们要从数据表中查询哪些字段。

    • device_id,gender,CASE...END as age_cunt: 这些是我们要查询的字段名。device_id是设备ID,gender是性别,age_cunt是根据用户年龄划分的范围。

    • FROM: 这条语句告诉我们从哪个数据表中进行查询。在这里,它是数据表user_profile,用于获取用户的设备ID、性别和年龄信息。

    • CASE...END as age_cunt: 这段代码是使用CASE语句对用户的年龄进行分类。当用户的年龄小于20岁时,返回"20岁以下";当用户的年龄在20到24岁之间时,返回"20-24岁";当用户的年龄大于等于25岁时,返回"25岁及以上";否则返回"其他"。

    • WHEN...then...: 这些是CASE语句的条件和结果。当满足条件时,会返回对应的结果。

    • ELSE: 当所有条件都不满足时,返回ELSE后面指定的结果。

    • END: CASE语句结束标志。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值