ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

MySql基础(day2)

MySql基础(day2) 四、常见函数4.1 概念将一组逻辑语句封装在方法提中对外暴露方法名。类似于python中的方法优点1、隐藏了实现细节2、提高代码的重用性调用select 函数名(实参列表) [ from 表名];分类1、单行函数如concat、ifnull、length包含字符函数、数学函数、日期函数、其他函数、流程控制函数-if函数、流程控制函数-case结构2、分组函数功能做统计使用又称统计函数聚合函数、组函数。4.2 单行函数4.2.1 字符函数1、length获取参数值的字节个数# 特别需要注意的是对于非 ASCII 字符如汉字LENGTH 函数返回的不是字符的个数# 而是字符串的字节数select length(hello); select length(你好hello);2、CONCAT拼接字符串# CONCAT 函数用于将两个或多个字符串连接成一个字符串。# 它可以连接任意数量的字符串并返回一个组合后的字符串。# CONCAT_WS函数用于指定分隔符连接字符串SELECT CONCAT_WS(-, 2024, 07, 14);SELECT CONCAT(2026,_,8,_,18);3、upper、lower# UPPER 函数用于将字符串转换为大写。# LOWER 函数用于将字符串转换为小写。SELECT UPPER(hongshaojichi);SELECT LOWER(HONGSHAOJICHI);4、substr# substrsubstring函数用于从字符串中提取子串。# string 是原始字符串。# start_position 是子字符串的起始位置从 1 开始。# length 要提取的子串的长度可选。# 注意索引从1开始SELECT SUBSTR(我爱吃红烧鸡翅,4,3) out_put;5、instr返回子串第一次出现的索引如果找不到返回0# INSTR 函数用于返回一个子字符串在另一个字符串中第一次出现的位置。# 如果子字符串不在字符串中则返回 0。INSTR 函数区分大小写。SELECT INSTR(我爱吃红烧鸡翅,红烧鸡翅);6、trim函数用于删除字符串开头和结尾的空格字符或其他指定的字符。SELECT TRIM(sfromssssssssssss红烧鸡翅sssssss) out_put;7、lpad用指定的字符实现左填充指定长度rpad用指定的字符实现右填充指定长度SELECT lpad(红烧鸡翅,8,*) out_put;SELECT rpad(红烧鸡翅,8,*) out_put;8、replace 替换SELECT REPLACE(我要吃红烧鸡翅,鸡翅,排骨) out_put;4.2.2 数学函数1、roundROUND 函数用于将数值四舍五入到指定的小数位数。语法ROUND(number, decimals)其中number要进行四舍五入的数值。decimals要保留的小数位数。如果省略默认值为 0。SELECT ROUND(3.1415,3) out_put;2、ceilCEIL 函数或 CEILING 函数用于将数值向上取整返回大于或等于该数值的最小整数。语法CEIL(number)其中number要向上取整的数值。SELECT CEIL(3.14) out_put;3、floorFLOOR 函数用于将数值向下取整返回小于或等于该数值的最大整数。语法FLOOR(number)其中number要向下取整的数值。SELECT FLOOR(3.14) out_put;4、truncateTRUNCATE 函数用于将数值截断到指定的小数位数直接去掉多余的小数位而不进行四舍五入。语法TRUNCATE(number, decimals)其中number要截断的数值。decimals要保留的小数位数。SELECT TRUNCATE(3.1415, 2);5、mod取余MOD 函数用于计算两个数之间的余数模运算。MOD(N, M) 返回 N 除以 M 的余数。如果 M 为 0则返回 NULL。SELECT MOD(10,3);4.2.3 日期函数1、nowNOW 函数用于返回当前的日期和时间。语法NOW()结果格式为YYYY-MM-DD HH:MM:SS2、curdateCURDATE 函数用于返回当前的日期不包括时间部分。语法CURDATE()结果格式为YYYY-MM-DD3、curtimeCURTIME 函数用于返回当前的时间不包括日期部分。语法CURTIME()结果格式为HH:MM:SS4、str_to_date常用STR_TO_DATE 函数用于将字符串转换为日期和时间格式。语法STR_TO_DATE(string, format)其中string要转换的日期和时间字符串。format指定字符串的格式。格式化符号%Y四位数字的年份。%y两位数字的年份。%m两位数字的月份01 到 12。%c月份数值0 到 12。%d两位数字的日期00 到 31。%e日期数值0 到 31。%H两位数字的小时24 小时制00 到 23。%h两位数字的小时12 小时制01 到 12。%i两位数字的分钟00 到 59。%s两位数字的秒00 到 59。%pAM 或 PM。# eg:查询入职日期为1992-4-3的员工信息SELECT * FROM employees WHERE hiredate STR_TO_DATE( 4-3 1992, %c-%d %Y );5、date_formatDATE_FORMAT 函数用于将日期或日期时间值格式化为指定的字符串格式。语法DATE_FORMAT(date, format)其中date要格式化的日期或日期时间值。format指定结果字符串的格式。格式化符号%Y四位数字的年份。%y两位数字的年份。%M月份名称January 到 December。%m两位数字的月份01 到 12。%c月份数值1 到 12。%D带有英文序数后缀的月份中的天1st, 2nd, 3rd, …。%d两位数字的日期00 到 31。%e日期数值0 到 31。%H两位数字的小时24 小时制00 到 23。%h两位数字的小时12 小时制01 到 12。%i两位数字的分钟00 到 59。%s两位数字的秒00 到 59。%pAM 或 PM。%W星期名称Sunday 到 Saturday。%w星期中的天0 Sunday, 6 Saturday。%j一年中的天数001 到 366。# eg 查询有奖金的员工名和入职日期(xx月/xx日 xx年)SELECT last_name,DATE_FORMAT(hiredate,%m月/%d日 %y年) AS 入职日期 FROM employees WHERE commission_pct IS NOT NULL;4.2.4 流程控制函数1、if 函数IF 函数是用于在查询中进行条件判断的流程控制函数。语法IF(condition, true_value, false_value)其中condition要评估的条件表达式。如果条件为真非零或非空则返回 true_value否则返回 false_value。true_value条件为真时返回的值。false_value条件为假时返回的值。# eg 查询员工的姓和名以及奖金率如果有奖金率则返回有没有则返回无并以备注为列名SELECT last_name, first_name, commission_pct, IF(commission_pct IS NOT NULL,有,无) as 备注 FROM employees;2、case 函数CASE 函数或 CASE 表达式是一种流程控制函数类似于编程语言中的 switch 语句简单形式CASE case_expressionWHEN when_expression1 THEN result1WHEN when_expression2 THEN result2...ELSE else_resultEND其中case_expression需要进行比较的表达式或列。when_expression1, when_expression2, ...与 case_expression 进行比较的表达式或值。result1, result2, ...当 case_expression 等于 when_expression 时返回的结果。else_result如果没有 when_expression 匹配时返回的默认结果。搜索形式CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE else_resultEND其中condition1, condition2, ...条件表达式可以是任何布尔表达式。result1, result2, ...当条件表达式为真时返回的结果。else_result如果没有条件表达式为真时返回的默认结果。#eg 查询员工的工资要求1部门号30显示的工资为1.1倍2部门号40显示的工资为1.2倍3部门号50显示的工资为1.3倍4其他部门显示的工资为原工资简单形式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;搜索形式SELECT salary, department_id, CASE WHEN department_id30 THEN salary*1.1 WHEN department_id40 THEN salary*1.2 WHEN department_id50 THEN salary*1.3 ELSE salary END AS 新工资 FROM employees;五、分组函数5.1 概念功能用作统计使用又称为聚合函数或统计函数或组函数分类1sum 求和2avg 平均值3max 最大值4min 最小值5count 计算个数特点1sum、avg一般用于处理数值型max、min、count可以处理任何类型2以上分组函数都忽略null值3可以和distinct搭配实现去重的运算4一般使用count(*)做统计函数5和分组函数一同查询的字段要求是group by后的字段5.2 案例5.2.1 sum函数SUM 函数用于计算数值列的总和。语法SUM(expression)其中expression要求和的列或表达式。SELECT SUM(salary) from employees;5.2.2 avg函数AVG 函数用于计算数值列的平均值。语法AVG(expression)其中expression要求平均值的列或表达式。SELECT AVG(salary) from employees;5.2.3 max/min函数MAX 函数用于计算数值列的最大值。MIN 函数用于计算数值列的最小值。SELECT MAX(salary), MIN(salary) FROM employees;5.2.4 count函数COUNT 函数用于计算行数或者满足指定条件的行数。语法COUNT(expression)其中expression可选项要计数的列或表达式。如果不提供参数则计算整个结果集的行数。SELECT COUNT(salary) FROM employees;六、分组查询6.1 概念select 分组函数列要求出现在group by的后面from 表名[where 筛选条件]group by 分组的列表[order by 子句]特点1、分组查询中的筛选条件分为两类数据源 位置 关键字分组前筛选 原始表 group by子句的前面 where分组后筛选 分组后的结果集 group by子句的后面 having1分组函数做条件肯定是放在having子句中(2) 能用分组前筛选的就优先考虑使用分组前筛选2、group by 子句支持单个字段分组多个字段分组多个字段之间用逗号隔开没有顺序要求表达式或函数用的较少3、也可以添加排序排序放在整个分组查询的最后6.2 案例#查询邮箱中包含a字符的每个部门的平均工资(分组前筛选)SELECT department_id, avg(salary) FROM employees WHERE email like %a% GROUP BY department_id;# 查询哪个部门的员工个数大于2 分组后筛选SELECT COUNT(*), department_id FROM employees GROUP BY department_id HAVING COUNT(*)2;-- 按表达式或者函数分组# eg 按员工姓名的长度分组查询每一组的员工个数筛选员工个数大于5的有哪些SELECT count(*), LENGTH(CONCAT(last_name,first_name)) as len FROM employees GROUP BY LENGTH(CONCAT(last_name,first_name)) HAVING count(*)5;-- 按多个字段分组# eg 查询每个部门每个工种的员工的平均工资SELECT department_id, job_id, AVG(salary) FROM employees GROUP BY department_id, job_id;-- 添加排序# eg 查询每个部门每个工种的员工的平均工资并且按平均工资的高低显示SELECT department_id, job_id, AVG(salary) FROM employees GROUP BY department_id, job_id ORDER BY AVG(salary) desc;七、连接查询7.1 概念概念又称多表查询当查询的字段来自多个表时就会用到连接查询。分类1按年代分类sql99标准推荐支持内连接外连接左外、右外交叉连接2按功能分类内连接等值连接 非等值连接 自连接外连接左外连接 右外连接 全外连接交叉连接7.2 案例7.2.1 内连接语法select 查询列表from 表1 别名inner join 表2 别名on 连接条件分类等值连接 非等值连接 自连接特点1添加排序、分组、筛选2inner 可以省略3筛选条件放在where后面连接条件放在on后面提高分离性便于阅读4inner join连接和sql92语法中的等值连接效果时一样的都是查询多表的交集-- 等值连接# eg 查询哪个部门的员工个数大于3的部门名和员工个数并按个数降序SELECT count(*), department_name FROM employees e INNER JOIN departments d ON e.department_idd.department_id GROUP BY department_name HAVING count(*)3 ORDER BY count(*) desc;-- 非等值连接# eg 查询工资级别的个数大于20 的个数并且按工资级别降序SELECT count(*), grade_level FROM employees e INNER JOIN job_grades j ON e.salary BETWEEN lowest_sal AND highest_sal GROUP BY grade_level HAVING count(*)20 ORDER BY grade_level desc;-- 自连接# 查询名中包含字符e的员工的名字、上级的名字SELECT e.first_name, m.first_name FROM employees e INNER JOIN employees m ON e.manager_id m.employee_id WHERE e.first_name LIKE %e%;7.2.2 外连接-- 外连接应用场景用于查询一个表中有另一个表中没有的记录。特点1外连接的查询结果为主表中的所有记录如果从表中有和它匹配的则显示匹配的值如果从表中没有和它匹配的则显示null。外连接查询结果 内连接结果 主表中有而从表中没有的记录2左外连接left join左边的是主表右外连接right join右边的是主表3左外和右外交换两个表的顺序可以实现同样的效果4全外连接 内连接的结果 表1中有但表2中没有的表2中有但表1中没有的数据准备eg 查询男朋友不在男生表中的女生名。-- 左外连接SELECT b.name, bo.* FROM beauty b LEFT JOIN boys bo ON b.boyfriend_idbo.id WHERE bo.id IS NULL;-- 右外连接SELECT b.NAME, bo.* FROM boys bo RIGHT OUTER JOIN beauty b ON b.boyfriend_id bo.id WHERE bo.id IS NULL;
返回列表