(数据库存储应用)S5多表操作

添加、删除外键约束

  • 外键:引用另一个表中的一列或多列,被引用的列应有主键约束,或者唯一性约束。外键用于加强两个表之间的链接。(表示表和表之间的参照关系,使数据库帮助维护种关系,这种键就是表与表之间的外键。若在后续增删改数据破坏了这种外键约束,数据库会报错。

添加外键

创建表时创建

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. 一对一

     在任意张表创建外键来保存另一方的主键作为外键
    
  2. 一对多

     在多的一方设计外键来保存数目为1的一方的主键
    
  3. 多对多

     新建一张第三方关系表来保存两张表的主键,来储存两者表之间的对应关系。
    

添加数据

先为主表添加数据,就是没有外键的表为主表。

  • 多对多先添加数据后添加关联数据。

删除关联表数据

多对一,先删多,才能删1
多对多,先删关系表。后删数据表。

多表查询(链接查询)

交叉连接

返回两个表的笛卡尔积,比如两表各有4条数据符合查询要求,则得出16条查询记录。

select * from1 cross join2;

内连接

自然连接。使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的行。只有满足条件才会出现在结果中。

select 查询字段 from1[inner] join2 on1.关系字段=2.关系字段

还可以使用where 代替Join on

select 查询字段 from1,2 where1.关系字段=2.关系字段

注意

  • join on与where查询的结果相同但是,join on属于内连接,where属于条件判断。where后可以添加其他条件,joinon不可以。

外连接

不仅包含符合条件的数据,还包含两表,或者左、右表的所有数据

select 字段 from1 left|right[outer] join2 on1.关系字段=2.关系字段 where 条件;
  1. left join:左连接,包含左表所有数据以及符合条件的右表数据。
  2. right join:右连接,包含右表所有数据以及符合条件的左表数据。
  3. FUll join :全连接mysql不支持
  4. union:联合连接
select 字段 from1 left join2 on1.关系字段=2.关系字段 where 条件 
union
 select 字段 from1 right join2 on1.关系字段=2.关系字段 where 条件;

复合条件查询

在查询时添加条件,来筛选查询结果
例:
(数据库存储应用)S5多表操作_第1张图片
在这里插入图片描述

子查询

指一个查询语句嵌套在另一个查询语句内部。执行时先执行内部,然后将结果作为外层的查询进行过滤

带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才会作为外层查询的条件。

比较运算符子查询

语法相仿。看着办。。

你可能感兴趣的:(#,数据库存储)