添加、删除外键约束
- 外键:引用另一个表中的一列或多列,被引用的列应有主键约束,或者唯一性约束。外键用于加强两个表之间的链接。(表示表和表之间的参照关系,使数据库帮助维护种关系,这种键就是表与表之间的外键。若在后续增删改数据破坏了这种外键约束,数据库会报错。
添加外键
创建表时创建
foreign key(本表属性名) references 外表名(属性);
- 例
先创建一个表
create table dept(
id int primary key auto_increment,
name varchar(40)
);
在创建一个有外键的表
create table emp(
id int primary key auto_increment,
name varchar(40),
dept_id int,
foreign key(id) references dept(id)
);
若 dept中的值在其他表中作为外键,那当删除dept中的属性值时若外表中有约束在,删除会失败
表存在时添加外键
alter table 表名 add constraint (外键取名字随便) foreign key(外键字段名) REFERENCES 外表名(主键字段名)
- 例
create table dept(
id int primary key auto_increment,
name varchar(40)
);
create table emp(
id int primary key auto_increment,
name varchar(40),
dept_id int
);
alter table emp add constraint fk_id foreign key(dept_id) references dept(id);
>>>
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| dept_id | int(11) | YES | MUL | NULL | |
+---------+-------------+------+-----+---------+----------------+
删除外键约束
alter table 表名 drop foreign key 外键名;
操作关联表
关联关系
-
一对一
在任意张表创建外键来保存另一方的主键作为外键
-
一对多
在多的一方设计外键来保存数目为1的一方的主键
-
多对多
新建一张第三方关系表来保存两张表的主键,来储存两者表之间的对应关系。
添加数据
先为主表添加数据,就是没有外键的表为主表。
- 多对多先添加数据后添加关联数据。
删除关联表数据
多对一,先删多,才能删1
多对多,先删关系表。后删数据表。
多表查询(链接查询)
交叉连接
返回两个表的笛卡尔积,比如两表各有4条数据符合查询要求,则得出16条查询记录。
select * from 表1 cross join 表2;
内连接
自然连接。使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的行。只有满足条件才会出现在结果中。
select 查询字段 from 表1[inner] join 表2 on 表1.关系字段=表2.关系字段
还可以使用where 代替Join on
select 查询字段 from 表1,表2 where 表1.关系字段=表2.关系字段
注意
- join on与where查询的结果相同但是,join on属于内连接,where属于条件判断。where后可以添加其他条件,joinon不可以。
外连接
不仅包含符合条件的数据,还包含两表,或者左、右表的所有数据
select 字段 from 表1 left|right[outer] join 表2 on 表1.关系字段=表2.关系字段 where 条件;
- left join:左连接,包含左表所有数据以及符合条件的右表数据。
- right join:右连接,包含右表所有数据以及符合条件的左表数据。
- FUll join :全连接mysql不支持
- union:联合连接
select 字段 from 表1 left join 表2 on 表1.关系字段=表2.关系字段 where 条件
union
select 字段 from 表1 right join 表2 on 表1.关系字段=表2.关系字段 where 条件;
复合条件查询
在查询时添加条件,来筛选查询结果
例:
子查询
指一个查询语句嵌套在另一个查询语句内部。执行时先执行内部,然后将结果作为外层的查询进行过滤
带IN的子查询
select * from tb_name where xxx in (select * from tb_name where xxx=xxx);
内层查询返回一个序列如(1,2,3),
这个序列作为外层查询的条件,条件为其中任何一个就返回结果。
还有not in 与 in 恰好相反
带EXISTS子查询
exists后的查询只会返回TRUE或者False。
select * from tb_name where exists(select * from tb_name where xxx=/</>xx);
- 当内部查询有返回值时 相当于true。则外层执行查询语句。否则不执行
ANY子查询
表示满足其中任何一个条年间就返回值作为外层查询结果。
select * from tb_name where 属性 =/>/< any(select * from tb_name where xx=xx);
子查询若返回(1,4)则 属性 符合(1,4)的任何一个就作为外层循环的查询条件。
ALL子查询
与ANY差不多,但是要全部满足才会作为外层查询的条件。
select * from tb_name where 属性 =/>/< all(select * from tb_name where xx=xx);
子查询若返回(1,4)则 属性 符合(1,4)所有作为外层循环的查询条件。加入为>,则属性要大于1并且大于4才会作为外层查询的条件。
比较运算符子查询
语法相仿。看着办。。