MySQL
MySQL:一个数据库管理系统(DBMS)
数据库分类
- 关系型数据库 (SQL)
- Mysql , Oracle , Sql Server ,DB2 ;
- 通过表和表之间,行和列之间的关系进行数据的存储;
- 非关系型数据库 (No SQL) Not only SQL
- Redis, MongDB;
- 以对象存储,通过对象自身的属性来确定;
命令行常用操作
黑窗口下操作数据库
mysql -u root -proot --链接数据库
-- 所有的语句都需用 分号结尾;
show databases; -- 查看所有的数据库;
use school ; --使用 school 数据库 use 数据库名(使用某数据库)
show tables; --显示 数据库中的所有表 ;
describe studnet ; --显示student表的信息; describe 表名(显示某表的信息)
create database person; -- 创建一个数据库; create database 数据库名
exit; --退出链接
操作数据库
操作数据库>操作数据库中的表>操作数据库中表的数据;
mysql的数据库不区分大小写;
- 创建数据库
create database [ if not EXISTS] myDatabase; -- []选写。 创建 myDatabase 数据库
- 删除数据库
drop database [if exists] myDatabase; --删除 数据库 myDatabase
- 使用数据库
use myDatabase; --使用 数据库 myDatabase;
--如果表面和字段名 是一个特殊字符,就需要带 ``;
- 查看数据库
show Databases; #查看所有的数据库
数据类型
MySQL中的数据类型:
整数
- tinyint 十分小的数据 1个字节
- smallint 较小的数据 2
- mediumint 中等大小的数据 3
- int 正常大小 4
- bigint 较大 8
浮点数
- float 4个字节
- double 8
- decimal 字符串形式的浮点数,一般用于金融计算
字符串
- char 字符串固定大小 0-255
- varchar 可变字符串 0-65535 常用 String
- tinytext 微型文本 2^8 - 1
- text 文本串 2^16 -1 保存大文本
时间日期
- data YYYY-MM-DD 日期格式
- time HH : mm : ss 时间格式
- datatime YYYY-MM-DD HH : mm : ss 常用的时间格式
- timestamp 时间戳 1970.1.1 到现在的毫秒数
- year 表示年份
null : 空;
数据库表
创建表
create table if not exists `student`(
`id` int(4) not null auto_increment comment '学号', -- auto_increment 自增。 comment 注释 ,
`name` varchar(30) not null default '匿名' comment '姓名', -- default 默认值
`pwd` varchar(20) not null default '123456' comment '密码',
`sex` char(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 -- engine=innodb 数据库引擎 表类型 innodb, charset = utf8 字符集 utf8 默认的字符集不支持中文
创建表的格式:
create table [if not exists] `表名`(
`字段名` 列类型 [属性] [索引][注释],
...... ,
`字段名` 列类型 [属性] [索引][注释]
)[表类型] [字符集设置] [注释]
常用命令:
show create database test; #查看创建数据库 test 的语句 test数据库名
show create table student; #查看创建 student 表的语句 student 表名字
desc student; #查看表的具体结构 desc 表名
修改表
#修改表面 alter table 旧表名字 rename as 新表名
alter table student rename as student1 # student表名改为student1
#增加表字段 alter table 表名 add 字段名 列类型;
alter table student1 add `age` int(3); # 给 student 表增加 age字段
#修改表的字段(重命名,修改约束)
alter table student1 modify age varchar(11); #一般用 modify修改约束,它不能修改字段名 :alter table 表名 modify 字段名 列类型
alter table student1 change age age1 int(2);# 用 change修改表面和约束 : alter table 表名 change 旧字段名 新字段名 列类型
#删除表的字段 alter table 表名 drop 字段名
alter table student1 drop age1;
删除表
#删除表 drop table [if exists] 表名
drop table if exists student; #删除 sutdent表
数据管理
DML语言:数据操作语言;操作表中的数据;
- insert
- update
- delete
添加(增)
语法:insert into 表名 (字段1,字段2,…) values (‘值1’,‘值1’,…),(‘值2’,‘值2’);
# 语法: insert into 表名 (字段1,字段2,...) values ('值1','值1',...),('值2','值2');
insert into `student1` (`name`) VALUES ('张三');# 插入一条name为张三的数据
insert into `student1` (`name`,`pwd`) values ('李四','qwerty'),('王五','1111');#插入两条 数据
/*
字段 和 值 之间 要一一对应; 可以插入多条数据,values后面的值用逗号隔开;字段可以省略,但是值必须包含所有字段且一一对应;
*/
修改(改)
语法: update 表名 set 字段名 = 值,字段名 = 值,… where 条件
#语法 update 表名 set 字段名 = 值,字段名 = 值,... where 条件
update student1 set `name` = '锋儿' where id = 1; #将id 等于 1 的 数据 name 名字改为 烽儿
update student1 set `name` = '烽儿'# 不加条件会将表中所有的值改变;
update student1 set `name` = '烽子' sex = '男' where id between 1 and 5; #可以修改多个字段
# 值可以为 变量
条件有 and , or , between and , <= ,>= ,=; !=,
删除(删)
语法:delete from 表名 where 条件
# delete from 表名 where 条件
delete from `student1` where id = 3; #删除 student1表中 id = 3 的记录 //删除一条记录
delete from `student` #不加条件,会删除整个表
# 删除表 truncate table 表名
truncate table `student1`# truncate 方式删除表名会使自增清零,而 delete 会保留自增记录;
DQL查询数据
简单查询
DQL: data query language ,数据查询语言;
- 查询表中的字段
语法:select 字段1 [as 别名],字段2,… from 表名;
#查询表中的字段 语法: select 字段1 [as 别名],字段2,... from 表名
select * from student1 ; # * 表示查询表的所有字段
select `name`,`pwd` from student1; #查询 student1 表 中的 name pwd 字段;
select `name` as 名字 from student1; # 给 字段加一个别名 ,也可以给表起别名
select concat("姓名:",name) from student1; # concat 函数, 在查询结果上加上指定的字符串; concat(str1,str2); str1为添加的字符串,str2为字段名
- 去重关键字 distinct; 去除查询结果中重复的数据,只保留一条;
语法: select distinct 字段1,字段2… from 表名; 只保留一条多个相同的数据;
select distinct `name` from student1; # 去除查询结果中 name相同的数据
select distinct `name`,`pwd` from student1; #去除 查询结果中 name,pwd都相同的数据
在查询中后可以增加where子句限制查询条件
-
模糊查询: 比较运算符
运算符:
-
is null
-
is not null
-
like %代表0-任意一个字符 _(表示一个字符)
select `id`,`name` from student1 where name like '烽_' ; #查询 name 以 烽开头 后面有一个字符的 # 字符% : 查询 以字符开头 后面任意字符的 - in :查询在某个范围的数据 , in 查询的是 一个或多个 具体的值; ```sql select `id`,`name` from student1 where id in (1,2,3); #查询 id 在 1 2 3 的 id和name
-
联表查询
当查询的字段 不在同一张表中时,需要用到联表查询; jion on
语法:
select 字段1,字段2,... #若两个表中都有某一个字段,需要指定从哪张表查询该字段, 通过 别名.重复字段名 的方式;
from 表1 as 别名
inner join 表2 as 别名 # (inner left right) join
on 条件; # 等值判断 ,一般为两个表的交叉点字段,使 交叉点相同
# 有一张student学生表,字段有 id 学号, name。还有一张 grades成绩表 ,字段有 id,科目subject,成绩grade
# 查询 id,name,subject,grade ; 确定交叉点为 id
select s.id,name,subject,grade # 两张表都有 id ,需要指定查询哪张表的id ; s.id
from student as s # 为表取别名
inner join grades as g # 为表取别名
on s.id = g.id; # 等值判断, join on , on 也可以用 where 代替;
- inner join
- left join 左连接 : 以 左表为基准, 先查询左表中拥有的字段返回结果后 查询右表;
- right join 右连接 : 以 右表为基准, 先查询右表中拥有的字段返回结果后 查询左表;
分页和排序
- 排序,升序 asc , 降序desc
语法: select … //通过 select 查询出结果
order by 字段名 asc(desc) // 再 使用 order by 排序, 字段名为按照 该字段进行排序
select `id`,`name` from student1
order by `id` desc #将查询结果 按照 id 号 降序 排列
- 分页 limit
语法:limit 起始值,页面的大小
select `id`,`name` from student1
order by `id` desc #将查询结果 按照 id 号 降序 排列
limit 0,3; #分页 从 第一条1 条数据开始,显示3条数据;
/*
limit (n-1)*paperSized,paperSize ; paperSize 页面大小,起始值 (n-1)*paperSize n:当前页
上述表示 从0开始显示数据,第n也得 limit 公式;
*/
子查询
where 的条件是计算出来的,本质就是在 where 中 嵌套一个查询;(由里及外)
语法: select 字段… from 表名 where 字段 = (select 字段 from 表名);
聚合函数
语法: select 函数名(字段) from 表名;
- count() 计数
select count(name) from student1 # 指定字段计数,会忽略null值
select count(*) from student1; # * 或者 1 也可以查询表有几条数据,但是不忽略null
select cout(1) from student1;
- sum()
- avg()
- max()
- min()
分组和过滤:
group by 字段名 //根据 字段名进行分主
having 条件 //分组之后不能使用 where 过滤数据,需要使用 哈having
事务
事务:要么成功,要么失败,没有中间状态;
事务原则 :ACID :原子性,一致性,隔离性,持久性;
- 原子性:要么都成功,要么都失败;
- 一致性:事务前后的数据完整性保证一致;
- 隔离性:事务之间相互隔离,不被其他事务干扰;
- 持久性:事务一旦提交则不可逆,被持久化到数据库;
事务隔离的级别:
- 脏读:读取了未提交的数据;
- 不可重复读:多次读取数据的结果不一样
- 幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。
事务执行:
事务执行成功则 ( commit )提交,若不成功 (rollback)回滚
# mysql 默认开启事务
set autocommit = 0 # 关闭自动提交;
set autocommit = 1 #开启自动提交;默认;
#手动出处理事务
set autocommint = 0; #关闭自动提交
start transaction # 标记一个事务的开始 ,从这个之后的sql都在同一个事务里;
...(事务内容)
commit #提交事务,持久化成功;
rollback #回滚 ,回到事务原来的位置;提交失败;
set autocommint = 1 #开启自动提交;
savepoint #保存点名字,设置一个事务暂存点;
rollback to savepoint #回滚到保存点;
release savepoint #撤销保存点
索引
索引就是帮助MySQL高效获取数据的数据结构;
索引的分类:
- 主键索引(primary key) :唯一标识,主键不能重复,只能有一个列为索引;
- 唯一索引(unique key) :避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引;
- 常规索引(key / index) :默认的
- 全文索引(FullText) : 特殊的数据库引擎下有,快速定位数据;
索引的使用:
- 在创建表时给字段增加索引;
- 创建表完毕后,增加索引;
show index from student1 #显示表所有的索引信息
#增加一个索引 alter table 表名 add 索引类型 索引名(列名);
alter table student1 add key `indexname`(name);#给 student1 表 的 name 字段添加一个默认常规索引;索引名为 indexname
# explain + select语句 查看查询语句执行状态
索引原则:
- 索引不是越多越好;
- 不要对经常变动的数据加索引;
- 小数据量的表不需要加索引;
- 索引一般加在经常查询的字段上;
用户管理
create user 用户名 identified by '密码'; #创建用户
set password = password('新密码'); #修改当前用户的密码;
set password for 用户名 = password('新密码'); #修改指定用户的密码
rename user 旧用户名 to 新用户名 ; #修改用户名
grant all privileges on *.* to 用户名; #授予用户全部的权限 , 但是不能给其他用户授权;
show grants for 用户名; #查看指定用户所有的权限
revoke all privileges on *.* from 用户名;#撤销用户所有的权限
drop user 用户名; #删除用户;
备份
MySQL数据库备份的方式
- 直接拷贝物理文件(MySQL安装目录的data文件夹)
- 在MySQL的可视化工具中手动导出;
- 使用命令行 mysqldump 导出;
# mysqldump -h 主机 -u 用户名 -p密码 数据库 表名1 表名2 ... >物理磁盘位置/文件名 mysqldunp -h localhost -u root -p root school student > d:/a.sql; #命令行导出 #导入文件 source 备份文件; source d:/a.sql #登录的情况下使用source命令;
三大范式
-
第一范式
原子性:保证每列不能再分;
-
第二范式
前提:满足第一范式;
第二范式需要满足每张表只描述一件事情;
-
第三范式
前提:满足第一,二范式;
第三范式需要满足表中的每一列都必须和主键之间相关不能是间接相关;