常用函数:其他类型函数

1、聚合函数:group_concat

  • 功能:用于在分组时,将指定字段的值进行合并拼接成一个字符串

  • 场景:分组聚合、行列转换

  • 语法:

  • group_concat(  [distinct] col [order by col] [separator 分隔符]  )
    
    distinct:对元素的值进行去重
    order by:按照某一列的值进行排序
    separator:用于指定分隔符,不给默认为逗号作为分隔符
  • 示例:

  • -- 查询所有学生的个人信息和考试科目,将考试科目合并为一列
    with t1 as(
    select s_id, group_concat(c_name) as l_name
    from score
    join Course C on Score.c_id = C.c_id
    group by s_id)
    select *
    from student
    join t1 on Student.s_id = t1.s_id
    ;

2、逻辑判断函数:case when

  • 功能:基于不同的条件,返回不同的结果

  • 场景:如果 A 则 B,如果 C 则 D ……,多条件的判断场景

  • 语法:

  • -- 语法1:单列等值判断
    case col when v1 then r1
    	     when v2 then r2
    	     ……
    	     else rn
    end
    
    -- 语法2:任意条件判断
    case when 条件1 then r1
    	 when 条件2 then r2
    	 ……
    	 eles rn
    end
  • 示例:

  • -- 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程ID和课程名称
    SELECT
    	course.c_name,
    	p.* 
    FROM
    	course
    	JOIN (
    SELECT
    	t.c_id,
    	SUM( IF ( t.LEVEL = 'level1', 1, 0 ) ) '[100-85]',
    	SUM( IF ( t.LEVEL = 'level2', 1, 0 ) ) '[85-70]',
    	SUM( IF ( t.LEVEL = 'level3', 1, 0 ) ) '[70-60]',
    	SUM( IF ( t.LEVEL = 'level4', 1, 0 ) ) '[<60]',
    	COUNT( t.s_id ) sumstu 
    FROM
    	(
    SELECT
    	c_id,
    	s_id,
    	s_score,
    CASE
    	
    	WHEN s_score BETWEEN 85 
    	AND 100 THEN
    	'level1' 
    WHEN s_score BETWEEN 70 
    AND 85 THEN
    'level2' 
    WHEN s_score BETWEEN 60 
    AND 70 THEN
    'level3' ELSE 'level4' 
    END LEVEL 
    FROM
    	score 
    	) t 
    GROUP BY
    	t.c_id 
    ) p ON course.c_id = p.c_id
    

3、其他判断函数if、ifnull、coalesce

  • if

    • 功能:用于实现条件判断,基于条件判断的结果返回不同的值,用于单条件场景

    • 语法:if(判断条件,条件成立返回的结果,条件不成立返回的结果)

    • 示例1:

    • -- 对成绩表,如果成绩大于等于60分显示通过,否则显示未通过
      select *,
             if(s_score>=60,'通过','未通过') as is_pass
      from score;
    • 示例2:多条件嵌套查询

    • -- 对于成绩表,如果成绩>=60为及格,中等为:70-80,优良为:80-90,优秀为:>=90
      
      select *,
             if(s_score<60,'不合格',if(s_score<70,'及格',if(s_score<80,'中等',if(s_score<90,'良好','优秀')))) as sc
      from score;
  • ifnull

    • 功能:用于判断第一个参数是否为null,如果为null则返回第二个参数,如果不为null则返回第一个参数【返回参数中第一个不为null的值】

    • 语法:ifnull(参数1,参数2)

    • 示例:

    • -- 查询平均成绩小于60分的学生的学号和平均成绩,考虑没参加考试的情况
      SELECT
      	t.id,
      	AVG( t.score ) avgscore 
      FROM
      	(
      SELECT
      	st.s_id id,
      	IFNULL( sc.s_score, 0 ) score 
      FROM
      	student st
      	LEFT JOIN score sc ON st.s_id = sc.s_id 
      	) t 
      GROUP BY
      	t.id 
      HAVING
      	avgscore < 60
      
    • coalesce

      • 功能:返回参数列表中第一个非空的值

      • 语法:coalesce(参数1,参数2,参数3……参数N)

      • 示例:

      • 预处理:

      • -- 先查询出所有学生的姓名、考试科目和成绩,如果该学生没有考试该科目,则使用null值
        with t1 as (
            select distinct s_id
            from score
        )
        select t1.s_id,
               c_name,
               s_score
        from t1
        join course
        left join score s on t1.s_id = s.s_id and Course.c_id = s.c_id
        ;
      • 使用coalesce

      • -- 对上述查询结果进行处理,如果成绩为null值,则使用数字0填充
        with t2 as (
        with t1 as (
            select distinct s_id
            from score
        )
        select t1.s_id as sid,
               c_name as cname,
               s_score as sscore
        from t1
        join course
        left join score s on t1.s_id = s.s_id and Course.c_id = s.c_id
        )
        select sid,
               cname,
               coalesce(sscore,0) as ssscore
        from t2
        ;

4、类型转换函数:cast

  • cast

    • 功能:将某一数据的类型进行转换

    • 语法:cast( 列 as 新的类型)

    • 示例:

    • select cast('5' as UNSIGNED) - 1;
      select '5' - 1;
      select cast('2023-01-01 15:31:27' as date );
      select cast('2023-01-01 15:31:27' as time );
      select cast('2023-01-01' as datetime);
valuedescribe
DATE将value转换成'YYYY-MM-DD'格式
DATETIME将value转换成'YYYY-MM-DD HH: MM: SS'格式
TIME将value转换成'HH: MM: SS'格式
CHAR将value转换成CHAR(固定长度的字符串)格式

SIGNED       

将value转换成INT(有符号的整数)格式
UNSIGNED将value转换成INT(无符号的整数)格式
DECIMAL将value转换成FLOAT(浮点数)格式
BINARY将value转换成二进制格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值