基础:
- sql语句
- 表结构设计
调优:
- 索引、慢查询优化
- 配置参数调优
核心原理:
- InnoDb存储引擎 (包括隔离级别、事务、锁、缓存池、回滚日志等等)
- Mysqld (包括连接管理、进程管理、查询缓存、查询优化、日志等等)
基础
了解数据库
# 主键值规则 这里列出的规则是MySQL本身强制实施的。
- 每个行都必须具有一个主键值(主键列不允许NULL值)。
# SHOW也可以用来显示表列:
- show columns FROM customers;
- DESCRIBE customers
# SHOW STATUS
- 用于显示广泛的服务器状态信息;
# SHOW CREATE DATABASE和SHOW CREATE TABLE ,
- 分别用来显示创建特定数据库或表的MySQL语句;
# SHOW GRANTS
- 用来显示授予用户(所有用户或特定用户)的安全权限;
# SHOW ERRORS 和 SHOW WARNINGS
- 用来显示服务器错误或警告消息。
mysql数据类型
- 数据类型包括
- 数字类型、时间与日期类型、字符串类型、空间数据类型
字符串类型
# 变长和定长
- MySQL处理定长列远比处理变长列快得多。此外,MySQL不允许对变长列(或一个列的可变部分)进行索引。这也会极大地影响性能。
数值数据类型
# 有符号或无符号
- 所有数值数据类型(除BIT和BOOLEAN外)都可以有符号或无符号。有符号数值列可以存储正或负的数值,无符号数值列只能存储正数。默认情况为有符号,但如果你知道自己不需要存储负值,可以使用UNSIGNED关键字,这样做将允许你存储两倍大小的值。
# 存储货币数据类型
- MySQL中没有专门存储货币的数据类型,一般情况下使用DECIMAL(8, 2)
日期和时间数据类型
二进制数据类型
二进制数据类型可存储任何数据(甚至包括二进制信息),如图像、 多媒体、字处理文档等
查询数据select
select 列 from 表
查询出来的数据是 未排序数据
检索多个列
# 当心逗号
- 在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。如果在最后一个列名后加了逗号,将出现错误。
检索所有列 *
# 使用通配符
- 一般,除非你确实需要表中的每个列,否则最好别使用 * 通配符。虽然使用通配符可能会使你自己省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序的性能。
检索不同的行DISTINCT
# DISTINCT 关键字
- 顾名思义,此关键字指示MySQL只返回不同的值
- 不能部分使用DISTINCT DISTINCT关键字应用于所有列而不仅是前置它的列。如果给出SELECT DISTINCT vend_id, prod_price,除非指定的两个列都不同,否则所有行都将被检索出来。
限制结果 limit
# LIMIT 5
- 指示MySQL返回不多于5行。
# LIMIT 5, 5
- 指示MySQL返回从行5开始的5行。第一个数为开始位置,第二个数为要检索的行数。
# 行 0
- 检索出来的第一行为行0而不是行1。因此, LIMIT 1, 1将检索出第二行而不是第一行
# MySQL 5的LIMIT语法
- LIMIT 3, 4的含义是从行4开始的3行还是从行3开始的4行?如前所述,它的意思是从行3开始的4行,这容易把人搞糊涂。
- 由于这个原因,MySQL 5支持LIMIT的另一种替代语法。LIMIT 4 OFFSET 3意为从行3开始取4行,就像LIMIT 3, 4一样。
排序检索数据 ORDER BY 子句
# 子句(clause)
- SQL语句由子句构成有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。子句的例子有 SELECT 语句的 FROM 子句,
# 通过非选择列进行排序
- 通常, ORDER BY 子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。
# 使用子句的次序不对将产生错误消息。
使用方法:
按多个列排序
为了按多个列排序,只要指定列名,列名之间用逗号分开即可(就像选择多个列时所做的那样)。就会按先写的列进行排序,再对后面的进行排序
指定排序方向
数据排序不限于升序排序(从 A 到 Z )。这只是默认的排序顺序,还可以使用 ORDER BY 子句以降序(从 Z 到A)顺序排序。为了进行降序排序,必须指定 DESC 关键字。
分析:
DESC 关键字只应用到直接位于其前面的列名。在上例中,只对prod_price 列指定 DESC ,对 prod_name 列不指定。因此,prod_price 列以降序排序,而 prod_name 列(在每个价格内)仍然按标准的升序排序。
在多个列上降序排序 如果想在多个列上进行降序排序,必须对每个列指定 DESC 关键字。
过滤数据
# MySQL在执行匹配时默认不区分大小写,
- 所以 fuses 与 Fuses 匹配。
使用 WHERE 子句
在 SELECT 语句中,数据根据 WHERE 子句中指定的搜索条件进行过滤。WHERE 子句在表名( FROM 子句)之后给出.
WHERE 子句操作符
Between = 1<= x <=2
空值检查
NULL 无值(no value),它与字段包含 0 、空字符串或仅仅包含空格不同。
SELECT 语句有一个特殊的 WHERE 子句,可用来检查具有 NULL 值的列。这个 WHERE 子句就是 IS NULL 子句。其语法如下:
# NULL 与不匹配
- 在通过过滤选择出不具有特定值的行时,你可能希望返回具有 NULL 值的行。但是,不行。因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有 NULL 的行。
AND操作符----OR 操作符
MySQL允许给出多个 WHERE 子句。这些子句可以两种方式使用:以 AND 子句的方式或 OR 子句的方式使用。
# 计算次序
- SQL(像多数语言一样)在处理 OR 操作符前,优先处理 AND 操作符。
# 在WHERE子句中使用圆括号
- 任何时候使用具有 AND 和 OR 操作符的 WHERE 子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义。
IN 操作符
圆括号在 WHERE 子句中还有另外一种用法。 IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。 IN 取合法值的由逗号分隔的清单,全都括在圆括号中。
NOT 操作符
WHERE 子句中的 NOT 操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
用通配符进行过滤 like
# 通配符(wildcard)
- 用来匹配值的一部分的特殊字符
# 搜索模式(search pattern)
- 由字面值、通配符或两者组合构成的搜索条件。
LIKE 操作符
在搜索子句中使用通配符,必须使用 LIKE 操作符。 LIKE 指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较.
# 百分号( % )通配符
- 最常使用的通配符是百分号( % )。在搜索串中, % 表示任何字符出现任意次数。
# 注意尾空格 尾空格可能会干扰通配符匹配。
- 例如,在保存词anvil 时,如果它 后面有一个或多个空格,则子句 WHEREprod_name LIKE '%anvil' 将不会匹配它们,因为在最后的 l后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个 % 。一个更好的办法是使用函数(第11章将会介绍)去掉首尾空格。
# 注意NULL
- 虽然似乎 % 通配符可以匹配任何东西,但有一个例外,即 NULL 。即使是 WHERE prod_name LIKE '%' 也不能匹配用值 NULL 作为产品名的行。
# 下划线( _ )通配符
- 另一个有用的通配符是下划线( _ )。下划线的用途与 % 一样,但下划线只匹配单个字符而不是多个字符。
# 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用 在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
用正则表达式进行搜索
使用MySQL正则表达式
除关键字 LIKE 被 REGEXP 替代外,这条语句看上去非常像使用LIKE 的语句(第8章)。它告诉MySQL: REGEXP 后所跟的东西作为正则表达式(与文字正文 1000 匹配的一个正则表达式)处理。
# LIKE 匹配整个列。
- 如果被匹配的文本在列值中出现, LIKE 将不会找到它,相应的行也不被返回(除非使用通配符)。意识就是没有通配符就是==
# 而 REGEXP 在列值内进行匹配,
- 如果被匹配的文本在列值中出现, REGEXP 将会找到它,相应的行将被返回。这是一个非常重要的差别。那么, REGEXP 能不能用来匹配整个列值(从而起与 LIKE 相同的作用)?答案是肯定的,使用 ^ 和 $ 定位符(anchor)即可
# 匹配不区分大小写 MySQL中的正则表达式匹配
- (自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大小写,可使用 BINARY 关键字,如 WHERE prod_name REGEXP BINARY 'JetPack .000' 。
创建计算字段
计算字段
# 计算字段
- 计算字段并不实际存在于数据库表中。计算字段是运行时在 SELECT 语句内创建的。
# 字段(field)
- 基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。
例如:
- 如果想在一个字段中既显示公司名,又显示公司的地址,但这两个信息一般包含在不同的表列中。
- 城市、州和邮政编码存储在不同的列中(应该这样),但邮件标签打印程序却需要把它们作为一个恰当格式的字段检索出来。
- 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
- 物品订单表存储物品的价格和数量,但不需要存储每个物品的总价格(用价格乘以数量即可)。为打印发票,需要物品的总价格。
- 需要根据表数据进行总数、平均数计算或其他计算。
拼接字段
MySQL的 SELECT 语句中,可使用Concat() 函数来拼接两个列。
举一个创建由两列组成的标题的简单例子
- Concat() 拼接串,即把多个串连接起来形成一个较长的串。
- Concat() 需要一个或多个指定的串,各个串之间用逗号分隔。
去除空格
通过删除数据右侧多余的空格来整理数据,这可以使用MySQL的 RTrim() 函数来完成,
# Trim 函数
- MySQL除了支持 RTrim() (正如刚才所见,它去掉串右边的空格),还支持 LTrim() (去掉串左边的空格)以及
- Trim() (去掉串左右两边的空格)。
使用别名
QL支持列别名。别名(alias)是一个字段或值的替换名。别名用 AS 关键字赋予。请看下面的 SELECT 语句:
执行算术计算
是对检索出的数据进行算术计算
# 如何测试计算
- SELECT 提供了测试和试验函数与计算的一个很好的办法。虽然 SELECT 通常用来从表中检索数据,但可以省略 FROM 子句以便简单地访问和处理表达式。例如, SELECT3*2; 将返回 6 , SELECT Trim('abc'); 将返回 abc,而 SELECTNow() 利用 Now() 函数返回当前日期和时间。通过这些例子,可以明白如何根据需要使用 SELECT 进行试验。
使用数据处理函数
SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便。在前一章中用来去掉串尾空格的 RTrim() 就是一个函数的例子。
使用函数
大多数SQL实现支持以下类型的函数。
- 用于处理文本串(如删除或填充值,转换值为大写或小写)的文本函数。
- 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)
的数值函数。 - 用于处理日期和时间值并从这些值中提取特定成分(例如,返回
两个日期之差,检查日期有效性等)的日期和时间函数。 - 返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本
细节)的系统函数。
文本处理函数
-
RTrim()
-
Upper()
日期和时间处理函数
- 首先需要注意的是MySQL使用的日期格式。无论你什么时候指定一个日期,不管是插入或更新表值还是用WHERE子句进行过滤,日期必须为格式yyyy-mm-dd
数值处理函数
汇总数据
聚合函数
# 我们经常需要汇总数据而不用把它们实际检索出来,为此MySQL提供了专门的函数。使用这些函数,MySQL查询可用于检索数据,以便分析和报表生成。这种类型的检索例子有以下几种。
- 确定表中行数(或者满足某个条件或包含某个特定值的行数)。
- 获得表中行组的和。
- 找出表列(或所有行或某些特定的行)的最大值、最小值和平均值。
上述例子都需要对表中数据(而不是实际数据本身)汇总。因此,返回实际表数据是对时间和处理资源的一种浪费(更不用说带宽了)。重复一遍,实际想要的是汇总信息。为方便这种类型的检索,MySQL给出了5个聚集函数,
# 只用于单个列 AVG()
- 只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个 AVG() 函数。
- NULL值 AVG()函数忽略列值为NULL的行。
# COUNT() 函数有两种使用方式。
- 使用 COUNT(*) 对表中行的数目进行计数,不管表列中包含的是空值( NULL )还是非空值。
- 使用 COUNT(column) 对特定列中具有值的行进行计数,忽略NULL 值。
# 对非数值数据使用 MAX()
- 虽然 MAX() 一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。在用于文本数据时,如果数据按相应的列排序,则 MAX() 返回最后一行。
- NULL 值 MAX() 函数忽略列值为 NULL 的行
# 聚集不同值
- avg(distict 列)
数据分组
创建分组
分组是在 SELECT 语句的 GROUP BY 子句中建立的。
# 在具体使用 GROUP BY 子句前,需要知道一些重要的规定。
- GROUP BY 子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
- 如果在 GROUP BY 子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。
- GROUP BY 子句中列出的每个列都必须是检索列或有效的表达式但不能是聚集函数)。如果在 SELECT 中使用表达式,则必须在GROUP BY 子句中指定相同的表达式。不能使用别名。
- 除聚集计算语句外, SELECT 语句中的每个列都必须在 GROUP BY 子句中给出。
- 如果分组列中具有 NULL 值,则 NULL 将作为一个分组返回。如果列中有多行 NULL 值,它们将分为一组。
- GROUP BY 子句必须出现在 WHERE 子句之后, ORDER BY 子句之前。
- 使用ROLLUP使用WITH ROLLUP关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值,如下所示:
过滤分组
唯一的差别是WHERE 过滤行,而 HAVING 过滤分组。
# HAVING 支持所有 WHERE 操作符
# WHERE 在数据分组前进行过滤, HAVING 在数据分组后进行过滤。
# 不要忘记 ORDER BY
- 一般在使用 GROUP BY 子句时,应该也给出 ORDER BY 子句。这是保证数据正确排序的唯一方法。千万不要仅依赖 GROUP BY 排序数据
- 正如所见,这里WHERE子句不起作用,因为过滤是基于分组聚集值而不是特定行值的。
- HAVING和WHERE的差别 这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
SELECT子句顺序
使用子查询
将select查询出来的数据 作为 另一个查询语句的条件
联 结 表
等值查询(内部联结)
SELECT vend_name ,prod_name , prod_price
from vendors INNER JOIN products
on vendors.vend_id = products.vend_id;
自联结
自己联结自己
自然联结
问题:
- 标准的联结(前一章中介绍的内部联结)返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。
自然联结是这样一种联结,其中你只能选择那些唯一的列。这一般是通过对表使用通配符(SELECT *)。
在这个例子中,通配符只对第一个表使用。所有其他列明确列出,所以没有重复的列被检索出来。
事实上,迄今为止我们建立的每个内部联结都是自然联结,很可能我们永远都不会用到不是自然联结的内部联结。
外部联结
在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。上面的例子使用LEFT OUTER JOIN从FROM子句的左边表(customers表)中选择所有行。为了从右边的表中选择所有行,应该使用RIGHT OUTER JOIN。
就是全部显示谁。
七种JOIN连接详解
1.内连接
内连接查询出的数据是两张表的交集,即上图中红色所表示的部分。
2.左外连接
左外链接如图中红色部分的内容,即包含左边表的全部行(不管右边的表中是否存在与它匹配的行),和右边表中全部匹配的行。
3.右外链接
右外链接如图中红色部分的内容,即包含右边表的全部行(不管左边的表中是否存在与它匹配的行),和左边表中全部匹配行。
4.左连接
左连接如图中红色部分的内容,查询出左表独有的数据
解析:其实上图就是在左外连接的基础上进行的,左外连接得到了左表,但是左表里还包含了一部分左右表都具有相同数据的区 域,这时需要将这部分相同数据去掉,去除的条件就是B.key IS NULL
5.右连接
如果看懂了上面的左连接,那么右连接大同小异,就是查询出右表独有的数据
6.全连接(*Mysql中不支持下图写法*)
查询出左右两表的所有数据
但是!MySQL中并不支持这种写法,所以只能通过别的方法。
A、B的所有也就是A的独有、B的独有 和A、B的共同拥有的数据
Mysql中可以使用:select * from Table A left join Table B on A.Key = B.Key (找出A的所有)
union (去重)
select * from Table A right join Table B on A.Key = B.Key (找出B的所有)
7.全外连接(*Mysql中不支持下图写法*)
左右表的共有数据之外的数据查询
筛选出对于A表而言B为空,对于B表而言A为空的
MySQL中也不支持这种写法,所以只能通过别的方法。
其实全外连接也就是A的独有+B的独有
Mysql语法: select * from Table A left join Table B on A.Key = B.Key where B.Key is null (找出A的独有)
union (去重)
select * from Table A right join Table B on A.Key = B.Key where A.Key is null (找出B的独有)
事务
# 事务( transaction )指一组SQL语句;
# 回退( rollback )指撤销指定SQL语句的过程;
# 提交( commit )指将未存储的SQL语句结果写入数据库表;
# 保留点( savepoint )指事务处理中设置的临时占位符(place-holder),你可以对它发布回退(与回退整个事务处理不同)。
控制事务处理
# 开始事务
- start transaction
# 回退(撤销)MySQL语句
- MySQL的 ROLLBACK 命令用来
# 你不能回退 CREATE 或 DROP 操作。
- 事务处理块中可以使用这两条语句,但如果你执行回退,它们不会被撤销。
# 隐含提交(implicit commit)
- 即提交(写或保存)操作是自动进行的。
# 使用COMMIT
- 事务处理块中,提交不会隐含地进行。为进行明确的提交,使用 COMMIT 语句。
# 使用保留点
- 这些占位符称为保留点。为了创建占位符,可如下使用 SAVEPOINT
- 语句: SAVEPOINT delete1;
- 回退: ROLLBACK to delete1;
# 更改默认的提交行为
- 默认的MySQL行为是自动提交所有更改。
- 设置 autocommit 为 0 (假)指示MySQL不自动提交更改(直到 autocommit 被设置为真为止)。
- 标志为连接专用 autocommit 标志是针对每个连接而不是服务器的。
视图
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
使用视图
# 视图用 CREATE VIEW 语句来创建。
# 使用 SHOW CREATE VIEW viewname ;来查看创建视图的语句。
# 用 DROP 删除视图,其语法为 DROP VIEW viewname;。
# 更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE ORREPLACE VIEW。如果要更新的视图不存在,则第 2 条更新语句会创建一个视图;如果要更新的视图存在,则第 2 条更新语句会替换原有视图。
创建视图
使用存储过程
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。
执行存储过程
- CALL 接受存储过程的名字以及需要传递给它的任意参数。
- CALL 存储过程的名字()
创建存储过程
- create procedure
删除存储过程
- delete procedure
使用参数
# 每个参数必须具有指定的类型,这里使用十进制值。
# 关键字 OUT 指出相应的参数用来从存储过程传出一个值(返回给调用者)。MySQL支持 IN (传递给存储过程)、 OUT (从存储过程传出,如这里所用)和 INOUT (对存储过程传入和传出)类型的参数。
# 存储过程的代码位于 BEGIN 和 END 语句内,如前所见,它们是一系列SELECT 语句,用来检索值,然后保存到相应的变量(通过指定 INTO 关键字)。
# 变量名 所有MySQL变量都必须以 @ 开始。
- select @processaverage
游标
为什么用使用
1. MySQL检索操作返回一组称为结果集的行。这组返回的行都是与SQL语句相匹配的行(零行或多行)。使用简单的 SELECT 语句,例如,没有办法得到第一行、下一行或前10行,也不存在每次一行地处理所有行的简单方法(相对于成批地处理它们)。需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。
2. 游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条 SELECT 语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
提示:
- 只能用于存储过程 不像多数DBMS,MySQL游标只能用于存储过程(和函数)。
使用游标
- 在能够使用游标前,必须声明(定义)它。这个过程实际上没有
检索数据,它只是定义要使用的 SELECT 语句。 - 一旦声明后,必须打开游标以供使用。这个过程用前面定义的
SELECT 语句把数据实际检索出来。 - 对于填有数据的游标,根据需要取出(检索)各行。
- 在结束游标使用时,必须关闭游标。
创建游标
DECLARE 语句用来定义和命名游标:
打开和关闭游标
OPEN CURSOR
使用游标数据
在一个游标被打开后,可以使用 FETCH 语句分别访问它的每一行。 FETCH 指定检索什么数据(所需的列),检索出来的数据存储在什么地方。 它还向前移动游标中的内部行指针,使下一条 FETCH 语句检索下一行(不 重复读取同一行)。
删除
drop、delete与truncate分别在什么场景之下使用?
drop、delete与truncate分别在什么场景之下使用?
我们来对比一下他们的区别:
drop table
- 1)属于DDL(Data Definition Language 数据定义语言DDL用来创建数据库中的各种对象-----表、视图、)
- 2)不可回滚
- 3)不可带where
- 4)表内容和结构删除
- 5)删除速度快
truncate table
- 1)属于DDL
- 2)不可回滚
- 3)不可带where
- 4)表内容删除
- 5)删除速度快
delete from
- 1)属于DML(数据操纵语言DML)
- 2)可回滚
- 3)可带where
- 4)表结构在,表内容要看where执行的情况
- 5)删除速度慢,需要逐行删除
- 不再需要一张表的时候,用drop
- 想删除部分数据行时候,用delete,并且带上where子句
- 保留表而删除所有数据的时候用truncate
建立索引
MySQL CREATE INDEX语句
创建表的时候就能为表创建索引
CREATE TABLE t(
c1 INT PRIMARY KEY,
c2 INT NOT NULL,
c3 INT NOT NULL,
c4 VARCHAR(10),
INDEX (c2,c3)
);
alter 创建
alter table table_name add index index_name (column_list) ; 普通索引
alter table table_name add unique (column_list) ; 唯一索引
alter table table_name add primary key (column_list) ; 主键索引
其中包括普通索引、UNIQUE索引和PRIMARY KEY索引3种创建索引的格式,table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。
CREATE INDEX idx_c4 ON t(c4);
create 创建
create index index_name on table_name (column_list) ;
create unique index index_name on table_name (column_list) ;
说明:table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。
SQL 约束有哪几种?
SQL 约束有哪几种?
- NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
- UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。
- PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
- FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
- CHECK: 用于控制字段的值范围。
Mysql存储引擎
Mysql的存储引擎有以下几种:
常用的存储引擎有以下:
- Innodb引擎,Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
- MyIASM引擎(原本Mysql的默认引擎),不提供事务的支持,也不支持行级锁和外键。
- MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。
同一个数据库也可以使用多种存储引擎的表。如果一个表修改要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。
MyIASM和Innodb两种引擎所使用的索引的数据结构是什么?
MyIASM和Innodb两种引擎所使用的索引的数据结构是什么?
答案:都是B+树!
MyIASM引擎,B+树的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。
Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。
标签:语句,存储,Mysql,使用,base,子句,MySQL,数据 From: https://www.cnblogs.com/firsthelloworld/p/17219531.html