创建表示,可以可以指定某列不为空
create table student(
id int not null,
name varchar(20)
);
create table student(
id int not null,
name varchar(20) unique
);
default 指定的默认值,会在按列插入时生效(按列插入但未被指定的列,就是按默认值来插入)
如果手动给某一列设定为 null,不会触发 默认值 的效果
create table student(
id int not null,
name varchar(20) unique default 'aaa'
);
设计表的时候,一般都需要指定一个主键
主键就是一条记录的唯一身份标识
对于一张表来说,主键只能有一个
特性:
create table student(
id int not null primary key,
name varchar(20) unique
);
create table student(
id int primary key auto_increment,
name varchar(20)
);
外键用于关联其他表的主键或唯一键
foreign key (字段名) references 主表(列)
create table class (
id int primary key,
name varchar(20)
);
create table student (
id int primary key auto_increment,
name varchar(20),
classId int,
foreign key(classId) references class(id)
);
外键约束就是要求当前表里面 classId 字段的值,必须在 class 表的 id 中出现过才可以(此时要求 id 得是 class 表的主键)
外键约束会影响到数据的修改和删除
如果 class 表中的 id 已经被 student 中的 classId 用到了,那么就不能删除 class 表中的对应记录,更不能删除整个 class 表
所谓的“数据库设计”其实就是设计表,根据区当前问题的场景,这些表中应该有哪些字段,这些表中的约束等
设计数据库的基本思路:
从具体的问题场景中,先提取出“实体(对象、关键性的名词)”,让后再找出多个“实体”之间的关联关系
三种关系范式:
“聚合”值的事行之间的聚合,和“列之间”无关
常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:
group by 是针对某一列,按照列里面的内容,把这些记录进行分组(值相同的在一组)
select 中使用 group by 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查询时,select 指定的字段必须是“分组依据字段”,其他字段若想出现在 select 中则必须包含在聚合函数中
group by 往往要搭配 聚合函数 来使用,如果不是用聚合函数,此时尝试查询一些不重复的类,可能结果就不太科学
select 需要查询的字段 from 表名 group by 指定列;
group by 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 where 语句,而需要用 having
select 需要查询的字段 from 表名 group by 指定列 having 筛选条件;
注:
关联查询可以对关联表使用别名
实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。
左外连接
select 字段名 from 表名1 left join 表名2 on 连接条件;
右外连接
select 字段 from 表名1 right join 表名2 on 连接条件;
自连接是指在同一张表连接自身进行查询。
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
-- 使用IN
select * from score where course_id in (select id from course where
name='语文' or name='英文');
-- 使用 NOT IN
select * from score where course_id not in (select id from course where
name!='语文' and name!='英文');
- [not] exists 关键字
-- 使用 EXISTS
select * from score sco where exists (select sco.id from course cou
where (name='语文' or name='英文') and cou.id = sco.course_id);
-- 使用 NOT EXISTS
select * from score sco where not exists (select sco.id from course cou
where (name!='语文' and name!='英文') and cou.id = sco.course_id);
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用union 和 union all时,前后查询的结果集中,字段需要一致。
union:
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
查询id小于3,或者名字为“英文”的课程:
select * from course where id<3
union
select * from course where name='英文';
-- 或者使用or来实现
select * from course where id<3 or name='英文';
union all :
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
查询id小于3,或者名字为“Java”的课程:
-- 可以看到结果集中出现重复数据Java
select * from course where id<3
union all
select * from course where name='英文';