- 更新的表不能在 set 和 where 中用于子查询
- update 后面可以做任意的查询
- 关闭 MySQL 的事务自动提交
START TRANSACTION
DML....
COMMIT|ROLLBACK - SELECT 语句中的算术表达式
- :加法运算
- :减法运算
- :乘法运算
/ :除法运算,返回商
% :求余运算,返回余数
- 包含空值的算术表达式计算结果为空。
- MySQL 中并不支持||作为连字符,需要使用 concat 函数。在参数数量上与 oracle 的 concat函数有区别。
- 使用 DISTINCT 关键字时需要注意以下几点:
- DISTINCT 关键字只能在 SELECT 语句中使用。
- 在对一个或多个字段去重时,DISTINCT 关键字必须在所有字段的最前面。
- 如果 DISTINCT 关键字后有多个字段,则会对多个字段进行组合去重,也就是说,只有多个字段组合起来完全是一样的情况下才会被去重。
- like
%表示任意多个任意字符
_表示一个任意字符 - 左右拼接
LPAD(str,len,padstr)/RPAD(str,len,padstr)
str --- 待拼接的字符串
len ---拼接后的长度
padstr --- 拼接的字符串 - REPLACE(str,from_str,to_str)
将 str 中的 from_str 替换为 to_str(会替换掉所有符合from_str 的字符串) - 数字函数
ROUND(arg1,arg2):四舍五入指定小数的值
ROUND(arg1):四舍五入保留整数。
TRUNCATE(5.365,2) 截断指定小数的值,不做四舍五入处理。
MOD(arg1,arg2):取余 MOD(5,2) --- 1 - 转换函数
DATE_FORMAT(date,format)
将日期转换成字符串(类似 oracle 中的 to_char())
STR_TO_DATE(str,format)
将字符串转换成日期(类似 oracle 中的 to_date()) - 通用函数
IFNULL(expr1,expr2)
判断 expr1 是否为 null,如果为 null,则用 expr2 来代替 null
(类似 oracle 的 NVL()函数)
NULLIF(expr1,expr2)
判断 expr1 和 expr2 是否相等,如果相等则返回 null,如果不
相等则返回 expr1
IF(expr1,expr2,expr3)
判断 expr1 是否为真(是否不为 null),如果为真,则使用 expr2
替代 expr1;如果为假,则使用 expr3 替代 expr1(类似 oracle 的 NVL2()函数)
COALESCE(value,...)
判断 value 的值是否为 null,如果不为 null,则返回 value;如
果为 null,则判断下一个 value 是否为 null……直至出现不为 null 的 value 并返回或者返回最
后一个为 null 的 value
CASE WHEN THEN ELSE END
条件函数 - 聚合函数
- AVG(arg)函数
对分组数据做平均值运算。
arg:参数类型只能是数字类型。
2.SUM(arg)函数
对分组数据求和。
arg:参数类型只能是数字类型。
3.MIN(arg)函数
求分组中最小数据。
arg:参数类型可以是字符、数字、日期。
MAX(arg)函数
求分组中最大数据。
arg:参数类型可以是字符、数字、日期。COUNT 函数
返回一个表中的行数。
COUNT 函数有三种格式:
• COUNT(*)
• COUNT(expr)
• COUNT(DISTINCT expr)
约束分组结果(HAVING) 只能用在 数据组 的sql中
子查询
可以将子查询放在许多的 SQL 子句中,包括:
• WHERE 子句
• HAVING 子句
• FROM 子句
使用子查询的原则
• 子查询放在圆括号中。
• 将子查询放在比较条件的右边。
• 在单行子查询中用单行运算符,在多行子查询中用多行运算符。
-
MySQL 中的正则表达式
• MySQL 中允许使用正则表达式定义字符串的搜索条件,性能要高于 like。
• MySQL 中的正则表达式可以对整数类型或者字符类型检索。
• 使用 REGEXP 关键字表示正则匹配。
• 默认忽略大小写,如果要区分大小写,使用 BINARY 关键字 - 索引
普通索引
是最基本的索引,它没有任何限制。
在创建索引时,可以指定索引长度。length 为可选参数,表示索引的长度,只有字符串
类型的字段才能指定索引长度,如果是 BLOB 和 TEXT 类型,必须指定 length。
创建索引时需要注意:
如果指定单列索引长度,length 必须小于这个字段所允许的最大字符个数。唯一索引
唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。主键索引
主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。组合索引
组合索引是指使用多个字段创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用(最左前缀原则)。
最左前缀原则
就是最左优先。
如:我们使用表中的 name,address,salary 创建组合索引,那么想要组合索引生效,
我们只能使用如下组合:
name/address/salary
name/address
name/
如果使用 addrees/salary 或者是 salary 则索引不会生效。
- 全文索引
全文索引(FULLTEXT INDEX)主要用来查找文本中的关键字,而不是直接与索引中的值
相比较。FULLTEXT 索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的 where语句的参数匹配。FULLTEXT 索引配合 match against 操作使用,而不是一般的 where 语句加 like。
全文索引可以从 CHAR、VARCHAR 或 TEXT 列中作为 CREATE TABLE 语句的一部分被创建,或是随后使用 ALTER TABLE 添加。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
全文解析器
全文索引中基本单位是”词”。分词,全文索引是以词为基础的,MySQL 默认的分词是所有非字母和数字的特殊符号都是分词符。在检索数据时我们给定的检索条件也是词。
MySQL 中默认的全文解析器不支持中文分词。如果数据含有中文需要更换全文解析器NGRAM。
使用全文索引
SELECT 投影列 FROM 表名 WHERE MATCH(全文索引列名) AGAINST(‘搜索内容’)
MySQL中The used table type doesn't support FULLTEXT indexes解决办法
报此错误是不支持全文索引,解决办法:
1、查看创建表时用的哪种引擎,如果是InnoDB,改为MyISAM,InnoDB不支持FULLTEXT类型的索引
2、查看配置文件mysql.ini,搜索default-storage-engine= ,如果是InnoDB,改为MyISAM。重启MySQL服务。
-
在实际操作过程中,应该选取表中哪些字段作为索引?
为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引,有7大原则:
1.选择唯一性索引
2.为经常需要排序、分组和联合操作的字段建立索引
3.为常作为查询条件的字段建立索引
4.限制索引的数目
5.尽量使用数据量少的索引
6.尽量使用前缀来索引
7.删除不再使用或者很少使用的索引