ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySql内置高阶函数

2021-04-30 19:00:14  阅读:165  来源: 互联网

标签:内置 group -- price WHEN MySql 高阶 id SELECT


1.avg()函数

-- avg()函数忽略列值为null的行
SELECT AVG(id) as age FROM person WHERE age = 15;

2.count()函数

count(*) -- 对表中行的数目进行计数,不管表列中包含的是空值(null)还是非空值
count(column) -- 对特定列中具有值的行进行计数,忽略null值

3.max()函数

-- max()函数忽略列值为null的行
SELECT max(id) as id FROM person;

4.min()函数

-- min()函数忽略列值为null的行
SELECT min(id) as id FROM person;

5.case when()函数

-- 分情况更新语句
UPDATE Salaries
SET salary = CASE WHEN salary >= 10000 THEN salary * 0.9
WHEN salary < 10000 THEN salary * 1.2
ELSE salary END;
-- 查询转换
SELECT CASE pref_name
      WHEN '长沙' THEN '湖南' 
      WHEN '衡阳' THEN '湖南'
      WHEN '海口' THEN '海南' 
      WHEN '三亚' THEN '海南'
    ELSE '其他' END AS district,
    SUM(population) 
FROM PopTbl
GROUP BY district;

6.exists关键字

-- 慢(in查询较慢)
SELECT * 
  FROM Class_A
WHERE id IN (SELECT id 
               FROM  CLASS_B);

-- 快(表示存在)
SELECT *
  FROM Class_A A 
 WHERE EXISTS
(SELECT *  
   FROM Class_B  B
  WHERE A.id = B.id);

7.UNION 和 UNION ALL

 UNION ALL -- 全连接
 UNION -- 相同只留一条

8.FIND_IN_SET()函数

-- 函数返回指定字符串在以逗号分隔的字符串列表中的位置。常用在部门的子部门或者子部门的上级部门等场景下使用
-- 如果needle包含逗号(,),该函数将无法正常工作
FIND_IN_SET(needle,haystack);
-- 效率和in相比,in更好
-- 分情况使用,能用in,则用in
INSERT INTO `test` VALUES (1, 'name', 'daodao,www.111cn.net,xiaoqin');
INSERT INTO `test` VALUES (2, 'name2', 'xiaohu,daodao,xiaoqin');
INSERT INTO `test` VALUES (3, 'name3', 'xiaoqin,daodao,www.111cn.net');

-- 不能使用
select id, list, name from test where 'daodao' IN ('libk', 'zyfon', 'daodao');
-- list是变量,使用find_in_set()
-- ('libk', 'zyfon', 'daodao')为常量
select id, list, name from test where find_in_set('daodao',list);

9.LOCATE()函数

-- 返回字符串str中子字符串substr的第一个出现位置, 起始位置在pos	
LOCATE(substr,str,pos)
-- 返回字符串 str中子字符串substr的第一个出现位置
SELECT LOCATE('fa',sex) FROM `user` 
SELECT * FROM `user` WHERE LOCATE('5',PASSWORD,4) AND LOCATE('5',user_name)
-- 结果:如若substr 不在str中,则返回值为0

10.CASE WHEN 使用场景

-- 第一、等值转换
SELECT NAME AS '名字', (
    CASE sex
    WHEN 0 THEN
    '女'
    WHEN 1 THEN
    '男'
    ELSE '不详'
    END )
FROM USER
-- 第二、范围转换
SELECT id AS 学号,
         name AS 姓名,
        (case
    WHEN score >= 90
    WHEN '优秀'
    WHEN score >= 70 THEN
    '良好'
    WHEN score >= 60 THEN
    '及格'
    ELSE '不及格' END) AS 学习情况
FROM student 
-- 第三、列转行操作
SELECT name as '姓名'
,MAX(CASE course WHEN '语文' THEN score ELSE 0 END) AS '语文'
,MAX(CASE course WHEN '数学' THEN score ELSE 0 END) AS '数学'
,MAX(CASE course WHEN '英语' THEN score ELSE 0 END) AS '英语'
FROM student GROUP BY name

11.group_concat()函数

-- group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )
-- 以id分组,把price字段的值在同一行打印出来,逗号分隔(默认)
select id, group_concat(price) from goods group by id; 
-- 以id分组,把price字段的值在一行打印出来,分号分隔
select id,group_concat(price separator ';') from goods group by id;  
-- 以id分组,把去除重复冗余的price字段的值打印在一行,逗号分隔
select id,group_concat(distinct price) from goods group by id;  
-- 以id分组,把price字段的值去重打印在一行,逗号分隔,按照price倒序排列
select id,group_concat(DISTINCT price order by price desc) from goods group by id;  

12.group_concat()函数与FIND_IN_SET()函数连用

SELECT GROUP_CONCAT(zbxmid) FROM zcy_zbxmcd
SELECT * FROM zcy_zbxm t1
JOIN (SELECT GROUP_CONCAT(zbxmid) as id FROM zcy_zbxmcd ) t2 ON FIND_IN_SET(t1.id,t2.id)
ORDER BY t1.id
-- 可以使用in代替

标签:内置,group,--,price,WHEN,MySql,高阶,id,SELECT
来源: https://blog.csdn.net/weixin_44063083/article/details/116308062

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有