1. DDL(数据定义语言):主要是进行数据库、表、视图、触发器、索引的定义。CREATE创建数据库、表、视图等;ALTER修改表、视图等;DROP删除数据库、表、视图等。
2. DML(数据操作语言):主要是执行数据的增删改查。INSERT插入数据;DELETD删除数据;UPDATE更新数据;SELECT查询数据;
3. DCL(权限控制语言):主要是控制用户的访问权限。GRANT为用户赋予某种权限;REVOKE收回用户的权限。
CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。
VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么”+1”呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。
CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。
MySQL支持多种存储引擎,包括Innodb,MyISAM等。可以使用show engines查看MySQL支持的引擎种类;如图:
查询结果中,参数engine代表引擎名称,Support代表是否支持该引擎,Comment代表对该引擎的简单介绍,Transantions代表是否支持事务,XA代表是否支持分布式事务,Savepoints代表是否支持保存点,以便事务回滚。
在创建表的时候,如果没有使用engine=”引擎名”,那么会使用默认的引擎,可以使用show variables like ‘%storage_engine%’;查看默认的引擎。
InnoDB引擎提供了事务、回滚、崩溃修复、多版本并发控制的事务安全。同时提供了外键约束的表引擎。InnoDB支持自增长列(AUTO_INCREMENT),且自动增长的列不能为空,值唯一。其中自动增长的列必须为主键或主键的部分。
InnoDB引擎的优势在于优秀的事务管理能力,并发控制能力,但是读写性能稍差,占用的数据空间较大。
MyISAM存储引擎的表分为三个文件,文件名与表名相同,扩展名分别为frm、MYD、MYI。frm是存储表结构,MYD是存储数据,MYI是存储索引。基于MyISAM的存储引擎支持三种存储格式,静态、动态、压缩型。静态型是默认的并且字段长度固定,动态是变长的。
MyISAM优势在于占用空间小(为什么?)处理速度快,但是不支持事务的完整性与并发性。
在MySQL的按照目录下可以找到一个叫my.ini的问价,打开文件,修改或者添加default-storage-engine=INNODB (设置默认的存储引擎为InnoDB,其余的同理),修改之后需要进行服务重启才能生效。
CREATE TABLE TABLENAME(
属性1 属性类型 [属性约束条件],
属性2 属性类型 [属性约束条件],
属性3 属性类型 [属性约束条件],
.....
属性N 属性类型 [属性约束条件],
);
//其中tablename不能为SQL关键字,例如insert、update、select等。
在对数据库进行操作时,如果操作违背了属性约束条件,那么数据库就会报错。
属性约束条件 | 说明 |
---|---|
primary key | 标识该属性或属性组为该表主键,可以唯一标识该元组 |
foreign key | 标识该属性或属性组为该表外键,是与之联系的某表主键 |
not null | 标识该属性不能为空 |
unique | 该属性值是唯一的 |
auto_increment | 该属性为自增长 |
default | 设置属性的默认值 |
被设置为primary key的属性或者属性组必须是值唯一且不能为空的。
示例
//单一主键
create table class(
id int primary key,
classname char(10),
);
//多属性主键
create table class(
id int;
classname char(10);
primary key(id,classname)
);
格式
constraint 外键别名 foreign key(属性1.1,属性1.2,...) references 表名(属性2.1,属性2.2,...)
//注意:属性2.1,属性2.2必须是表的主键
//A表
create table A(
a_id int,
a_name char(10),
primary key(id)
);
//B表,并且在B表上建立外键
create table B(
b_id int,
b_name char(10),
constraint c_fk foreign key(b_id) references A(a_id)
);
一般auto_increment主要用于为新增的一条表记录生成主键,一张表里面只有一个字段可以用auto_increment修饰,且该属性必须为主键或者主键的一部分,被auto_increment修饰的字段只能为整数类型(int、smallint、bigint等)。
通过describe 表名可以查看表的属性,属性类型,not null,key,default等。
使用show create table 表名可以查看更加详细的信息,比如建表的SQL语句,使用的存储引擎,编码字符集等。
alter table 旧表名 rename 新表名
alter table 表名 modify 属性名 新的属性类型
alter table 表名 change 旧属性名 新属性名 [旧属性类型|新属性类型]
alter table 表名 add 属性名 属性类型 [约束条件] [first|after 属性2]
//符号“[]”代表里面的属性为可选项,first:将新增的属性设为表的第一个字段,after 属性2:代表将新增属性插入到属性2之后,如何都未写,代表新字段写入表最后。
alter table 表名 drop 属性名
alter table 表名 engine="引擎名"
alter table 表名 drop foreign key 外键别名
drop table 表名
//注意:需要该表没有外键约束,若需要删除具有外键的表,需要先删除外键再删除表
索引由数据库中的一列或者多列组成,目的是为了提高数据查询的速度。数据库索引可以相当于字典的音序表,在字典里查找某个字,一般会先根据拼音或者部首进行快速定位,这里的“拼音”,“部首”就是索引。MySQL不同的存储引擎InnoDB和MyISAM都支持B+树索引。(传送门:B+树与数据库索引的前世今生)。除了B+树索引,MySQL还有哈希索引。(待补充)
索引的优点:
索引的优点就如上文提到的,可以加快数据的查询速度。同样的,对于父表与子表之间的联合查询也可以提高查询速度;使用分组和排序子句进行数据查询时,也可以显著减少查询中分组与排序的时间。
索引的缺点:
索引的建立需要耗费额外的物理空间,随着数据量和索引数目的增长,带来的消耗也是不能小视的。同时,在对数据进行增加和删除的时候,也需要动态的维护索引,也会带来性能问题。
创建普通索引的时候,不需要添加其他约束条件(前文提的约束条件)。普通索引可以建立在任何类型的字段上。(普通索引的值是可以重复的)
普通索引被unique修饰后就变成了唯一性索引,唯一性索引的值必须是不能重复的,主键就是一种特殊的唯一性索引。区别在于唯一性索引允许空值但是主键索引不允许。(同样的数据,唯一性索引定位的速度更快)
使用FULLTEXT可以建立全文索引,全文索引必须建立在CHAR,VARCHAR,TEXT类型的字段上面,当查询数据量较大的字符串时,建立全文索引可以显著的提高速度,但是MySQL的MyISAM支持全文索引,而innoDB要5.6版本才支持,默认全文索引不区分大小写。
单列索引就是在单个列上面建立索引,多列索引是指在多个列上面建立联
create table 表名(
属性1 数据类型 [约束条件],
属性2 数据类型 [约束条件2]
...
[UNIQUE|FULLTEXT] INDEX|KEY [别名] (属性名 [(长度)] [ASC|DESC])
);
其中unique和fulltext为可选参数,分别表示唯一性索引与全文索引,index和key都是声明索引的关键字,选择一个即可。“别名”是给创建的所有取新名字;“属性1”参数指定了索引对应的字段名,该字段必须是前面定义的字段;“长度”是指索引的长度,一般是字符串类型的索引使用;“ASC”表示升序排列,“DESC”表示降序排列。
//例如
create table index(
id int,
name char(10),
index(id)
);
//删除索引
alter table table_name drop index key_name;
//添加索引
alter table table_name add index 字段名
插入两条数据
使用explain关键字查看select语句的执行
显示possible key 与 key都是id,说明索引起了作用。
删除index id后再看看,索引没有了
create table index(
id int [unique],
name char(10),
unique index(id)
);
创建唯一性索引需要unique参数对index进行约束,如上述代码, 需要注意的是如果对id没有进行unique约束,也可以成功建立唯一性索引,但是可能无法达到唯一性索引带来的查询效率。
解释如下:
1. 首先建立使用unique约束的字段的唯一性索引并插入数据
接着按照id进行数据的查询,使用explain进行查询分析
可以发现查询分析这里出现的type为const。
2. 创建不使用unique修饰字段的唯一性索引并插入数据
可以发现type变为了ref。
传送门:explain中type的详解
顾名思义,多列索引就是在多个列上面建立索引。
//基本语法
create table tablename(
属性1 属性类型 [约束条件],
属性2 属性类型 [约束条件],
....
属性n 属性类型 [约束条件]
index(属性1,属性2,...属性k)
);
ps: k<=n
检验多列索引的最左前缀原则(简单版,详细版)
可以看出,索引生效了。接下来只使用id列
同样使用了索引,接下来只使用name列
可以看出,没有使用索引,是全表扫描,所以建立多列索引的时候,需要考虑最左前缀原则。
create table tablename(
属性1 属性类型 [约束条件],
属性2 属性类型 [约束条件],
...
属性n 属性类型 [约束条件],
FULLTEXT INDEX(属性1,属性2,...,属性k)
以上内容均为个人学习的简单笔记,有任何不正确的地方,欢迎指正。