MySQL开发常用函数笔记

Posted Stephanie_1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL开发常用函数笔记相关的知识,希望对你有一定的参考价值。

mysql 定义和使用变量

如下,直接定义和赋值了两个变量@fromDate和@toDate,并且可以在SQL中使用

SET @fromDate = '2018-04-01';
SET @toDate = '2018-04-30';

-- 测试打印 我对变量的赋值 
select @fromDate as 'fromDate的值';


fromDate的值 |
---|
1212 | 


MySQL常用函数大全

将为NULL的字段转为0,方便统一处理,如果c表的parent_ids字段为NULL的话,则结果返回’'空串

IFNULL(c.parent_ids,'')

MySQL中的条件语句

请留意 a.tag=1这条语句,是一个等号,而不是两个等号,参数格式:

if(condition,param1,param1)函数格式下,

param1表示if内条件为真的情况下 返回param1,if条件为false则返回param2

select IF(a.tag = 1 ,SUM(a.count),0) AS '个数'  from my_table a 

字符串查找函数

查找my_table中 的str字段中 包含’123’子串 的所有条目

select * from my_table a where FIND_IN_SET('123',a.str)

yanruTODO 请忽略,以下是我的开发草稿:

SELECT DISTINCT
c.number,
(LENGTH(IFNULL(c.parent_ids,’’))-LENGTH(REPLACE(IFNULL(c.parent_ids,’’),’,’,’’))) AS ‘科目级数’,
@fromLevel,
IFNULL(c.parent_ids,0),
a.*
FROM fin_voucher a,
fin_voucher_detail b,
fin_subject c
WHERE a.id = b.vch_id AND b.subject_id = c.id – AND a.operator = e.id

– 凭证日期范围
AND a.vch_date >= @fromDate AND @toDate >= a.vch_date

– 科目级数
AND (LENGTH(IFNULL(c.parent_ids,’’))-LENGTH(REPLACE(IFNULL(c.parent_ids,’’),’,’,’’))) >= CONVERT(@fromLevel,SIGNED)
AND CONVERT(@toLevel,SIGNED) >= (LENGTH(IFNULL(c.parent_ids,’’))-LENGTH(REPLACE(IFNULL(c.parent_ids,’’),’,’,’’)))
– 凭证字条件
AND a.vch_word_id = ‘a5f821fa80644329b5a397ca63c54dc2’

– 凭证号区间
AND a.vch_num >= 1
AND 1 >= a.vch_num

ORDER BY c.number ASC

将SQL查询结果 拼接成一个串

-- 例如,我有一个基础的user_info表如下:

SELECT * FROM user_info

id | name	 | phone_num
---|---|---
1 | 张三 | 1212121212
2 | 李四 | NULL
3 | 王五 | NULL

此时我想将所有的用户名拼接到一个串,用GROUP_CONCAT(字段名)函数:

SELECT GROUP_CONCAT(name) FROM user_info

-- 如下是查询结果,默认以逗号分隔了:
GROUP_CONCAT(name) | 
---|---
张三,李四,王五 | 

但是默认的GROUP_CONCAT 默认拼接结果 可能是按id排序的,未必满足我们的要求,在函数内添加ORDER BY子句可以指定排序顺序:

SELECT GROUP_CONCAT(name ORDER BY phone_num) from user_info

指定字符串链接的分隔符,默认是用逗号分隔的:

SELECT GROUP_CONCAT(name SEPARATOR '_')  FROM user_info

则输出结果会以’_'进行分隔

MySQL 中分实现分页查询

select id, number,name from user_info  limit 2,5 -- 查询第2+1开始及以后的5个元素 


-- 语句1:select * from student limit 9,4
--  语句2:slect * from student limit 4 offset 9
-- // 语句1和2均返回表student的第10、11、12、13行 ,第一个参数表示从该参数的下一条数据开始,第二个参数表示每次返回的数据条数。
--  //语句2中的4表示返回4行,9表示从表的第十行开始

格式化日期函数

select DATE_FORMAT(NOW(),'%Y-%m-%d')

将当前日期输出为年月日格式如:
2018-09-12

数据库连接查询

使user_info作为主表,关联查询 address_info
格式为 tableA a inner join tableB b ON a.id = b.otherid,其中ON后面的条件 为获取通过ab关联字段确定 关联的条件。

select * from user_info a inner join address_info b on a.adressId = b.id

判断一个字段是否为空

不能直接用name = null 来判断

select * from user where name is null

MySQL涉及小数如金额等的字段,一律用decimal

对数据求SUM()时会出现不同的结果,float和double求SUM都会出现很多小数点,而decimal求SUM得到的是精准数值。

所以,金额类的数据一定要使用decimal类型,且要指定数据精度,如decimal(15,2),表示总共15位小数保留两位的数据类型。


查询某个数据库的所有表的各个字段的字段名、字段类型和字段描述

需要注意的是如果字段描述出现了blob类型,建议使用Navicat查询导出,我使用SQLYog结果查询结果不管怎么导出始终无法显示正常字符串,其中table_schema表示数据库名称信息,'yanru_test’是我要查询的数据库

SELECT
a.table_name 表名,
a.table_comment 表说明,
b.COLUMN_NAME 字段名,
CONVERT (  b.column_comment  USING utf8) 字段说明,
 
b.column_type 字段类型,
b.column_key 约束
FROM
information_schema. TABLES a
LEFT JOIN information_schema. COLUMNS b ON a.table_name = b.TABLE_NAME
WHERE
a.table_schema = 'yanru_test'
ORDER BY
a.table_name

关于MySQL的排他锁

Mysql InnoDB 排他锁

用法 : select … for update;

例如 : select * from goods where id = 1 for update;

排他锁的申请前提 : 没有线程对该结果集中的任何行数据使用排他锁或共享锁,否则申请会阻塞

for update 仅适用于 InnoDB,且必须在事务块 (BEGIN/COMMIT) 中才能生效,在进行事务操作时,通过 for update 语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞,排他锁包含 行锁、表锁

以上是关于MySQL开发常用函数笔记的主要内容,如果未能解决你的问题,请参考以下文章

笔记快速理解傅里叶级数

笔记快速理解傅里叶级数

求幂级数的收敛域及和函数手写笔记

高等数学常用的泰勒级数

GNN笔记:傅里叶变换

MySQL学习笔记——计算字段及常用函数