多表操作

打印 上一主题 下一主题

主题 580|帖子 580|积分 1740

第一章 外键

在实际开发项目中,一个健壮的数据表一定有很好的参照完整性,为保证数据的完整性,需将两表建立关系。这时可通过外键约束来实现
1.1、介绍

什么是外键约束?
在另一张表中引用另一张表的主键约束或唯一约束。
例如:如下操作创建表
  1. create table grade(
  2.         id int primary key,
  3.     name varchar(36)
  4. );
  5. create table student(
  6.         sid int primary key,
  7.     sname varchar(36),
  8.     gid int not null,
  9.     foreign key(gid) references grade(id)
  10. );
复制代码
从上述创建表可知,学生表中引用班级表中的主键,从而两表有了联系。两表有了主从关系。
主表:被引用的表,如 grade 表
从表:引用表,如 student 表
注意:引用外键后,外键列只能插入参照列存在的值,且删除数据时,只能先删除 student 表中的数据,再删除 grade 表的数据
1.2、外键约束

还可以在表创建后来创建外键约束。
语法:
  1. alter table 表名 add constraint 外键约束名 foreign key(外键字段) references 外表(主键字段)
  2. [on delete [cascade|set null | no action | restrict]]
  3. [on update [cascade|set null | no action | restrict]]
复制代码
需要注意的是建立外键的表必须是 innoDB 型,不能为临时表。
定义外键约束名时,不能加引号。
[]:可选项,当删除主表时,从表中的数据也应该删除,各参数如下:
参数说明cascade删除包含有参照关系的记录set null使用null替换删除含有参照关系的字段数据,前提 字段约束不为 not nullno action不进行任何操作restrict默认配置,拒绝删除主表或修改外键关联列1.3、删除外键

当有业务需求需要删除表间的关联关系时,需要删除外键约束
语法:
  1. alter table 表名 drop foreign key 外键约束名;
复制代码
第二章 关联表

2.1、关联关系


  • 多对一

    • 是常见的一种关系,在多对一的表关系中,外键会建在多的一方,否则会造成数据的冗余。

  • 多对多

    • 会常见中间表,该表会存有 两个外键。

  • 一对一

    • 常见于保存临时的数据表中

注意:在两个具有关联表中删除数据时,一定要先删除从表数据,再删除主表数据。
第三章 连接查询

3.1、交叉连接

也是进行笛卡尔积运算。
语法:
  1. select * from 表1 cross join 表2;
复制代码
结果是两表列的乘积。
不常见。
3.2、内连接

又称简单连接或自然连接,是常见的一种连接查询
通过表中共有字段进行连接运算
语法:
  1. select 查询字段 from 表1 [inner] join 表2
  2. on 表1.字段 = 表2.字段
复制代码
还有一种连接为自连接,是内连接特殊的存在,是在同一张表上进行的连接运算。
语法:
  1. select 查询字段 from 表1 join 表2
  2. on 表1.字段 = 表2.字段
复制代码
例如:
  1. select * from emp e1 join emp e2
  2. on e1.字段 = e2.字段
复制代码
3.3、外连接

查询两张表中另一张表的数据加上本身的数据。也就是说查询结果中以一张表为主表,在另一张表为从表中进行匹配,
语法:
  1. select 查询字段 from 表1 left|right [outer] join 表2
  2. on 表1.字段 = 表2.字段
  3. where
  4. .....
复制代码
1、左外连接

语法:
  1. select 查询字段 from 表1 left join 表2
  2. on 表1.字段 = 表2.字段
  3. where
  4. .....
复制代码
左边的表为主表,右边为从表,以主表为主,从表为辅
如果主表在从表中没有匹配,则以null代替
2、右外连接

语法:
  1. select 查询字段 from 表1 right join 表2
  2. on 表1.字段 = 表2.字段
  3. where
  4. .....
复制代码
右边的表为主表,左边为从表,以主表为主,从表为辅
如果主表在从表中没有匹配,则以null代替
3.4、复合连接

在连接查询中,添加过滤条件来限制查询结果,使查询结果更加精确。例如 在链家查询中添加 where、group by、order by等操作。
第四章 子查询

4.1、带 in 查询

内层查询语句返回集合,集合中的元素供外层查询进行比较
例如:查询存在年龄为20 岁的员工部门
  1. select *
  2. from dept
  3. where did in (
  4.         select did
  5.            from emp where age=20
  6. );
复制代码
其中 in 前还可以添加 not ,表示不再其中,与 in 相反
4.2、带 exists 查询

true 、false
当为true 时,外层查询才会执行
例如:查询 emp 表中是否存在年龄大于 21 岁的员工
  1. select *
  2. from dept
  3. where exists(
  4.         select did
  5.     from emp where age > 21
  6. );
复制代码
exists 比 in 关键字的运行效率高,在实际开发中,尤其是数据量大时,推荐使用
4.3、带 any 查询

表示满足其一即可
例如:
  1. select *
  2. from dept
  3. where did > any(
  4.         select did from emp
  5. );
复制代码
4.4、带 all 查询

全都满足
例如:
  1. select *
  2. from dept
  3. where did > all(
  4.         select did from emp
  5. );
复制代码
4.5、比较运算符查询

'','=','=','!='

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表