第四章、多表查询

学习目标

es 多個table 關聯查詢 es数据库多表查询_join

4.1、外键

  • 什么是外键

  • 外键用于建立和加强两个表数据之间的链接。
我们知道建立外键是为了保证数据的完整和统一性,即主表和从表中对应的数据保持统一,可以在建立外键时添加ON DELETE或ON UPDATE子句。
在已存在的表上添加外键约束的语法格式如下:
alter table 表名 add constraint 外键名(不能带引号) foreign key(外键字段名) references grade(主键字段名);[ON DELETE {CASCADE | SETNULL | NO ACTION | RESTRICT}][ON UPDATE {CASCADE | SETNULL | NO ACTION | RESTRICT}]

es 多個table 關聯查詢 es数据库多表查询_es 多個table 關聯查詢_02

  • 为表添加外键约束
#创建数据库
create database chapter04;
#使用创建的数据库
use chapter04;
#班级表
create table grade(
	gid int primary key not null,
	gname varchar(20) not null
)

--创建外键
#方法1
create table student(
	sid int primary key not null,
	sname varchar(20) not null,
	gid int not null,
	foreign key(gid) references grade(gid)#此处系统会默认取好外键名
);

#方法2
create table student(
	sid int primary key not null,
	sname varchar(20) not null,
	gid int not null,
	#自定义外键名
	CONSTRAINT fk_student_gid foreign key(gid) references grade(gid)
);

#方法3(为已存在的表添加外键约束)
alter table student add constraint fk_student_gid foreign key(gid) references grade(gid);
  • 解除外键约束
alter table student drop foreign key fk_student_gid ;
  • 删除外键约束
alter table student drop gid;
  • 查看表结构(外键)
show create table 表名;

4.2、操作关联表

  • 关联关系
  • 添加数据
    在向从表中添加数据时,外键所在字段必须只能选择主表中已存在的关联键列,这是受外键约束。
  • 删除数据
    根据创建外键时选择的级联删除的[cascade | set null | no action | restrict],在删除主表和从表中数据时,会有不同的结果,详情请看该篇4.1、外键引用中的图表 。

4.3、连接查询

  • 交叉连接(CROSS JOIN)
  1. 交叉连接返回的结果是被连接的两个表中所有数据的笛卡尔积即行数的乘积。
  2. 最常见的是多对一的关系,下面以主表grade和从表student两表为例。
  3. 语法如下:
select * from student cross join grade;
  1. 返回结果:
  • 内连接(INNER JOIN)
  1. 内连接(INNER JOIN)又简称连接或自然连接,内连接使用比较运算符对两个表中的数据进行比较,列出与连接条件匹配的数据行,组合成新的记录。
  2. 语法如下:
select * from student inner join grade on student.s_gid = grade.gid;
  1. 返回结果:
  • 外连接
  1. 外连接包括左连接和右连接
  2. 语法如下:
select 所查字段 from 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段 WHERE 条件
#实例(where条件可带可不带)
select * from student left join grade on student.s_gid = grade.gid;
  1. 返回结果:
  • 复合条件连接查询
    复合条件连接查询就是再连接查询的过程中,通过添加过滤条件来限制查询结果,是结果更加精确。

4.4、子查询

  • 子查询是指一个查询语句嵌套另一个查询语句内部的查询。在执行查询语句时,首先会执行子查询中的语句,然后将返回结果作为外层查询的过滤条件。
  • 带IN关键字的子查询
  • 带EXISTS关键字的子查询
  • 带ANY关键字的子查询
  • 带ALL关键字的子查询
  • 带比较运算符的子查询