上接:
零基础学习数据库SQL教程(二)
写在前面的话:本文章内容是自己在LintCode网站SQL教程学习过程中做的学习总结,以便自己复习和大家学习,如果去刷此网站的题,也可以把此文作为参考答案来使用。例题的答案是本人所写,并且已经运行成功,大家可以放心学习。
目录
算法函数(一)
1. 使用 AVG() 函数求数值列的平均值
2.使用 MAX() 函数返回指定列中的最大值
3. 使用 MIN() 函数返回指定列中的最小值
4. 使用 SUM() 函数统计数值列的总数
算术函数(二)
1.使用 ROUND() 函数将数值四舍五入
1.1ROUND(X)
1.2 ROUND(X, D)
2. 使用 NULL() 函数判断空值
2.1 ISNULL()
2.2 IFNULL()
3. 使用 COUNT() 函数计数
3.1 COUNT( column_name )
3.2 COUNT(*)
3.3COUNT(DISTINCT column_name)
时间函数(一)
2. 使用 DATE()、TIME() 函数提取日期和时间
3. 使用 EXTRACT() 函数提取指定的时间信息
4.DATE_FORMAT() 格式化输出日期
时间函数(二)
1. 使用 DATE_ADD() 增加时间
2. 使用 DATE_SUB() 减少时间
3. 使用时间函数 DATEDIFF() 和 TIMESTAMPDIFF() 计算日期差
3.1 DATEDIFF ()
3.2 TIMESTAMPDIFF()
平均函数 AVG() 是平均数 AVERAGE 的缩写,它用于求数值列的平均值。它可以用来返回所有列的平均值,也可以用来返回特定列和行的平均值。 具体的计算过程为:其通过对表中行数计数并计算特定数值列的列值之和,求得该列的平均值。
但是当参数 column_name
列中的数据均为空时,结果会返回 NULL。
语法:
SELECT AVG(`column_name`)
FROM `table_name`;
我们可以通过下面的实例来感受一下 AVG() 函数 的用法。
假如我们想要计算课程表 courses
中学生上课人数 student_count
的平均值,我们可以使用下面的SQL语句:
SELECT AVG(`student_count`) AS `average_student_count`
FROM `courses`;
其中 AS
关键字的作用是赋予 AVG(student_count)
计算结果列显示在列表中的别名。
何为别名?
别名是一个字段或值的替换名,由关键字 AS
赋予。别名还有其他用途,常见的用途包括在实际的表列名包含不符合规定的字符(如空格)时重新命名它,在原来的表列名含糊或者容易误解时扩充它等。
别名常与函数联用,给使用函数之后的新计算列一个名字,方便我们查看和使用。我们会在后续的学习中经常见到它。
例题:请编写 SQL 语句,查询教师表 teachers
中教师邮箱为 '@qq.com' 结尾的年龄的平均值,最后返回结果列名显示为 'average_teacher_age' 。
答案:
select AVG(age)
as
average_teacher_age
from teachers
where email like '%@qq.com'
最大值函数 MAX() 用于返回指定列中的最大值。它只有一个参数 column_name
,表示指定的列名。但是当参数 column_name
列中的数据均为空时,结果会返回 NULL。
语法:
SELECT MAX(`column_name`)
FROM `table_name`;
例题:请编写 SQL 语句,从教师表 teachers 中,查询最年长的中国教师信息,并返回该教师的年龄。
答案:
select max(age)
as
max_age
from teachers
where country='CN'
MIN() 函数的功能与 MAX() 正好相反,它用于返回指定列中的最小值。但与 MAX() 相同的是,它也只有一个参数 column_name
,表示指定的列名,且当参数 column_name
列中的数据均为空时,结果会返回 NULL。
语法:
SELECT MIN(`column_name`)
FROM `table_name`;
例题:请编写 SQL 语句,查询教师表 teachers 中最小的教师年龄 (age)。
答案:
select min(age) as min_age
from teachers
SUM() 函数用于统计数值列的总数并返回其值。它只有一个参数 column_name
,表示指定的列名,但是当参数 column_name
列中的数据均为空时,结果会返回 NULL。
语法
SELECT SUM(`column_name`)
FROM `table_name`;
例题:请编写 SQL 语句,统计课程表 courses 中 teacher_id 为 3 的教师所教授的学生总数,并用select_student_sum 作为结果集列名。
答案:
select sum(student_count) as `select_student_sum`
from courses
where teacher_id='3'
ROUND()
函数用于把数值字段舍入为指定的小数位数。
语法:
SELECT ROUND(`column_name`, `decimals`)
FROM `table_name`;
其中:
column_name 为要舍入的字段
decimals 规定要返回的小数位数
ROUND( X ):返回参数 X 四舍五入后的一个整数。
我们可以通过下面 3 个简单案例学习一下 ROUND(X) 的用法。
<1>
mysql> SELECT ROUND(-1.49);
+--------------+
| ROUND(-1.49) |
+--------------+
| -1 |
+--------------+
1 row in set (0.00 sec)
<2>
mysql> SELECT ROUND(-1.99);
+--------------+
| ROUND(-1.99) |
+--------------+
| -2 |
+--------------+
1 row in set (0.00 sec)
<3>
mysql> SELECT ROUND(1.51);
+-------------+
| ROUND(1.51) |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
注意:因为没有提及小数位数,所以默认为0
ROUND(X, D): 返回参数 X 四舍五入且保留 D 位小数后的一个数字。如果 D 为 0,结果将没有小数点或小数部分。
我们可以通过下面 2 个简单案例学习一下 ROUND(X, D) 的用法。
<1>
mysql> SELECT ROUND(1.388, 1);
+-----------------+
| ROUND(1.388, 1) |
+-----------------+
| 1.4 |
+-----------------+
1 row in set (0.00 sec)
<2>
mysql> SELECT ROUND(-1.498, 0);
+-----------------+
| ROUND(-1.498, 0) |
+-----------------+
| -1 |
+-----------------+
1 row in set (0.00 sec)
例题:请编写 SQL 语句,查询教师表 teachers
中,20 岁(不包含 20 岁)以上教师的平均年龄,返回的字段为 avg_teacher_age ,结果保留四舍五入后的整数。
答案:
select round(avg(age)) as avg_teacher_age
from teachers
where age>20
在介绍判断空值函数 NULL() 之前,我们先来了解一下在之前的学习中遇到了多次的 NULL ,即我们常说的空值。但是这种叫法并不准确,因为 NULL 并不是值,它表示数值未知或者不确定。因此,NULL 无法和 0 或空格字符串 "" 进行比较,甚至 NULL 与 NULL 之间也无法比较。默认地,表的列可以存放 NULL 。
ISNULL()
函数用于判断字段是否为 NULL,它只有一个参数 column_name
为列名,根据column_name
列中的字段是否为 NULL 值返回 0 或 1。
语法:
SELECT ISNULL(`column_name`)
FROM `table_name`;
其中:
如果 column_name
列中的某个字段是 NULL 则返回 1,不是则返回 0
IFNULL()
函数也用于判断字段是否为NULL,但是与 ISNULL()
不同的是它接收两个参数,第一个参数 column_name
为列名,第二个参数 value
相当于备用值。
语法:
SELECT IFNULL(`column_name`, `value`)
FROM `table_name`;
其中:
如果 column_name
列中的某个字段是 NULL 则返回 value 值,不是则返回对应内容。
COALESCE(column_name, value)
函数也用于判断字段是否为NULL,其用法和 IFNULL()
相同。
我们可以通过下面的实例来感受一下 ISNULL() 和 IFNULL() 的用法。
假如教师表 teachers
中教师姓名为 'Linghu Chong' 中邮箱为 NULL 值,我们可以通过该记录对比学习 ISNULL()
、IFNULL()
和 COALESCE()
,其中 COALESCE()
用法与 IFNULL()
相同。
我们可以使用下面的 SQL 语句:
SELECT `name`, `email`, ISNULL(`email`), IFNULL(`email`, 0), COALESCE(`email`, 0)
FROM `teachers`;
执行输出结果:
mysql> SELECT `name`, `email`, ISNULL(`email`), IFNULL(`email`, 0), COALESCE(`email`, 0) FROM `teachers`;
+------------------+---------------------------+---------------+---------------------------+---------------------------+
| name | email | ISNULL(email) | IFNULL(email,0) | COALESCE(email,0) |
+------------------+---------------------------+---------------+---------------------------+---------------------------+
| Eastern Heretic | [email protected] | 0 | [email protected] | [email protected] |
| Northern Beggar | [email protected] | 0 | [email protected] | [email protected] |
| Western Venom | [email protected] | 0 | [email protected] | [email protected] |
| Southern Emperor | [email protected] | 0 | [email protected] | [email protected] |
| Linghu Chong | NULL | 1 | 0 | 0 |
+------------------+---------------------------+---------------+---------------------------+---------------------------+
5 rows in set (0.00 sec)
例题:请编写 SQL 语句,从 teachers
表中找出没有邮箱并且年龄大于20岁的教师信息。
答案:
select *
from teachers
where isnull(email)=1 and age>'20'
COUNT() 函数用于计数,可利用其确定表中行的数目或者符合特定条件的行的数目。当COUNT() 中的参数不同时,其的用途也是有明显的不同的,主要可分为以下三种情况:COUNT(column_name) 、COUNT( * ) 和 COUNT(DISTINCT column_name) 。
COUNT(column_name) 函数会对指定列具有的行数进行计数,但是会除去值为 NULL 的行。该函数主要用于查看各列数据的数量情况,便于统计数据的缺失值。
假如出现某一列的数据全为 NULL 值的情况, 使用COUNT( column_name ) 函数对该列进行计数,会返回 0。
语法:
SELECT COUNT(`column_name`)
FROM `table_name`;
COUNT(*) 函数会对表中行的数目进行计数,包括值为 NULL 所在行和重复项所在行。该函数主要用于查看表中的记录数。
语法:
SELECT COUNT(*)
FROM `table_name`;
❗ 注意: COUNT(column_name) 与 COUNT(*) 的区别
COUNT(column_name) 中,如果 column_name
字段中的值为 NULL,则计数不会增加,而如果字段值为空字符串""
,则字段值会加 1
COUNT() 中,除非整个记录全为 NULL,则计数不会增加,如果存在某一个记录不为 NULL,或者为空字符串""
,计数值都会加 1。正常来说,表都会有主键,而主键不为空,所以 COUNT() 在有主键的表中等同于 COUNT(PRIMARY_KEY),即查询有多少条记录。
COUNT( DISTINCT column_name)的作用是返回指定列的不同值的数目
语法:
SELECT COUNT(DISTINCT column_name)
FROM table_name;
注意:COUNT( DISTINCT column_name)的作用和COUNT( DISTINCTROW column_name)完全相同。
例题1:请编写 SQL 语句,统计课程表 courses
中不同的教师 id teacher_id
的数量,最后返回统计值,结果列名显示为 teacher_count
。
答案:
select count(distinct teacher_id) as teacher_count
from courses
例题2:请编写 SQL 语句,统计教师表中年龄在 20 到 28 岁之间,且国籍为中国或英国的教师人数,最后返回统计值,结果列名显示为 teacher_count
。
答案:
select count(id) as teacher_count
from teachers
where (age between 20 and 28) and (countryin('CN','UK'))
1. 使用 NOW() 、 CURDATE()、CURTIME() 获取当前时间
在 SQL 中,我们可以通过使用 NOW()、CURDATE()、CURTIME() 来获取当前的时间
NOW()
可以用来返回当前日期和时间 格式:YYYY-MM-DD hh:mm:ss
CURDATE()
可以用来返回当前日期 格式:YYYY-MM-DD
CURTIME()
可以用来返回当前时间 格式:hh:mm:ss
在使用
NOW()
和CURTIME()
时,如果要精确的秒以后的时间的话,可以在()中加数字,加多少,就表示精确到秒后多少位比如
NOW(3)
就是精确到毫秒,表示为:2021-03-31 15:27:20.645
例题:请编写 SQL 语句,向记录表 records
中插入当前的日期。
答案:
insert
into records
values (curdate())
通过上一节的学习,我们已经学会了如何在 SQL 中获取当前的时间了,这一节我们将会学习如何将时间中的代表日期的元素和代表时间的元素从时间中提取出来。
就以上一节我们获得的 current_datetime
来说吧,我们已经知道了“现在”的时间是 '2021-03-25 16:16:30'
,但是在实际运用中,不需要这么的精确,只需要其中的日期或者时间,那么我们应该怎么做呢。或许你会想到再用 CURDATE()
或者CURTIME()
把需要的日期或者时间获取出来不就行了吗。但是你有没有想过时间是会变的, CURDATE()
或者CURTIME()
都是获取当前的,而在某些情况下,时间是固定的,接下来就需要使用 DATE () 和TIME () 了
我们可以通过下面的示例来感受一下 DATE () 、TIME () 的用法
使用 DATE()
、TIME()
函数分别将 '2021-03-25 16:16:30'
这组数据中的日期于时间提取出来,并用 date
、time
作为结果集列名。
SELECT DATE('2021-03-25 16:16:30') AS `date`,TIME('2021-03-25 16:16:30') AS `time`;
+------------+----------+
| date | time |
+------------+----------+
| 2021-03-25 | 16:16:30 |
+------------+----------+
1 row in set
例题:请编写 SQL 语句,从课程表 courses
中查询 2020 年 8 月前的课程名和创建日期,并为创建日期的列名起别名为 created_date
(日期指 created_at
中不包括具体时间的部分)。
答案:
select name,date(created_at) AS created_date
from courses
where date(created_at)<'2020-08-01'
前面我们已经学习了 DATE 函数和 TIME 函数,明白 DATE 返回日期, TIME 返回时间,如果我只想知道年份的信息或者小时的信息,那么该怎么解决呢?这时,我们就可以使用 EXTRACT() 函数来解决问题。
EXTRACT() 函数用于返回日期/时间的单独部分,如 YEAR
(年)、MONTH
(月)、DAY
(日)、HOUR
(小时)、MINUTE
(分钟)、 SECOND
(秒)。
语法
SELECT EXTRACT(unit FROM date)
FROM `table`
其中:
table 是表格名
date 参数是合法的日期表达式。
unit 参数是需要返回的时间部分,如 YEAR
、MONTH
、 DAY
、 HOUR
、MINUTE
、SECOND
等。
在一般情况下,
EXTRACT(unit FROM date)
与unit()
的结果相同。
例题:请编写 SQL 语句,从课程表 courses
中查询所有课程的课程名称( name
)和课程创建时间( created_at
)的小时数,将提取小时数的列名起别名为 created_hour
。
答案:
select name,extract(hour from created_at) as created_hour
from courses
我们在 SQL 中使用 DATE_FORMAT()
方法来格式化输出 date/time。 需要注意的是 DATE_FORMAT()
函数返回的是字符串格式。
语法:
SELECT DATE_FORMAT(date,format);
其中
date
一个有效日期。
format
是 date/time 的输出格式。
输出格式表示方法: %Y 表示年份, %m 表示月份,%d 表示日期,%w 表示星期,%H 表示小时,%i 表示分钟,%S表示秒 注意大小写
例题:请编写 SQL 语句,查询 courses
表,查询课程创建时间,按照 ’年-月-日 时:分:秒’ 的格式返回结果,返回列名显示为 DATE_FORMAT
。
答案:
select DATE_FORMAT(created_at,'%Y-%m-%d %H:%i:%S')
as DATE_FORMAT
from courses
在使用 mysql 查询数据的过程中,有时我们需要修改数据表中的时间,对日期进行计算,如:对某个日期加上几天、几个小时等操作。
DATE_ADD()
函数是常用的时间函数之一,用于向日期添加指定的时间间隔。
语法
SELECT DATE_ADD(date, INTERVAL expr type)
FROM table_name
其中:date
指代希望被操作的有效日期,为起始日期
expr
是希望添加的时间间隔的数值(expr 是一个字符串,对于负值的间隔,可以以 ”-“ 开头)
type
是具体的数据类型,表示加上时间间隔的单位(可以是 MICROSECOND (毫秒), SECOND , MINUTE , HOUR , DAY , WEEK , MONTH , QUARTER (一刻钟), YEAR 等)
例题:请编写 SQL 语句,修改 courses
表中课程的课程创建日期,将课程创建日期均推迟一天,最后返回课程名称 name
及修改后的课程创建时间,修改后的课程创建时间命名为 new_created
。
答案:
select name,date_add(created_at,interval 1 day)
as new_created
from courses
DATE_SUB() 函数是常用的时间函数之一,用于从日期减去指定的时间间隔。它与 DATE_ADD()
函数具有相似的用法。
语法:
SELECT DATE_SUB(date, INTERVAL expr type)
FROM table_name
其中:date
指代希望被操作的有效日期
expr
是希望减少的时间间隔
type
是具体的数据类型(可以是 MICROSECOND , SECOND , MINUTE , HOUR , DAY , WEEK , MONTH , QUARTER , YEAR 等)
例题:请编写 SQL 语句,修改 courses
表中课程的课程创建日期,将课程创建日期均提前一天,最后返回课程 id
、课程名称 name
及修改后的开课日期,修改后的课程创建日期命名为 new_created
。
答案:
select id,name,date_sub(created_at,interval 1 day)
as new_created
from courses
前面我们学习了关于时间的一些简单应用,对时间的一些删改等,但是在实际生活中往往更多的是需要我们去计算一些日期差值的,比如一些假期日时长,还有多久到某某纪念日,等,下面我们就来简单介绍一下。
DATEDIFF() 常用的日期差,在 MySQL 中默认只能计算天数差。
DATEDIFF() 用法:
DATEDIFF(时间1,时间2)
DATEDIFF() 差值计算规则:时间 1 - 时间 2
例题:请编写 SQL 语句,查询 courses
表,计算从 2019 年 03 月 26 日到创建时间(created_at)相差的天数,结果列名以 date_diff
显示 。
答案:
select datediff(created_at,'2019-03-26')
as date_diff
from courses
查询功能多的 MySQL 自带的日期函数,可以计算两个日期相差的年(YEAR,时间1,时间2),月(MONTH,时间1,时间2),周(WEEK,时间1,时间2),日(DAY,时间1,时间2),小时(HOUR,时间1,时间2)。
TIMESTAMPDIFF() 用法:
TIMESTAMPDIFF (类型,时间1,时间2)
TIMESTAMPDIFF() 差值计算规则:时间 2 - 时间 1
例题:请编写 SQL 语句,查询 courses
表,计算课程创建时间与 '2020-04-22' 的月数差,返回列名显示为 MonthDiff。
答案:
select timestampdiff(month,created_at,'2020-04-22')
as MonthDiff
from courses
下接:
零基础学习数据库SQL教程(四)