mysql数据库学习笔记

1。数据库基本操作

1.连接数据库 mysql -u root -p

2.创建数据库 create database (if not exists) 数据名;

不可与其他数据库重名 由字母 数字 _ $ 组成 可由上述任意字符开头 但不可使用单独的数字

3.指定字符集

4.查看数据库 show databases;

5.选择数据库 use 名字

6.修改

7.删除 drop database 名字

8.退出 quit

2.数据类型

1.数字类型

2.字符串(字符)类型

扫描二维码关注公众号,回复: 4384062 查看本文章

3.日期

4.时间类型

3.数据表

3.1.创建表

create table table_name (列名1 属性,列名2 属性,。。。。。)

 create table tb_booktype (
    -> id int(10) unsigned NOT NULL,
    -> typename varchar(30),
    -> days int(10) unsigned
    -> ) ENGINE=MyISAM;  //设置使用MyISAM存储引擎
2.设置自增类型字段

使用 AUTO_INCREMENT关键字,将字段设置为此时,建议将其设置为主键 否则数据表将创建失败。

 create table tb_booktype1 (
    -> id int(10) unsigned NOT NULL AUTO_INCREMENT,
    -> typename varchar(30),
    -> days int(10) unsigned,
    PRIMARY KEY('id')
    -> ) ENGINE=MyISAM; 
3.设置字符集
DEFAULT CHARSET=字符集类型 //基本语法

//demo1
create table tb_booktype1 (
     id int(10) unsigned NOT NULL AUTO_INCREMENT,
     typename varchar(30),
     days int(10) unsigned,
    PRIMARY KEY('id')
     ) DEFAULT CHARSET=GBK;
 
 //demo2
create table tb_bookinfo (
     barcode varchar(30),
     bookname varchar(70),
     typeid int(10) unsigned,
     author varchar(30),
     ISBN varchar(20),
     price float(8,2),
     page int(10) unsigned,
     bookcase int(10) unsigned,
     inTime date,
     del tinyint(1) DEFAULT '0',
     id int(11) NOT NULL
     CHECK(typeid IN (SELECT id FROM tb_booktype))
     );

4.复制表结构
//基本用法
create table (if not exists) 数据表名
{LIKE 源数据表名 | (LIKE 源数据表名)};

//查看数据库的表
show tables;

//向bookinfo插入数据
INSERT INTO tb_bookinfo VALUES ('9787115418425','JAVA 课程设计',3,'明日科技','115',49.80,350,1,'2017-02-04',0,1);

//复制
 create table tb_bookinfobak
    -> like tb_bookinfo;
    //复制仅复制表结构 不复制内容

//查看表结构
DESC 数据表名;

//查看表内容
SELECT *FROM 数据表名;

//复制表内容
CREATE TABLE tb_bookinfobak1
AS SELECT *FROM bookinfo;
5.修改表内容
//修改字段

//修改约束条件
alter table 数据表名 add constraint 约束名 约束字段 (字段名);
alter table tb_bookinfo add constraint mrprimary ;PROMARY KEY(id)

//删除主键/外键/唯一性约束条件
ALTER TABLE 表名 DROP PRIMARY KEY;
ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
ALTER TABLE 表名 DROP INDEX 唯一索引名;

//修改其他选项
ALTER TABLE 表名 ENGIN=新的存储引擎类型
                DEFAULT CHARSET=新的字符集
                AUTO_INCREMENT=新的初始化值
                
//修改表名
rename table 数据表名1 to 数据表名2;


6.删除表

DROP TABLE (IF EXSTS)数据表名;

7.设置索引

7.1 创建索引

create table tb_socre(
     id int(11) auto_increment primary key not null,
     //表示是否自动编号 每个表只能有一个auto_increment列,并且必须被索引
     name varchar(50) not null,
     math int(5) not null, //不为空	
     english int(5) not null,
     chinese int(5) not null,
     index(id)); //给创建的索引取新名称
     
| tb_socre | CREATE TABLE `tb_socre` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `math` int(5) NOT NULL,
  `english` int(5) NOT NULL,
  `chinese` int(5) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)   //设置的索引
)  //创建的索引

7.2在已建立的数据表中创建索引
create [unique|fulltext|spatial] index index_name
on table_name(属性 [(length)][ASC|DESC]); //指定数据表的排序顺序

//eg
create index idx_name on tb_bookinfo (bookname);
7.3 删除索引
DROP INDEX index_name ON TABLE_NAME;

//eg:
DROP INDEX idx_name ON tb_bookinfo;

8.定义约束

8.1 定义主键约束

(1)作为列的完整性约束,在表的某个列的属性定义时,加上关键字 PRIMARY KEY

(2)作为表的完整性约束,在表的所有列属性定义后,加上PRIMARY KEY(index_col_name,…)

create table tb_student(
id int auto_increment,
name varchar(30) not null,
sex varchar(2),
age int not null CHECK(age>6 and age<18)
classid int not null,
birthday date,
PRIMARY KEY (id,classid)
)  //主键由多个列构成
8.2 定义候选键约束

用关键字 UNIQUE 定义 同上一

8.3定义非空约束

关键字 NOT NULL

8.4 定义CHECK 约束

8.4.1列约束

8.4.2表约束

11.18

1.第五六章 数据库管理与开发
insert [low_priority|delayed|high_priority] into 数据表名 values  //插入数据
eg:
2.视图

视图为虚拟表 里面没有数据

1.查看创建视图权限
SELECT Select_priv,Create_view_priv FROM mysql.user WHERE user='用户名'
//表示用户是否具有SELECT权限 Y/N  查看
//表示用户是否具有SELECT VIEW 权限   创建视图
//表示数据库下的user表
eg:select select_priv,create_view_priv from mysql.user where user='root';

2。创建视图
create [algorithm={undefined|merge|temptable}] view 视图名【(属性清单)】as select语句 【with [cascaded|local] check option];
eg: create view v_book (barcode,bookname,author,price,page,booktype) as select barcode,bookname,author,price,page,typename from tb_bookinfo as b,tb_booktype as t where b.typeid=t.id

//查看视图数据
select * from v_book;

3.查看视图
desc 视图名; //了解各个字段简单信息
show table status like '视图名';
//若全为空 视图为虚拟表  普通数据表可显示数据
show create view 视图名;//查看视图详细定义

4.修改视图
create or replace [algorithm={undefined|merge|temptable}] view 视图名【(属性清单)】as select语句 【with [cascaded|local] check option];
eg: create or replace view v_book (barcode,bookname,price,booktype) as select barcode,bookname,price,typename from tb_bookinfo as b,tb_booktype as t where b.typeid=t.id


alter view [algorithm={undefined|merge|temptable}] view 视图名【(属性清单)】as select语句 【with [cascaded|local] check option];
eg:alter view v_book (barcode,bookname,booktype) as select barcode,bookname,typename from tb_bookinfo as b,tb_booktype as t where b.typeid=t.id with check option;

5.更新视图
eg: update v_book set bookname='java web程序设计(慕课版)' where barcode='9787115418425';

6.更新视图的限制

7.删除视图
drop view if exists 视图名 [restrict|cascade];

11.19

1.触发器
1.1创建触发器
1.只有一个执行语句
create trigger 触发器名 before | after 触发事件(insert|update|delete) on 表名 for each row 执行语句
eg:
delimiter //
mysql> create trigger auto_save_log before insert on tb_bookinfo for each row insert into tb_booklog (event,logtime) values('插入了一条图书信息',now());
    -> //
  
  
  //向表中插入数据查看日志
 insert into tb_bookinfo 
 (barcode,bookname,typeid,author,translator,ISBN,price,page,bookcase,inTime,operator,del) values ('9787115418081','Oracle数据库管理与开发慕课版',5,'明日科技','','115',49.80,312,4,'2017-02-10','mr',0);

//日志中查询是否执行insert
select * from tb_booklog;

2.具有多个执行语句
delimiter //
create trigger 触发器名 before | after 触发事件(insert|update|delete) on 表名 for each row 
begin 执行语句列表 end
//

1.2
3.查看触发器
show triggers;
show triggers\G

4.查看triggers中触发器的信息
select * from information_schema.triggers;
select * from information_schema.triggers\G

5.查询指定名称的触发器
select * from information_schema.triggers where trigger_name = '触发器名称';

6.查询指定书局库对应的触发器
select * from information_schema.triggers where trigger_schema = '触发器名称';

1.3 使用触发器
执行顺序:before触发器->表操作->after触发器操作

7.删除触发器
drop trigger 触发器名称

11.22

1.创建存储过程与存储函数

1.创建存储过程
create procedure sp_name ([proc_parameter[,...]]) [characteristic...] routine_body;
sp_name 存储过程名称
proc_parameter 存储过程的参数列表 
characteristic 存储过程特性
routine_body sql代码内容

关键字 delimiter 更改结束标志

2.删除
drop procedure proc_name;

3.创建存储函数
create function sp_name ([func_parameter[,...]]) 
returns type //指定返回值类型
[characteristic...] routine_body
func_parameter: param_name type

2.变量
2.1声名局部变量 
declare var_name[,...] type [default value]
eg: declare id int;
 declare id int default 10;
 
 2.1声名全局变量
 eg:@t
 
 2.2赋值
 2.2.1 set
 set var_name = expr[,var_name=expr]...;
 expr 赋值表达式 set若为多个变量赋值 赋值语句间用逗号隔开
 eg: set id = 10;
 2.2.2 select...into
 select col_name[,...] into var_name[,...] from table_name where conditiono;
 eg: select price into book_price from tb_bookinfo where barcode = '12323213';
3.光标
1.声名光标
declare cursor_name cursor for select_statement
eg: declare cursor_book cursor for select barcode,bookname,price from tb_bookinfo where typeid=5;
2.打开光标 
open cursor_name;
3.使用光标 fetch...into
fetch cursor_name into var_name[,var_name]...
eg:fetch cursor_book into tmp_barcode,tmp_bookname,tmp_price;
4.关闭
close cursor_name;
4.调用
1.调用存储过程
call sp_name([parameter[,...]])
eg: 
set @bookid = 7;
call proc_name(@bookinfo,@borrowcount);
select @borrowcount;
2.调用函数
call/select? function_name([parameter[,...]];

5.查看
1. show status  查看数据库信息
show {procedure | function } status[like 'pattern'];
like 'pattern'  匹配过程或函数名
2.show create   查看详细信息
show create {procedure | function } sp_name;
3.修改
alter {procedure | function } sp_name [characteristic...]  characteristic:
{contains sql | no sql | reads sql data | modifies sql data} | sql security {definer | invoker} | comment 'string' //注释信息
子程序包含sql语句
不包含
读数据语句
写数据语句
指明权限执行 d 只有定义者可以执行 i 调用者可执行

eg:
alter procedure proc_count modifies  sql data security invoker;
4.删除
drop {procedure | function } [if exists] sp_name;

2.数据备份与恢复

恢复工具: mysqlimport.exe 备份: mysqlpump.exe
路径: usr/bin
一。备份
1.备份一个数据库 mysqldump命令
mysqldump -u root -p db_library>db_library.sql
                     数据库名        存放路径集名称
-- 开头 注释
/*! 40101 开头 只有版本大与4.1.1才能执行*/;
2.备份多个数据库 --databases
mysqldump -u root -p --databases dbname1 dbname2 >db_library.sql
3.备份所有数据库
mysqldump -u root -p --all--databases>BackupName.sql
4.查看mysql数据库文件保存位置命令
show variables like '%datadir%';
// /var/lib/mysql/ 
5.直接复制整个目录 
mysqlhotcopy  非自带  需要安装perl数据接口包  只能备份nylsam类型的表

二。恢复
先创建该数据库 再执行恢复操作
mysql -uroot -p [db_name] <backup.sql;
mysql -u root -p db_library <db_library.sql;
使用--all--databases参数恢复数据不用指定数据库

三。数据库迁移
3.1.1 复制数据库目录(主版本号相同的数据库、MyISAM类型 才可以)
3.1.2 使用命令备份和还原数据库
使用mysqldump命令
场景: 从一个名称为host1的主机中备份出所有数据库,将这些数据库迁移到名为host2的值主机上
mysqldump -h host1 -u root --password=password1 --all-databases | mysqldump -h host2 -u root --password= password2 
| 管道  password1 password2 用户密码 
该种方式可以解决版本不同的问题
3.2 不同数据库的迁移(其他数据库与mysql迁移)

四.表的导入和导出
导出:4.1
select ... into outfile 
select @@secure_file_priv;  // /var/lib/mysql-files/ 
在使用第一个语句的时候指定的目的路径必须是第二个语句所指定的目录
select * from tb_bookinfo into outfile '/var/lib/mysql-files/bookinfo.txt' fields terminated by '\.' optionally enclosed by '\"' lines starting by '\>' terminated by '\r\n';

/*You do not have the permissions necessary to view the contents of “mysql-files”.*/

1.fields terminated by '字符串':设置字符串为字段的分隔符,默认为'\t'
2.fields enclosed by '字符': 设置字符来括上字段的值 默认不使用任何符号
3.fields optionally enclosed by '字符': 设置字符来括上char varchar 和 text 等字符型字段 默认不是用任何符号
4.fields escaped by '字符': 设置转义字符 默认 /
lines starting by '字符串': 设置每行开头的字符 默认无任何字符
5.lines terminated by '字符串': 设置每行结束的字符 默认 /n


4.2 用mysqldump命令导出文本文件
mysqldump -u root -pPASSWORD -T "目标目录" dbname table [option];
PASSWORD root用户密码 option 附件选项
optioN选项:
同上标号部分 格式: --lines-terminated-by='字符串';

这些选项必须用双引号括起来 否则mysql无法识别
eg: mysqldump -u root -p --default-character-set=gbk-T "/var/lib/mysql-files/bookinfo.txt" db_library tb_bookinfo "--lines-terminated-by=\r\n" "--fields-terminated-by=、" "--fields-optionally-enclosed-by= “   ";

导出XML格式
mysqldump -u root -pPASSWORD(-p) --xml|-X dbname table>D:\name.xml;

4.3 mysql命令
文本
mysql -u root -pPASSWORD -e"select 语句" dbname >D:/name.txt;
xml
mysql -u root -pPASSWORD --xml|-X -e"select 语句" dbname >D:/name.xml;
html
---html|-H

11.25

1.mysql性能优化
 一.分析数据库性能
 show status like 'value';
 value参数:
 Connections: 连接服务器次数
 Uptime: mysql上线时间
 Slow_queries: 慢查询次数
Com_select:查询操作次数
Com_insert:插入操作次数
Com_delete:删除操作次数

 2.通过profile工具分析语句消耗性能
 show variables like '%pro%'; //查询是否开启profile工具
 set profiling=1; //开启profile工具
 
 场景:获取查询tb_student数据表中全部数据所需要的执行时间:
 select * from tb_student;
 show profiles;
 
 二。优化查询
 2.1分析查询语句
 explain|describe(desc) select语句
 eg: explain select * from tb_bookinfo;
 //
            id: 1  //在整个查询中select的位置
  select_type: SIMPLE
        table: tb_bookinfo 
   partitions: NULL 
         type: ALL //连接类型,该列存储着很多值 范围从const到ALL
possible_keys: NULL //指出为了提高查询速度 在mysql中可以使用的索引
          key: NULL //指出实际使用的键
      key_len: NULL
          ref: NULL
         rows: 1 //返回查询结果所检验的行数
     filtered: 100.00
        Extra: NULL  //包含一些其他信息 设计mysql如何处理查询
        
2.2 索引对查询速度的影响
创建索引
create index index_name on tb_bookinfo(bookname);

2.3 使用索引查询
2.3.1 like关键字
explain select * from tb_bookinfo where bookname like '%Java%';
若前方有%,则不采用索引 可以取掉第一个%;

 2.3.2 使用多列索引
 2.3.3 使用or关键字
 
 三。优化数据库结构
分解成多个表
增加中间表
优化插入记录速度
1.禁用索引插入记录前禁用索引,记录插入完毕后开启索引
禁用索引语句: alter table 表名 disable keys;
开启语句: alter table 表名 enable keys;
2.禁用唯一性检查
禁用 set unique_checks=0;
开启 set unique_checks=1;
3.优化insert语句
3.1 一个insert插入多条数据
3.2一个插一条 插多次 
3.3 load data infile语句?

分析|检查|优化 表
analyze|check|optimize table 表名
check table 表名 [option]
check可检查InnoDB和MyISAM类型的表是否存在错误 还可以检查视图是否存在错误  option参数:quick fast changed medium extended 执行效率一次降低 option选项只对MyISAM有效
optimize只能优化表中的varchar bilb text 字段 对InnoDB和MyISAM都有效
+------------------------+---------+----------+----------+                                         信息类型:状态、警告、错误、信息
| Table                  | Op 执行的操作     | Msg_type | Msg_text | 显示信息
+------------------------+---------+----------+----------+
| db_library.tb_bookinfo | analyze | status   | OK       |
+------------------------+---------+----------+----------+

四。优化多表查询
用select子查询

五。优化表设计
1.字段长度设置称其可能应用的最大范围
2.使用optimize table 命令

2。事务与锁机制
事物
1.关闭自动提交	
show variables like 'autocommit';  //查看是否开启
显示关闭自动提交
set autocommit = 0;
autocommit为会话变量 只在当前命令行窗口有效 
隐式
start transaction

2。回滚
rollback;

3.事务提交
显示提交
commit;
隐式提交
set autocommit=1;

4.回退点
savepoint 回退点名;
rollback to savepoint 定义的回退点名;

锁机制
类型 读锁 写锁
二者区别
               读锁              写锁
读锁            兼容            不兼容
写锁           不兼容            不兼容

锁策略
表级锁 行级锁

2.MyIsam表的表级锁
基本步骤
 1为指定数据表添加锁定
lock tables table_name lock_type;
lock_type read|write
 2 用户执行数据表操作(添加 删除 更改)
 3.解锁
 unlock tables;
 
 2.1以读的方式锁定数据表
 锁定用户其他方式操作 如删除 插入 更新不被允许
 
 2.2以写的方式锁定数据表
 lock table table_name write;
 锁定的表 可以对自己进行查询操作 但是打开一个新的会话 不可进行操作
 
 3.InnoDB 表的行级锁
  3.1在查询语句中设置读锁
  select语句 lock in share mode;
  3.2在查询语句中设置写锁
  select语句 lock update;
  3.3在更新语句中(insert update delete) InnoDB存储引擎自动为更新语句影响的记录添加隐式写锁
 
 
 4.事物的隔离级别
 (1)Serializable(串行化)
 (2)Repeatable Read(可重复读)
 (3)Read Committed(读已提交数据)
 (4)Read Uncommitted (读未提交数据)
 并发性能越来越高
 
 设置事物的隔离级别
 set {global | session } transaction isolation level 具体级别
 

猜你喜欢

转载自blog.csdn.net/qj6837/article/details/84573887