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开发常用函数笔记的主要内容,如果未能解决你的问题,请参考以下文章