约束create table t_student(s_pk_id int primary key, /主键约束/s_name varchar(20) not null, /非空约束/s_tel varchar(11) unique, /唯一约束/s_sex char(2) default 'M', /默认约束/s_age int check(age >= 18 and age <=40) /检查约束 mysql没有作用/);
主键约束的第二种方式与自动增长create table t_student(s_pk_id int auto_increment, 这一列是自动增长的列,会永远自动向前递增,自动增长的列在一张表中就只能有一个1 8 10 11 13 14 15s_name varchar(20) not null, 非空约束s_tel varchar(11) unique,唯一约束s_sex char(2) default 'M', 默认约束s_age int check(age >= 18 and age <=40), /检查约束 mysql没有作用/primary key(s_pk_id) /*主键约束的第二种写法);
创建班级表create table t_class(c_pk_id int primary key auto_increment,c_name varchar(20) not null);
创建功课表create table t_subject(sub_pk_id int primary key auto_increment,sub_name varchar(20) not null,sub_publish_time date);
创建学生和功课的中间表 分数表
create table t_scores(sc_pk_id int primary key auto_increment,sc_student_id int not null,sc_subject_id int not null,sc_score float,constraint fk_scores_student foreign key(sc_student_id) references t_student(s_pk_id),constraint fk_scores_subject foreign key(sc_subject_id) references t_subject(sub_pk_id));
修改表,修改数据类型,添加自增和主键
alter table t_food_bak modify pk_id int auto_increment primary key;
自增默认从1开始,如果想手动设置从哪里开始,使用下面的语句
alter table t_food_bak auto_increment=1000;
关联关系
一对一 不常用
一对多(多对一) 在数据库中的做法就是在"多"的这一端加上一个外键列和"一"这一端的主键进行对应
多对多 其实就是特殊的一对多,处理的方式,都是多加一张中间表,这个中间表分别和另外两张表示多对一的关系
关联约束
如果表已经建好了,我们需要修改表添加外键约束
修改 表 表名 添加 约束 外 键(外键列名) 关联 主键表(主键列名)
alter table t_student add constraint [外键名] foreign key(s_class_id) references t_class(c_pk_id);
在建表的时候,直接写好关联约束
可以直接在建表语句的最后写上
constraint foreign key(外键列名) references t_class(主键列名);
DML 语句
增 insert into 表名([列名,列名,列名....]) values ([值,值,值....])insert into t_student(s_pk_id,s_name,s_tel) values(1,'张三','13111111111');
自增列,可以不用插入insert into t_student(s_name,s_tel) values('张三','13111111111');
注意一个问题,列名和值必须一一对应,如果字段名写出来,那么value就必须对应
insert into t_student(s_pk_id,s_name,s_tel,s_sex) values(2,'王五','13111111111','F');
insert into t_student(s_pk_id,s_name,s_tel,s_sex) values(null,'王五','13111111111',default);
可以默认不写列名,意思是后面的值就要和列名顺序对应,不推荐这种写法insert into t_student values(null,'赵六','13111111115',default,19);
一次加入多行数据
insert into t_student(s_name,s_tel,s_age)values("张飞","13811111111",30),("赵云","13811111112",28),("关羽","13811111113",32);
改 update 表名 set 列名=新的值,列名=新的值...[where 条件]
把t_student的s_class_id全部改为1
update t_student set s_class_id=1
把学生id=2的班级外键改为3
update t_student set s_class_id=3 where s_pk_id=2;
把学生id大于2并且小于5的班级全部改为F66班
update t_student set s_class_id=4 where s_pk_id > 2 and s_pk_id < 5;
如果没有主外键约束,外键可以随便写,但是有了主键外键约束之后,这里就不能随便写外键的值
update t_student set s_class_id = 99 where s_pk_id=5;
update语句更新多个值
update t_student set s_tel="13711111111",s_age=18 where s_pk_id=1;
在...之间
使用 >= and <=
update t_student set s_age = s_age + 1 where s_age >= 18 and s_age <= 30;
btween and
update t_student set s_age = s_age + 1 where s_age between 18 and 30;
在...范围内
= and <= > and
update t_student set s_age = s_age - 2 where s_class_id=1 or s_class_id=3 or s_class_id=4;
inupdate t_student set s_age = s_age - 2 where s_class_id in(1,3,4);
not 取反update t_student set s_age = s_age - 2 where s_class_id not in(1,3,4);
判断为null 注意: 不是用的=null在mysql中null和任意的值比较都是false 而是使用 is null,
update t_student set s_age = 50 where s_age is null and s_class_id=1;
取反update t_student set s_age = 50 where s_age is not null and s_class_id=1;
删除 delete from 表名 [where 条件]
删除所有数据 delete from t_student;
按照条件删除 删除年龄为null的数据 delete from t_student where s_age is null;
delete删除语句,就算删除全部的数据,之前自增的id,还是会继续往下自增
删除数据还可以使用truncate,这个语句,大家知道就可以了,千万别用
模糊匹配 关键字 like
替代符 _ 替代一个字符
替代符 % 替代0个或多个字符
比较下面四个替代符的区别,到底模糊匹配的是什么
update t_student set s_age=20 where s_name like '张%';update t_student set s_age=s_age+2 where s_name like '张_';update t_student set s_age=s_age+5 where s_name like '%张%';update t_student set s_age=s_age-5 where s_name like '%五';
DQL 语句
简单查询 select 列名,列名,列名...(简单查询全部列名 *) from 表名
select * from t_student;
单词DMLinsert(新增)update(修改)delete(删除)
DDLselect(查询)
where(哪里 匹配条件) set(设置) like(像 模糊匹配) from(来自...)
primary key(主键)unique(唯一)constraint(约束)references(引用,关联)