日期函数
常见
curdate() current_date()
获取当前年月日
curtime() current_time()
获取当前时分秒
now() sysdate()
获取当前年月日时分秒
datediff(date1,date2)
返回date1-date2相差的天数
date_add(time,interval exp unit) select date_add(now(),interval 1 DAY) from dual;
给指定时间time加上单位为unit的exp
date_sub(time,interval exp unit)
给指定时间time减去单位为unit的exp
常见unit如下:
time_format(time,format)
将时间time的时分秒【只对时分秒】信息按照format指定的格式格式化为字符串并返回
date_format(time,format)
将时间time按照format指定的格式格式化为字符串并返回
常见格式如下:
案例
1 | select now(),sysdate() from dual; |
其他函数
database()
获取当前使用的数据库实例名
version()
获取数据的版本
user()
获取当前登录用户
md5(明文)
获取明文MD5后的摘要信息
password(明文)
获取明文加密后的密文,mysql使用该函数加密用户的密码**(注意了mysql 8 版本是没有该函数的)**
案例
1 | select DATABASE() from dual; -- 获取当前数据库实例 |
控制语句
常见
case
语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15CASE
VALUE
when 等值比较 THEN 满足
when 等值比较 THEN 满足
when 等值比较 THEN 满足
ELSE 其他
END
CASE
WHEN 条件 THEN 满足
WHEN 条件 THEN 满足
WHEN 条件 THEN 满足
ELSE 其他
ENDif(expression,成立,不成立)
类似于三目运算符
ifnull(expression,成立)
判断expression是否为空,如果为空则返回成立结果
nullif
案例
1 | select |
多表查询
含义
显示的数据不仅仅来自一张表中,可能是来自两张甚至更多。
分类
- 连接条件分
- 等值连接
- 非等值连接
- 按其他连接方法分
- 外连接
- 内连接
笛卡尔积
含义
显示的记录数量是各个查询表中记录数的乘积
产生原因
多表连接查询中缺少有效的关联的条件
处理方案
多表连接查询中添加有效的关联的条件,如果M张表查询至少需要M-1个有效的关联条件
案例
1 | -- select *from emp; -- 14 |
等值连接
含义
有效关联添加是等值比较的
案例
1 | -- 查询员工信息、部门名称、工作地点 |
非等值连接
含义
有效关联添加不是使用等值比较的
案例一
1 | select e.*,g.grade from emp e,salgrade g where e.sal BETWEEN g.losal and g.hisal; |
自身连接
相同表之间做关联查询
案例
1 | -- 查询员工姓名,员工编号,以及他们的经理姓名,经理编号。 |
ANSI标准 连接语句
所有关系型数据都要支持的语法
交叉连接 【了解】
1
select *from emp cross JOIN dept
自然连接 【了解】
1
select *from emp NATURAL join dept
using连接 【了解】
1
select *from emp join dept using(deptno)
inner join .. on 子句
left join .. on 子句
right join .. on 子句
inner join
内连接
语法
1 | select ... from 表1 [inner] join 表2 on 有效关联条件 [where 其他条件] |
好处
- 将有效关联条件和其他条件分开
- 提高可读性
案例
1 | -- select *from emp e,dept d where e.deptno = d.deptno and d.loc = 'DALLAS'; |
left join
左外连接(不管左边有没有和右边匹配都要显示)
语法
1 | select ... from 表1 left [outer] join 表2 on 有效关联条件 [where 其他条件] |
案例
1 | -- 列出员工的名称和部门编号 |
right join
右外连接(不管右边有没有和左边匹配都要显示)
语法
1 | select ... from 表1 left [outer] join 表2 on 有效关联条件 [where 其他条件] |
案例
1 | -- 列出员工的名称和部门编号 |
分组函数
分数函数也叫多行参数,是将多行作为参数
常见
min
MIN([DISTINCT|ALL] column|expression)
max
MAX([DISTINCT|ALL] column|expression)
avg
AVG([DISTINCT|ALL] column|expression)
sum
SUM([DISTINCT|ALL] column|expression)
count
COUNT ( * | { [DISTINCT|ALL] column})
语法
1 | SELECT [column,] group_function(column) |
分组函数位置:
select
having
order by
注意点
- 除了count(*)之外,其他的分组函数都会忽略null值
案例
1 | -- 查看最早入职之间 |
思考
请问如下结构多少?
1 | select count(comm) from emp; |
请问是否报错?
1 | select count(DISTINCT deptno) from emp; |
group by 语句
含义
按照指定条件将数据分组
示意图
语法
1 | SELECT deptno, group_function(column) |
注意点
使用了group by 之后,select 后面不可以写可以写分组函数、分组的依据列
案例
1 | -- 查询每个部门的编号,平均工资 |
having
含义
对分组后进一步的过滤
示意图
语法
1 | SELECT column, group_function |
案例
1 | -- 询每个部门最高工资大于3000的部门编号,最高工资 |
执行顺序
- from
- where
- group by
- select字段
- having
- order by
- limit
子查询
含义
查询语句中的查询语句,也称从查询、内部查询
示意图
规范
- 用(子查询)包裹起来
- 放到比较运算符的右边
- 使用适当的比较运算符
- 单行运算符:>、=、>=、<、<>、<=
- 多行运算符: IN、ANY、ALL
使用地方
- where
- from
- having
案例一
在where中使用子查询
1 | -- 查询出工资 比JONES的还要高 的其他雇员 |
案例二
在from和having使用子查询
1 | -- 查询部门人数大于所有 部门平均人数 的的部门编号,部门名称,部门人数 |
案例三
在from中使用子查询
1 | -- 查找员工名字、薪水、部门编号 |