一、约束
1)主键 主键约束=非空约束+唯一约束 主键可以是一个列或者多个列
1)创表添加多个列作为主键
create table score1(
sid int not null,
cid int not null,
PRIMARY key(sid,cid)
);
2)删除主键约束
alter table 表名 drop primary key
3)增加主键约束
alter table 表名 add primary key(字段名)
2)外键 跟其他表建立关联的字段
1)添加外键约束:
alter table 表名 add foreign key(外键字段) references 关联表(关联字段)
2)创建表添加约束
创表语句后面 FOREIGN KEY (外键字段) REFERENCES 关联表(关联字段)
3)删除外键约束
alter table 表名 drop foreign key 外键名
(如何知道外键名?
show create table 表名;可以看到外键名)
3)唯一(unique) 值是唯一的,但是可以为空
1)创建表时添加唯一约束
create table s1(id int PRIMARY key auto_increment,
sname VARCHAR(20) UNIQUE);
2)删除唯一约束
alter table 表名 drop index 字段名;
3)添加唯一约束
alter table 表名 add unique(字段名)
4)默认
1)创建添加默认值 default 默认值
create table s2(id int PRIMARY key auto_increment,
sname VARCHAR(20) UNIQUE,
sex char(2) default '男'
);
insert into s2(sname)VALUES('feng');
select * from s2;
2)删除默认约束
alter table 表名 alter 列名 drop default
3)添加默认值约束
alter table 表名 alter 列名 set default 默认值
5)非空 not null
1)创建表添加非空约束
-- create table score1(
-- sid int not null,
-- cid int not null,
-- PRIMARY key(sid,cid)
-- );
2)取消非空约束
alter table 表名 modify 字段名 类型
案例:alter table score1 modify sid int ;
3)添加非空约束
alter table 表名 modify 字段名 类型 not null;
案例:alter table score1 modify sid int not null ;
6)检查约束(check) mysql中检查约束是没有
二、查看数据表信息
1)查看表结构
desc 表名;
2)查看表的详细信息
show create table 表名;
3)删除表(慎重) 表结构、索引、约束以及数据都会删除
drop table 表名
4)表结构修改 alter table 表名
1)删除字段
alter table 表名 drop 字段名
alter table s2 drop sex;
2)添加字段
alter table 表名 add 新字段 类型;
alter table s2 add sex1 enum('男','女');
desc s2;
3)修改字段名
alter table 表名 change 旧字段 新字段 类型;
alter table s2 change sex1 sex enum('男','女');
desc s2;
4)修改字段类型
alter table 表名 modify 字段 新数据类型
alter table s2 modify sex char(2);
desc s2;
5)修改表名
alter table 表名 旧表名 rename 新表名
alter table s2 rename s22;
desc s22;
三、数据操作语句
1)增加
1)指定部分字段插入:insert into 表名(字段列表) values(值列表);
2)所有字段赋值 :insert into 表名 values(值列表);
3)一次性添加多条记录
insert into 表名(字段列表) values(值列表1),(值列表2).....;
insert into student(sname) values('tifa');
insert into student values(5,'幽思寒蝉');
insert into student values(6,'y'),(7,'越幸运'),(8,'枫');
select * from student;
2)删除数据
1)delete from 表 [ where 条件 ]
2)truncate table 表名
3)两者的区别
1)delete 后面可以带上where 而truncate不可以
2)delete可以回滚,而truncate不可回滚,并且truncate删除速度比delete要快
3)修改
update 表名 set 字段名1=字段值,字段名2=字段值 where 条件
update student set sname='tifa' where sid=2;
select * from student;
4)查询 select
1)查询整个表的数据
select 字段1,字段2[*] from 表名
2)筛选表中的记录,用到where查询
条件结构: 表达式/字段名 比较运算符 值
比较运算符:> < = != >= <=
select 字段1,字段2[*] from 表名 where 条件1 and/or 条件2 and/or 条件3
and : 结果集同时满足所有条件
or: 结果集只要满足其中一个条件即可
优先级从高到低依次为 () and or
select * from student where sname='y' or sid=7
select 字段1,字段2[*] from 表名 where 条件1 OR 条件2 AND 条件3
select 字段1,字段2[*] from 表名 where 条件1 OR (条件2 AND 条件3)
3)特殊比较运算符
1)like 看起来像 模糊查询 当知晓某个字段部分值
匹配符:% 匹配0或者多个任意字符
_ 占位
__
1)查询名称中包含a的学员信息
select * from student where sname like '%a%';
2)查询名称中首字母是a的学员信息
select * from student where sname like 'a%';
3)查询第三个字符是f的学员信息
select * from student where sname like '__f%';
2)between...and... 在..之间 包含边界值
select * from score where score BETWEEN 90 and 100;
3)in(1或者多个值) 在..里面
select * from student where sid in(1,2,5);
4)is null 是空 null不等于空格
is not null 不是空
select * from student where sid is not null;
5)not 非 一般情况跟 not like, not between..and not in 一起使用
select * from student where sname not like '%a%';
select * from score where score not BETWEEN 90 and 100;
select * from student where sid not in(1,2,5);
4)limit 读取前几行
-- select * from emp limit 偏移数,N行 注意:偏移数默认是0,可以忽略不写
select * from emp limit 0,5;
select * from emp limit 5;
-- 需要展示第二页的数据,每页展示五行 6~10
select * from emp limit 5,5;
5)distinct 去重复
--查询有选修课的学生sid
select distinct sid from score
6)排序 order by 放在sql语句的最后
语法:select 字段1,字段2 from 表名 where 条件1 and/or 条件2
order by 字段1 desc/asc, 字段2 desc/asc ...
排序规则:desc 降序(从大到小) asc 升序 默认按升序排列
select * from score order by score desc;
select * from score order by score asc;
select * from score order by score ;
5)分组 涉及统计就用分组
1)自动分组 作用于一组数据返回一个结果
分组函数:
max() 求最大
min() 求最小值
avg() 求平均值
sum() 求和
count()求个数
--查询选修成绩最高成绩,总成绩,平均成绩,最低成绩的分数
select max(score),sum(score),avg(score),min(score) from score;
2)手动分组 group by
难点1)什么情况下用到手动分组group by
涉及到多组数据的统计
2)根据什么字段来分组
把具有相同字段的值归于一组,就根据这个字段分组
3)手动分组sql语句中,除分组函数之外group by 后面有的字段,select后面才可以有
注意:多个列进行分组,先后顺序不影响结果集
2)语法:select 字段1,字段2 from 表名 where 条件1 and/or 条件2
group by 分组字段1,分组字段1
3)手动分组分为单列分组和多列分组
4)单列分组
--查询每个学员的最高成绩
select sid,max(score) from score group by sid ;
select sid,max(score),min(score) from score group by sid ;
5)多列分组
-- 查询每个学员每门科目最高成绩 --涉及统计用到分组
select sid,cid,max(score) from score group by sid,cid
6)对分组后数据筛选 having
语法:
select 字段1,字段2 from 表名 where 条件1 and/or 条件2
group by 分组字段1,分组字段1
having 条件1 and/or 条件2
注意:1)包含分组函数的条件只能放在having 后面,其他条件都可以放在where后面
-- --查询每个学员最高成绩大于95的学生编号
select sid from score group by sid
having max(score)>95;
6)子查询
求未知值的情况下,一般用到子查询
特点:1)子查询包含()
2)先执行子查询(括号里面的sql),再执行括号外面的sql语句(主查询)
子查询分为单行子查询和多行子查询
1)单行子查询:子查询返回单行多列或者单行多列数据 跟> < = >= <=一起使用
-- --查询最高成绩sid
select sid from score where score=(select max(score) from score);
select sid from score where score=98;
2)多行子查询:子查询返回多行多列或者多行单列的数据
-- 查询全部及格的学生信息(名称编号)
select sname,sid from student where
sid in(select sid from score group by sid having min(score)>=60) ;
3)exists 存在
select sname,sid from student
where exists( select sid from score where score.sid=student.sid
group by sid having min(score)>=60 )