备注:Server version: 5.7.20
一、建表语句:
/*
建立一个存储学生信息的表,
字段包括:学号、姓名、性别、年龄、入学日期、班级,email等信息。
*/
-- 创建数据库表
create table t_student(
sno int(6), -- 6是定义的显示长(款)度,不代表数据类型占用的字节数,长度不够的话MySQL会自动增加长度。
-- 注意:不是所有的类型超过定义的长度后MySQL都会自动扩充,比如:score double(4,1)表示小数部分为1,总宽度为4,并且不会自动扩充。
sname VARCHAR(5), --5个字符
sex CHAR(1),
age int(3),
enterdate date,
classname VARCHAR(10),
email VARCHAR(15)
);
二、查看表结构:
1.sql:
desc t_student;
2.查询结果:
三、查看建表语句:
1.sql:
show create table t_student;
CREATE TABLE `t_student` (
`sno` int(6) DEFAULT NULL,
`sname` varchar(5) DEFAULT NULL,
`sex` char(1) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
`enterdate` date DEFAULT NULL,
`classname` varchar(10) DEFAULT NULL,
`email` varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
2.查询结果:
四、插入语句:
1.sql:
insert into t_student values(1,'张三','男',18,'2024-04-19','软件工程1班','123@163.com');
2.注意事项:
1.int宽度是显示宽度,如果超过,可以自动增大宽度,int底层都是4个字节;
2.时间的方式多样"1256-12-23";"1256/12/23","1256.12.23";
3.字符串不区分单引号和双引号;
4.如何写入当前的时间now(),sysdate(),CURRENT_DATE();
5.char varchar是字符的个数,不是字节的个数,可以使用binary,varbinary表示定长和不定长的字节个数;
6.如果不是全字段插入数据的话,需要加入字段的名字;
-- 以下sql均正确:
insert into t_student values (1,'张三','男',18,'2022-5-8','软件1班','123@126.com');
insert into t_student values (10010010,'张三','男',18,'2022-5-8','软件1班','123@126.com');
insert into t_student values (2,'张三','男',18,'2022.5.8','软件1班','123@126.com');
insert into t_student values (88,"tony",'男',18,'2024/4/19','软件1班','123@126.com');
insert into t_student values (8,"张三",'男',18,CURRENT_DATE(),'软件1班','123@126.com');
insert into t_student values (9,"易烊千玺",'男',18,now(),'软件1班','123@126.com');
insert into t_student (sno,sname,enterdate) values (10,'李四',SYSDATE());
五、查询语句:
1.sql:
select * from t_student;
2.结果:
六、修改和删除数据:
1.注意事项:
①关键字、表、字段名不分大小写;
②默认情况下内容不分大小写;
③删除操作from关键字不能少;
④修改、删除操作不能忘记加限制条件。
2.操作:
修改数据:
update t_student set age=20 where sname='tony';
删除数据:
delete from t_student where sno=2;
七、修改表结构
1.增加一列:
alter table t_student add score double(5,2); --5:存放数据的数字总位数(有5个数字);2:小数点后的位数
alter table t_student add score double(5,2) FIRST; --增加一列放首列
alter table t_student add score double(5,2) AFTER sex; --增加一列放sex和age字段之间
2.给新增字段填数据:
update t_student set score=123.5678 where sno=1; --多余位数测小数会四舍五入之保留两位
3.删除一列:
alter table t_student drop score;
4.修改一列:
-- 修改字段能存放的数字位数和小数点后数字位数之后,原来的数据会按照新设定的要求显示,原来的123.57会四舍五入显示成123.6
-- modify修改的是字段的数据类型,不修改字段名字
alter table t_student modify score float(4,1);
alter table t_student change score score_new double(5,1); -- change修改列名和列的类型定义
5.删除整张表:
drop table t_student;
八、表的完整性约束:
1.非外键约束:
/*
建立一张用来存储学生信息的表
字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
约束:
建立一张用来存储学生信息的表
字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
【1】学号是主键 = 不能为空 + 唯一 ,主键的作用:可以通过主键查到唯一的一条记录【2】如果主键是整数类型,那么需要自增
【3】姓名不能为空
【4】Email唯一
【5】性别默认值是男
【6】性别只能是男女
【7】年龄只能在18-50之间
*/
-- 创建数据库表:
create table t_student(
sno int(6) primary key auto_increment, -- 主键约束、自动增加约束
sname varchar(5) not null, -- 非空约束(字段值不能为空)
sex char(1) default '男' check(sex='男' || sex='女'), -- 默认值约束(给字段设置默认值)、检查约束
age int(3) check(age>=18 and age<=50), -- 检查约束(限制某个字段的取值范围)
enterdate date,
classname varchar(10),
email varchar(15) unique -- 唯一性约束
);
-- 添加数据:
-- 1048 - Column 'sname' cannot be null 不能为null
-- 3819 - Check constraint 't_student_chk_1' is violated. 违反检查约束
insert into t_student values (1,'张三','男',21,'2023-9-1','java01班','zs@126.com');
-- 1062 - Duplicate entry '1' for key 't_student.PRIMARY' 主键重复
-- > 1062 - Duplicate entry 'ls@126.com' for key 't_student.email' 违反唯一约束
insert into t_student values (2,'李四','男',21,'2023-9-1','java01班','ls@126.com');
insert into t_student values (3,'露露','男',21,'2023-9-1','java01班','ls@126.com');
-- 如果主键没有设定值,或者用null.default都可以完成主键自增的效果
insert into t_student (sname,enterdate) values ('菲菲','2029-4-5');
insert into t_student values (null,'小明','男',21,'2023-9-1','java01班','xm@126.com');
insert into t_student values (default,'小刚','男',21,'2023-9-1','java01班','xg@126.com');
-- 如果sql报错,可能主键就浪费了,后续插入的主键是不连号的,我们主键也不要求连号的
insert into t_student values (null,'小明','男',21,'2023-9-1','java01班','oo@126.com');
1.表级约束:
备注:表级约束指的是在创建表的sql后面加约束。自增约书、非空约束、默认值约束只能有列级约束,只能在sql的字段后面加。
-- 创建数据库表:
create table t_student(
sno int(6) auto_increment, -- 主键约束、自动增加约束(自动增加功能只能在字段上加)
sname varchar(5) not null, -- 非空约束(只能在字段上加)
sex char(1) default '男', -- 默认值约束(只能在字段上加)
age int(3), -- 检查约束(限制某个字段的取值范围)
enterdate date,
classname varchar(10),
email varchar(15),
constraint pk_stu primary key(sno), -- pk_stu 主键约束的名字
constraint ck_stu_sex check (sex = '男' || sex = '女'), -- ck_stu_sex:性别检查约束的名字
constraint ck_stu_age check (age >=18 and age<=50), -- ck_stu_age:年龄检查约束的名字
constraint uq_stu_email unique (email) -- uq_stu_email:唯一约束的名字
);
2.列级约束:
备注:创建表时sql的字段后面加约束条件。但是非空、默认值约束必须在创建表时在字段后面加,不支持通过sql语句单独添加。
drop table t_student;
select * from t_student;
-- 创建数据库表只加了非空、默认值约束
create table t_student(
sno int(6),
sname varchar(5) not null,
sex char(1) default '男',
age int(3),
enterdate date,
classname varchar(10),
email varchar(15)
);
-- 创建表以后添加约束:
alter table t_student add constraint pk_stu primary key (sno); -- 主键约束
alter table t_student modify sno int(6) auto_increment; -- 修改自增条件(不支持和添加主键约束的sql放在一条语句)
alter table t_student add constraint ck_stu_sex check (sex = '男' || sex = '女'); -- 添加性别检查约束
alter table t_student add constraint ck_stu_age check (age >=18 and age <=50); -- 添加年龄检查约束
alter table t_student add constraint uq_stu_email unique (email); -- 添加邮箱唯一性约束
--查看表结构:
desc t_student;