首页 > 数据库 >MySQL查询(二)

MySQL查询(二)

时间:2023-02-22 19:36:41浏览次数:32  
标签:salary 字符 group employees 查询 MySQL id select

MySQL查询(二)

函数调用:

select 函数名(实参列表) [from 表]

1. 常见函数

1.1. 单行函数

  • 字符函数

    • length 获取参数值的字节个数,一个字母是1个字节,一个汉字3个字节

      select length('john');
      
    • concat 拼接字符

      select concat(last_name,'_',first_name) from employees;
      
    • upper、lower 将字符转化为大写或小写

      select upper('john');
      
      select concat(upper(last_name),'_',lower(first_name)) 姓名
      from employees; #将姓大写,名小写,并连接起来,中间用'_'隔开,起别名——姓名
      
    • substr、substring

      截取字符中某一部分。第一个参数是字符;第二个参数是开始的索引,SQL的索引从1开始;第三个参数是截取的字符长度,若没有则截取到末尾。

      select substr('我非常爱SQL',5);     #从索引5开始往后取到末尾,输出结果是SQL
      
      select substr('我非常爱SQL',2,2);  #从索引2开始取,截取2个字符,输出结果是非常
      
    • instr 返回子字符第一次出现的索引,若找不到,返回0

      select instr('我非常爱SQL','非常爱');  #输出结果是2
      
    • trim 去掉字符前后的空格

      select length(trim('   wng   '));   #输出结果是3
      
      select trim('a' from 'aaaaawhioahjgaaaaaaaa');  #去掉字符前后的a,输出结果是whioahjg
      
    • lpad 用指定的字符实现左填充指定长度

      select lpad('殷素素',10,'*');  #用*左填充,使得字符长度达到10,输出结果是*******殷素素
      
    • rpad 用指定的字符实现右填充指定长度

      select rpad('殷素素',10,'ac');  #用ac右填充,使得字符长度达到10,输出结果是殷素素acacaca
      
    • replace 替换

      select replace('周芷若周芷若张无忌爱上了周芷若','周芷若','赵敏');  #用赵敏替换所有的周芷若,输出结果是赵敏赵敏张无忌爱上了赵敏
      
  • 数学函数

    • round 四舍五入

      select round(-1.567);  #默认四舍五入为整数,结果是-2
      select round(-1.567,2);  #保留小数后两位,结果是-1.57
      
    • ceil 向上取整,返回大于等于该参数的最小整数

      select ceil(1.02);  #结果是2
      
    • floor 向下取整,返回小于等于该参数的最大整数

      select floor(-9.2); #结果是-10
      
    • truncate 截断

      select truncate(1.689,1);  #保留1位小数,直接截断,输出结果是1.6
      
    • mod 取余

      select mod(10,3);   #10除以3的余数,结果是1
      select mod(-10,3);  #-10除以3的余数,结果是-1,余数的正负号与被除数的正负号一致
      
  • 日期函数

    • now 返回当前系统日期+时间

      select now();  #2023-02-22 10:49:00
      
    • curdate 返回当前系统日期

      select curdate();   #2023-02-22
      
    • curtime 返回当前时间

      select curtime();  #10:51:33
      
    • datediff 获取两个日期之间相差多少天

      select datediff(now(),'1999-3-6');  #现在距离1999年3月6日的天数
      
    • 可以获取指定的部分,年year、月month、日day、小时hour、分钟minute、秒second

      select year(now());  #获取当前的年份
      select year(hiredate) 年 from employees;  #获取员工入职年份
      
      select month(now());  #获取当前月份
      select monthname(now());  #获取当前月份的英文,输出结果是February
      
    • str_to_date 将字符转换为日期

      格式符 功能
      %Y 四位的年份
      %y 两位的年份
      %m 月份(01,02,…,12)
      %c 月份(1,2,…,12)
      %d 日(01,02,…)
      %H 小时(24小时制)
      %h 小时(12小时制)
      %i 分钟(00,01,…,59)
      %s 秒(00,01,…,59)
      select str_to_date('3-5-1998','%c-%d-%Y');  #将字符转换为日期数据,第二项参数是提示字符中使用的格式,输出结果是1998-03-05
      
    • date_format 将日期转换为字符

      select date_format(now(),'%y年%m月%d日');  #将当前日期转换为字符,字符的格式按照第二项参数写,输出结果是23年02月22日
      
  • 其他函数

    • select version();  #查看当前版本
      
    • select database();   #查看当前数据库
      
    • select uesr();    #查看当前用户
      
  • 流程控制函数

    • if函数

      select if(10>5,'大','小');  #参数1:返回逻辑值的表达式,参数2:结果是true时的返回值,参数3:结果是false时的返回值
      
    • case

      若作为表达式用在select后面,则then后面只能跟显示的值,并且不加分号;若作为单独的语句,then后面可以跟表达式。

      第一种用法:(一般用于判断等于某个值的时候)

      case 要判断的字段或表达式
      when 常量1 then 要显示的值1或语句1;
      when 常量2 then 要显示的值2或语句2;
      ...
      else 要显示的值n或语句n;
      end
      

      举例:

      select salary 原始工资,department_id,
      case department_id
      when 30 then salary*1.1
      when 40 then salary*1.2
      when 50 then salary*1.3
      else salary
      end as 新工资
      from employees;
      

      第二种用法:(一般用于判断大于或小于某个值的时候)

      case
      when 条件1 then 要显示的值1或语句1;
      when 条件2 then 要显示的值2或语句2;
      ...
      else 要显示的值n或语句n;
      end
      

      举例:

      select salary,
      case
      when salary>20000 then 'A'
      when salary>15000 then 'B'
      when salary>10000 then 'C'
      else 'D'
      end as 工资级别
      from employees;
      

1.2. 分组函数

用作统计使用,又称为聚合函数或统计函数或组函数

  • sum 求和,适用于数值型数据,自动忽略null值

    select sum(salary) from employees;
    
  • avg 求均值,适用于数值型数据,自动忽略null值

    select avg(salary) from employees;
    
  • max 求最大值,适用于数值型、字符型、日期型数据,自动忽略null值

    select max(salary) from employees;
    
  • min 求最小值,适用于数值型、字符型、日期型数据,自动忽略null值

    select min(salary) from employees;
    
  • count 计数,适用于所有数据类型,计算的是非空值的个数

    select count(salary) from employees;
    
    select count(*) from employees;  #统计表格中共有多少行,使用最多
    
    select count(1) from employees;  #在表格中增加一列,值全为1,并统计表格中1这一列共有多少行
    
  • 可以与distinct搭配使用

    select sum(distinct salary) from employees; #计算工资去重以后的和
    select count(distinct salary) from employees; #计算有多少种不同的工资
    

2. 分组查询

  • 基本语法

    select 分组函数,列(要求出现在group by后面)
    from 表
    [where 筛选条件]
    group by 分组的列表
    [order by 排序的字段]
    
  • 简单的分组查询

    select avg(salary),job_id
    from employees
    group by job_id;  #查询每个工种的平均工资
    
  • 添加分组前的筛选条件

    筛选的数据源是原始表,放在group by子句前面,用where连接

    select avg(salary),department_id
    from employees
    where email like '%a%'
    group by department_id;  #查询每个部门中邮箱包含字符a的员工的平均工资
    
  • 添加分组后的筛选条件

    筛选的数据源是分组后的结果表,放在group by子句后面,用having连接

    select count(*) 个数,department_id
    from employees
    group by department_id
    having 个数>2;  #找到部门人数超过2的部门编号。首先按部门分组,计算每个部门人数,再对分组后的结果进行筛选,用having进行筛选
    
    select min(salary),manager_id
    from employees
    where manager_id>102
    group by manager_id
    having min(salary)>5000;  查询领导编号大于102的每个领导下的员工最低工资大于5000的领导编号和最低工资
    

    可以用分组前筛选的优先用分组前筛选。

  • 按表达式或函数分组

    select count(*),length(last_name)
    from employees
    group by length(last_name)
    having count(*)>5;  #按照员工名长度分组,查询每组员工个数,筛选员工个数大于5的组
    

    MySQL 中 group by 和 having 后面都支持使用别名。

  • 按多个字段分组,多个字段之间用逗号隔开,没有顺序之分

    select avg(salary),department_id,job_id
    from employees
    group by department_id,job_id;  #查询每个部门每个工种的员工平均工资
    
  • 添加排序

    select avg(salary),department_id,job_id
    from employees
    where department_id is not null
    group by department_id,job_id
    having avg(salary)>10000
    order by avg(salary) desc;
    

标签:salary,字符,group,employees,查询,MySQL,id,select
From: https://www.cnblogs.com/DYDNyang/p/17145570.html

相关文章

  • MySQL函数
     GROUP_CONCATSUBSTRING_INDEX例子:SUBSTRING_INDEX(GROUP_CONCAT(ll.xorderbyll.seqdesc,ll.createdesc),",",2) mysql中函数CONCAT及GROUP_CONCAT的使用ht......
  • MySQL 8.0 新特性-原子DDL
    背景MySQL8.0原子DDL是一个复杂的过程,涉及比较多的模块,例如:MDL锁,表定义缓存,行格式,RowLog,DDLLog,online属性,表空间物理文件操作等。本文主要通过与MySQL 5.7版本的......
  • 在Centos8/OpenEuler中安装MySQL
    在Centos8/OpenEuler中安装MySQL5.6/5.7  在Centos8/OpenEuler中安装MySQL5.6/5.7时,我们会遇到以下依赖问题:[root@node1~]#rpm-ivhMySQL-client-5.6.26-1.rhel5.x86......
  • es 集成logstash 同步mysql数据
    安装wgethttps://artifacts.elastic.co/downloads/logstash/logstash-7.14.0-linux-x86_64.tar.gz解压tar-zxvflogstash-7.14.0-linux-x86_64.tar.gz 移动 mvlo......
  • mysql 中实现递归树,类似oralce CONNECT BY PRIOR... START WITH
    CREATEDEFINER=`root`@`%`FUNCTION`getChildList`(rootIdVARCHAR(255))RETURNSmediumtextCHARSETutf8mb4BEGINDECLAREsTempMEDIUMTEXT;DECLA......
  • 使用Jmockit 测试 spring + mybatis plus 项目 - CRUD Mapper 查询样例
    Jmockit1.46+junit4packagexxx;XXXProgressimportxxx;importcom.baomidou.mybatisplus.core.conditions.Wrapper;importcom.google.common.collect.Lists;impo......
  • Linux忘记mysql密码,重置ysql密码
    1.修改配置文件,无需密码登录sudovim/etc/my.cnf在最底下添加一行:skip-grant-tables重启mysqlsystemctlrestartmysqld  2.登录mysql,修改密码输入mysql......
  • 带您了解TiDB & MySQL数据库中关于日期、时间的坑
    (带您了解TiDB&MySQL数据库中关于日期、时间的坑)时间的基础知识什么是时间时间是人们根据自然现象而进行的一种抽象概念。人类通过观察日月星辰、季节交替、动植物生......
  • Z002错误汇总-远程连接阿里云MySQL出现(10060)错误
    1、我所遇到的问题的根本原因:没有将自己的IP设置到白名单里面; 2、解决方案:第一步:查看自己的IP第二步:复制这个地址,并添加到白名单,问题即解......
  • 【MySQL】012-事务
    一、基本介绍1、概念如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败; 2、操作①开启事务:starttransaction......