注意点:
- LIMIT必须要位于ORDER BY之后
- LIKE ‘%’ 不能匹配值为NULL的记录
- 下划线(_)通配符,匹配单个字符。但是,不能匹配0个字符的情况(%可以匹配0个字符)
- 通配符尽量不要放在起始处,因为这样搜索是最慢的
- 可以在SQL语句内完成的转换和格式化工作都可以直接在程序代码里完成,但是SQL要比代码的效率高很多。
- Concat()拼接多个字符串。(在mysql中是用Concat,在其他DBMS中一般使用+或||)
- Trim()去掉左右两边的空格,RTrim()去掉右侧的空格,LTrim()去掉左侧的空格
...WHERE Date(order_date) = '2020-06-06'
,比较日期时,习惯性使用Date()函数是一个很好的习惯。比较时间时,使用Time()函数。- Year()从日期中返回年份的函数,Month()从日期中返回月份。
例子
MySQL使用 IN 查询取出数据排序问题(要与in取出的数据排序相同)
mapper.xml 文件代码如下:1
2
3select * from course
where uid in <foreach collection="courseUids" item="uid" open="(" separator="," close=")">#{uid}</foreach>
ORDER BY FIELD(uid,<foreach collection="courseUids" item="uid" separator="," >#{uid}</foreach>)
mysql按照字符串类型的数值进行排序
因为mysql进行的排序规则是按照ASCII码进行排序的,并不会自动的识别出这些数据是数值,sql改为order by 字段名称+0 desc/asc
的形式进行排序 即可。这样mysql会将数值字符串类型的数据当作数值进行处理,但是存在效率问题,不推荐使用varchar/char类型来存储数值,这样会带来不必要的问题.
mysql按月份统计数据
1 | /*按月统计*/ |
分页
在订单分页查询中,为了提升性能可以使用组合索引。但当 LIMIT 子句变成 LIMIT 1000000,10
时,查询还是会很慢,因为数据库不知道第1000000 条记录在哪里,它也会去重新算一遍。
解决办法:可以将上一页的最大值当成参数作为查询条件的
1 | # 原sql |
1 | # 优化后sql |
tips:一开始查询的前面10条记录,数据库只需要计算10次。
mysql的联结查询
有关联结查询,可以看看这篇文章:https://www.cnblogs.com/yyjie/p/7788413.html
内部联结
例子:1
2
3
4select * from a,b where a.a_id = b.b_id
#也可以这样写:
select * from a inner join b on a.a_id = b.b_id
外部联结
查询包含了那些在相关表中没有关联的行。例如:对每个客户下了多少订单进行计数,包括那些没有下单的客户。
外部联结有两种:左外联结left outer join
和右外联结right outer join
关键词 outer
可省略,如:select * from a left outer join b on b.b_id = a.a_id
等同于select * from a left join b on b.b_id = a.a_id
。
上面的例子表示使用左连接从a表选择所有的行进行查询。
左右联结查询可通过表位置互换来相互转换使用。
自然联结
自联结
自己连接自己去做查询。
字符串连接
concat()函数
1、功能:将多个字符串连接成一个字符串。
2、语法:concat(str1, str2,…)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
concat_ws()函数
1、功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator)
2、语法:concat_ws(separator, str1, str2, …)
group_concat()函数
1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
例子:SELECT id,GROUP_CONCAT(name SEPARATOR ',') FROM customer GROUP BY id
GROUP_CONCAT 默认以逗号分隔:SELECT id,GROUP_CONCAT(name) FROM customer GROUP BY id
,这个sql和上面那句是一样的效果的。