1.概述
数据库(DataBase): 长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据 “仓库”。
- 关系型数据库:MySQL、Oracle、SQL Server…
- 非关系型数据库:Redis、MongoDB…
数据库管理系统 ( DataBase Management System ): 数据库管理软件 , 科学组织和存储数据 , 高效地获取和维护数据。
MySQL: 开源的、免费的关系型数据库。
Windows数据库基本操作: 以管理员身份打开cmd.exe
net start mysql
开启数据库服务mysql [-h 服务器主机地址] -u 用户名 -p用户密码
[]表示可以不写,默认连接本机;-u 与用户名之间可以有空格;-p和密码之间不能有空格,或者输完-p之后直接回车再填写密码。update user set password=password('123456') where user='root';
修改root用户密码为123456show databases;
显示所有数据库flush privileges;
刷新数据库use 数据库名;
选择某个数据库show tables;
显示数据库中所有表describe 表名;
显示某张表的所有信息create database 数据库名;
新建数据库exit;
退出mysql? 命令
寻求帮助
2.数据库操作
1.查询语句分类
名称 | 说明 | 命令 |
---|---|---|
DDL(数据 定义 语言) | 定义 管理 数据对象(数据库、数据表) | CREATE、DROP、ALTER |
DML(数据 操作 语言) | 操作 数据库对象中所包含的 数据 | INSERT、UPDATE、DELETE |
DQL(数据 查询 语言) | 查询 数据库 数据 | SELECT |
DCL(数据 控制 语言) | 管理 数据库的语言,包括管理权限及数据更改 | GRANT、commit、rollback |
命令行操作数据库:
create database [if not exists] 数据库名;
创建数据库drop database [if exists] 数据库名;
删除数据库show databases;
查看所有数据库use 数据库名;
选择数据库
创建数据表:
create table [if not exists] `表名`(
'字段名1' 列类型 [属性][索引][注释],
'字段名2' 列类型 [属性][索引][注释],
#...
'字段名n' 列类型 [属性][索引][注释]
)[表类型][表字符集][注释];
2.数据类型
数据值和列类型
类型 | 说明 | 字节 |
---|---|---|
tinyint | 很小的数据,基本不用 | 1 |
smallint | 较小的数据,很少用 | 2 |
mediumint | 中等大小的数据,不咋用 | 3 |
int | 标准的整数,经常用 | 4 |
bigint | 较大的数据 | 8 |
float | 浮点型 | 4 |
double | 浮点型 | 8 |
decimal | 字符串形式的浮点型,经融计算常用 | 自定义长度(m,d) m:能存的十进制数个数 d:小数点后数字个数 |
字符串
M表示长度
类型 | 说明 | 最大长度 |
---|---|---|
char[(M)] | 定长字符串,检索快、费空间 | 0~255 |
varchar[(M)] | 可变字符串 | 0~65535 |
tinytext | 微型文本串 | 2^8 - 1 |
text | 文本串 | 2^16 - 1 |
mediumtext | 中型文本串 | 2^24 - 1 |
longtext | 长文本串 | 2^32 - 1 |
时间日期
类型 | 格式 | 范围 | 字节 |
---|---|---|---|
year | YYYY | 1901~2155 | 1 |
date | YYYY-MM-DD | 1000-01-01~9999-12-31 | 4 |
time | HH:MM:SS | -838:59:59~ 838:59:59 | 3 |
datetime | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 8 |
timestamp | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01~2038-01-19 03:14:07 | 4 |
null: null值即为没有值(未知值),不要用null进行计算,因为结果也是null。
null 和 空字符串 的区别:
- 查询方式不同
where XXX = '';
空字符串
where XXX is null;
null - null不能参与运算
- 统计字段时的区别
3.数据字段属性
UnSigned
- 无符号的
- 声明该数据列不允许负数
ZEROFILL
- 0填充的
- 不足位数的用0来填充 , 如int(3),5则为005
Auto_InCrement
- 自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)
- 通常用于设置 主键 , 且为整数类型
- 可定义起始值和步长
当前表设置步长(AUTO_INCREMENT=100)
只影响当前表
SET @@auto_increment_increment=5
影响所有使用自增的表(全局)
NULL 和 NOT NULL
- 默认为NULL , 即没有插入该列的数值
- 如果设置为NOT NULL , 则该列必须有值
DEFAULT
- 默认的
- 用于设置默认值
-- 目标 : 创建一个school数据库
-- 创建学生表(列,字段)
-- 学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住址,email
-- 创建表之前 , 一定要先选择数据库
CREATE TABLE IF NOT EXISTS `student` (
`id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` varchar(2) NOT NULL DEFAULT '男' COMMENT '性别',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`address` varchar(100) DEFAULT NULL COMMENT '地址',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- 查看数据库的定义
SHOW CREATE DATABASE school;
-- 查看数据表的定义
SHOW CREATE TABLE student;
-- 显示表结构
DESC student; # 设置严格检查模式(不能容错了)SET sql_mode='STRICT_TRANS_TABLES';
4.存储引擎
ENGINE=InnoDB
show engines;
查看表的存储引擎
存储引擎主要有:
- Mylsam
- lnnoDB
- Memory
- Archive
- Federated
默认引擎: Innoos"引擎,lnnoDB底层存储结构为B+树,树的每个节点对应lnnoDB的1个page, page大小是固定的 一般设为16k。
MyISAM 与 InnoDB对比
- 适用 MyISAM : 节约空间及相应速度
- 适用 InnoDB : 安全性 , 事务处理及多用户操作数据表
MyISAM | InnoDB | |
---|---|---|
事务处理 | × | √ |
数据行锁定 | × | √ |
外键约束 | × | √ |
全文索引 | √ | × |
表空间大小 | 较小 | 较大 |
适用场合 | 节约空间、响应速度 | 安全性 、事务处理、多用户操作数据表 |
数据表的存储 | 三个文件:. frm ——表结构定义文件. MYD ——数据文件 ( data ). MYI ——索引文件 ( index ) | 一个 *.frm 文件 |
5.数据表的存储
MySQL数据表以文件方式存放在磁盘中,Mysql安装目录\data\下存放数据表 . 目录名对应数据库名 , 该目录下文件名对应数据表 。
*.frm
– 表结构定义文件
*.MYD
– 数据文件 ( data )
*.MYI
– 索引文件 ( index )
InnoDB类型数据表只有一个 *.frm
文件 , 以及上一级目录的ibdata1文件
MyISAM类型数据表对应三个文件
每个库目录存在一个保存当前数据库的选项文件 db.opt
6.数据表字符集
SHOW CHARACTER SET
查看表的字符集
我们可为数据库,数据表,数据列设定不同的字符集,设定方法 :
- 创建时通过命令来设置 , 如 :
CREATE TABLE 表名() CHARSET = utf8;
- 如无设定 , 则根据MySQL数据库配置文件 my.ini 中的参数设定
7.修改表(ALTER TABLE)
ALTER TABLE 旧表名 RENAME AS 新表名
修改表名
ALTER TABLE 表名 ADD字段名 列属性[属性]
添加字段
ALTER TABLE 表名 MODIFY 字段名 列类型[属性]
修改字段列类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[属性]
修改字段名及属性
ALTER TABLE 表名 DROP 字段名
删除字段
DROP TABLE [IF EXISTS] 表名
删除表
3.DML
1.主键
主键约束(PRIMARY KEY): mysql使用最多的约束,便于 DBMS 更快的查找到表中的记录。
注意事项:
- 一张表只能有一个主键
- 主键值必须唯一标识表中的每一行,且不能为 NULL(唯一性原则)
- 一个字段名只能在联合主键字段表中出现一次
- 联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。(最小化原则)
1.设置主键约束
在 CREATE TABLE
语句中,通过 PRIMARY KEY
关键字来指定主键
设置单字段主键:
<字段名> <数据类型> PRIMARY KEY [默认值] -- 在定义字段的同时指定主键
[CONSTRAINT <约束名>] PRIMARY KEY [字段名] -- 在定义完所有字段之后指定主键
设置联合主键: 由一张表中多个字段组成的主键
比如,设置学生选课数据表时,使用学生编号做主键还是用课程编号做主键呢?如果用学生编号做主键,那么一个学生就只能选择一门课程。如果用课程编号做主键,那么一门课程只能有一个学生来选。显然,这两种情况都是不符合实际情况的。
实际上设计学生选课表,要限定的是一个学生只能选择同一课程一次。因此,学生编号和课程编号可以放在一起共同作为主键,这也就是联合主键了。
-- 将多个字段同时作为主键,当主键是由多个字段组成时,不能直接在字段名后面声明主键约束
PRIMARY KEY [字段1,字段2,…,字段n]
在修改表时添加主键约束:
ALTER TABLE <数据表名> ADD PRIMARY KEY(<字段名>);
删除主键约束:
ALTER TABLE <数据表名> DROP PRIMARY KEY;
2.外键约束
外键约束(FOREIGN KEY): 表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。
定义外键的规则:
- 主表必须有主键
- 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
- 主键不能包含空值,但允许在外键中出现空值。
- 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
- 外键中列的数目必须和主表的主键中列的数目相同。
- 外键中列的数据类型必须和主表主键中对应列的数据类型相同。
CREATE TABLE
语句中,通过 FOREIGN KEY
关键字来指定外键
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]
ALRER TABLE
语句中添加外键
ALTER TABLE <数据表名> ADD CONSTRAINT <外键名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
删除外键约束:
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
2.DML语言
DML语言: 用于操作数据库对象中所包含的数据
1.INSERT
INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')
注意:
- 字段或值之间用英文逗号隔开
- 可同时插入多条数据 , values后用英文逗号隔开
- '字段1,字段2…'该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致
2.UPDATE
UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];
3.DELETE
DELETE FROM 表名 [WHERE condition];
4.TRUNCATE
用于完全清空表数据 , 但表结构 , 索引 , 约束等不变
TRUNCATE [TABLE] table_name;
与DELETE的区别:
两者都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快
- 使用
TRUNCATE TABLE
重新设置AUTO_INCREMENT
计数器(从初始值开始计数)
DELETE
,InnoDB : 自增列从初始值重新开始 (因为是存储在内存中,断电即失);MyISAM : 自增列依然从上一个自增数据基础上开始 (存在文件中,不会丢失) - 使用
TRUNCATE TABLE
不会对事务有影响
4.DQL
1.SELECT
select完整语法:
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 联合查询
[WHERE ...] -- 指定结果需满足的条件
[GROUP BY ...] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY ...] -- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset} -- 指定查询的记录从哪条至哪条
1.查询表达式
数据库中的表达式 : 一般由文本值 , 列值 , NULL , 函数和操作符等组成
-- selcet查询中可以使用表达式
SELECT @@auto_increment_increment; -- 查询自增步长
SELECT VERSION(); -- 查询版本号
SELECT 100*3-1 [AS] 计算结果; -- 表达式
2.where条件语句
用于检索数据表中 符合条件 的记录
where条件子句运算符:
运算符 | 简介 | 案例 | 结果 |
---|---|---|---|
= | 等于 | 1=1 | true |
<> != | 不等于 | 1<>1 1!=1 | false |
> | 大于 | 1>1 | false |
< | 小于 | 1<1 | false |
>= | 不小于 | 1>=1 | true |
<= | 不大于 | 1<=1 | true |
between | 在某个范围 | between 1 and 2 | |
and && | 与 | 1>1 and 1<2 | false |
or || | 或 | 1>1 or 1<2 | true |
not ! | 非 | not(1>1) | true |
where模糊查询比较运算符:
运算符 | 案例 | 结果 |
---|---|---|
is null | a is null | a=null,true a!=null,false |
is not null | a is not null | a=null,false a!=null,true |
between | a between b and c | |
like | a like b | a如果匹配b,true |
in | a in(b,c,d…) | a在b,c,d…之中,true |
where模糊查询通配符
%
任何字符出现任意次数_
只能匹配单个字符
3.连接查询
指令 | 说明 |
---|---|
left join | 从左表中返回所有行,不管右表 |
right join | 从右表中返回所有的行,不管左表 |
inner join | 返回两表的交集中的行 |
union | 把两张表的字段都查出来,没有对应的值就显示null |
注意: mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接。
自连接: 当前表与自身的连接查询,关键点在于虚拟化出一张表给一个别名
2.ORDER BY
ORDER BY
- 用于根据指定的列对结果集进行排序
- 默认按照
ASC
升序对记录进行排序(降序DESC
)
- 利用有序索引获取有序数据
取出满足过滤条件、作为排序条件的字段,以及可以直接定位到行数据的行指针信息,在 Sort Buffer 中进行实际的排序操作,然后利用排好序的数据根据行指针信息返回表中取得客户端请求的其他字段的数据,再返回给客户端。
这种方式,在使用explain分析查询的时候,显示Using index。而文件排序显示Using filesort。 - 文件排序
3.limit
查询结果分页显示
第一页 : limit 0,5
第二页 : limit 5,5
第三页 : limit 10,5
......
第N页 : limit (页码-1)*单页面显示条数,单页面显示条数
4.子查询
子查询:
- WHERE条件子句中,又嵌套了另一个查询语句
- 嵌套查询可由多个子查询组成,求解的方式是由里及外
- 子查询返回的结果一般都是集合,故而建议使用
IN
关键字
SELECT studentno,studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
)
)
5.函数
数据函数:
SELECT ABS(-8); #绝对值
SELECT CEILING(9.4); #向上取整
SELECT FLOOR(9.4); #向下取整
SELECT RAND(); #随机数,返回一个0-1之间的随机数
SELECT SIGN(0); #符号函数: 负数返回-1,正数返回1,0返回0
字符串函数:
SELECT CHAR_LENGTH('abcdefg'); #返回字符串包含的字符数
SELECT CONCAT('ab','cd','efg'); #合并字符串,参数可以有多个
SELECT INSERT('abcdefg',1,3,'123'); #替换字符串,从某个位置开始替换某个长度
SELECT LOWER('ABcdefg'); #小写
SELECT UPPER('abcdefg'); #小写
SELECT LEFT('abcdefg',5); #从左边截取
SELECT RIGHT('abcdefg',5); #从左边截取
SELECT REPLACE('abcdefg','ab','yz'); #替换字符串
SELECT SUBSTR('abcdefg',4,6); #截取字符串,开始和长度
SELECT REVERSE('abcdefg'); #反转
日期和时间函数:
SELECT CURRENT_DATE(); #获取当前日期
SELECT CURDATE(); #获取当前日期
SELECT NOW(); #获取当前日期和时间
SELECT LOCALTIME(); #获取当前日期和时间
SELECT SYSDATE(); #获取当前日期和时间
-- 获取年月日,时分秒
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());
系统信息函数:
SELECT VERSION(); #版本
SELECT USER(); #用户
聚合函数:
函数 | 说明 |
---|---|
count() | 返回满足Select条件的记录总和数,如 select count(*) |
sum() | 返回数字字段或表达式列作统计,返回一列的总和 |
avg() | 通常为数值字段或表达列作统计,返回一列的平均值 |
max() | 可以为数值字段,字符字段或表达式列作统计,返回最大的值 |
min() | 可以为数值字段,字符字段或表达式列作统计,返回最小的值 |
加密函数:
md5(字符串)
加密字符串
6.事务和索引
1.事务
事务: 将一组SQL语句放在同一批次内去执行
注意: MySQL事务处理只支持InnoDB和BDB数据表类型
1.ACID原则
原子性(Atomic): 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。
事务在执行过程中发生错误,会被回滚(ROLLBACK)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consist): 事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。
隔离性(Isolated): 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性(Durability): 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
2.事务的并发问题
脏读: 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
不可重复读(侧重于修改): 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
幻读(侧重于新增或删除): 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
3.MySQL事务隔离级别
mysql默认的事务隔离级别为repeatable-read
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | √ | √ | √ |
不可重复读(read-committed) | × | √ | √ |
可重复读(repeatable-read) | × | × | √ |
串行化(serializable) | × | × | × |
4.基本语法
-- 使用set语句来改变自动提交模式
SET autocommit = 0; /*关闭*/
SET autocommit = 1; /*开启*/
-- 注意:
--- 1.MySQL中默认是自动提交
--- 2.使用事务时应先关闭自动提交
-- 开始一个事务,标记事务的起始点
START TRANSACTION
-- 提交一个事务给数据库
COMMIT
-- 将事务回滚,数据回到本次事务的初始状态
ROLLBACK
-- 还原MySQL数据库的自动提交
SET autocommit =1;
-- 保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点
2.索引
索引: 对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
索引的原理: 存在磁盘/内存,全局搜索→结果集,key值放在BTree→根据BTree上的key进行查找(每次修改表,都会重写全局遍历,重新存BTree,以空间换时间)
索引一般以文件形式存在磁盘中(也可以存于内存中),存储的索引的原理大致概括为以空间换时间,数据库在未添加索引的时候进行查询默认的是进行全量搜索,也就是进行全局扫描,有多少条数据就要进行多少次查询,然后找到相匹配的数据就把他放到结果集中,直到全表扫描完。而建立索引之后,会将建立索引的KEY值放在一个n叉树上(BTree)。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表,每次以索引进行条件查询时,会去树上根据key值直接进行搜索。
索引的优点:
- 提高查询速度
- 确保数据的唯一性
- 可以加速表和表之间的连接 , 实现表与表之间的参照完整性
- 使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间
- 全文检索字段进行搜索优化
索引的缺点:
- 创建和维护的时间成本高,且这个成本随着数据量的增加而加大
- 创建和维护的空间成本高,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
- 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长
索引分类:
- 主键索引 (Primary Key)
- 唯一索引 (Unique)
- 普通索引 (Index)
- 全文索引 (FullText)
- 复合索引(Index)
索引准则:
- 索引不是越多越好
- 不要对经常变动的数据加索引
- 小数据量的表建议不要加索引
- 索引一般应加在查找条件的字段
索引创建:
CREATE TABLE table_name[col_name data type]
[unique|fulltext][index|key][index_name](col_name[length])[asc|desc]
1.主键索引
主键 : 某一个属性组能唯一标识一条记录
特点 :
- 最常见的索引类型
- 确保数据记录的唯一性
- 确定特定数据记录在数据库中的位置
2.唯一索引
作用 : 避免同一个表中某数据列中的值重复
与主键索引的区别:
- 主键索引只能有一个
- 唯一索引可能有多个
CREATE TABLE `Grade`(
`GradeID` INT(11) AUTO_INCREMENT PRIMARYKEY,
`GradeName` VARCHAR(32) NOT NULL UNIQUE
-- 或 UNIQUE KEY `GradeID` (`GradeID`)
)
3.普通索引
普通索引(单列索引):单列索引是最基本的索引,它没有任何限制。
作用 : 快速定位特定数据
注意 :
- index 和 key 关键字都可以设置常规索引
- 应加在查询找条件的字段
- 不宜添加太多常规索引,影响数据的插入,删除和修改操作
-- 直接创建
CREATE INDEX index_name ON table_name(col_name);
-- 修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name(col_name);
-- 创建表的时候同时创建索引
CREATE TABLE `news` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` varchar(255) NOT NULL ,
`content` varchar(255) NULL ,
`time` varchar(20) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (title(255))
)
-- 删除索引
DROP INDEX index_name ON table_name;
或者
alter table `表名` drop index 索引名;
4.复合索引
复合索引:复合索引是在多个字段上创建的索引。复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。
-- 创建一个复合索引
create index index_name on table_name(col_name1,col_name2,...);
-- 修改表结构的方式添加索引
alter table table_name add index index_name(col_name,col_name2,...);
5.全文索引
作用 : 快速定位特定数据
注意 :
- 只能用于MyISAM类型的数据表
- 只能用于CHAR , VARCHAR , TEXT数据列类型
- 适合大型数据集
/*
#方法一:创建表时
CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
);
#方法二:CREATE在已存在的表上创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;
#方法三:ALTER TABLE在已存在的表上创建索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ;
#删除索引:DROP INDEX 索引名 ON 表名字;
#删除主键索引: ALTER TABLE 表名 DROP PRIMARY KEY;
#显示索引信息: SHOW INDEX FROM student;
*/
/*增加全文索引*/
ALTER TABLE `school`.`student` ADD FULLTEXT INDEX `studentname` (`StudentName`);
/*EXPLAIN : 分析SQL语句执行性能*/
EXPLAIN SELECT * FROM student WHERE studentno='1000';
/*使用全文索引*/
-- 全文搜索通过 MATCH() 函数完成。
-- 搜索字符串作为 against() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行,MATCH() 返回一个相关性值。即,在搜索字符串与记录行在 MATCH() 列表中指定的列的文本之间的相似性尺度。
EXPLAIN SELECT *FROM student WHERE MATCH(studentname) AGAINST('love');
/*
开始之前,先说一下全文索引的版本、存储引擎、数据类型的支持情况
MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。
测试或使用全文索引时,要先看一下自己的 MySQL 版本、存储引擎和数据类型是否支持全文索引。
*/
6.索引的数据结构
可以在创建索引的时候,指定索引的数据结构
hash类型的索引: 查询单条快,范围查询慢
btree类型的索引: b+树,层数越多,数据量指数级增长(innodb默认支持它)
不同的存储引擎支持的索引类型:
- InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
- MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
- Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
- NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
- Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;
7.用户管理
基本命令:
-- 用户和权限管理
用户信息表:mysql.user
-- 刷新权限
FLUSH PRIVILEGES
-- 增加用户 CREATE USER kuangshen IDENTIFIED BY '123456'
CREATE USER 用户名 IDENTIFIED BY [PASSWORD] 密码(字符串)
- 必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。
- 只能创建用户,不能赋予权限。
- 用户名,注意引号:如 'user_name'@'192.168.1.1'
- 密码也需引号,纯数字密码也要加引号
- 要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD
-- 重命名用户 RENAME USER kuangshen TO kuangshen2
RENAME USER old_user TO new_user
-- 设置密码
SET PASSWORD = PASSWORD('密码') -- 为当前用户设置密码
SET PASSWORD FOR 用户名 = PASSWORD('密码') -- 为指定用户设置密码
-- 删除用户 DROP USER kuangshen2
DROP USER 用户名
-- 分配权限/添加用户
GRANT 权限列表 ON 表名 TO 用户名 [IDENTIFIED BY [PASSWORD] 'password']
- all privileges 表示所有权限
- *.* 表示所有库的所有表
- 库名.表名 表示某库下面的某表
-- 查看权限 SHOW GRANTS FOR root@localhost;
SHOW GRANTS FOR 用户名
-- 查看当前用户权限
SHOW GRANTS; 或 SHOW GRANTS FOR CURRENT_USER; 或 SHOW GRANTS FOR CURRENT_USER();
-- 撤消权限
REVOKE 权限列表 ON 表名 FROM 用户名
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用户名 -- 撤销所有权限
权限解释:
-- 权限列表
ALL [PRIVILEGES] -- 设置除GRANT OPTION之外的所有简单权限
ALTER -- 允许使用ALTER TABLE
ALTER ROUTINE -- 更改或取消已存储的子程序
CREATE -- 允许使用CREATE TABLE
CREATE ROUTINE -- 创建已存储的子程序
CREATE TEMPORARY TABLES -- 允许使用CREATE TEMPORARY TABLE
CREATE USER -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW -- 允许使用CREATE VIEW
DELETE -- 允许使用DELETE
DROP -- 允许使用DROP TABLE
EXECUTE -- 允许用户运行已存储的子程序
FILE -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX -- 允许使用CREATE INDEX和DROP INDEX
INSERT -- 允许使用INSERT
LOCK TABLES -- 允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS -- 允许使用SHOW FULL PROCESSLIST
REFERENCES -- 未被实施
RELOAD -- 允许使用FLUSH
REPLICATION CLIENT -- 允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE -- 用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT -- 允许使用SELECT
SHOW DATABASES -- 显示所有数据库
SHOW VIEW -- 允许使用SHOW CREATE VIEW
SHUTDOWN -- 允许使用mysqladmin shutdown
SUPER -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE -- 允许使用UPDATE
USAGE -- “无权限”的同义词
GRANT OPTION -- 允许授予权限
/* 表维护 */
-- 分析和存储表的关键字分布
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ...
-- 检查一个或多个表是否有错误
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
-- 整理数据文件的碎片
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
推荐学习: MySQL数据库优化