一、数据库的定义
二、数据库的种类
1、数据存储方式不同。
关系型和非关bai系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
2、扩展方式不同。
SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。
因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。而NoSQL数据库是横向扩展的。
而非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
3、对事务性的支持不同。
如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。
三、mysql的运行机制
四、mysql常用命令
<知识点:给每行添加编号:>
select r.* ,@num:=@num+1 from test.result r join (select @num:=0) a on 1=1;
4.1、对数据库常用命令
1.连接数据库
mysql -u用户名 -p密码
2.显示已有数据库
show databases;
3.创建数据库
create database sqlname;
4.选择数据库
use database sqlname;
5.显示数据库中的表(先选择数据库)
show tables;
6.显示当前数据库的版本信息以及连接用户名
select version(),user();
7.删除数据库(删除时没有提示直接删除)
drop database sqlname;
4.2、数据库中对表的命令
1.创建表
(1)语法:
create table tablename(
字段1 数据类型 字段属性
…
字段n
);
(2)注意:
a.创建表时为了防止与保留字冲突,用’'括起来
b.单行注释:#…
多行注释:/…/
c.创建表时多字段中间用英文逗号隔开,最后一行不用逗号。
(3) 字段约束和属性
a.非空约束 not null(字段不允许为空)
b.默认约束 default(设置默认值)
c.唯一约束 unique key(uk)(设置字段的值是唯一的,可为空,但只能有一个空值)
d.主键约束 primary key(pk)(作为表记录的唯一标识)
e.外键约束 foreign key(fk)(用于两个表之间建立关系,需要指定引用主表的哪一字段。在数据库的存储引擎中InnoDB支持外键,MyISAM不支持外键。
作为外键的字段要求是主表中的主键(单字段主键))
2 外键操作
1.设置自增auto_increment=n,从n开始。
2.设置自增set @@ auto_increment_increment=m,步长为m。
在这里插入图片描述
3.多字段设置主键:primary key(字段1,字段2…字段n)
4.表中的注释/说明性文字:)comment=“说明文字”;
5.设置字符集:)charset=“字符集”;
6.查看表的结构:describe’表名’/desc 表名
7.查看数据库定义:show create database sqlname;
8.查看数据表定义:show create table tablename;
9.查看默认存储引擎:show variables like’storage_engine%’;
11.指定表的存储引擎:)engine=存储引擎;
10.删除表:drop table ‘tablename’;
11.获取当前日期:now();
3 修改表:
(1)修改表名:alter table 旧表名 rename 新表名;
(2)添加字段:alter table 表名 add 字段名 数据类型…;(添加新的字段)
(3)修改字段:alter table 表名 change 原字段名 新字段名 数据类型…;
(4)删除字段:alter table 表名 drop 字段名;
(5)在创建完表以后添加主键约束:
alter table 表名 add constraint 主键名 primary key 表名(主键字段);
(6)创建完表以后添加外键约束(作为外键的字段要求是主表中的主键(单字段主键)):
alter table 表名 add constraint 外键名 foreign key(外键字段) references 关联表名 (关联字段);
(7) 添加字段
mysql> alter table 表名 ADD 字段名 字段类型;
(8)更新数据(修改数据):
mysql> update 表名 set 列名=更新值 where 更新条件;
修改newstudent表中id=1001的数据名字为tom:
UPDATE newstudent SET name
=‘tom’ WHERE id=1001;
4 插入数据
1.插入单行数据:
insert into 表名 (字段名列表(逗号隔开)) values(值列表(逗号隔开));
2.插入多行数据 :
insert into 表名(字段名列表) values (值列表1), … ,(值列表n);
3.将查询结果插入到新表中:
create table 新表(select 字段1, … ,from 原表);
查询student表中的id,name,sex,phone数据插入到newstudent表中:
CREATE TABLE newstudent(SELECT id,name
,sex,phone FROM student);
5 删除数据
(1)delete from 表名 where 删除条件;
delete 删除的是整条数据,不会只删除单个列。
删除newstudent表中名字为tom的数据:
DELETE FROM newstudent WHERE name
=‘tom’;
(2)truncate table 删除数据: 速度更快
truncate table 删除的是表中所有的行,但表的结构,列,约束,索引等不会改变。不能用于有外键约束的表。删除数据不能恢复。
truncate table 表名 where 删除条件;
6 查询语句
1.使用select查询
select 列名/表达式/函数/常量 from 表名 where 查询条件 order by 排序的列名asc/desc;
(1)查询所有的数据行和列:
select * from 表名;
(2)查询部分行和列:
select 列名… from 表名 where 查询条件;
(3)在查询中使用列的别名:
select 列名 AS 新列名 form 表名 where 查询条件;
计算,合并得到新的列名:
select 列名1+’.’+列名2 AS 新列名 from 表名;
(4)查询空值:
通过is null 或者 is not null 判断列值是否为空
查询student表中Email为空的学生姓名:
SELECT name
FROM student WHERE Email IS NULL;
(5)使用强制索引查询
select * from salaries force index(idx_emp_no) where emp_no=10005;
7.分组查询
8.常用函数
1.聚合函数:
(1)AVG (平均值):select avg(列名)from 表名
假设列名为成绩 则查询到的是表中所有成绩的平均值。
(2)count 返回某字段的行数
(3)max 返回某字段的最大数
(4)min 返回某字段的最小值
(5)sum 返回某字段的和。
2.字符串函数:
(1)concat() 连接字符串s1,s2…sn为一个完整的字符串。
(2)insert(s1,p1,n,news)将字符串s1从p1位置开始,n个字符长的字串替换为字符串news。
(3)lower(s)将字符串s中的所有字符改为小写。
(4)upper(s)将字符串s中的所有字符改为大写。
(5)substring(s,num,len)返回字符串s的第num个位置开始长度为len的子字符串。
3.时间日期函数:
(1)获取当前日期:curdate();
(2)获取当前时间:curtime();
(3)获取当前日期和时间:now();
(4)返回日期date为一年中的第几周:week(date);
(5)返回日期date的年份:year(date);
(6)返回时间time的小时值:hour(time);
(7)返回时间time的分钟值:minute(time);
(8)返回日期参数(date1和date2之间相隔的天数):datediff(date1,date2);
(9)计算日期参数date加上n天后的日期:adddate(date,n);
4.数学函数
(1)返回大于或等于数值x的最小整数:ceil(x);
(2)返回小于或等于数值x的最大整数:floor(x);
(3)返回0~1之间的随机数:rand();
order by 子句
order by子句按照一定的顺序排列查询结果,asc升序排列,desc降序排列。
limit子句
显示指定位置指定行数的记录。
select 字段名列表 form 表名 where 约束条件 group by分组的字段名 order by 排序列名 limit 位置偏移量,行数;
#查询学生信息里gid=1按学号升序排列前四条记录
9.模糊查询
in子查询**not in 子查询
使用in关键字可以使父查询匹配子查询返回的多个单字段值。
解决使用比较运算符(=,>等),子查询返回值不唯一错误信息。
like模糊查询
LIKE语句语法格式:select * from 表名 where 字段名 like 对应值(子串)。
它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应子串的。
A:% 包含零个或多个字符的任意字符串: 1、LIKE’Mc%’ 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
2、LIKE’%inger’ 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
3、LIKE’%en%’ 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
B:_(下划线) 任何单个字符:LIKE’_heryl’ 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。
C:[ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符:、
1,LIKE’[CK]ars[eo]n’ 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
2、LIKE’[M-Z]inger’ 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)
**D:[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符:LIKE’M[^c]%’ 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。
E: 它同于DOS命令中的通配符,代表多个字符:cc代表cc,cBc,cbc,cabdfec等多个字符。
F:?同于DOS命令中的?通配符,代表单个字符 :b?b代表brb,bFb等
G:# 大致同上,不同的是代只能代表单个数字。k#k代表k1k,k8k,k0k 。
F:[!] 排除 它只代表单个字符
下面我们来举例说明一下:
例1,查询name字段中包含有“明”字的。
select * from table1 where name like ‘%明%’
例2,查询name字段中以“李”字开头。
select * from table1 where name like '李’
例3,查询name字段中含有数字的。
select * from table1 where name like ‘%[0-9]%’
例4,查询name字段中含有小写字母的。
select * from table1 where name like ‘%[a-z]%’
例5,查询name字段中不含有数字的。
select * from table1 where name like ‘%[!0-9]%’
可以自定义转移符----》escape’自定义转移符’
distinct------》去除重复项
betweenand模糊查询
操作符 BETWEEN … AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
null ,not null查询
exists 子查询 not exists子查询
exists子查询用来确认后边的查询是否继续进行
drop table if exists test—>判断是否存在表test,如果存在就删除。
not exists实现取反操作。对不存在对应查询条件的记录。
10.多表连接查询
多表连接查询是通过各个表之间共同列的关联性来查询数据。
1.内连接查询
内连接查询根据表中共同的列进行匹配。取两个的表的交集。两个表存在主外键关系是通常使用内连接查询。
内连接使用inner join…on 关键字或者where子句来进行表之间的关联。
inner 可省略 on 用来设置条件。
(1)在where子句中指定连接条件
(2)在from中使用inner join…on关键字
两种方法查询结果相同。
2.外连接查询
外连接查询中参与连接的表有主从之分,已主表的每行数据匹配从表的数据列,将符合连接条件的数据直接返回到结果集中,对不符合连接条件的列,将被填上null值再返回到结果集中。
(1)左外连接查询
left join…on 或者left outer join…on关键字进行表之间的关联。
(2)右外连接查询
右外连接包含右表中所有的匹配行,右表中有的项在左表中没有对应的项将以null值填充。
right join…on 或right outer join…on关键字进行表之间的关联。
(3)自连接
把一个表作为两个表使用。
11.分页查询
只利用 LIMIT 关键字。
语法:LIMIT X,Y
注意:在 LIMIT X,Y 中,Y代表返回几条记录,X代表从第几条记录开始返回(第一条记录序号为0),切勿记反。
例如:分页查询employees表,每5行一页,返回第2页的数据
SELECT * FROM employees LIMIT 5,5
五、 MySQL常用函数
5.1 group by 和 over(partition by)的区别
group by 和 partition by 都有分组统计的功能,但是partition by并不具有group by的汇总功能。partition by统计的每一条记录都存在,而group by将所有的记录汇总成一条记录(类似于distinct EmpDepartment 去重)。partition by可以和聚合函数结合使用,同时具有其他高级功能。
在partition by 后在加上order by:
SELECT EmpSalary,EmpDepartment,SUM(EmpSalary) OVER(PARTITION BY EmpDepartment ORDER BY EmpSalary) sum_sala FROM Employee
此处小结:加上order by 后,类似于累加功能(sum_sala += EmpSalary),先观察销售部的结果,从第4条记录开始,其sum(EmpSalary)即sum_sala=2000,第5条记录,sum(EmpSalary)=sum_sala+2500=4500,即第4条sum_sala与第5条EmpSalary的和,依次类推;开发部,由于2个5000是并列的,所以计算的时候是几个并列数据之和即5000+5000=10000。
5.2 row_number的用法
ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于预先排序以便于进行编号。
ROW_NUMBER()
说明:返回结果集分区内行的序列号,每个分区的第一行从1开始。
语法:ROW_NUMBER () OVER ([ <partition_by_clause> ] <order_by_clause>) 。
备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
参数:<partition_by_clause> :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
<order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。
返回类型:bigint 。
ROW_NUMBER()常用的几种情况
1.使用row_number()函数进行编号,如
select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Customer
原理:先按psd进行排序,排序完后,给每条数据进行编号。
2.在订单中按价格的升序进行排序,并给每条记录进行排序代码如下:
select DID,customerID,totalPrice,ROW_NUMBER() over(order by totalPrice) as rows from OP_Order
3.统计出每一个各户的所有订单并按每一个客户下的订单的金额 升序排序,同时给每一个客户的订单进行编号。这样就知道每个客户下几单了。
代码如下:
select ROW_NUMBER() over(partition by customerID order by totalPrice) as rows,customerID,totalPrice, DID from OP_Order
4.统计每一个客户最近下的订单是第几次下的订单。
代码如下:
with tabs as
(
select ROW_NUMBER() over(partition by customerID order by totalPrice) as rows,customerID,totalPrice, DID from OP_Order
)
select MAX(rows) as '下单次数',customerID from tabs group by customerID
5.统计每一个客户所有的订单中购买的金额最小,而且并统计改订单中,客户是第几次购买的。
上图:rows表示客户是第几次购买。
思路:利用临时表来执行这一操作。
1.先按客户进行分组,然后按客户的下单的时间进行排序,并进行编号。
2.然后利用子查询查找出每一个客户购买时的最小价格。
3.根据查找出每一个客户的最小价格来查找相应的记录。
代码如下:
with tabs as
(
select ROW_NUMBER() over(partition by customerID order by insDT) as rows,customerID,totalPrice, DID from OP_Order
)
select * from tabs
where totalPrice in
(
select MIN(totalPrice)from tabs group by customerID
)
6.筛选出客户第一次下的订单。
思路。利用rows=1来查询客户第一次下的订单记录。
代码如下:
with tabs as
(
select ROW_NUMBER() over(partition by customerID order by insDT) as rows,* from OP_Order
)
select * from tabs where rows = 1
select * from OP_Order
5.3 Over函数
1、over函数的写法:
over(partition by class order by sroce) 按照sroce排序进行累计,order by是个默认的开窗函数,按照class分区。
2、开窗的窗口范围:
over(order by sroce range between 5 preceding and 5 following):窗口范围为当前行数据幅度减5加5后的范围内的。
over(order by sroce rows between 5 preceding and 5 following):窗口范围为当前行前后各移动5行。
3、与over()函数结合的函数的介绍
求班级成绩排名:
1 select t.name,t.class,t.sroce,rank() over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;
5.4 isnull、ifnull 、nullif
mysql中:
1.isnull(exper) 判断exper是否为空,是则返回1,否则返回0
2.ifnull(exper1,exper2)判断exper1是否为空,是则用exper2代替
3.nullif(exper1,exper2)如果expr1= expr2 成立,那么返回值为NULL,否则返回值为 expr1。
5.5 case when then 语法
case
when 条件1 then action1
when 条件2 then action2
when 条件3 then action3
when 条件N then actionN
else action
end
5.6 datediff()函数 与 timestampdiff()函数的区别 及使用
1.先从名字上来区分这两个函数的区别。
datediff() //看名字“直译”过来的意思是 《日期差异》 (胡乱翻译的不是很正确哦!)
timestampdiff() //这个也“值译”过来 《时间戳差异》
从名字就能大概区分他们的租作用,一个比较时间戳的,一个是比较日期的。
知道了他们的具体是干什么的,那就测试一下吧。
2.测试datediff()
DATEDIFF() 函数返回两个日期之间的天数。
date1 和 date2 参数是合法的日期或日期/时间表达式。 只有值的日期部分参与计算。
假设action表中有开始活动日期,结束活动日期。查看举行3天活动有那写项目。
SELECT * from action where DATEDIFF(startDate,endDate) = 3;
测试一下MySQL:
SELECT DATEDIFF(‘2018-05-09 08:00:00’,‘2018-05-09’) AS DiffDate;
//结果 0 ; 表示 2018-05-09 与 2018-05-09之间没有日期差。这里是不比较时分秒的。下面验证带上时分秒有没有差别。
SELECT DATEDIFF('2018-05-09 00:00:00','2018-05-09 23:59:59') AS DiffDate;
//结果 0 ;
SELECT DATEDIFF('2018-05-08 23:59:59','2018-05-09 00:00:00') AS DiffDate;
//结果 -1;
SELECT DATEDIFF('2018-05-09 00:00:00','2018-05-08 23:59:59') AS DiffDate;
//结果 1;
3.测试timestampdiff()
测试一下MySQL
select timestampdiff(YEAR,"2018-01-01 15:15:16","2019-08-23 15:15:16") as timestamodiff;
//结果1。相差一年。
select timestampdiff(YEAR,"2019-08-22 15:15:19","2018-12-23 15:15:16") as timestamodiff;
//结果 -1,也是相差一年。
select timestampdiff(YEAR,"2019-08-22 15:15:19","2018-08-22 15:15:16") as timestamodiff;
//结果0,相差不到一年
select timestampdiff(MONTH,"2018-08-22 15:15:16","2018-07-23 15:15:16") as timestamodiff;
// 结果 0 相差不到一个月
select timestampdiff(MONTH,"2018-08-22 15:15:16","2018-07-01 15:15:16") as timestamodiff;
// 结果 -1 相差一个月
select timestampdiff(MONTH,"2018-08-22 15:15:19","2018-09-23 15:15:16") as timestamodiff;
// 结果 1 想差一个月
select timestampdiff(DAY,"2018-08-22 15:15:16","2018-08-23 15:15:16") as timestamodiff;
// 结果 1 想差一天
select timestampdiff(DAY,"2018-08-22 15:15:19","2018-08-23 15:15:16") as timestamodiff;
// 结果 0 想差不到一天
select timestampdiff(DAY,"2018-08-23 15:15:19","2018-08-22 15:15:16") as timestamodiff;
// 结果 -1 想差一天
5.7 substr()函数
mysql中的substr()函数和hibernate的substr()参数都一样,就是含义有所不同。
用法:
substr(string string,num start,num length);
string为字符串;start为起始位置;length为长度。
区别:
mysql中的start是从1开始的,而hibernate中的start是从0开始的。
如果是倒数2个字符,则是 start num=-2,length=2
5.8 group_concat
roup_concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由函
数参数(就是字段名)决定。分组必须有个标准,就是根据group by指定的列进行分组。
5.9 exists用法
EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT … FROM…), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。
例1:
例2:
使用含有关键字exists查找未分配具体部门的员工的所有信息。
select * from employees e
where not exists
(select emp_no from dept_emp d where e.emp_no=d.emp_no)
5.10 截取日期中的年月
DATE_FORMAT(date, ‘%Y-%m’)
六、MySQL的事务,视图,索引,备份和恢复
1.事务
事务是指将一系列数据操作捆绑成为一个整体进行统一管理。
把所有的命令作为一个整体一起向系统提交或者撤销造组偶请求。
事务属性:原子性,一致性,隔离性,持久性。
myISA存储引擎不支持事务。
关闭事务自动提交:set autocommit=0;
(1)开始事务:begin/start transaction;
(2)提交事务:commit;
(3)回滚/撤销事务:rollback;
恢复自动提交:set autocommit=1;
设置结果集以??编码格式显示:set names ??;
2.视图
2.1 创建临时表,需要磁盘分配空间,原表数据修改但临时表数据不会改变
创建临时表的语法:
2.2 视图不同于创建临时表,视图是一种查看数据库中一个或多个表中数据的方法。视图是一种虚拟表,不占用物理存储,但占用逻辑空间。作为来自一个或多个表的行或列的子集创建的。视图充当查询中的表筛选器的角色。
(1)创建视图:create view 视图名 as <select语句>
(2)删除视图:drop view 视图名;
(3)查看视图数据:select 。。。。。from 视图名;
3.索引
索引类似于书的目录,使用索引可以将数据库程序无须对整个表扫描就可以在其中找到所需数据。
(1)普通数据:允许重复和空值。
(2)唯一索引:不允许出现重复。可以有多个唯一索引。
(3)主键索引:非空,唯一。删除时drop primary key;
(4)复合索引:将多个列组合作为索引。?
(5)全文索引:可重复和空值,在char,varchar,text创建。
where match(列名)against (‘查找内容’);
(6)空间索引:对空间数据类型的列建立的索引。
(一)索引的创建
1.单列索引
1-1) 普通索引(这个是最基本的索引)
建表时:INDEX IndexName(字段名(length))
建表后:CREATE INDEX IndexName ONTableName(字段名(length))
或ALTER TABLE TableName ADD INDEX IndexName(字段名(length)
此处展示的语句用于创建一个索引,索引使用字段数据的前10个字符。
CREATE INDEX part_of_name ON customer (name(10));
使用字段数据的一部分创建索引可以使索引文件大大减小,从而节省了大量的磁盘空间,有可能提高INSERT操作的速度。
前缀索引是一种能使索引更小,更快的有效办法,但是MySql无法使用前缀索引做ORDER BY 和 GROUP BY以及使用前缀索引做覆盖扫描。
这里又引出了一个新概念,覆盖扫描!
如果一个索引(如:组合索引)中包含所有要查询的字段的值,那么就称之为覆盖索引,如:
SELECT user_name, city, age FROM user_test WHERE user_name = 'feinik' AND age > 25;
1-2) 唯一索引,要求字段所有的值是唯一的,这一点和主键索引一样,但是允许有空值。
建表时:UNIQUE INDEX IndexName(字段名(length))
建表后:CREATE UNIQUE INDEX IndexName ONTableName(字段名(length))
或ALTER TABLE TableName ADD UNIQUE INDEX IndexName(字段名(length))
1-3) 主键索引,不允许有空值
一般在建表的时候自动创建,主键一般会设为 int 而且是 AUTO_INCREMENT自增类型的
1-4)全文索引
假设字段的数据类型是长文本,文本字段上(text等)建立了普通索引,我们需要查找关键字的话,那么其条件只能是where column like ‘%xxxx%’ ,但是,这样做就会让索引失效,这时就需要全文索引了。
建表时:FULLTEXT INDEX IndexName(字段名(length))
建表后:CREATE FULLTEXT INDEX IndexName ON TableName(字段名(length))
或ALTER TABLE TableName ADD FULLTEXT INDEX IndexName(字段名(length))
4.创建索引:
create 【索引类型】index 索引名 on 表名 (创建索引的列);
或者创建表时之间在列后面加上索引类型。
或者修改表alter table 表名 add index 索引名 (索引列);
删除索引:drop index 索引名;
查看索引:show index from 表名;
5.数据库备份和恢复
1.使用mysqldump命令备份数据库
mysqldump -u -p 数据库名>备份数据库位置及名字;
表数据导出到文本文件
select *from 表名 where 查询条件 into outfile 备份数据库位置及名字;
2.使用mysql命令恢复数据库(先创建新的数据库)
mysql -u -p 新创建数据库名<所要恢复数据库位置及文件名;
source命令恢复数据库
source 数据库备份文件;