主键约束
约束类型—primary key: 主键约束
表示id不可以重复,通过id来确定唯一的一条记录(唯一标识数据表中的行/记录)
非空: 表示这个列的值不能为空
自增: 表示插入记录的时候不需要手动插入,会自动增长
多表之间的建立
注意:
1:n的关系: 就把1放入多的一方。例如:班级和学生是1:n的关系,就在学生表中加入team_id;
n:n的关系: 需要通过一个中间表用来维护两个之间的关系。例如:老师和班级是n:n的关系,创建一个team_teacher表,表中包含team_id和teacher_id
例题:查找501班的老师名字和教的科目名字
思路:
1、先通过班级表找到班级的id
2、通过中间表找到对应班级id的老师id
3、再通过老师表找到对应老师id的老师信息
select id from team where name ='501';-- 先找到班级的id 501班的id是1
select teacher_id from team_teacher where team_id='1';-- 通过中间表找到班级id是1的老师的id
select * from teacher where id='1' or id='2';-- 再通过老师的id找到老师的信息
步骤一:
步骤二:
步骤三:
整合:
in():-- in表示 id只要 等于小括号()里面的值都可以
逗号,相当于 or
-- 两种方式相同
select name,subject from teacher where id='1' or id='2';
select name,subject from teacher where id in (1,2);
多表之间的连接
方法一 :使用子查询
子查询:把一个sql查询的结果,作为另外一个查询的条件使用
通过 in()方法
select id from team where name =‘501’;
select teacher_id from team_teacher where team_id=‘1’;
select t.name,t.subject from teacher t where
t.id in
(select teacher_id from team_teacher where team_id='1');
嵌套两次子查询:
select id from team where name =‘501’;
select teacher_id from team_teacher where team_id=‘1’;
select * from teacher where id=‘1’ or id=‘2’;
select t.name,t.subject from teacher t where t.id in
(select teacher_id from team_teacher where team_id in(select id from team where name ='501'));
方法二 :使用连接
SQL 连接(JOIN) 子句用于将数据库中两个或者两个以上表中的记录组合起来。连接通过共有值将不同表中的字段组合在一起。
select t.name,t.subject from teacher t left join team_teacher tt
on (t.id=tt.teacher_id)
left join team te on (te.id=tt.team_id) where te.name='501';
左连接(LEFT JOIN): 返回左表中的所有行,即使右表中没有匹配的行。
右连接(RIGHT JOIN): 返回右表中的所有行,即使左表中没有匹配的行。
on(匹配条件)
三、左连接与右连接的结果理解
左连接结果数量:
在查询结果中,左边的记录会全部包含
– on后面的匹配条件,如果匹配到0或者1,对结果的总数没有影响
– 如果匹配,大于1条,那么对于结果,结果就增加 (匹配数量-1) 的个数
select *from team t left join team_teacher tt on (t.id=tt.team_id);-- 班级表连接中间表
左表 team表(结果记录id 中至少有3条):
右表 team_teacher表 匹配的 team_id 行:(结果记录中+1+1)
结果:5条
右连接的结果数量:
在查询结果中,右边的记录会全部包含
select *from team t right join team_teacher tt on (t.id=tt.team_id);
右表 team_teacher 表(结果记录team_id 中至少有4条):
左边 team表 匹配的 id 行:(结果记录总数没有影响 —都只有1条)
结果:4条