与MySQL相识的第二天,我们之间有了更深入的交流,加深了我们之间的了解。
Posted 码小春
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与MySQL相识的第二天,我们之间有了更深入的交流,加深了我们之间的了解。相关的知识,希望对你有一定的参考价值。
前言
在昨天我们和mysql有了第一次的见面,通过一天的学习,我们渐渐和MySQL成为了朋友,今天又经过了一天的深入交流,让我们更加的了解熟悉彼此 ,接下来就看看我和MySQL的一些故事吧。
一、排序查询(order by)
当我们学了一天的MySQL之后,我们肯定知道了在MySQL中基础的一些查询,当我们会了之后我们肯定觉得没什么太多的用处,无非就是加快了我们查询数据的速度,我们已经不能再被基础的查询所满足了,所以今天我带着MySQL来了,带着order by 走来了,首先我们看看我们怎么将我们查询到的一些数据进行排序,。
格式:
select
要查询的东西
from
表
where
条件
order by 排序的字段|表达式|函数|别名 【asc|desc】
我们在需要排序的查询语句之后添加一个order by再加上我们进行排序的条件就可以了。
排序方式:
这时候就有人问了 我知道可以用这个来进行排序了,那我怎么控制它进行升序还是降序呐?
这个问题算是问道点子上了,接下来我们就讲讲怎么来控制排序。其实很简单,就在我们刚刚的基础上在最后加上asc或者是desc就行了;
* ASC:升序,默认的
* DESC:降序
排序分类:
1.按单个字段进行排序
2.按多个字段排序
3.按表达式排序
4.按别名排序
5.按函数排序
注意:如果有多个排序条件,则当之前的条件值一样时,才会判断第二条件
实践:
有一句老话说得好实践出真知,当看到这里的时候我们就会想我知道格式了,但是总感觉还是不会用啊!!! 接下来我就给大家整了几个实践的题目。
1. 将姓名中包含e字符的年薪和姓名显示出来,并且按年薪进行降序
SELECT last_name,salary*12 年薪 FROM employees ORDER BY 年薪 DESC;
2. 显示所有有奖金的员工姓名、奖金、姓名的长度,按姓名的长度从低到高排序
SELECT last_name,salary*(1+IFNULL(commission_pct,0)) 奖金
FROM employees WHERE LENGTH(last_name)
ORDER BY LENGTH(last_name) ;
3. 部门编号>50的按工资从高到低排序,如果一样,再按frist_name升序
SELECT first_name 姓名,salary 工资
FROM employees WHERE department_id>50
ORDER BY 工资 DESC,姓名 ASC;
二、常见函数
我们了解了怎么排序之后,又会有其他的问题出现了,我们怎么求平均值呀,怎么去取出来字符串中的某一个字段呀等等。当人这些东西不用我们自己去手写,在MySQL中给大家提供了一些常用的函数。
1、字符函数
concat: 拼接
substr: 截取子串
upper: 转换成大写
lower: 转换成小写
trim: 去前后指定的空格和字符
ltrim: 去左边空格
rtrim: 去右边空格
replace: 替换
lpad: 左填充
rpad: 右填充
instr: 返回子串第一次出现的索引
length: 获取字节个数
2、数学函数
round: 四舍五入
rand: 随机数
floor: 向下取整
ceil: 向上取整
mod: 取余
truncate: 截断
3、日期函数
now: 当前系统日期+时间
curdate: 当前系统日期
curtime: 当前系统时间
str_to_date: 将字符转换成日期
date_format: 将日期转换成字符
4、流程控制函数
if 处理双分支
case语句 处理多分支
情况1:处理等值判断
情况2:处理条件判断
5、其他函数
version: 版本
database: 当前库
user: 当前连接用户
实践:
还是那句话实践出真知,只有自己敲了才知道一些奇妙的东西。
1.显示系统时间(注:日期+时间)
SELECT NOW();
2.查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)
SELECT *,salary*1.2 'new salary' FROM employees;
3.将员工的姓名按首字母排序,并写出姓名的长度(length)
SELECT last_name,LENGTH(last_name) 长度,SUBSTR(last_name,1,1) AS 首字符 FROM employees
ORDER BY 首字符 ASC;
三、分组函数
接下来就是平均值等的计算,终于不用自己一个一个的数据去敲啦。
* count:计算个数
* 一般选择非空的列:主键
* count(*)
* max:计算最大值
* min:计算最小值
* sum:计算和
* avg:计算平均值
特点:
1、以上五个分组函数都忽略null值,除了 count(*)
2、sum和avg一般用于处理数值型,max、min、count可以处理任何数据类型
3、都可以搭配distinct使用,用于统计去重后的结果
4、count的参数可以支持: * 字段、*、常量值,一般放1注意:聚合函数的计算,排除null值。
解决方案:
* 选择不包含非空的列进行计算
* IFNULL函数
实践:
1、查询公司员工工资的最大值,最小值,平均值,总和
SELECT MAX(salary),MIN(salary),SUM(salary),AVG(salary) FROM employees;
2、查询部门编号为90的员工个数
SELECT COUNT(*),department_id
FROM `departments`
WHERE department_id=90;
四、分组查询(group by)
看了那么多的知识我们终于来到了最后一个需要学习的地方,千万不要放弃呀!!!
语法:
select 查询的字段,分组函数
from 表
group by 分组的字段
group by 是可以通过我们在最后添加的条件也就是我们需要进行分组的字段,自动将一些相同的放在了一起。
特点:
1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、可以按多个字段分组,字段之间用逗号隔开
4、可以支持排序
5、having后可以支持别名
面试相关:
顺便给大家提供了一个面试的高频考点。
where 和 having 的区别?
1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不 满足结果,则不会被查询出来
2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
实践:
通过那么多的学习我们终于来到了最后的一个实践阶段!
1.查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序
SELECT MAX(salary),MIN(salary),SUM(salary),AVG(salary),job_id
FROM employees
ORDER BY job_id;
2.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
SELECT MIN(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
3.查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
SELECT COUNT(department_id),SUM(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY SUM(salary);
总结
通过今天的学习大家对于MySQL肯定又有了更加深入的了解,希望能给大家带来一些微不足道的帮助。
以上是关于与MySQL相识的第二天,我们之间有了更深入的交流,加深了我们之间的了解。的主要内容,如果未能解决你的问题,请参考以下文章