MySQL学习(一)

SQL语言

1. DDL(数据定义语言):主要是进行数据库、表、视图、触发器、索引的定义。CREATE创建数据库、表、视图等;ALTER修改表、视图等;DROP删除数据库、表、视图等。
2. DML(数据操作语言):主要是执行数据的增删改查。INSERT插入数据;DELETD删除数据;UPDATE更新数据;SELECT查询数据;
3. DCL(权限控制语言):主要是控制用户的访问权限。GRANT为用户赋予某种权限;REVOKE收回用户的权限。

MySQL数据类型

MySQL学习(一)_第1张图片
MySQL学习(一)_第2张图片
MySQL学习(一)_第3张图片

CHAR(M), VARCHAR(M)不同之处

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学习(一)_第4张图片

MySQL存储引擎

MySQL支持多种存储引擎,包括Innodb,MyISAM等。可以使用show engines查看MySQL支持的引擎种类;如图:
MySQL学习(一)_第5张图片
查询结果中,参数engine代表引擎名称,Support代表是否支持该引擎,Comment代表对该引擎的简单介绍,Transantions代表是否支持事务,XA代表是否支持分布式事务,Savepoints代表是否支持保存点,以便事务回滚。
在创建表的时候,如果没有使用engine=”引擎名”,那么会使用默认的引擎,可以使用show variables like ‘%storage_engine%’;查看默认的引擎。

InnoDB存储引擎简记

InnoDB引擎提供了事务、回滚、崩溃修复、多版本并发控制的事务安全。同时提供了外键约束的表引擎。InnoDB支持自增长列(AUTO_INCREMENT),且自动增长的列不能为空,值唯一。其中自动增长的列必须为主键或主键的部分。
InnoDB引擎的优势在于优秀的事务管理能力,并发控制能力,但是读写性能稍差,占用的数据空间较大。

MyISAM引擎简记

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关键字,例如insertupdateselect等。

属性约束条件

在对数据库进行操作时,如果操作违背了属性约束条件,那么数据库就会报错。

属性约束条件 说明
primary key 标识该属性或属性组为该表主键,可以唯一标识该元组
foreign key 标识该属性或属性组为该表外键,是与之联系的某表主键
not null 标识该属性不能为空
unique 该属性值是唯一的
auto_increment 该属性为自增长
default 设置属性的默认值
primary key

被设置为primary key的属性或者属性组必须是值唯一且不能为空的。

示例
//单一主键
create table class(
             id int primary key,
             classname char(10),
 );

//多属性主键
create table class(
             id int;
             classname char(10);
             primary key(id,classname)
 );
foreign key
格式
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修饰,且该属性必须为主键或者主键的一部分,被auto_increment修饰的字段只能为整数类型(int、smallint、bigint等)。

查看表

describe/desc 表名

通过describe 表名可以查看表的属性,属性类型,not null,key,default等。
MySQL学习(一)_第6张图片

MySQL学习(一)_第7张图片

show create table 表名

使用show create table 表名可以查看更加详细的信息,比如建表的SQL语句,使用的存储引擎,编码字符集等。
MySQL学习(一)_第8张图片

修改表

修改表名

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 字段名

插入两条数据
MySQL学习(一)_第9张图片
使用explain关键字查看select语句的执行
MySQL学习(一)_第10张图片
显示possible key 与 key都是id,说明索引起了作用。
删除index id后再看看,索引没有了
MySQL学习(一)_第11张图片

创建唯一性索引

create table index(
       id int [unique],
       name char(10),
       unique index(id)
);

创建唯一性索引需要unique参数对index进行约束,如上述代码, 需要注意的是如果对id没有进行unique约束,也可以成功建立唯一性索引,但是可能无法达到唯一性索引带来的查询效率。
解释如下:
1. 首先建立使用unique约束的字段的唯一性索引并插入数据
MySQL学习(一)_第12张图片
接着按照id进行数据的查询,使用explain进行查询分析
MySQL学习(一)_第13张图片
可以发现查询分析这里出现的type为const。
2. 创建不使用unique修饰字段的唯一性索引并插入数据
MySQL学习(一)_第14张图片

MySQL学习(一)_第15张图片
可以发现type变为了ref。
传送门:explain中type的详解

创建多列(联合)索引

顾名思义,多列索引就是在多个列上面建立索引。

//基本语法
create table tablename(
       属性1 属性类型 [约束条件],
       属性2 属性类型 [约束条件],
       ....
       属性n 属性类型 [约束条件]
       index(属性1,属性2,...属性k)
);
ps: k<=n

创建联合索引并插入数据
MySQL学习(一)_第16张图片

MySQL学习(一)_第17张图片

这里写图片描述

检验多列索引的最左前缀原则(简单版,详细版)
MySQL学习(一)_第18张图片
可以看出,索引生效了。接下来只使用id列
MySQL学习(一)_第19张图片
同样使用了索引,接下来只使用name列
MySQL学习(一)_第20张图片
可以看出,没有使用索引,是全表扫描,所以建立多列索引的时候,需要考虑最左前缀原则。

创建全文索引

create table tablename(
       属性1 属性类型 [约束条件],
       属性2 属性类型 [约束条件],
       ...
       属性n 属性类型 [约束条件],
       FULLTEXT INDEX(属性1,属性2,...,属性k)

这里写图片描述

MySQL学习(一)_第21张图片

索引设计原则

  1. 唯一性索引
    需要列的值唯一,可以更加快速的定位数据,例如可以对学生的学号建立唯一性索引,可以很快定位某个学生,但是对于姓名就不适合建立唯一性索引,因为存在重名的情况。
  2. 为经常需要进行排序、分组、联合操作的字段建立索引
    经常进行order by、group by、distinct、union的等操作的字段建立索引。
  3. 为经常作为查询条件的字段建立索引
  4. 限制索引的数目
  5. 尽量使用前缀建立索引
    如果索引字段特别长,最好使用值的前缀来建立索引。例如TEXT、BLOG类型的字段。

以上内容均为个人学习的简单笔记,有任何不正确的地方,欢迎指正。

你可能感兴趣的:(MySQL,mysql,数据库)