日期函数
now() 当前时间
select now();
year() 年份
- 计算每个同学的年龄
- year(now()) 当前的年份
- year(birthdate) 出生的那年年份
- year(now()) - year(birthdate) 年龄
SELECT id,username,birthdate, (YEAR(NOW()) - YEAR(birthdate)) as age from emps;
unix_timestamp() 时间戳
SELECT (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(birthdate)) as "存活/秒" from emps;
date_format 日期格式化
符号 | 含义 |
---|---|
%Y | 4位数的年份 |
%m | 月份 |
%d | 天 |
%H | 小时 |
%M | 分钟 |
%S | 秒 |
SELECT birthdate, DATE_FORMAT(birthdate,"%Y %m %d") from emps;
查询早上6:00-晚上6:00 之间出生的人;
- 使用 date_format格式化时间
date_format(birthdate,"%H")
select * from emps
where date_format(birthdate,"%H") between 6 and 18;
- 使用 date_format格式化时间
按照出生进行降序排序;
select * from emps
order by birthdate desc;
计算最高薪水salary与最低薪水salary的差距;
select max(salary),min(salary),max(salary)-min(salary) from emps;
datediff() 计算时间差
计算两个时间之间的条件
SELECT DATEDIFF("2017-01-01", "2016-12-24");
select *,DATEDIFF(NOW(),birthdate) from emps;
date_add() 时间换算
- MICROSECOND 微秒
- SECOND 秒
- MINUTE 分钟
- HOUR 小时
- DAY 天
- WEEK 周
- MONTH 月
- QUARTER 季度
YEAR 年
-15 year : 15年前
SELECT DATE_ADD(now(), INTERVAL -15 Year);
20年后
SELECT DATE_ADD(now(), INTERVAL 20 Year);
字符串相关
concat() 拼接
SELECT CONCAT("xiaowang","-",20,"-",75)
- 查询student表,显示数据格式为
张三-男-20-75
select concat(name,"-",sex,"-",age,"-",score) from student;
IFNULL() 如果为空
- 查询学生信息,如果成绩score为null 显示
缺考
```sql select id,name,age,sex,ifnull(score,”缺考”) from student;
select id,name,age,IFNULL(sex,”不详”),IFNULL(score,”缺考”) from student;

<a name="DQs4t"></a>
# 总结

<a name="IKdhK"></a>
# 作业

1. 查询成绩大于60分的同学,并按照年龄升序排序;
1. 年龄最小的同学信息;
1. 年龄第二小的同学信息;
```sql
-- 查询成绩大于60分的同学,并按照年龄升序排序;
SELECT * FROM student
WHERE score > 60 -- 先过滤成绩大于60
ORDER BY age -- 按照年龄排序
-- 年龄最小的同学信息;
-- 1. 先找到最小的年龄
SELECT min(age) FROM student;
-- 2. 根据年龄找到对应的人
SELECT * FROM student
WHERE age=(SELECT min(age) FROM student);
-- 年龄第二小的同学信息; 需要去重
SELECT distinct(age) FROM student ORDER BY age LIMIT 1,1
SELECT * FROM student
WHERE age=(SELECT distinct(age) FROM student ORDER BY age LIMIT 1,1)
- 查询分数,并按照分数进行降序排序,分数一样,按照年龄升序排序;
- 统计sex为null的人员数量;
- 统计张姓人员的总数,总成绩,平均成绩; ```sql — 查询分数,并按照分数进行降序排序,分数一样,按照年龄升序排序; SELECT * FROM student ORDER BY score DESC , age;
— 统计sex为null的人员数量; SELECT COUNT(*) FROM student WHERE sex IS NULL;
— 统计张姓人员的总数,总成绩,平均成绩
SELECT COUNT()总数, SUM(score)总成绩, AVG(score)平均成绩 FROM student WHERE name
LIKE “张%”;
— 注意点: avg在计算的计算的时候会自动去掉Null值。
SELECT COUNT()总数, SUM(score)总成绩, SUM(score)/COUNT(*) 平均成绩 FROM student WHERE name
LIKE “张%”;
7. 查询所有信息,成绩为空显示`缺勤`;
7. 统计男生的人数
7. 统计女生的人数
7. 一条sql语句分别统计男生,女生的人数;(**选做,需要后续知识**);
```sql
-- 查询所有信息,成绩为空显示缺勤;
select id,name,age,sex,ifnull(score,"缺勤") from student
-- 统计男生的人数
select count(*) from student
where sex="男"
-- 统计女生的人数
select count(*) from student
where sex="女"
-- 一条sql语句分别统计男生,女生的人数
select sex,count(*) from student
where sex is not null
group by sex
- 统计emps表中的人数;
- 统计月薪,并将月薪去重之后按照升序排序;
- 计算emps表中的每个人的月薪,年薪(默认12薪); ```sql — 统计emps表中的人数; select COUNT(*) from emps;
— 统计月薪,并将月薪去重之后按照升序排序; select DISTINCT salary from emps ORDER BY salary asc;
— 计算emps表中的每个人的月薪,年薪(默认12薪); select salary ,salary*12 from emps;
4. 计算每个人的年龄,输出姓名(username),年龄;
4. 计算`最大年龄的人`与`最小年龄的人`之间相差的天数;
4. 显示出 `姓名-年龄-月薪-年薪`;
```sql
-- 计算每个人的年龄,输出姓名(username),年龄;
SELECT username,(year(now())-year(birthdate)) as 年龄 FROM emps;
-- 计算最大年龄的人与最小年龄的人之间相差的天数;
SELECT datediff(max(birthdate),min(birthdate)) as 相差天数 from emps;
-- 显示出 姓名-年龄-月薪-年薪;
select concat(username,"-",(year(now())-year(birthdate)),"-",salary,"-",salary*12) as "姓名-年龄-月薪-年薪" from emps;