一、回忆:
1、为什么使用数据库:
1.1、因为之前使用数组、集合存储数据都是在内存中,每一次关闭打开系统数据都会丢失;
1.2、使用文件存储数据、需要频繁打开关闭流,比较费时耗力。
1.3、使用数据库是最好的选择。
2、数据库的分类:
2.1、关系型数据库:MySQL、oracle、DB2、SqlServer、等
2.2、非关系型数据库:Redis、MongoDB等
3、数据库的关系:
数据库是提供服务,叫做DBMS,数据库管理系统
管理数据( DB)(数据库、表、表数据)
数据库操作语言加SQL
DBMS负责执行SQL语句,通过SQL语句来操作DB中的数据。
4、SQL的分类:
4.1、DDL:定义语言:create、drop、alter、对库和表的结构进行增删改
4.2、DML:操作语言:insert、delete、updata对表的数据进行增删改
4.3、DQL:查询语言:只要是select语句都是DQL,对表中数据进行查询
4.4、DCL:控制语言:授权、撤销权限、逻辑判断等。
4.5、TCL:事务控制:commit提交、rollback回滚、
5、对数据库的增删改查:
5.1、增:
create database 数据库名;
create database 数据库名 character set '字符集';
5.2、删:
drop database 数据库名;
5.3、改:
alter database 数据库名 character set '字符集';
5.4、查:
show databases;显示所有
show create database 数据库名;显示某个数据库的创建语句,包括字符集。
6、数据库创建表之前,需要先选中某个数据库
use 数据库名;
select database();查看当前数据库的名字;
7、数据库数据类型:
整形:tinyint、int 、bigint
浮点型:float、double
字符型:char、varchar(字符长度)
日期型:date、datetime
大文件:blob(二进制文件视频图片等)、text大文本
8、数据库表的增删改查:
8.1、表的创建
create table 表名(
列名 数据类型(数据长度),
列名 数据类型(数据长度),
...
);
8.2、desc 表名;查询表的结构;
二、数据库
1、约束
1)、什么是约束:在创建表的时候,可以给某些字段 添加一下相应的约束,比如某个字段不能为空。
2)、添加约束的目的:为了保证表中的数据合法、合理、有效、完整。
3)、常见约束:
非空约束:not null:表示约束的字段不能为null;账号不能为空,性别不能为空
唯一约束:unique:表示约束的字段不能重复;
主键约束:primary key:表示约束的字段不能为null,并且不能重复
外键约束:foreign key:表示当前字段与另一个表中的字段有关系,FK
(oracle数据库还有一个检查约束,mysql没有)
2、非空约束:not null 不能为空,空会报错。
drop table if exists t_user;
create table t_user(
id int,
t_name varchar(20) not null,
t_age int
);
insert into t_user (id ,t_name, t_age) values(1,'zhangsan',18); 正常
insert into t_user (t_name, t_age) values('lisi',19); 正常
insert into t_user (t_name) values('wangwu'); 正常
insert into t_user ( id,t_age) values(4,18); 会报错
ERROR 1364 (HY000): Field 't_name' doesn't have a default value
3、唯一约束:(字段的值具有唯一性,不允许重复,但是可以为null) unique
3.1、单列唯一约束:
drop table if exists t_user;
create table t_user(
id int ,
t_name varchar(20) unique,
t_phone varchar(11) unique,
t_age int
);
insert into t_user (id ,t_name, t_age) values(1,'zhangsan',18); 正常
insert into t_user (id ,t_name, t_age) values(2,'zhangsan',19); 会报错 因为值重复了
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 't_name'
insert into t_user (id ,t_name, t_age) values(2,'zhangsi',19); 正常
insert into t_user (id ,t_name, t_age) values(2,'zhangwu',19); 正常
insert into t_user (id,t_age) values(2,19); 正常,并且唯一约束的值可以为null
3.2、多列唯一约束:
drop table if exists t_user;
create table t_user(
id int ,
t_name varchar(20) ,
t_age int,
unique (id,t_name)
);
insert into t_user (id ,t_name, t_age) values(1,'zhangsan',18); 正常
insert into t_user (id ,t_name, t_age) values(2,'lisi',19); 正常
insert into t_user (id ,t_name, t_age) values(2,'lisi',20); 报错
ERROR 1062 (23000): Duplicate entry '2-lisi' for key 'id'
insert into t_user (id ,t_name, t_age) values(3,'lisi',20); 正常
4、主键约束:(primary key)(不能为null也不能重复。)
4.1、作用:主键的值 既不能为null,也不能重复
drop table if exists t_user;
create table t_user(
id int primary key ,
t_name varchar(20) ,
t_age int
);
insert into t_user (id ,t_name, t_age) values(1,'zhangsan',18); 正常
insert into t_user (id ,t_name, t_age) values(2,'lisi',19); 正常
insert into t_user (t_name, t_age) values('zhangsan',18); //报错了,不能为空
ERROR 1364 (HY000): Field 'id' doesn't have a default value
insert into t_user (id ,t_name, t_age) values(2,'wangwu',19); //报错了,不能重复
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
总结:id是主键,id字段的值,既不能为null,也不能重复。
主键叫做primary key ,主键一般是一个字段,但是也可以是多个字段联合(不建议用多个字段联合在一起表示主键,不要用违背三大范式)
drop table if exists t_user;
create table t_user(
id int ,
t_name varchar(20) ,
t_age int,
primary key(id)
);
4.2、分类:
1)、根据主键的字段数量划分为:单一主键和复合主键(不用);
2)、根据主键的性质来划分:自然主键和业务主键
自然主键:这个主键值跟业务没有任何关系,是一个自然数
业务主键:主键值跟业务相联系。(身份证号、银行卡号、学号等)
3)、推荐使用自然主键,因为业务主键可能会随着数据的变化而变化,变化之后可能与主键重复,不建议使用业务主键。
***在一张表中主键只能有一个
4.3、主键自增
只有mysql有主键自增,从1开始,每次增加1
drop table if exists t_user;
create table t_user(
id int auto_increment,
t_name varchar(20),
t_age int,
primary key(id)
);
drop table if exists t_user;
create table t_user(
id int primary key auto_increment ,
t_name varchar(20),
t_age int,
);
insert into t_user (t_name, t_age) values('zhangsan',18);
insert into t_user (t_name, t_age) values('zhangsi',10);
insert into t_user (t_name, t_age) values('zhangwu',19);
insert into t_user (t_name, t_age) values('zhangliu',29);
当主键设置的自增时,可以不为主键填值。
5、默认约束:(default默认值)
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,
t_name varchar(20) ,
t_gender char(4) default'男',
t_age int
);
insert into t_user (t_name, t_age) values('zhangsan',18);
insert into t_user (t_name, t_age,t_gender) values('zhangsi',18,'女');
三、表操作语句
1、select * from t_user; 查看该表的信息
2、show ta5/5bles; 查看当前所有表
3、desc 表名;查表结构
4、show create table 表名; 查看表的创建语句;
5、修改表的结构:
数据库这种东西,是协作团队共同沟通商议确定下来的,有那些表,表中有哪些字段,字段什么类型,都是商量后确定的结果。如果需要更改说明团队早期确定数据库的时候犯了错误,没有考虑这种情况。
5.1、alter table 表名 add 列名 类型(长度) 约束;增加一列
alter table t_user add t_phone varchar(12) unique;
5.2、alter table 表名 modify 列名 类型(长度) 约束;修改现有列的类型,长度约束(很少使用)
alter table t_user modify t_phone varchar(20) unique;
5.3、alter table 表名 change 旧列名 新列名 类型(长度) 约束 ;修改现有列的名称
alter table t_user change t_phone cellphone varchar(20) unique;
5.4、alter table 表名 drop 列名 ; 删除一列
alter table t_user drop t_cellphone;
5.5、rename table 旧表名 to 新表名 ; 修改表名;(很少用)
rename table t_user to tb_user;
5.6、alter table 表名 character set 字符集; 修改表的字符集;(不到万不得已不建议修改)
alter table tb_user character set 'gbk'
6、表数据新增
insert into 表名(列名,列
名。。。。)values(值,值。。。。);(可以省略部分列名)
省略列名:insert into 表名 values(值,值,值);(所有列都需要传值,顺序不能变。)
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,
t_name varchar(20) ,
t_gender char(4) default'男',
t_age int default 18
);
主键主动赋值为null,mysql会自动赋值并覆盖null;
批量添加数据:
insert into t_user values(null,'xiaobai','nv',20),(null,'111','nv',20),(null,'222','nv',20),(null,'333','nv',20);
7、update 语句(修改表记录)
写法:update 表名 set 字段名=字段值 where 条件;
不写wehre 就是把所有列数据修改。
8、delete语句(删除表中数据的语句)(删除的是行,不能删除列)
delete from 表名 where 条件;
delete from t_user where t_name='zs';
truncate table 表名; 删除表的所有记录;(删除的时候是把表删除了,然后再创建了一个相同名字的表);
四、注意:
1、删除某个表:drop table 表名; 没有这个表,会报错。
drop table if exists 表名;判断表是否存在存在就删除;推荐用这个。
2、唯一和主键约束的区别
2.1、唯一约束可以是空(null)。 但是主键约束不能为空
2.2、一张表中只能有一个主键,但是唯一约束可以有多个。
3、要慎用表数据的删除,(一般是逻辑删除),(用一个字段表示删除,删除时修改这个字段的值,不能物理删除(完全删除这条记录,不能恢复))(删除的是行,不是列。)