Len's Study-Log

集中一点,登峰造极!

0%

Mysql随笔

注意点:

  • 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
3
select * 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
2
3
4
5
6
7
8
9
10
/*按月统计*/
SELECT
count(id) countNum,
MONTH(create_time) createTime
FROM
rd_track_info
GROUP BY
MONTH(create_time)
ORDER BY
MONTH(create_time) DESC;

分页

在订单分页查询中,为了提升性能可以使用组合索引。但当 LIMIT 子句变成 LIMIT 1000000,10 时,查询还是会很慢,因为数据库不知道第1000000 条记录在哪里,它也会去重新算一遍。

解决办法:可以将上一页的最大值当成参数作为查询条件的

1
2
3
4
5
6
7
# 原sql
SELECT *
FROM operation
WHERE type = 'SQLStats'
AND name = 'SlowLog'
ORDER BY create_time
LIMIT 1000, 10;
1
2
3
4
5
6
7
# 优化后sql
SELECT *
FROM operation
WHERE type = 'SQLStats'
AND name = 'SlowLog'
AND create_time > '2017-03-16 14:00:00'
ORDER BY create_time limit 10;

tips:一开始查询的前面10条记录,数据库只需要计算10次。


mysql的联结查询

有关联结查询,可以看看这篇文章:https://www.cnblogs.com/yyjie/p/7788413.html

内部联结

例子:

1
2
3
4
select * 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和上面那句是一样的效果的。