目录
前言:要进行数据表 的操作,前提是一定要选择数据库
创建表
属性类型
数值类型
- INT对应普通整型 -2^31~2^31
- BIGINT对应长整型 -2^63~2^63
- DECIMAL(4,2),就表示这个双精度浮点数长度是4,小数部分2位,90.12就可以,但是100.1就不行
字符串类型
- 文本字符串就是我们打开文件能看懂的字符串,二进制我们看不懂,比如*.java就是字符串,*.class文件就是二进制字符串
- varchar(10),表示存储的字符串是可变的,其最大长度为10,char(10),表示字符串不可变,什么数据存储进去就是长度就是10
日期类型
- 有个时间戳的概念,就是现在的时间距离1970年1月1日0点的秒数,是一个长整型的数据
- select now();表示展示现在系统的时间
- 我们在输入日期类型的时候也要按照这个规格 yyyy-MM-DD hh:mm:ss
- 只有年月日的话,那么时分秒都是00:00:00
- 如果只有时分秒,那么就被当成年月日输入
实例
- comment表示给当前属性添加备注 ,表示这个属性有什么意义
查看有当前数据库的数据表
show tables;
- 其实数据就对应操作系统的文件夹,数据表就是文件夹中的文件
- *.frm文件保存了数据表的结构(数据表中有那些属性,属性类型等)
- .*ibd文件存储了具体的数据以及索引信息
- 查看数据库文件存储的路径,一般默认都是在C:\ProgramData\MySQL\MySQL Server 5.7\Data\
查看某个表的具体结构
desc 表名;
查看注释信息
show create table 表名;
删除表
drop table [if exists] 表名;
- 这跟删库一样,都是危险操作
- 但是存在恢复操作 公司每个数据库都是定期备份,当发生错误的时候可以还原
- MySQL自带的binlog机制,通过binlog恢复数据(每在数据库进行一个修改操作,都会在binlog文件中记录这一动作)
- 特殊的磁盘恢复工具
修改表结构
新增一个属性
alter table 表名 add 新属性名称 新属性类型;
修改表名
alter table 旧表名 rename 新表名;
修改表的字符集
alter table 表明 convert to character set 字符集;
删除某一列
alter 表名 drop 列名称;
修改某一列的属性或者类型
alter table 表名 change 原字段名称 新字段名称 类型[约束];
- 也可以用这个语句来只改类型,就是新字段名和原字段名保持相等
插入表的数据 insert
插入一行数据
insert into 表名(属性名称....) values(对应的属性值)
单行插入部分数据
- 若有的属性没有插入,默认值就是NULL
单行插入全列数据
- 在插入的时候不指定列名,那么就是单行全列插入,如果values中不写全,就会报错
多行插入
多行部分列插入
insert into 表名(属性名....)values(属性值),(属性值)....;
多行全列插入
insert into 表名 values (属性值),(属性值)....;
查询表的数据 select
查找全行全列
seletc * from 表名
- 一般不推荐,因为效率很低
查找指定列
select 列名称,列名称..... from 表名;
- seletc得到的数据相当于一张临时表,以二维表的形式展示数据,这张表的数据不会对数据库里的内容造成影响
查询字段表达式
查询字段取别名
select 列名 as 新名词 from 表名;
去重查询
select distinct 列名称 from 表名
select distinct 列名称1,列名称2...组合属性去重,就是这几个列完全一模一样才算重复元素
按结果集排序
select 列名称 from表名 order by 列名称[asc|desc],
默认是升序asc
desc是降序
关于NULL的排序
- NULL在排序中,最小的值
按多个列的条件去排序
- 先按照chinese升序(前提),如chinese相同,就按照math降序排序
分页查询
select 属性名称 from 表名 limit n;
- 这样就是输出前三行的数据
select 属性名称... from 表名 limit n,offset s;
- limit n表示输出n行,offest s,表示从s+1行开始输出
- 如果n大于行数,那么就全部输出
- 如果s大于行数,就输出找不到,
条件查询where
查询所有成绩大于200的同学的姓名和总成绩
- where不能用别名来作为判断条件,但是order by支持别名
- 因为order by执行顺序是已经把结果查出来了,只是给查出的数据排序(select查出来的结果对order by已经可见了)
- where的执行顺序是在select之前的,因为只有先满足where,才能选择出来,所以执行where的时候,seelect还没执行
关于NULL的条件查询
- mysql中的null不包含在< <= > >=.null=null也不支持,我们有专门的运算符去判断,
- 如果数据中有一个是NULL,那么比如像+的这种操作得到的数据就是一个NULL
区间查询between...and..
查询一个语文成绩在85到95分同学姓名和语文成绩
包含查询 in
查询数学成绩是20,90.5,90的同学姓名和数学成绩
模糊查询like
查询名字中包含羊的name
%字符%
查询名字中第二是羊,且名字长度为3
_字符_
修改表的数据
update 表名 set 列名=(表达式——根据这个表达式来确定修改的行)
修改一行一列
将孙悟空的math成绩+10;
修改一行多列
将猪八戒的math和english的成绩+10
修改多行数据
修改所有名字有羊的math加五分
- 满足条件的有3行数据,但是修改的只有2行,因为null不参与+这种运算,所以修改的就是2行
修改全部行的数据
不带where条件,就默认修改所有行的数据
删除表的数据delete
delete from 表名 where +条件
- 如果不加where,就是全表删除,原理是一行行进行delete,delete删除慢,可以恢复,可以加条件
- truncate table 表名 ,这个就是直接将标准的数据清除,删除快,数据不可恢复,不能加条件,相当于把这个表的文件大小变成0
- drop一个表,就是直接将表的文件删除了
表的约束以及设计(数据库三范式)
数据库的约束:对于某一列的值能添加那些内容做出一定的限制,这种限制就叫做约束,如果没有任何约束的话,会存在很大的安全隐患
约束类型
NULL约束
- not null表示不能将空值写入
如何在创建表之后添加非空约束呢?
- 因为非空这种是属于表的结构,所以使用alter +change
- 在修改为非空的时候,必须要将当前表中值为null的行删除或者修改成非空
唯一约束 unique
- 唯一约束表示的就是这个属性的字段只能出现一次,不能重复,但是在表中唯一约束的属性可以有多个
- 约束对应唯一键,索引
查看唯一约束
唯一约束存储null的情况
- null不受唯一键的约束
创建表之后修改某个字段为唯一约束
alter table 表名 add unique(属性);
默认值约束default
- 规定了默认值,在插入数据的时候,若没有指定该列,则使用默认值插入数据
- 若显示对默认值插入null,不会触发默认值
主键约束 primary key-索引
- 一张表只能有一个主键,primary key=unique+not null
- 主键可以由多个列共同组成——联合主键
- 在Mysql中同时设置not null和unique就会自动被设置为主键
删除主键
alter table 表名 drop primary key;
创建表之后添加主键
alter table 表名 add primary key(属性);
创建联合主键
alter table 表名 add primary key(属性);或者在创建表的时候在最后一行写
- 复合主键,只有所有的属性相同才被认为是相同的,部分相同不算相同
auto_increment自增主键
1可以显示插入null或者不写,自动触发自增功能
2关于自增主键删除之后的自增情况
- 新增的主键是以出现过的最大值为基值+1
3显示给自增主键插入一个值
- 新增的自增主键是以出现过最大的值为基值+1
4truncate删除表后的自增主键情况
- truncate删除表,会重置自增主键
外键约束 foreign key
涉及多个表之间的联系,比如有一个学生表,有一个班级表,学生表中应该有一个属性是班级信息,不然不知道是那个班的
- 如果在学生表插入class_id,在班级表中也必须id对应的值才行,不然就会报错
- 英文class表有对应的班级号为1的班级,所以在学生表中插入class_id为1的数据成功,因为是先有的班级,才有的班级对应的学生,这种约束就是外键约束
关于外键约束的删除
- 要删除一个班级,先要将班级中每个同学都解除跟这个班级的联系,不然就不能删除这个班级
Check约束
对于MySQL来说就是直接忽略,其语义是只能选择给定的值
- 比如sex属性只能输入男或者女