学习MySQL,这一篇就够了(数据库管理、字段类型、数据表操作、数据库语句、数据表字符集、数据库索引)

数据库管理

MySQL工具

MySQL控制台客户端

通过命令行登录MySQL的命令为:

mysql -u用户名 -p密码 -h ip地址 -P端口号

登录成功,MySQL控制台显示如下:
在这里插入图片描述

数据库管理

一、创建数据库

MySQL创建数据库的语法如下:

CREATE {DATABASE | SCHEMA}[IF NOT EXISTS]db_name;
  • IF NOT EXISTS 的意思是如果不存在db_name库则创建该库,如果存在则当前命令会被忽略
  • 如果MySQL已经有了一个库,然后用户再次执行创建命令,MySQL会返回数据库创建失败的错误。而如果指定IF NOT EXISTS,MySQL只会返回一个警告,执行语句不会报错
create database test;

运行结果如下:在这里插入图片描述
此时如果再次运行创建test库的语句则会报错:
在这里插入图片描述
而如果加上if not exists选项,创建命令会正常执行,MySQL会返回一个警告(warning信息),可通过show warning 语句查看警告信息

在这里插入图片描述

  • 创建数据库,并指定字符集为UTF-8
  • 可用alter命令来调整库的字符集(后面会写到)
create database test DEFAULT CHARACTER SET utf8;

二、选择数据库

  • 数据库创建完成后,如果想要在创建的数据库下进行操作,需要先切换到该库下,切换库的语法如下:
USE db_name;
  • 切换到test库下,执行一个简单的查询语句
    show tables(查看当前库下有哪些表),由于test库下还没有表,所以会返回空

在这里插入图片描述

  • 可以切换到MySQL库下,查看MySQL库下的表:
    在这里插入图片描述

三、查看数据库

  • 通过命令show create database db_name;可以查看库的创建方法,包括库的字符集信息:
    在这里插入图片描述
    Tips:如果在创建库的时候没有指定字符集,系统会自动加上参数“DEFAULT CHARACTER SET utf8”,这个字符集可以自行设定,有兴趣的朋友可以自行查阅相关知识,这里不再多说
  • 通过命令show databases;可以查看当前数据库中有哪些库

在这里插入图片描述

四、修改数据库

  • 修改数据库的字符集可以通过命令alter来实现
alter database db_name DEFAULT CHARACTER SET utf8 
//utf8 等字符集都可选
  • 在这里我将字符集从utf8改为latin1

在这里插入图片描述

五、删除数据库

  • 删除数据库是指将已经创建的库从数据库中删除,执行该操作会同时清除该库下的所有内容,包括表结构与数据等
Drop database db_name;
  • db_name为要删除的库名,若不存在则执行删除命令会报错

  • 这里删除刚刚创建的test库,执行命令如下:
    在这里插入图片描述

  • 执行查询命令,可以看出test库已经不存在了

  • 删除库是一项危险操作,建议用户在确认库里的东西已经不需要了之后再执行删除操作,否则后果不堪设想

字段类型

MySQL支持多种数据类型,包括数值、日期/时间和字符串(字符)类型

数值类型包括整数类型和小数类型,其中:
  • 整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
  • 浮点数类型包括FLOAT、DOUBLE
  • 定点数类型包括DECIMAL
日期/时间类型包括:
  • DATE、TIME、DATETIME、TIMESTAMP、YEAR
字符串类型包括:
  • CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、SET
  • 其中BINARYVAEBINARY是二进制字符串类型

一、数值类型

  • MySQL提供了多种整数类型,从TINYINTBIGINT,可以存储数据的范围越来越大,同时所需要的存储空间也越来越大,整数类型可以添加自增属性。
  • 整数类型分为有符号数和无符号数,可以在数据类型后添加UNSIGNED关键字来标识该类型是有符号的还是无符号的。
  • INT表示有符号的4字节长度的整数,而INT UNSIGNED标识该类型是无符号的4字节长度整数
  • 有符号与无符号的取值范围是不同的:
    在这里插入图片描述
  • 浮点数类型包括单精度浮点数[float(M,D)]和双精度浮点数[double(M,D)]
  • 定点数类型为decimal(M,D)
  • decimal型的取值范围与double相同,但是decimal的有效范围由M和D决定,而且decimal型的字节数是M+2.即定点数的存储空间由其精度决定
  • MySQL中可以指定浮点数和定点数的精度:其定义格式如下:数据类型(M,D)
  • “数据类型”指的是浮点数或定点数的数据类型名称
  • M 参数称为精度,是数据的总长度,小数点不占位置
  • D 参数称为标度,是小数点后面的长度
  • 例如:float(6,2)表示数据为float型,数据长度为6,小数点后保留2位
  • 注意:上述方法适用于浮点数和定点数,但不是浮点数的标准用法。建议在定义浮点数时,如果不是实际情况需要,最好不要使用。如果使用了,可能会影响数据库的迁移”
  • 对于定点数而言,decimal(M,D)是定点数的标准格式,一般情况下可以选择这种数据类型
  • 如果插入值的精度高于实际定义的精度,系统会自动进行四舍五入处理,使其精度达到要求

二、字符串类型

  • 字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、SET
  • CHARVARCHAR类型相似,但它们之间保存和检索的方式有所区别,在最大长度和尾部空格是否被保留等方面有不同。在存储和检索过程中不进行大小写转换
  • BINARYVARBINARY类似于CHARVARCHAR,不同的是它们只包含二进制字符串,即它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序基于列值字节的数值
  • TEXT类型有4种:TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT,它们分别对应4种BLOB类型,有相同的最大长度和存储需求
  • ENUM是枚举类型
  • SET是集合类型,不同于ENUM类型,它是一个排列组合,假如有abc,它可以选择a或b或c,也可选择ab或ac或bc或abc

三、时间类型

  • 表示时间值的日期和时间类型为YEAR、TIME、DATE、DATETIME、TIMESTAMP
  • YEAR,字节数为1,取值范围为“1901~2155”
  • TIME,字节数为3,取值范围为“-838:59:59~838:59:59”
  • DATE,字节数为4,取值范围为“1001-0101~9999-12-31”
  • DATETIME,字节数为8,取值范围为“1000-01-01 00:00:00~9999-12-31 23:59:59”
  • TIMESTAMP,字节数为4,取值范围为“19700101080001~20380119111407”
  • 如果插入值超出有效取值范围,系统会报错,并将零值插入到数据库中

(1)YEAR类型

  • 给YEAR类型赋值可以有三种方法:
    1、直接插入4位字符串或4位数字
    2、插入2位字符串,这种情况下如果插入‘00’-‘69’,相当于插入‘2000’-‘2069’如果插入‘70’-‘99’,相当于插入‘1970’-‘1999’,插入’0’也是‘2000’
    3、插入2位数字,它与第二种方法不同的是,如果插入0,则表示‘0000’,所以在给YEAR类型赋值时一定要注意0和‘0’,二者只相差一个引号,却相差了2000年

(2)TIME类型

  • TIME类型表示为时:分:秒,尽管小时范围为0~23,但是为了表示某些特殊时间间隔,MySQL将TIME的小时范围扩大了,而且支持负值
  • 对TIME类型赋值,标准格式是HH:MM:SS,但不一定非要是这种格式。如果插入的是D HH:MM:SS,格式,则相当于插入了D*(24+HH):MM:SS;如果插入的是HH:MM或SS格式,则其他未被表示位的值被赋值为零值;另外也有D HHD HH:MM等格式
  • 在MySQL中,对于HHMMSS格式,系统能自动转换为标准格式
  • 插入当前时间:NOW()CURRENT_TIME()
  • TIME类型只占3个字节,如果只是存储时间数据,它是最好最合适的选择

(3)DATE类型

  • 标准格式为:YYYY-MM-DD
  • 另外,MySQL还支持一些不严格的语法格式,分隔符-可以被@ .等众多符号来替代
  • 也可以使用YY-MM-DD来插入数据,YY转换为年份的规则与YEAR类型类似
  • 插入当前系统时间:NOW()CURRENT_DATE()

(4)DATETIME类型

  • 标准格式为:YYYY-MM-DD HH:MM:SS
  • 具体赋值方法与上述各种类型的方法类似

(5)TIMESTAMP类型

  • TIMESTAMP类型的取值范围比较小,因此在输入值的时候一定要保证在TIMESTAMP的取值范围之内
  • 它的插入与插入其他日期和时间类型类似
  • 插入当前系统时间:1、CURRENT_TIMESTAMP()
    2、输入NULL,系统自动输入当前的TIMESTAMP 3、无任何输入,系统自动输入当前的TIMESTAMP
  • TIMESTAMP的数值是与时区相关的

数据表操作

  • 在数据库中,表是存储数据的基本单位,也是数据库中最重要的操作对象和面向用户的基本接口
  • 每张表会有若干列,每一行代表一条数据记录
  • 在MySQL中,数据是按行存储的

一、创建数据表

  • 创建表的基本语法如下:
	CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
	(
	列名1 数据类型  [约束条件]  [默认值],
	列名2 数据类型  [约束条件]  [默认值],
	列名3 数据类型  [约束条件]  [默认值],
	...
	列名n 数据类型  [约束条件]  [默认值]

	)[表的约束条件];
	-- 最后一个不可以有逗号否则会报错
  • comment 可用于增加字段说明

    如:name varchar(20) comment '姓名';

(1)使用主键约束

  • 主键由表的一列或多列组合而成
  • 主键约束要求主键列数据唯一且不为空
  • 主键可以标识表的唯一一条记录,表的主键相当于表的目录
  • 当为表创建主键后,使用主键列作为查询条件可以大大加快表的查询速度
  • 主键可以由多个字段构成,语法如下:
PRIMARY KEY(列名1,列名2,...,列名n)
  • 创建用户表user_tmp3,指定id列与name列为联合主键,建表语法如下:
CREATE TABLE user_tmp3
(
id int(11),
name varchar(128),
age int(11),
PRIMARY KEY(id,name)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

在这里插入图片描述

(2)使用外键约束

  • 创建外键约束的语法如下:
[CONSTRAINT <外键名>]FOREIGN KEY (列名1,...)
REFERENCES <父表名>(主键列名1,...)
  • 外键名是定义的外键约束的名字,一个表中的不同约束的名字不能相同(列名1,...)表示要添加外键约束的列
  • 父表名表示外键约束中子表依赖的父表的表名,主键列名1,...表示父表中定义的主键列
  • 创建外键约束父表和子表示例如下,其中father表为父表,son表为子表:
CREATE TABLE father
(
id int primary key,
name varchar(100)
);
  • 创建父表:

在这里插入图片描述

- 创建子表并使用外键约束:

CREATE TABLE son
(
id int primary key,
name varchar(100),
age int,
c_id int,
constraint p_c_id foreign key(c_id) REFERENCES father(id)
);

在这里插入图片描述

(3)使用非空约束

  • 非空约束是指列的值不能为空
  • 对于使用了非空约束的字段,如果用户在插入数据时没有指定值,数据库会报错
  • 非空约束的语法规则如下:
列名 数据类型 not null
  • 创建表user_tmp4,并指定用户姓名不能为空,建表语句如下:
CREATE TABLE user_tmp4
(
id int,
name varchar(20) NOT NULL
);

在这里插入图片描述

(4)使用唯一约束

  • 表的唯一约束是指列的值唯一,但是可以为空
  • 对于使用了唯一约束的字段,数据库可以保证这些字段的值不会重复
  • 唯一约束的语法如下所示,在顶一万列类型后直接加UNIQUE关键字:
列名 数据类型 UNIQUE
  • 创建用户表user_tmp5,指定id列唯一
CREATE TABLE user_tmp5
(
id int UNIQUE,
name VARCHAR(100)
);

在这里插入图片描述

(5)使用默认约束

  • 默认约束的作用是为某列指定默认值
  • 在向表中插入数据时,如果不指定该列的值,那么会使用默认值来填充该列:
  • 默认约束的语法规则如下:
字段名 数据类型 DEFAULT 默认值
  • 定义数据表user_tmp6,对于name列指定默认值为“newUser”
CREATE TABLE user_tmp6
(
id int,
name VARCHAR(100) DEFAULT "newUser"
);

在这里插入图片描述

  • 在向user_tmp6表中插入数据时,如果不指定name列的值,那么会自动将 “newUser” 作为该列的值
INSERT INTO user_tmp6 set id = 1
INSERT INTO user_tmp6 set id = 2
SELECT * FROM user_tmp6;
--一步一步执行

在这里插入图片描述

  • 可以看到新插入的两个数据name都被默认值赋值为 "newUser"

(6)使用自增属性

  • 为列添加自增属性语法如下:
列名 数据类型 AUTO_INCREMENT
  • 创建用户表user_tmp7,设置id为自增列:
CREATE TABLE user_tmp7
(
id int PRIMARY Key auto_increment,
name varchar(100)
);

在这里插入图片描述

二、查看数据表

  • 查看当前创建的表:
SHOW TABLES;

在这里插入图片描述

  • 查看表结构:
show create table 表名;
SHOW CREATE TABLE user_tmp7;

在这里插入图片描述

  • 只查看表中各个列的定义:
desc 表名;
DESC user_tmp7;
  • Tips:id为主键所以数据唯一且不能为空,创建时赋予了自增属性

在这里插入图片描述
在这里插入图片描述

三、修改数据表

(1)修改表名

  • 修改表名只会修改表的名字,对表的数据、字段的类型都没有影响,修改表名有两种语法形式:
--1、使用ALTER命令
ALTER TABLE 原表名 RENAME [TO] 新表名;
--2、使用RENAME命令
RENAME TABLE 原表名 TO 新表名;
  • 使用ALTER修改user_tmp7为user_temp7
ALTER TABLE user_tmp7 RENAME user_temp7;

在这里插入图片描述

  • 使用RENAME修改user_temp7为user_tmp7:
RENAME TABLE user_temp7 to user_tmp7;

在这里插入图片描述

(2)修改表的字段类型

  • 修改表的字段类型的语法如下:
ALTER TABLE 表名 MODIFY 列名 数据类型;
  • 执行alter命令修改name类型:
  • 原表数据:
    在这里插入图片描述
ALTER TABLE user_tmp7 MODIFY name VARCHAR(200);
  • 修改后:
    在这里插入图片描述

(3)修改表的字段名字

  • 修改表的字段名字的语法如下:
ALTER TABLE 表名 CHANGE 原列名 新列名 数据类型;
  • 将user_tmp7的name字段修改为new_name:
ALTER TABLE user_tmp7 CHANGE name new_name VARCHAR(300);

在这里插入图片描述
在这里插入图片描述

(4)为表添加字段

  • 为表添加字段的语法如下:
ALTER TABLE 表名 ADD 新列名 数据类型 [约束条件][FIRST|AFTER 字段名];
  • 为表user_tmp7添加一个字段age,同时添加非空属性,默认值为0:
    在这里插入图片描述
ALTER TABLE user_tmp7 ADD age int not NULL DEFAULT 0;

在这里插入图片描述

  • first和after字段名表示在特定位置添加字段

(5)为表删除字段

  • 删除表字段的语法如下:
ALTER TABLE 表名 DROP 列名;
  • 删除user_tmp7中的age字段
ALTER TABLE user_tmp7 DROP age;

在这里插入图片描述

(6)调整表字段的位置

  • 调整表的字段位置的语法如下:
ALTER TABLE 表名 MODIFY 列名 数据类型 FIRST | AFTER 字段名;
  • 调整age为第一列:
ALTER TABLE user_tmp7 MODIFY age int first;

在这里插入图片描述

  • 调整age在id后面:
ALTER TABLE user_tmp7 MODIFY age int AFTER id;

在这里插入图片描述

(7)调整表的引擎

  • 修改表的存储引擎的语法如下:
ALTER TABLE 表名 ENGINE=新引擎名;
-- 查看当前数据库支持哪些引擎
SHOW ENGINES;

在这里插入图片描述

(8)删除表的外键约束

  • 删除表的外键约束语法如下:
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;
  • 删除son表的外键:
ALTER TABLE son DROP FOREIGN KEY p_c_id;

四、删除数据表

  • 删除数据表的语法如下:
DROP TABLE [IF EXISTS]1,2,...,表n;
  • 删除多张表:
DROP TABLE user_tmp4,user_tmp5,user_tmp6;

在这里插入图片描述
在这里插入图片描述

数据库语句

一、新增数据

  • MySQL中使用INSERT INTOSQL语句来插入数据
  • 语法如下:
INSERT table_name (field1,field2,...,fieldn)
						VALUES
				  (value1,value2,...,valuen);
  • 如果数据是字符型,则必须使用单引号或双引号,如'value"value
  • 插入两条数据:
INSERT INTO test1(name,age,phone_num)
VALUES("张三",21,12345678900),
("李四",20,10987654321);

二、查询数据

  • MySQL数据库中使用SQLSELECT语句来查询数据
  • 语法如下:
SELECT column_name,colmu_name
FROM table_name
[WHERE Clause]
[LIMIT N][OFFSET M];
  • 查询test1表的数据:
SELECT * FROM test1;

在这里插入图片描述

  • 查询年龄大于等于20岁的用户(指定查看name和age列):
select name,age from test1 WHERE age >= 20;

在这里插入图片描述

  • 查询用到的操作符:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
select * FROM test1 WHERE name LIKE "张%";

在这里插入图片描述

select * FROM test1 WHERE name LIKE "张_";

在这里插入图片描述

select * From test1 WHERE age BETWEEN 21 AND 30;

在这里插入图片描述

-- 分页查询:LIMIT(MySQL专用)
-- 从0开始,筛选n条数据
	select ... FROM 表名 [WHERE] [ORDER BY...] LIMIT  n;
-- 从s开始,筛选n条数据
	select ... FROM 表名 [WHERE] [ORDER BY...] LIMIT  s,n;
	select ... FROM 表名 [WHERE] [ORDER BY...] LIMIT  n OFFSET s;

在这里插入图片描述

select * FROM test1  LIMIT  1;

在这里插入图片描述

select * FROM test1  LIMIT  1,3;
select * FROM test1  LIMIT  3 OFFSET 1;

在这里插入图片描述

三、修改数据

  • MySQL中使用SQL语句UPDATE命令来修改数据:
  • 语法如下:
UPDATE table_name SET field1=new-value1,field2=new-value2
[WHERE Clause];
  • 将id为1的用户年龄更新为22岁:
UPDATE test1 set age = 22 WHERE id = 1;

在这里插入图片描述

  • 将id为3或4的用户电话号码更新:
UPDATE test1 set phone_num = 33333333333 
WHERE id = 3 OR id = 4;

在这里插入图片描述

四、删除数据

  • MySQL中使用SQL语句DELETE FROM命令来删除数据:
  • 语法如下:
DELETE FROM table_name [WHERE Clause];
  • 删除年龄在20岁以下的用户:
DELETE FROM test1 WHERE age < 20;

在这里插入图片描述

五、replace操作

  • replace的作用是如果数据库中存在相同的主键数据,则相当于修改操作;如果数据库中不存在相同的主键数据,则相当于插入操作:
  • 语法如下:
REPLACE [INTO] table_name [(col_name...)]
{VALUES | VALUE}({expr | DEFAULT},...),(...),... ;
  • 查看当前test1表里的数据,然后执行replace语句,之后再次执行查询语句,可以发现,id为1的用户存在,则发生修改操作,id为3的信息与replace语句内容一样,则不修改,id为5的用户不存在,则执行插入:
SELECT * FROM test1;

在这里插入图片描述

REPLACE into test1 (id,name,age,phone_num)VALUES
(1,"小红",20,99999999999),
(3,"张三",21,33333333333),
(5,"王五",22,44444444444);
SELECT * FROM test1;

在这里插入图片描述

数据表字符集

  • 字符集是一套符号和编码。校验规则(collation)是在字符内用于比较字符的一套规则,即字符集的排序规则。MySQL可以使用对应字符集和校验规则来组织字符
  • MySQL服务器支持多种字符集,在同一服务器、同一个数据库,针织同一个表的不同字段都可以指定使用不同的字符集
  • Oracle等其他数据库在同一个数据库中只允许使用相同的字符集,相比较之下MySQL明显具有更好的灵活性
  • 每种字符集可能会有多种字符校验规则,也都有一个默认的校验规则,并且每个校验规则只是针对某个字符集,和其他的字符集没有关系
  • 在MySQL中,字符集的概念和编码方案被看做是同义词,一个字符集是一个转换表和一个编码方案的组合

一、查看字符集

(1)查看MySQL服务器支持的字符集

SHOW CHARACTER SET;

在这里插入图片描述

  • Charset——字符集、Description——描述、Default collation——默认排序、Maxlen——最大长度

(2)查看字符集的校验规则

SHOW COLLATION;

在这里插入图片描述

(3)查看当前数据库的字符集

SHOW VARIABLES LIKE 'character%';

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201115162427529.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUyMDI1Ng==,size_16,color_FFFFFF,t_70#pic_center

  • character_set_client:客户端请求数据的字符集
  • character_set_connection:客户机/服务器连接的字符集
  • character_set_database:默认数据库的字符集,无论默认数据库如何改变们都是这个字符集;如果没有默认数据库,那就使用character_set_server指定的字符集,这个变量建议由系统自己管理,不要认为定义
  • character_set_filesystem:把os上文件名转换为此字符集,即把character_set_client转换为character_set_filesystem,默认binary是不做任何转换的
  • character_set_results:结果集,返回给客户端的字符局
  • character_set_server:数据库服务器的默认字符集
  • character_set_system:系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字

(4)查看当前数据库的校验规则

SHOW VARIABLES LIKE 'collation%';

在这里插入图片描述

  • collation_connection:当前连接的字符集
  • collation_database:当前日期的默认校验。每次用USE语句来跳转到另一个数据库的时候,这个变量的值就会改变。如果没有当前数据库,这个变量的值就是collation_server变量的值
  • collation_server:服务器的默认校验

二、设置字符集

(1)为数据库指定字符集

  • 创建的每个数据库都有一个默认字符集,如果没有指定,则使用LATIN1
CREATE datebase db_name charset=utf8;

(2)为数据库指定校验规则

CREATE DATEBASE db_name default charset utf8 collate utf8_romanian_ci;

(3)为表分配字符集

create table table_charset
(
c1 varchar(10),
c2 varchar(10)
)engine=innodb default charset=utf8;

(4)为表指定校验规则

create table table_collate
(
c1 varchar(10),
c2 varchar(10)
)engine=innodb default charset=utf8 collate utf8_romanian_ci;

(5)为列分配字符集

CREATE table column_charset
(
c1 char(10) character set utf8 not null,
c2 char(10) char set utf8,
c3 varchar(10) charset utf8,
c4 varchar(10)
)engine=innodb;

(6)为列分配校验规则

CREATE table column_collate
(
c1 char(10) character utf8 collate utf8_romanian_ci not null,
c2 char(10) character utf8 collate utf8_spanish_ci
)engine=innodb;

三、处理乱码

  1. 首先要明确你的客户段使用何种编码格式,这是最重要的(IE6一般用UTF8,命令行一般是GBK,一般程序是GB2312)
  2. 确保你的数据库使用UTF-8格式,很简单,所有编码通吃
  3. 一定要保证connection字符集大于等于client字符集,不然信息就会丢失。比如:LATIN1 < GB2312 < GBK < UTF-8,若设置character_set_client = GB2312,那么至少connection的字符集要大于等于GB2312,否则就会丢失信息
  4. 以上三步都正确的话,那么所有中文都会被正确的转换成UTF-8格式存储进数据库
  5. 为了适应不同的浏览器和客户端,可以修改character_set_results来以不同的编码显示中文字体。由于UTF-8是大方向,所以还是建议在Web应用中使用UTF-8格式显示中文

数据库索引

一、索引介绍

  • MySQL索引的建立是提升MySQL运行效率非常重要的手段,可以大大提高MySQL的检索速度
  • 创建索引时,需要确保该索引应用的是SQL查询语句的条件(一般作为WHERE子句的条件)
  • 索引分为单列索引和组合索引。单列索引即一个索引只包含单个列,一个表可以有多个单列索引;组合索引即一个索引包含多个列
  • 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录
  • 缺点:过多的使用索引Juin造成滥用,它在提高查询速度的同时也降低了表的更新速度
  • 在对表进行INSERT、UPDATE和DELETE操作时,因为更新表时MySQL不仅要保存数据,还要保存索引文件,所以更新速度会变慢。建立索引还会占用磁盘空间的索引文件

二、唯一索引

  • 唯一索引与普通列表索引类似,不同的是唯一索引的列值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
  • 创建方式如下:
  1. 直接创建索引:
CREATE UNIQUE INDEX indexNmae ON mytable(username(length));
  1. 通过修改表结构增加索引:
ALTER TABLE MYTABLE add unique[indexName](username(length));
  1. 创建表的时候直接指定:
CREATE TABLE mytable
(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName](username(length))
);

三、普通索引

  1. 直接创建索引:
CREATE INDEX indexName ON mytable(username(length));

如果是CHAR、VARCHAR类型,length可以小于字段的实际长度;如果是BLOB和TEXT类型,必须指定length

  1. 修改表结构(添加索引):
ALTER table tableName ADD INDEX 
indexName(columnName);
  1. 创建表的时候直接指定:
CREATE TABLE mttable
(
IN INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName](username(length))
);

四、删除索引

DROP INDEX [indexName] ON mytable;
  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枳洛淮南✘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值