目录
常用函数
1.数学函数
2.字符串函数
3.时间日期函数
4.条件判断函数
5. 集合函数
查询数据
基础查询
条件查询
连接查询
外连接查询
子查询
合并查询
插入、更新、删除数据
插入数据
更新数据
删除数据
在Windows环境下MySQL默认不区分大小写,所以理论上只要名称正确怎么写都可以,但为了语句的可读性,建议遵循以下规范:
函数 |
作用 |
SQRT (x) |
平方根函数 |
ABS(x) |
绝对值函数 |
CEIL(X) |
返回不小于x的最小整数,返回值类型为bigint |
CEILING(X) |
返回不小于x的最小整数,返回值类型为bigint |
FLOOR(X) |
返回不大于x的最大整数,返回值类型为bigint |
RAND(X) |
根据X返回一个随机数 |
SIGN(X) |
返回x的符号,x值为负、零、正时对应结果为-1、0、1 |
目前接触,常用的就几个。还有其他一些数学运算函数,可以在使用时在进行查询
函数 |
说明 |
CHAR_LENGTH(str) |
返回字符串长度,即字符个数。 |
LENGTH(str) |
返回字符串的字节长度,跟编码方式有关;Utf8下,一个汉字3字节 |
CONCAT(S1,S2…) |
合并多个字符串,返回类型为字符串 ;若有NULL值则返回NULL |
CONCAT_WS(X,S1,S2…) |
合并多个字符串,x为多个字符串间的分隔符;若分隔符为NULL,则结果为NULL;且函数会忽略分隔符后的NULL值 |
INSERT(s1,x,len,s2) |
返回字符串s1从x位置开始被s2替换len长度。 |
LEFT(s,n) |
返回字符串s开始的最左边的n个字符 |
RIGHT(s,n) |
返回字符串s开始的最右边的n个字符 |
SUBSTRING(s,n,len) |
返回一个长度为len,从n开始;n<0时,从起始位置开始 |
SUBSTRING_INDEX(s,x,len) |
返回根据x截取符,从s字符串截取的位置字符。如:SUBSTRING_INDEX ('www.mysql.com.cn', '.', -2)截取第二个 '.' (倒数)之后的所有字符。(正数从头,负数从尾) |
注:目前自己在项目中使用最多的是字符串长度和字符串截取函数
函数 |
说明 |
CURDATE() |
获取当前日期,格式YYYY-MM-DD |
CURTIME() |
获取当前时间,格式HH:MM:SS |
NOW() |
获取当前日期和时间 |
MONTH(date) |
获取date的月份 |
MONTHNAME(date) |
获取日期中月份的英文名称 |
DAYNAME(d) |
获取日期中工作日的英文名称(星期一到星期五) |
YEAR(date) |
获取日期中的年份。 |
DAYOFYEAR(date) |
计算日期是一年中的第几天。 |
DATE_ADD(date,INTERVAL expr type) |
date是一个DATETIME或DATE值,expr用来制定从开始日期添加或减去的时间间隔值,type便是类型;如:DATE_ADD(“2019-04-12”,INTERVAL 30 DAY)表示date日期后的30天 |
DATE_SUB(date,INTERVAL expr type) |
同上 |
DATEDIFF(date1,date2) |
返回两个日期间相差的天数 |
DATE_FORMAT(date,format) |
返回date的自定义格式日期 |
常用的格式化形式
标识符 |
说明 |
%X |
4位数字形式表示年份 |
%x |
2位数字形式表示年份 |
%M |
月份英文名称 |
%m |
月份数字形式 |
%D |
带英文后缀的日期(1st) |
%d |
数字形式日期 |
%H |
以两位数24小时形式显示小时 |
%h |
以两位数12小时形式形式小时 |
函数 |
说明 |
IF(wxpr,v1,v2) |
Expr值为TRUE时返回v1,否则返回v2 |
CASE expr WHEN v1 THEN r1[WHEN v2 THEN r2][ELSE m] END |
如果expr变量值为Vn则执行Rn,否则执行else 如:CASE sex WHEN 1 THEN ‘女’ WHEN 2 THEN ‘男’ ELSE ‘未说明性别’ END 说明:函数返回值类型时任何返回值的相容集合类型;个人认为此函数较为重要,项目中用到次数较多,能自由改变输出状态 |
CONNECTION_ID() |
返回当前连接的次数,每个连接ID唯一 |
注:mysql中函数较多,自己在项目中目前常用的就这些,如一些加密、获取和改变字符集和其他函数用者不多,需要使用时可进行搜索查找。
函数 |
说明 |
COUNT() |
统计表中数据的总记录数,COUNT(*)和COUNT(字段值)区别:前者统计包含NULL值行,后者忽略空值的行 |
SUM() |
返回指定列值的总和,忽略NULL值;可统计字段类型int、char、varchar类型的字段可以直接进行转类型相加,前提是数据中存储的是数字,且统计的值不能超出当前类型的最大值。 |
AVG() |
返回指定列数据的平均值。 |
MAX() |
返回指定列中的最大值;可找寻最大列值或日期,字符比较时a最小,z最大; |
MIN() |
返回指定列中的最小值。 |
在项目中最常用的还是查询操作,获取数据来与程序进行交互;而且MySQL的优化大多都是针对查询进行的,所以如何优雅和高效的查询很重要。不要想到自己是初学者,觉得只要能正确书写SQL语句就行了,这种思想是有误的,要想成长就不能只做“花瓶”,最重要的就是团队成员会喷你(亲身经历,运气较好,喷完之后就教授了一番)。
SELECT * FROM 表名 最基础的查询语句
WHERE 关键字
1.SELECT name,password FROM t_user WHERE 查询条件 可使用上一篇说明的运算符。
注:当你的查询条件字段是字符串类型时一定要加单引号或者双引号,整形时加与不加一样。
IN 关键字
BETWEEN AND 关键字
LIKE 关键字
注:%表示多字符匹配,_表示单字符匹配;使用此关键字时,注意LIKE不能识别空格。如:LIKE “%e”,若数据e后面多出一个空格,则无法查找到记录。可用TRIM()函数去除空格。MySQL中还有能使用正则表达式的功能,匹配度比like关键字灵活多变,但是在项目中目前还没用到过,自我感觉like就能满足基本需求,当like不能实现需求时可以朝这个方向靠。
IS NULL关键字
注:IS NULL表示为null,IS NOT NULL表示为非空
AND和OR关键字
注:AND优先级大于OR,对于多条件语句要打好括号,即使是优先级高的也要,方便你我他。
DISTINCT关键字
注:查询结果不重复,此关键字应用于所有列而不是它后面的第一个指定列,如name,password如果结果集中这连个字段都不一样才会被查出来。
ORDER BY关键字
注:ORDER BY关键字作为排序使用默认为ASC升序,DESC为降序,参照行为第一行。当进行多列排序时,排序的第一列必须有相同值,才会对第二列进行排序。ASC,DESC只作用关键字后面的第一个字段。
GROUP BY关键字
注:关键字表示进行分组查询,HAVING作为分组后条件关键字使用,WHERE关键字用在分组之前;可以使用GRPUP_CONCAT函数查询返回分组中所有的值。WITH ROLLUP关键字计算查询出所有记录的综合,即同统计记录数量。在多字段分组查询时:按照分组字段的先后顺序依次进行分组。当使用ORDER BY对结果进行排序时,不能再使用WITH ROLLUP,两者互斥。
LIMIT关键字
注:第一个参数表示从查询结果的哪一行开始(第一条为0,默认,且为可选参数),第二个参数表示返回的记录条数。ORDER BY和LIMIT两个关键字一起使用时,LIMIT必须位于ORDER BY之后。
内连接查询 INNER JOIN
在内连接查询中,只有满足条件的结果才会出现在返回的结果集中。当多张表中出现重复字段值时,要使用”表名.列名”,不然报错
SELECT sys_user.id,user_name from sys_user INNER JOIN sys_user_role ON sys_user.id=sys_user_role.user_id
特殊的自联表查询(一张表连接查询)
SELECT t1.id,t1.user_name from sys_user as t1, sys_user as t2 WHERE t1.id=t2.id AND t2.id>5
LEFT JOIN:返回包括左表的所有记录和右表中连接字段相等的记录。
若左表的某行在右表中没有匹配的行,则右表中所有选择列均为空值
RIGHT JOIN: 返回包括右表的所有记录和左表中连接字段相等的记录。
若右表的某行在右表中没有匹配的行,则左表中所有选择列均为空值
子查询是在一个查询语句中嵌套另一个查询语句内部的查询;常用操作符ANY、SOME、ALL、IN、EXISTS。
ANY、SOME:表示主查询的字段只要存在子查询中的任何一个比较条件就行。
SELECT name FROM t_user WHERE id>ANY(SOME) (SELECT id FROM t_role);
ALL:大于所有子查询的结果集
SELECT name FROM t_user WHERE id>ALL (SELECT id FROM t_role);
IN:主查询在子查询的结果集中
EXISTS:是否存在,表示子查询是否有结果集返回,有为TRUE,反之为FALSE。只取决于是否返回行,与返回内容无关。返回FALSE时,外层语句也不会执行。相当于WHERE false。
注:能使用表连接实现就用表连接实现,子查询会在内存中建立一张虚拟的子表,比较耗费时间。
UNION 、UNION ALL:将多个SELECT语句结果集进行合并,合并时两个表的列数和数据类型必须相同,前者执行时会删除重复的记录,所有的返回行都是唯一的;后者不会删除。
注:UNION ALL语句执行时使用资源少,尽可能使用它,提高效率。
INSERT INTO 表名(列名1,列名2…)VALUES(值1,值2…)
注:
将另一张表的查询结果插入表中。
INSERT INTO 表名 (列名1,列名2…)SELECT (列名1,列名2) FROM 表名 WHERE条件
注:事实上,MySQL不关心SELECT返回的列名,它根据列的位置进行插入,SELECT的第一列对应待插入表的第一列,按此规定插入。、
UPDATE 表名 SET 列名1=值1,列名2=值2… WHERE 条件
基础操作,若WHERE后面为FALSE,则更新所有数据。
DELETE FROM 表名 WHERE 条件
基础操作,若WHERE后面为FALSE,则删除所有数据。
TRUNCATE 表名 删除表中所有记录。(其实是直接删除表并重新创建一个表,执行比DELETE快)