与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相识的第二天,我们之间有了更深入的交流,加深了我们之间的了解。的主要内容,如果未能解决你的问题,请参考以下文章

夜间随手记(与双双姐姐相识)

学java的第二天

第二天又是充实的一天

测试安排

与君相识 犹如故人|这是一篇关于AOP·ZUCC的自我介绍

构建之法阅读笔记01