sql语句没有外键怎么用sql语句写外连接?
没有也可以联。
外键只是强制完整性的约束。
外键起的是约束作用,不是连接
没有主键外键的关联一样可以进行连接。
根据字段的联系来写,没外键没事,不过俩字段类型要一致
有主键就好,两张表有关联就可以
主外键不用纠结,你只要理解是这两个表关联的字段是哪些就行
关联的SQL:
两个表分别table a 和table b ;
表table a 中有两个字段为id和flid;
表table b 中有两个字段为id和class;
现已知 table a中的flid字段的一个值,如flid=1;
根据此值先筛选此表中flid值为1所有对应的id(但只取唯一一个id的值),
再根据取出来的table a中id值判断与table b 表的class字段的某个值是否相等,
最后要筛选table b 中class相同的所有id字段的集合。
select b.* from a,b where a.id=b.class and a.flid=1
学生表还没有这个学生,
就产生了学生的考试信息是很荒谬的一样。
反过来也是,
如果删除一个学生信息,
则该学生的考试信息等也应该先删除。
未经证实的传言,
外键太多影响批量更新的速度,
所以有的人会不设外键。
但实际上是隐式的外键,
可用于联接。
但删除、更新的时候不会去检查完整性。
设了外键,就可以设定级联删除和更新。
例如删除一个学生信息,
它会自动先把该学生的考试信息也删除掉。
不设外键,就自己定义删除和更新。
一个表格中的记录里存储另一个表格中记录的ID
就可以从一个表格的记录找到另一个表中的记录了,叫做外键
比如:我有table1 和 table2 两张表
link
table1:
id name sex
1 张三 男
2 李四 女
3 王五 男
table2:
id hobby Lid
1 下棋 2
2 游戏 3
3 音乐 2
4 学习 1
我现在想当table1表里查询出id=2的数据时
同时查出table2表里 Lid=2的数据
select * from table1 a,table2 b where a.id=1 and a.id=b.lid
1.理解表与表之间建立关系的必要性
比如我们建立了一张个人信息表,把所有人的信息都存在这张表中
这张表中有老师和他们所属的部门,并且不同的部门工作也是不同的
所有数据存放在一张表中的弊端
1.组织结构不清晰
2.浪费存储空间
3.扩展性差
针对这个问题我们可以将他们分成两张表,
一张专门记录个人信息,
一张专门记录部门和部门工作
建立表的时候我们需要进行分析
1.站在个人信息表的角度:一个老师能否属于多个部门,不能!!!
2.站在部门表的角度:一个部门能否有多个老师,可以!!!
那这两张表的关系就是老师表多对一部门表,
也可以这么说,部门表一对多老师表
在表中是如何表示这种关系,
需要找出一个两者中独一无二的东西并且把他们连接起来,
我们在部门表中创建一个部门的id,
在老师表中添加这个属性并指向部门id
这样我们就可以把两者联系起来了,
但是老师的dep_id我们还是可以随意的修改,
应该有一个限制,限制他们只能和部门表的id相同才对
2.外键(foreign key)
什么是外键
如果公共关键字在一个关系中是主关键字,
那么这个公共关键字被称为另一个关系的外键。
由此可见,外键表示了两个关系之间的相关联系。
以另一个关系的外键作主关键字的表被称为主表,
具有此外键的表被称为主表的从表。
外键又称作外关键字。
外键的作用
保持数据一致性,完整性,
主要目的是控制存储在外键表中的数据。
使两张表形成关联,
外键只能引用外表中的列的值或使用空值。
外键拥有能使两张表阻止执行和级联执行的特点
所以要把两张有关联的表联系起来需要用到外键(foreign key)
阻止执行
从表插入新行,其外键值不是主表的主键值便阻止插入;
从表修改外键值,新值不是主表的主键值便阻止修改;
主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表 的相关行);
主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联执行(“主”来带动“从”)
主表删除行,连带从表的相关行一起删除;
主表修改主键值,连带从表相关行的外键值一起修改。
两种方法提供给用户选择。
无论选取哪种方法,从表里都不会有多余行。
从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。
3.表与表关系之一对多
还是使用上面老师表和部门表的例子,两者是一对多的关系
1.在创建表的时候,
我们需要先建被关联的表dep(主键所在的表),
才能建关联表teacher
# 先创建部门表dep
create table dep(
id int primary key auto increment,#####################
dep_name char(16),
duty varchar(16)
);
# 再创建老师表teacher
create table teacher(
id int primary key auto_increment,
gender enum('male','female') not null default 'male',
dep_id int,#################
foreign key(dep_id) references dep(id)#####################
);
2.在插入记录时,
必须先插被关联的表dep,
才能插关联表teacher
# 先插入被关联表的记录
insert dep(dep_name,duty) values
('教学部','教书育人'),
('德育部','培养品德'),
('体育部','强身健体');
# 再插入关联表的记录
insert teacher(name,dep_id) values
('sxc',1),
('zzp',2),
('zzj',3),
('lzx',1),
('yzy',1);
部门表的主键dep_id属性是教师表的外键