1.DATE_FORMAT函数,用来对日期就行格式化处理
MySQL的DATE_FORMAT函数的使用_Mysql_脚本之家
2.数据库中sql的执行顺序
先给结论
from>join>where>group by>聚合函数>having>select>order by>limit
①、最先执行from table;
需要先确定从哪个表中取数据,所以最先执行from table。
②、join连接
用于把来自两个或多个表的行结合起来,简单补充一下连接的类型
- 自然连接(natural join)
- 内连接(inner join):内连接查询能将左表和右表中能关联起来的数据连接后返回,返回的结果就是两个表中所有相匹配的数据。
- 外连接(outer join):外连接分为左外连接(LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行)、右外连接(RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行)、还有一个FULL JOIN(全连接),不过MYSQL不支持全连接
- 交叉连接(cross join)即笛卡尔连接
- 详细区别:https://www.cnblogs.com/lis2/p/16067341.html
③、where语句;
where语句是对条件加以限定
④、分组语句【group by…… having】;
group by是分组语句
having是和group by配合使用的,用来作条件限定
⑤、聚合函数;
常用的聚合函数有max,min, count,sum,聚合函数的执行在group by之后,having之前
举例:count函数查询分组后,每一组分别有多少条数据
select count(*) from user group by gender
值得注意的是:聚合函数的执行在group by之后,having之前
⑥、select语句;
对分组聚合完的表挑选出需要查询的数据
⑦、Distinct
distinct对数据进行去重
如果sql语句存在聚合函数,例如count、max等,会先执行聚合函数再去重
⑧、order by排序语句。
order by排序语句
select * from user order by id 升序排序 select * from user order by id desc 降序排序
⑨、limit
limit用于指定返回的数据条数
select * from user limit 2 从user表中查询前两条数据 该sql等同于 select * from user limit 0,2 表示从第0条开始取两条数据
limit常配合order by使用
select * from user order by id limit 3 根据id排序,选出id排序前三的数据
总结
from>join>where>group by>聚合函数>having>select>order by>limit
例子
select distinct user.name from user join vip on user.id=vip.id where user.id>10 group by user.mobile having count(*)>2 order by user.id limit 3;
执行顺序
- from user
- join vip on user.id=vip.id ,join是表示要关联的表,on是连接的条件
- where user.id>10
- group by user.mobile 根据user.mobile分组
- 然后先执行count(*)在执行having,查询分组之后数量大于2的分组数据
- select 对分组聚合完的表挑选出需要查询的数据
- distinct查询出来的数据去重
- order by user.id 对去重后的数据排序
- limit 3对排序后的数据选出前面3条
Mapper中返回结果为map时:
@MapKey用法说明_小厂程序员DHJ的博客-优快云博客
Mapper中返回映射结果为map的另一种情况:
表中存在topic相同的和不同的数据,需求是统计topic相同的数据量,考虑使用map返回,key为topic的值,value为数量
数据准备如下:
具体实现如下:
import org.apache.ibatis.session.ResultContext; import org.apache.ibatis.session.ResultHandler; import java.util.HashMap; import java.util.Map; @SuppressWarnings("all") public class MapResultHandler<K,V> implements ResultHandler<Map<K,V>> { private final Map<K,V> mappedResults = new HashMap<>(); @Override public void handleResult(ResultContext context) { Map map = (Map) context.getResultObject(); mappedResults.put((K)map.get("key"), (V)map.get("value")); } public Map<K,V> getMappedResults() { return mappedResults; } }
mapper如下:
void test(MapResultHandler<Integer, Integer> resultHandler); 这里的返回值一定要为void
<resultMap id="configMap" type="java.util.Map" > <result column="topic" property="key" jdbcType="VARCHAR" /> <result column="cover" property="value" jdbcType="VARCHAR" /> </resultMap> <select id="test" resultMap="configMap"> select topic , count(cover)as cover from party_calendar group by topic </select>
service中如下:
MapResultHandler<Integer, Integer> resultHandler = new MapResultHandler<>(); partyCalendarMapper.test(resultHandler); Map<Integer, Integer> alarmCountMap = resultHandler.getMappedResults();
alarmCountMap打印如下:{111=2, 222=1}
Mysql中的最左匹配的总结:
Mysql中的一些特殊的符号: