每一个数据库处理日期的时候 采用的机制是不同的 日期处理都有自己的一套机制 所以在实际开放中表中的字段定义为date类型 这种情况很少见 因为一旦使用日期类型那么java程序将不能够通用 在实际的开放中一般会使用日期字符串来表示日期
日期是数据库本身的特色 也是数据库本身机制中的一个重要内容 所以还是需要掌握
MYSQL 数据库管理系统对日期的处理提供了2个重要的函数
-str_to_date 该函数的作用是将日期字符串转化成日期类型 varchar(可变长度字符串)->date
该函数的执行结果是date类型 该函数的使用格式str_to_date('日期字符串','日期格式')
关于MYSQL的日期格式
java的格式 YYYY MM dd HH mm ss SSS
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
Date date = sdf.parse("1970-10-10 12:15:10") (parse 解析)
提示错误cannot format object to date 可能是因为引入错误的jar包
mySQL %Y %m %d %H %i(分) %s
selece ename,hiretime from emp where hiretime='1970-12-17';
MySQL默认的日期格式%Y-%m-%d正好和日期字符串'1970-12-17'正好和默认的日期格式一样 存在了自动类型转换 自动将日期字符串转换成日期类型 所以可以查询
‘12-17-1980’日期字符串和默认的不同 varchar类型和hiretime的date不同不能通过 会报错
如果要使用 加上str_to_date('12-17-1980','%d-%m-%Y');
date_format
将日期类型date转化成具有特定格式的日期字符串varchar (date——>varchar)
运算结果是varchar类型(具备特定的格式)
语法格式
date_format(日期类型数据,'日期格式')
java的日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
Date date = new Date();
String strTime = sdf.format(date);
MySQL
select ename,date format(hiretime,'%d-%m-%Y') as hiretime from emp;
select ename,date format(hiretime,'%Y-%m-%d') as hiretime from emp; 是默认格式
结论date_format 主要使用在查询操作中,客户需要日期以特定格式展示时需要这个函数
分组函数/聚合函数/多行处理函数 count sum avg max min 自动忽略空值count() 括号内写上字段过滤空 写上星就是满足要求的所有记录总数
分组函数不能直接使用在where关键字后面
distinct 查询结果去除重复数据
select ename,distinct job from emp; 出错
select distinct depno,job from emp;distinct 只能出现在所有字段的最前方 将后方所有字段联合的重复记录去除 但不影响表中的数据只将查询的结果显示
分组查询
分组查询涉及到的两个字句
1、group by
order by 表示通过哪个或者哪些字段进行排序
group by 通过哪个或者哪些字段进行分组
先通过group by 分组 再通过max(sal) 取其最大值
select job,max(sal) from emp group by job; 工作岗位正好也是相应不同的值 可以加上ename(MySQL 语法比较松散 oracle 执行的时候报错) 但是没有意义因为不是分组的依据 数据错乱
若一条DQL 中有group by 子句 那么select 关键字后面只能加参与分组的字段和分组函数
select deptno,max(sal) from emp group by deptno,job;
select job,max(sal) from empwhere job<> 'MANGER' group byjob;
为什么where中不能出现avg中出现分组函数: 分组函数要在分组后执行 而分组在where后面执行所以不能用分组函数在where关键字
2、having
having和where 功能都是为了完成数据的过滤
where和having 后面都是添加条件
where 在group by 之前完成过滤
having在group by之后完成过滤
select job,avg(sal) from emp group by job having avg(sal) >1500;
能够在分组前就过滤的就用where过滤实在不行才用having 效率问题
一个完整的DQL 语句的总结 :select from where group by having order by 顺序不能变
执行顺序 1、from 从某张表中查询数据2、where 经过某个条件进行过滤3、 group by 然后分组4、 having 分组之后不满意再过滤 5、 select 查询出来 6、 order by 排序输出
连接查询(跨表查询)
什么是连接查询
1、查询只从一张表检索数据 被称为单表查询
2、在实际的开发中数据并不是存储在一张表中 是同时存储在多张表中,这些表和表之间存在关系,我们在检索的时候通常是需要多张表联合起来取得有效数据,这种多表查询被称为连接查询或者叫做跨表查询
连接查询出现的年代
SQL92 (1992) sql99(1999)
DBA database adminnistrator
连接查询根据连接方式可以分为
1、内连接 (等值连接 非等值连接 自连接)
2、外连接 左外连接(左连接) 右外连接(右连接)
3、全连接(好像很少)
当多张表进行连接查询 若没有任何条件进行限制 会发生什么现象
在进行多表连接查询的时候尽量给表起别名可读性高
select e.name,d.name from emp e,dept d;
若两张表连接查询的时候没有任何的条件限制最终的查询结果是两张表记录条数乘积,这种现象被称为笛卡尔积现象,为了避免笛卡尔积现象的发生,必须在进行表连接的时候添加限制条件