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.关系字段
注意
不仅包含符合条件的数据,还包含两表,或者左、右表的所有数据
select 字段 from 表1 left|right[outer] join 表2 on 表1.关系字段=表2.关系字段 where 条件;
select 字段 from 表1 left join 表2 on 表1.关系字段=表2.关系字段 where 条件
union
select 字段 from 表1 right join 表2 on 表1.关系字段=表2.关系字段 where 条件;
指一个查询语句嵌套在另一个查询语句内部。执行时先执行内部,然后将结果作为外层的查询进行过滤
select * from tb_name where xxx in (select * from tb_name where xxx=xxx);
内层查询返回一个序列如(1,2,3),
这个序列作为外层查询的条件,条件为其中任何一个就返回结果。
还有not in 与 in 恰好相反
exists后的查询只会返回TRUE或者False。
select * from tb_name where exists(select * from tb_name where xxx=/</>xx);
表示满足其中任何一个条年间就返回值作为外层查询结果。
select * from tb_name where 属性 =/>/< any(select * from tb_name where xx=xx);
子查询若返回(1,4)则 属性 符合(1,4)的任何一个就作为外层循环的查询条件。
与ANY差不多,但是要全部满足才会作为外层查询的条件。
select * from tb_name where 属性 =/>/< all(select * from tb_name where xx=xx);
子查询若返回(1,4)则 属性 符合(1,4)所有作为外层循环的查询条件。加入为>,则属性要大于1并且大于4才会作为外层查询的条件。
语法相仿。看着办。。