您的位置:首页 > 数据库 > MySQL

Mysql基本使用

2018-03-07 11:46 260 查看
##################################################
DDL 数据定义语言:CREATE DROP ALTER
DML 数据操作语言:INSERT UPDATE DELETE
DQL 数据查询语言:SELECT
DCL 数据控制语言:GRANT COMMIT ROLLBACK
##################################################

MYSQL(存储数据 数据共享):免费开源、齐全
用于win 和 linux

net START mysql;
mysql -uroot -p1234;
mysql -hlocalhost -uroot -p1234;

#查看数据库的定义(一些信息)
SHOW CREATE DATABASE school;

#查看表的定义(一些信息)
SHOW CREATE TABLE student;

/*
CREATE TABLE `student` (
  `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '主键,学号',
  `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
  `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '学生姓名',
  `sex` VARCHAR(2) NOT NULL DEFAULT '男',
  `birthday` DATETIME DEFAULT NULL,
  `address` VARCHAR(100) DEFAULT NULL,
  `email` VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
*/

#desc显示表结构
DESC student;

#创建一个测试表
CREATE TABLE test(
coll INT(4) NOT NULL;
)
CREATE TABLE test(
coll INT(4) ZEROFILL NOT NULL;
)
CREATE TABLE test(
coll INT(4) NOT NULL DEFAULT 5 UNSIGNED;
)

#自增量从100开始 只影响当前表
CREATE TABLE test(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL 
)AUTO_INCREMENT=100; 

#影响所有自增量列的表 步长
SET @@auto_increment_increment=100; 

#设置严格检查模式
SET sql_mode='strict_trans_table';

数据表类型:
MYISAM、INNODB、HELP、bob、csv、MEMORY等

常见的MYISAM与INNODB类型:

MYISAM INNODB
事务处理 0 1
数据行锁定 0 1
外键约束 0 1
全文索引 1 0
表空间大小 较小 较大,约两倍

#查看mysql所支持的引擎类型(表类型)
SHOW ENGINES;
#查看默认引擎
SHOW VARIABLES LIKE 'storage_engine';
SHOW VARIABLES LIKE 'storage_engine%';

#设置表的引擎:
CREATE TABLE student(...)ENGINE=INNODB;
CREATE TABLE student(...)ENGINE=MYISAM;

#修改引擎:
#安装时更改引擎
#在my.ini文件当中修改

#设置数据库的字符集:
CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8 */

CREATE TABLE `student` (
  `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '主键,学号',
  `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
  `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '学生姓名',
  `sex` VARCHAR(2) NOT NULL DEFAULT '男',
  `birthday` DATETIME DEFAULT NULL,
  `address` VARCHAR(100) DEFAULT NULL,
  `email` VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8  #设置数据表的字符集:

CREATE TABLE a(
address CHAR(5) CHARACTER SET gbk  #设置表中列的字符集:
)

##############################################################################
#重命名
ALTER TABLE student RENAME AS tableOne;
ALTER TABLE student RENAME TO tableOne;

#添加列
ALTER TABLE tableone ADD liveaddress VARCHAR(100) DEFAULT '深圳'; 

#修改表
ALTER TABLE tableone MODIFY liveaddress VARCHAR(500) DEFAULT '广州';
ALTER TABLE tableone CHANGE address 地址 VARCHAR(500) DEFAULT '广东';

#删除字段
ALTER TABLE tableone DROP email;

#drop table
DROP TABLE IF EXISTS tableone;

#年级表
CREATE TABLE IF NOT EXISTS grade(
gradeid INT(10) PRIMARY KEY AUTO_INCREMENT,
gradename VARCHAR(50) NOT NULL
)

#学生表
CREATE TABLE IF NOT EXISTS student(
id INT(4) PRIMARY KEY,
NAME VARCHAR(20) NOT NULL DEFAULT '匿名',
sex TINYINT(1) DEFAULT 1,
gradeid INT(10),
phone VARCHAR(50) NOT NULL,
address VARCHAR(100),
brithday DATETIME,
email VARCHAR(50),
idcard VARCHAR(18) NOT NULL,
CONSTRAINT fk_gradeid FOREIGN KEY(gradeid) REFERENCES grade(gradeid)
)

##############################################################################
#添加主键
ALTER TABLE grade ADD CONSTRAINT pk_grade PRIMARY KEY(gradeid);

#添加外键
ALTER TABLE student
ADD CONSTRAINT fk_gradeid FOREIGN KEY(gradeid) REFERENCES grade(gradeid)

#删除外键
ALTER TABLE student DROP FOREIGN KEY fk_gradeid;
ALTER TABLE studnet DROP INDEX fk_gradeid;

#使用语句增加数据
INSERT INTO grade(gradename) VALUES('大一');
INSERT INTO grade VALUES(2,'大二');
INSERT INTO grade(gredename) VALUES('大三'),('大四');

INSERT INTO student(id,NAME,sex,gradeid,phone,address,brithday,email,idcard)
VALUES(1001,'李四',2,1,'130367350207',NULL,NOW(),NULL,'123456789012345678'),
(1001,'张三',DEFAULT,1,'130367350207',NULL,NOW(),NULL,'113456789012345678');

#使用语句修改数据
UPDATE student SET address='广州' WHILE id=1001;
UPDATE student SET address='深圳',email='1234@qq.com' WHILE studnet=1001;

#修改多条数据
UPDATE student SET sex=1 WHILE id=1001 OR id=1002 OR id=1003;
UPDATE student SET sex=2 WHILE id>=1001 AND id<=1003;
UPDATE student SET sex=1 WHILE id BETWEEN 1001 AND 1003;

#使用函数
UPDATE student SET `name`=CONCAT("姓名:",`name`);

---删除数据
DELETE FROM grade WHILE gredeid=4;
#全部删除:自增当前值在原来基础上增加编号
DELETE FROM test;
#自增量会重新开始编号(truncate),删除的数据不能还原,不能用于删除外键引用的表
TRUNCATE TABLE test;

#用delete删除数据库,重启数据库服务之后:
#对于innodb的表,自增列重新开始,它是放在内存当中的;
#对于myisam的表,自增列从原基础上开始,它是放在文件里面的

#查询所有列信息
SELECT * FROM student;
#查询指定列
SELECT studentno,studentname FROM student;

#取别名AS
SELECT studentmo AS 学号,studentname AS 姓名 FROM student;
SELECT student 学号,studentanme 姓名 FROM student;

SELECT studentno 学号,studentname 姓名 FROM student AS a;
SELECT studentno 学号,studentname 姓名 FROM student a;

#使用AS给查询结果取名
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;

##############################################################################
#查询哪些同学参加了考试 去除重复行(distinct)
SELECT DISTINCT studentno FROM result;

#查询步长
SELECT @@auto_increment_increment;
SELECT VERSION();
SELECT 100*3-1 AS 结果:;

#学员考试成绩集体提分一分:
SELECT studentno,studentresult+1 AS '提分后:' FROM result;

#满足条件的查询(where)考试成绩95-100
SELECT studentno,studentresult
FROM result
where studentresult>=95 AND studentresult<=100;

#模糊查询
SELECT studentno,studentresult
FROM result
where studentresult BETWEEN 95 AND 100;

#精确查询
SELECT studentno,studentresult
FROM result
where studentno=1000;

#或者写成&&
SELECT studentno,studentresult
FROM result
where studentresult>=95 && studentresult<=100;

#比较运算符(模糊查询)
#除了1000号同学,其他的成绩
SELECT studentno,studentresult
FROM result
where studentno !=1000;

SELECT studentno,studentresult
FROM result
where NOT studentno=1000;

##############################################################################
#模糊查询 between and | like | in | null
#查询姓李的同学的学号及姓名
#like:%(0-多个字符) _(一个字符)
SELECT studentno,studentresult
FROM result
where studentname LIKE '李%';

SELECT studentno,studentresult
FROM result
where studentname LIKE '李_';

#姓名中含有‘文’字的同学
SELECT studentno,studentresult
FROM result
where studentname LIKE '%文%';

#用转义符 查% _:
SELECT studentno,studentresult
FROM student
where studentname LIKE '%\%%';

SELECT studentno,studentresult
FROM student
where studentname LIKE '%\_%';

#自己定义的符号作转义符 (escape)
SELECT studentno,studentresul
e84e
t
FROM student
where studentname LIKE '%:%%' ESCAPE ':';

#模糊查询: in | null
SELECT studentno,studentresult
FROM student
where studentno=1000 OR studentno=1002 OR studentno=1003;

SELECT studentno,studentresult
FROM student
where studentno IN(1000,1001,1002,1003);

SELECT studentno,studentresult
FROM student
where address IN('北京','苏州','扬州');
#null
SELECT * FROM student
where borndate IS NULL;

SELECT studentname FROM student
where borndate IS NOT NULL;

#区别空字符串与null
SELECT studentname FROM student where address IS NULL;
SELECT studentname FROM student where address='';
SELECT studentname FROM student where address='' OR address IS NULL;

#连接查询
#内连接 inner join
#外连接 outer join
#左外连接 left join
#右外连接 right join
#自连接
#等值连接 非等值连接

#查询参加了考试的同学信息(学号、学生姓名、科目编号、分数)
#1.先确定查询的列来源于两个表 student  result,连接查询
#2.确定使用哪一种连接查询? 
---内连接(拿出来的是表里面的交集)
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
INNER JOIN result r
ON r.StudentNo=s.StudentNo
---左连接(返回所有左表的记录,右表NULL填充)
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
LEFT JOIN result r
ON r.StudentNo=s.StudentNo
---等值连接
SELECT s.studentno,studentname,subjectno,studentresult
FROM student s,result r
where r.StudentNo=s.StudentNo
---非等值连接(m*n行依次相乘)

#查缺考的同学
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
LEFT JOIN result r
ON r.StudentNo=s.StudentNo
where studentresult IS NULL;

##############################################################################
#连接查询(自连接)
CREATE TABLE IF NOT EXISTS category(
categoryid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
pid INT(10) NOT NULL,
categoryname VARCHAR(50) NOT NULL,
PRIMARY KEY(categoryid)
)
INSERT INTO category 
VALUES(2,1,"美术设计"),
(3,1,"软件开发"),
(4,3,"数据库基础"),
(5,2,"ps基础"),
(6,2,"色彩搭配"),
(7,3,"PHP基础"),
(8,3,"Java基础");

#编写SQL语句,将栏目的父子关系呈现出来,(父栏目名称、子栏目名称)
#父栏目   子栏目
#美术设计  PS基础
#美术设计  色彩搭配
#软件开发  数据库基础
#软件开发  PHP基础
#软件开发  Java开发
#(自连接)
SELECT a.categoryname AS '父栏目',b.categoryname AS '子栏目'
FROM category AS a,category AS b
WHILE a.categoryid=b.pid

#三表连接
#查询参加过考试的同学信息(学号  姓名  科目名称  成绩)
SELECT s.studentno,studentname,subjectname,studentresult 
FROM student s
INNER JOIN result r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` sub
ON r.SubjectNo = sub.subjectno

#查询学员及所属的年级(学号 学生姓名 年级名) 1 张三 大一
SELECT studentno AS 学号,studentname AS 学生姓名,gradename AS 年级名称
FROM student
INNER JOIN grade
ON student.gradeid=grade.gredeid

#查询科目及所属的年级(科目名称 年级名称) java 大一
SELECT subjectname AS 科目名称,gradename AS 年级名称
FROM SUBJECT sub
INNER JOIN grade AS g
ON sub.gradeid=g.gradeid

#查询《数据库结构-1》的所有考试结果(学号 学生姓名 科目名称 成绩)
SELECT s.studentno,studentname,subjectname,studentresult 
FROM student s
INNER JOIN result r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` sub
ON r.SubjectNo = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY studentresult DESC,studentno DESC       #默认 asc 升序
#常见错误:order by studentresult,studentno desc  正确是成绩升序排列、学号降序排列

---分页
#查询《数据库结构-1》的所有考试结果(学号 学生姓名 科目名称 成绩)
---每页显示5条记录
SELECT s.studentno,studentname,subjectname,studentresult 
FROM student s
INNER JOIN result r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` sub
ON r.SubjectNo = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY studentresult DESC
LIMIT 0,5;   ==LIMIT 5 OFFSET 0;
#limit 0,5;   #第一页   #从0开始 显示5条
#limit 5,5;   #第二页   #第二页=((2-1 * 5),5);
#limit (page-1)*pagesize,pagesize;  (当前页码-1)*页容量 页容量

#查询 《JAVA第一学年》课程成绩前10名且分数大于80的学生信息(学号、姓名、课程名、分数)
SELECT s.studentno,studentname,subjectname,studentresult
FROM student s
INNER JOIN result r 
ON s.StudentNo=r.StudentNo
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
WHERE subjectname='JAVA第一学年' AND studentresult>80
ORDER BY studentresult DESC
LIMIT 0,10;

---子查询 (如果得到的是一个数可以用等于 如果得到的是一个集合就用IN)
#查询《数据库结构-1》的所有考试结果(学号、科目编号、成绩),并按成绩降序排列
#方法一:使用连接查询
SELECT studentno,r.subjectno,studentresult 
FROM result r INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
WHERE subjectname='数据库结构-1'
ORDER BY studentresult DESC;

#方法二:使用子查询,子查询执行顺序:由里到外
SELECT studentno,subjectno,studentresult
FROM result WHERE subjectno=(SELECT subjectno FROM `subject` WHERE subjectname='数据库结构-1')
ORDER BY studentresult DESC;

##############################################################################
---查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名
#方法一:使用连接查询
SELECT r.studentno,studentname
FROM student s
INNER JOIN result r
ON s.StudentNo=r.StudentNo
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
WHERE subjectname='高等数学-2' AND studentresult>=80;

#方法二:使用连接查询+子查询
#分数不小于80分的学生的学号和姓名
SELECT r.studentno,studentname 
FROM student s INNER JOIN result r
ON s.StudentNo=r.StudentNo
WHERE studentresult>=80
#在上面SQL基础上,添加需求:查询课程为《高等数学-2》
SELECT r.studentno,studentname 
FROM student s INNER JOIN result r
ON s.StudentNo=r.StudentNo
WHERE studentresult>=80 
AND subjectno =(SELECT subjectno FROM `subject` WHERE subjectname='高等数学-2')

#方法三:使用子查询
SELECT studentno,studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE studentresult>=80 AND subjectno=(
SELECT subjectno FROM `subject` WHERE subjectname='高等数学-2'))

##############################################################################
---查询《C语言-1》的前5名学生的成绩信息:学号、姓名、分数
SELECT r.studentno,studentname,studentresult
FROM student s
INNER JOIN result r
ON s.StudentNo=r.StudentNo
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
WHERE subjectname='C语言-1'
ORDER BY studentresult DESC
LIMIT 0,5;

SELECT r.studentno,studentname,studentresult
FROM student s
INNER JOIN result r
ON s.StudentNo=r.StudentNo
WHERE subjectno=(SELECT subjectno FROM `subject` WHERE subjectname='C语言-1')
ORDER BY studentresult DESC
LIMIT 0,5;

---使用子查询实现,查询郭靖同学所在的年级名称
SELECT gradename FROM grade WHERE gradeid = 
(SELECT gradeid FROM student WHERE studentname='郭靖')

##############################################################################
---数学函数
SELECT ABS(-8) AS 绝对值;  #绝对值
SELECT CEILING(9.3); #大于等于我的最小的整数
SELECT FLOOR(9.3); #小于等于我的最大的整数
SELECT RAND();  #返回0-1之间的随机数
SELECT RAND(50); #以某个数作为种子,返回重复随机数
SELECT SIGN(0);  #符号函数,正数1  负数-1  0返回0
SELECT SIGN(-333);
SELECT SIGN(332);

---字符串函数
SELECT CHAR_LENGTH('好好学习数据库'); #返回字符串中包含的字符数
SELECT CONCAT('我','爱','你,课工场'); #合并字符串
SELECT INSERT('我爱你课工场',1,3,'很爱'); #替换字符串,从某个位置开始,替换某个长度
SELECT INSERT('我爱你课工场',10,3,'很爱'); #如果起始位置超过了字符串长度,则返回源字符串
SELECT LOWER('I LOVE YOU');  #变小写
SELECT UPPER('i LOVE you');  #变大写
SELECT LEFT('课工场欢迎你',3); #返回从左边截取的字符串
SELECT RIGHT('课工场欢迎你',3);
SELECT REPLACE('课工场欢迎你,你好','你','你们'); #替换 把你替换成你们
SELECT SUBSTR('课工场欢迎你',1,3);  #截取,从哪个位置开始截取,截取多长
SELECT REVERSE('课工场欢迎你'); #反转

---日期和时间函数
#获取当前日期
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();

#查询姓李的同学,改成历
SELECT REPLACE(studentname,'李','历') AS 新名字 FROM student
WHERE studentname LIKE '李%'

---聚合函数
SELECT COUNT(studentname) FROM student;
SELECT COUNT(*) FROM student;
SELECT COUNT(1) FROM student;

SELECT SUM(studentresult) AS 总和 FROM result;
SELECT AVG(studentresult) AS 平均分 FROM result;
SELECT MAX(studentresult) AS 最高分 FROM result;
SELECT MIN(studentresult) AS 最低分 FROM result;

SELECT * FROM result;
#查询不同课程的平均分,最高分,最低分
#前提:根据不同课程进行分组
SELECT subjectno,AVG(studentresult) AS 平均分,MAX(studentresult) AS 最高分,MIN(studentresult) AS 最低分 
FROM result
GROUP BY subjectno;

SELECT subjectname,AVG(studentresult) AS 平均分,MAX(studentresult) AS 最高分,MIN(studentresult) AS 最低分 
FROM result  r INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
GROUP BY r.subjectno
HAVING 平均分>80  #分完组才能用having筛选
ORDER BY 平均分 DESC
LIMIT 0,4;

##############################################################################
---事务处理
就是将一组SQL语句放在同一批次内去执行,如果一个SQL有错,则所有的SQL都取消执行

#事务的ACID原则:
原子性(Atomic):一组SQL语句是一起执行的,要不全部成功,要不全部失败
一致性(Consist):确保数据库正确改变状态后,来成功提交事务。要不数据处于事务改变前的状态,要不数据就处于改变后的状态
隔离性(Isolated):数据库中存在很多事务处理,每一个事务互不影响。事务独立和透明的
持久性(Durable):如果事务提交成功,对于数据的影响是持久的。

SET autocommit=0; #关闭自动提交模式
SET autocommit=1; #开启自动提交模式

#--使用事务模拟实现转账
CREATE TABLE account(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(32) NOT NULL,
cash DECIMAL(9,2) NOT NULL  #decimal(9,2) 最大长度9位,小数点后面两位
)

DELETE FROM account;

INSERT INTO account(`name`,cash)
VALUES('A',2000),('B',10000);

--go
SET autocommit = 0;

START TRANSACTION;
UPDATE account SET cash=cash-500 WHERE NAME='A';
UPDATE account SET cash=cash+500 WHERE NAME='B';
#commit;
ROLLBACK;
SET autocommit = 1;

SELECT * FROM account;

##############################################################################
---数据库索引
作用:
提高查询速度 #数据库有行和列,对列进行查询,将列设置索引,算法就能直接查到
确保数据唯一性
加速表与表之间的连接,实现表于表之间的参照完整性
使用分组和排序进行检时,可以显著减少时间
全文检索字段进行搜索优化

分类:
主键索引(PRIMARY KEY)
#唯一标识的一条记录 
#特点:最常见的索引类型 确保数据记录的唯一性 确定特定数据记录在数据库中的位置

唯一索引(UNIQUE)
#作用:避免同一个表中的列值重复
#只能有一个主键索引(非空唯一),可有多个唯一索引(唯一可空)

常规索引(INDEX)
#作用:快速定位特定数据
#index/key 都可以设置常规索引
#太多常规索引会影响数据插入删除和修改操作,应加在查找条件的字段

全文索引(FULLTEXT)
#作用:快速定位特定数据
#只能用于myisam类型的数据表
#只能用于char、varchar、text数据列类型
#适合大型数据集

---添加索引方式一:创建表,声明列属性时添加上
CREATE TABLE test1(
id INT(4) PRIMARY KEY,
testno VARCHAR(10) UNIQUE,
c VARCHAR(50),
d VARCHAR(20),
e TEXT,
INDEX `index_c`(c,d),
FULLTEXT(e)
)ENGINE=MYISAM;

#添加索引方式二:创建表,将所有列都声明完毕后,再添加索引
CREATE TABLE test2(
id INT(4),
testno VARCHAR(10),
c VARCHAR(50),
d VARCHAR(20),
e TEXT,
PRIMARY KEY(id),
UNIQUE KEY(testno),
INDEX `index_c`(c,d),
FULLTEXT(e)
)ENGINE=MYISAM;

#添加索引方式三:先创建表,创建表完毕后,修改表添加索引
CREATE TABLE test3(
id INT(4),
testno VARCHAR(10),
c VARCHAR(50),
d VARCHAR(20),
e TEXT
)ENGINE=MYISAM;

ALTER TABLE test3 ADD PRIMARY KEY(id);
ALTER TABLE test3 ADD UNIQUE KEY(testno);
ALTER TABLE test3 ADD INDEX(c,d);
ALTER TABLE test3 ADD FULLTEXT(e);

--执行的性能检验(EXPLAIN)
EXPLAIN SELECT * FROM student WHERE studentno='1000';

#修改表 加全文索引
ALTER TABLE student ENGINE=MYISAM;
ALTER TABLE student ADD FULLTEXT(studentname);
#上面加了主键索引在explain检验中就用了主键索引 这里加了全文索引没有用全文索引 
EXPLAIN SELECT * FROM student WHERE studentname LIKE '李%';

---使用全文索引
EXPLAIN SELECT * FROM student WHERE MATCH(studentname) AGAINST('love');

---删除索引
DROP INDEX testno ON test3;
ALTER TABLE test3 DROP INDEX c;
ALTER TABLE test3 DROP INDEX e;
ALTER TABLE test3 DROP PRIMARY KEY;

#显示索引信息
SHOW INDEX FROM student;

---索引准则
不是越多越好
经常变动的数据不要加索引
小数据量的表不要加索引
索引一般加在查找条件的字段

##############################################################################
---数据库备份与恢复
/*!40101.....*/ 40101属于版本号,属于mysql可执行语句,仅mysql使用,提高数据库可移植性

#备份整个库
mysqldump -uroot -proot school>h:/文件路径/school.sql
mysqldump -uroot -proot school student grade>h:/文件路径/school.sql

mysqldump --HELP
mysqldump --HELP |more

mysqldump -uroot -proot --skip-ADD-DROP-TABLE school student grade>h:/文件路径/school.sql
mysqldump -uroot -proot --skip-ADD-DROP-TABLE -c school student grade>h:/文件路径/school.sql

---mysqldump常用选项   mysql --HELP
#--add-drop-table (导出的脚本会加上drop table if exists 语句)
#--add-locks (会在insert语句中捆绑lock table和unlock table语句)
#-t 或 --no-create-info (忽略不写create table语句)
#-c 或 --complete-insert (每个insert语句列上加上字段名)
#-d 或 --no-data (不写表的任何行信息。对于只想转储表结构很有用)
#--where "where-condition",-w "where-condition" (只转储给定的where条件选择的记录)
#--opt 
等同于指定:--ADD-DROP-TABLES
  --ADD-locking
  --CREATE-OPTION
  --DISABLE-KEYS--EXTENDED-INSERT
  --LOCK-TABLES
  --QUICK
  --SET-CHARSET

##############################################################################
--source命令恢复
mysql>USE test;
mysql>source h:/文件路径/school.sql

mysql命令恢复
mysql -uroot -pkgc test<h:/文件路径/school.sql

3.使用SQL命令方式来备份和恢复
#将school数据库student表中的学号、姓名两列备份出去
USE school;

#注意:备份出去的文件不可以提前存在
SELECT studentno,studentname INTO OUTFILE 'h:/chenxuan/student.sql' FROM student;

#将备份出去的数据恢复到test的stutab表中
USE test;
CREATE TABLE stutab(
id INT(4),
sname VARCHAR(20)
)
LOAD DATA INFILE 'h:/student.sql' INTO TABLE stutab(id,sname);

SELECT * FROM stutab;      #执行查询所恢复的这个表的数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: