数据库 SQL 外键约束 多表查询
多表设计与多表查询
1.外键约束
表是用来保存现实生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,像这种约束就叫做外键约束。定义外键约束 foreign key(本表的列名 ordersid) references orders(id)(引用的表明及列名)create table dept(id int primary key auto_increment,name varchar(20));create table emp(id int primary key auto_increment,name varchar(20),dept_id int,foreign key(dept_id) references dept(id));2.多表设计一对多:在多的一方保存一的一方的主键做为外键一对一:在任意一方保存另一方的主键作为外键多对多:创建第三方关系表保存两张表的主键作为外键,保存他们对应关系
3.多表查询3.1笛卡尔积查询:将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用select * from dept,emp;3.2内连接查询:查询的是左边表和右边表都能找到对应记录的记录select * from dept,emp where dept.id = emp.dept_id;select * from dept inner join emp on dept.id=emp.dept_id;3.3外连接查询a.左外连接查询:在内连接的基础上增加左边表有而右边表没有的记录select * from dept left join emp on dept.id=emp.dept_id;b.右外连接查询:在内连接的基础上增加右边表有而左边表没有的记录select * from dept right join emp on dept.id=emp.dept_id;c.全外连接查询:在内连接的基础上增加左边表有而右边表没有的记录和右边表有而左表表没有的记录select * from dept full join emp on dept.id=emp.dept_id;d.但是mysql不支持全外连接,不过我们可以使用union关键字模拟全外连接select * from dept left join emp on dept.id = emp.dept_idunionselect * from dept right join emp on dept.id = emp.dept_id;
多表查询实例
create table a(id int primary key,job varchar(20));insert into a values(1,'AA'), (2,'BB'), (3,'CC');select * from a;create table b(id int ,name varchar(20) ,foreign key(id) references a(id));一对多:在多的一方(b)保存一的一方(a)的主键做为外键;多对多:创建第三方关系表保存两张表的主键作为外键,保存他们对应关系注意:被参照的a(id)必须定义为unique才可以被参照,否则报错(逻辑错误)。insert into b values(1,'bqt'), (2,'bqt2'), (2,'bqt3');注意:插入数据的id必须在被参照的表中已经存在,否则报错(逻辑错误)。select * from b;select * from a,b;将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用.select * from a,b where a.id = b.id;或select * from a inner join b on a.id=b.id;内连接查询:查询的是左边表和右边表都能找到对应记录的记录。select * from a left join b on a.id=b.id;左外连接查询:在内连接的基础上增加左边表有而右边表没有的记录select * from a right join b on a.id=b.id;右外连接查询:在内连接的基础上增加右边表有而左边表没有的记录备注:由于右边表参照左边表,所以不存在右边表有而左边表没有的记录。select * from a left join b on a.id = b.idunionselect * from a right join b on a.id = b.id;全外连接查询:在内连接的基础上增加左边表有而右边表没有,和右边表有而左表表没有的记录select * from a full join b on a.id=b.id; -- 某些数据库支持,但mysql不支持!
数据库 SQL 外键约束 多表查询的更多相关文章
- MySQL数据库(4)_MySQL数据库外键约束、表查询
一.外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...
- 吃货眼中的sqlalchemy外键和连表查询
前言 使用数据库一个高效的操作是连表查询,一条查询语句能够查询到多个表的数据.在sqlalchem架构下的数据库连表查询更是十分方便.那么如何连表查询?以及数据库外键对连表查询有没有帮助呢?本篇文章就 ...
- My SQL外键约束
外键约束对子表的含义:如果在父表中找不到对应的候选键,则不能对子表进行insert/update操作 外键约束对父表的含义:在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹 ...
- MySQL数据库有外键约束时使用truncate命令的办法
MySQL数据库操作中,Delete与Truncate两个命令都可以删除一个数据表中的全部数据,使用办法分别是: DELETE FROM t_question TRUNCATE TABLE t_que ...
- truncate有外键约束的表,报ORA-02266处理。
问题描述:当父表有子表的外键约束时,无法直接truncate父表.报ORA-02266: unique/primary keys in table referenced by enabled fore ...
- 详解MariaDB数据库的外键约束
1.什么是外键约束 外键约束(foreign key)就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强. 关于数据表的完整性和关连性,可以举个例子 ...
- MySQL基础9-主键约束、外键约束、等值连接查询、一对一和多对多关系
1.主键约束和外键约束 外键约束 * 外键必须是另一表的主键的值(外键要引用主键!) * 外键可以重复 * 外键可以为空 * 一张表中可以有多个外键! 概念模型在数据库中成为表 数据库表中的多对一关系 ...
- mysql数据库导入外键约束问题
在网站搬迁过程中,很重要一点是数据的迁移.你的数据库可能已经包含了一个设计良好的数据表集合,并且在网站运营过程中,产生了重要的数据.这时你必须做好包含数据表schema以及数据本身的迁移. 完成上述数 ...
- SQL外键约束
1.查询表已有的外键 select name from sys.foreign_key_columns f join sys.objects o on f.constraint_object_id=o ...
随机推荐
- underscorejs-min学习
2.16 min 2.16.1 语法: _.min(list, [iteratee], [context]) 2.16.2 说明: 返回list中的最小值. list为集合,数组.对象.字符串或arg ...
- .NET,你真的 知道了吗
搞清自己是干什么的 有人问你是做什么的,回答是:"我是做,NET开发的",有的人也会问:"那.NER.是什么?"刚开始我认为是一个开打工具,后认为是一个平台,一 ...
- python3可变与不可变数据类型
Python3中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Dictionary(字典) Tuple(元组) Set(集合) 我理解的可变就是当一个变量创建 ...
- codevs 3269 混合背包
题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体 ...
- 转:OWASP发布Web应用程序的十大安全风险
Open Web Application Security Project(OWASP)是世界范围内的非盈利组织,关注于提高软件的安全性.它们的使命是使应用软件更加安全,使企业和组织能够对应用安全风险 ...
- Cannot find module formidable
今天按照例子学习安装 formidable 即使我-g全局安装,也不行.. 于是搜到了这句话.. 解决了 我也遇到这个问题,困扰了我一天,现在找到解决办法了.我在看这篇入门教程:http://node ...
- forever 使用
安装: $npm install -g forever y@y:ydkt$ forever start server/app.js warn: --minUptime not set. Default ...
- C++编程中对缓冲区的理解(OS默认4096大小的缓冲区,有例子,很形象)
什么是缓冲区缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区.缓冲区根据其对应的是输入设备还是输出 ...
- -_-#【Better Code】字符串匹配
提高 web 应用性能之 JavaScript 性能调优
- HttpURLConnection和HttpClient
HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.在 JDK 的 java.net 包中已经提供了访问 ...






