目录
在Windows环境下MySQL默认不区分大小写,所以理论上只要名称正确怎么写都可以,但为了语句的可读性,建议遵循以下规范:
- 关键字和函数名称全部大写
- 数据库名称、表名称、字段名称全部小写
- SQL语句必须以分号结尾
常用函数
1.数学函数
函数 | 作用 |
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 |
目前接触,常用的就几个。还有其他一些数学运算函数,可以在使用时在进行查询
2.字符串函数
函数 | 说明 |
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)截取第二个 '.' (倒数)之后的所有字符。(正数从头,负数从尾) |
注:目前自己在项目中使用最多的是字符串长度和字符串截取函数
3.时间日期函数
函数 | 说明 |
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小时形式形式小时 |
4.条件判断函数
函数 | 说明 |
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中函数较多,自己在项目中目前常用的就这些,如一些加密、获取和改变字符集和其他函数用者不多,需要使用时可进行搜索查找。
5. 集合函数
函数 | 说明 |
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 关键字
- SELECT name,password FROM t_user WHERE id IN(条件值1,条件值2)
BETWEEN AND 关键字
- SELECT name,password FROM t_user WHERE id BETWEEN 1 AND 5
LIKE 关键字
- SELECT name,password FROM t_user WHERE LIKE ‘B%’;
注:%表示多字符匹配,_表示单字符匹配;使用此关键字时,注意LIKE不能识别空格。如:LIKE “%e”,若数据e后面多出一个空格,则无法查找到记录。可用TRIM()函数去除空格。MySQL中还有能使用正则表达式的功能,匹配度比like关键字灵活多变,但是在项目中目前还没用到过,自我感觉like就能满足基本需求,当like不能实现需求时可以朝这个方向靠。
IS NULL关键字
- SELECT user,password FROM t_user WHERE idcard IS NULL
注:IS NULL表示为null,IS NOT NULL表示为非空
AND和OR关键字
- SELECT name,password FROM t_user WHERE idcard IS NULL AND( photo IS NOT NULL OR enable=1)
注:AND优先级大于OR,对于多条件语句要打好括号,即使是优先级高的也要,方便你我他。
DISTINCT关键字
- SELECT DISTINCT name,password FROM t_user
注:查询结果不重复,此关键字应用于所有列而不是它后面的第一个指定列,如name,password如果结果集中这连个字段都不一样才会被查出来。
ORDER BY关键字
- SELECT DISTINCT name,password FROM t_user ORDER BY name
注:ORDER BY关键字作为排序使用默认为ASC升序,DESC为降序,参照行为第一行。当进行多列排序时,排序的第一列必须有相同值,才会对第二列进行排序。ASC,DESC只作用关键字后面的第一个字段。
GROUP BY关键字
- SELECT GROUP_CONCAT(user_name) AS Names,COUNT(user_name) as nuber, user_password FROM sys_user GROUP BY user_info WITH ROLLUP HAVING COUNT(user_name)>3
注:关键字表示进行分组查询,HAVING作为分组后条件关键字使用,WHERE关键字用在分组之前;可以使用GRPUP_CONCAT函数查询返回分组中所有的值。WITH ROLLUP关键字计算查询出所有记录的综合,即同统计记录数量。在多字段分组查询时:按照分组字段的先后顺序依次进行分组。当使用ORDER BY对结果进行排序时,不能再使用WITH ROLLUP,两者互斥。
LIMIT关键字
- SELECT name,password FROM t_user LIMIT 4,3
注:第一个参数表示从查询结果的哪一行开始(第一条为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…)
注:
- 插入数据时虽然可以不指定列名进行插入,但是values后面的值则不仅要求完整且顺序和表定义列的顺序相同,若后面表的结果又改变,则必须改动SQL语句;所以无特殊情况都要写上列名。
- 尽可能的一条插入语句插入多条数据,效率更高。如:INSERT INTO 表名(列名1,列名2…)VALUES(值1,值2…),(值3,值4…)…
将另一张表的查询结果插入表中。
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快)