--获取当前系统时间
select now()
--插入数据时候直接使用now()
insert into t_emp values(null,'666','六','赵','男','13900211666',2000,'游泳',2,now());
--把日期转换成字符串
select date_format(now(), '%Y-%m-%d %H:%i:%s');
select date_format('2008-12-19 10:10:10', '%Y-%m-%d %H:%i:%s');
--日期计算
select date_add(now(), interval 1 day); -- 加一天
select date_add(now(), interval 1 hour); -- 加一小时
select date_add(now(), interval 1 minute); -- 加一分钟
select date_add(now(), interval 1 second);--加一秒
select date_add(now(), interval 1 microsecond);--加一毫秒
select date_add(now(), interval 1 week);--加一周
select date_add(now(), interval 1 month);--加一个月
select date_add(now(), interval 1 quarter);--加一个季度
select date_add(now(), interval 1 year);--加一年
select date_add(now(), interval -1 day); -- 减一天
--计算两个日期之间相差几天
select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7
-- 1.7 显示出所有男性员工的工号,姓名,年龄
SELECT eno,CONCAT(first_name,last_name) name, 2021-YEAR(birthday) age
FROM t_emp
WHERE gender = '男';
--计算平均工资 avg计算平均值,sum求和,count求个数,min求最小值,max求最大值
select min(salary),max(salary) ,avg(salary),sum(salary)/count(*) from t_emp;
-- 1.16 【易错】查找没有月薪的两个人
-- 知识点 : 判断是否为null值 is null is not null
SELECT * FROM t_emp WHERE salary is null;
--区间查询,查询所有工资在12000到15000之间的员工,包括边界值
select * from t_emp where salary between 12000 and 15000;
select * from t_emp where salary>=12000 and salary<=15000;
-- 1.17 查询所有员工的薪资,没有薪资的员工展示为0
-- 重点 : 空置换函数 IFNULL(exp1,exp2) 当exp1列中出现null时,将此时的值替换为exp2
SELECT id,eno,IFNULL(salary,0) FROM t_emp;
-- 1.18 查找以139开头的手机号码及它对应的员工
-- 知识点 : 模糊查询 列 like '%内容' '内容%' '%内容%' 'a_'
SELECT * FROM t_emp WHERE mobile LIKE '139%';
-- 单分支选择。类似于java中的if...else...[ 条件?成功:失败]
-- 数据库考点: 流程函数 IF(expr1,expr2,expr3) 用法类似于三元运算符
-- 1.21 当薪资大于150000,显示super, 当薪资大于10000时,显示high, 否则显示low,
SELECT id,eno,birthday,salary,
IF(salary>10000,IF(salary>15000,'super','high'),'low') AS level
FROM t_emp;
-- 数据库中的选择分支
CASE
WHEN 条件 THEN 成立时执行
WHEN 条件 THEN 成立时执行
WHEN 条件 THEN 成立时执行
ELSE 不成立时执行
END
SELECT id,salary,
CASE WHEN salary >0 and salary <=5000 THEN '奋斗吧'
WHEN salary >5000 and salary <10000 THEN 'low'
WHEN salary >=10000 and salary <20000 THEN 'middle'
ELSE 'high'
END AS level
FROM t_emp;
-- 1.23 找到月薪最高的前三个人
-- 分析 : 薪资降序排列所有员工
-- 知识点 : 截取表记录 LIMIT start,num 从start行索引开始截取num条数据
-- 积分榜/排行榜: 排序+LIMIT
SELECT *
FROM t_emp
ORDER BY salary DESC
LIMIT 0,3;
--注意:在select中的字段,除了分组的字段外,其他都是聚合函数
--1.24.3 统计出每个部门的最低,最高,平均薪资
SELECT dept_id,MIN(salary),MAX(salary),AVG(IFNULL(salary,0))
FROM t_emp
GROUP BY dept_id;
--1.26 子查询(万能查询,基本可以解决面试中的大部分问题)
-- 子查询 : 在查询中继续嵌套查询
-- FROM 查询的结果作为表出现 ,WHERE 查询的结果作为条件出现
-- 1.26.1 查询出最高薪资的员工信息
-- 分析 : 查出最高薪资
SELECT * FROM t_emp WHERE salary = (SELECT MAX(salary) FROM t_emp);
SELECT * FROM t_emp WHERE salary = (SELECT MIN(salary) FROM t_emp);
-- 1.26.2 查询出高于平均薪资的员工信息
SELECT * FROM t_emp WHERE salary > (SELECT AVG(IFNULL(salary,0)) FROM t_emp);
-- 1.26.3 查询出最低和最高薪资的员工信息
SELECT * FROM t_emp
WHERE salary =(SELECT MAX(salary) FROM t_emp) OR salary=(SELECT MIN(salary) FROM t_emp);
SELECT * FROM t_emp
WHERE salary in ((SELECT MIN(salary) FROM t_emp),(SELECT MAX(salary) FROM t_emp));
-- 1.26.4 数据库合并数据 UNION UNION ALL
-- UNION UNION ALL : 将两个独立的查询语句的结果进行合并(两个查询的列数要一致)
-- 区别(面试) : UNION合并后结果去重, UNION ALL 只合并但不会去重
--注意:每一个select的结果列的类型必须相同
SELECT * FROM t_emp WHERE salary = (SELECT MAX(salary) FROM t_emp)
UNION
SELECT * FROM t_emp WHERE salary = (SELECT MIN(salary) FROM t_emp)