MySQL<多表操作>
多表操作
外键
什么是外键
外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束。
外键用于建立和加强两个表数据之间的链接。
为表添加外键约束
想要真正连接两个表的数据,就需要为表添加外键约束。
alter table 表名 add constraint FK_ID foreign key(外键字段名) references外表表名(主键字段名);
(1)建立外键的表必须是InnoDB型不能是临时表。因为MySQL中只有InnoDB型的表才支持外键。
(2)定义外键名时,不能加引号。如:constraint 'FK_ID' 或 constraint " FK_ID "都是错误的。
建立外键是为了保证数据的完整和统一性,即主表和从表中对应的数据保持统一,可以在建立外键时添加ON DELETE或ON UPDATE子句。
alter table 表名 add constraint FK_ID foreign key(外键字段名) REFERENCES 外表表名(主键字段名);
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
CASCADE:删除包含于已删除键值有参照关系的所有记录
SET NULL:修改包含与已删除键值有参照关系的所有记录,使用NULL值替换
NO ACTION:不进行任何操作
RESTRICT:拒绝主键删除或修改外键关联列。
删除外键约束
解除两个表之间的关联关系时,就需要删除外键约束
alter table 表名 drop foreign key 外键名;
多表建立原则
一对多:
在多的一方创建一个字段作为外键指向一的一方的主键.
多对多:
创建一个中间表,中间表中至少两个字段,分别作为外键指向多对多双方各自的主键
一对一:
唯一外键对应,主键对应
操作关系表
关联关系
一对多(部门与员工) 、多对多(老师与学生)、 一对一(身份证)
添加数据
删除数据
连接查询
交叉连接
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积即行数的乘积。
SELECT * from 表1 CROSS JOIN 表2;
在实际开发中这种业务需求是很少见,一般不会使用交叉连接,而是使用具体的条件对数据进行有目的的查询。
内连接
内连接(INNER JOIN)又称简单连接或自然连接,内连接使用比较运算符对两个表中的数据进行比较,列出与连接条件匹配的数据行,组合成新的记录。
是将多个表连成一个表的查询。只有那些满足查询条件的列才会出现在最后的表中
SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段
隐氏内连接
select * from A,B where 条件
显示内连接
select * from A inner join B on 条件
外连接
左连接的结果包括LEFT JOIN子句中指定的左表的所有记录,和所有满足连接条件的记录。如果左表的某条记录在右表中不存在,则在右表中显示为空。
右连接与左连接正好相反,返回右表中所有指定的记录和所有满足连接条件的记录。如果右表的某条记录在左表中没有匹配,则左表将返回空值。
SELECT 所查字段 FROM 表1 LEFT|RIGHT [OUTER] JOIN 表2
ON 表1.关系字段 = 表2.关系字段 WHERE 条件
左外连接
select * from A left outer join B on 条件
右外连接
select * from A right outer join B on 条件
自连接
就是一个表与其自己进行连接
复合条件连接查询(嵌套查询)
嵌套查询可以包括带有IN谓词的子查询、带有比较运算符的子查询、带有ANY或ALL谓词的子查询和带有EXISTS谓词的子查询。
在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。
子查询
带IN关键字的子查询
带EXISTS关键字的子查询
带ANY关键字的子查询
带ALL关键字的子查询
带比较运算符的子查询
sql执行顺序
1.from 表名
2.where 条件
3.group by
4.having
5.select
6.order by
MySQL<多表操作>的更多相关文章
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- LINUX篇,设置MYSQL远程访问实用版
每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- 闰秒导致MySQL服务器的CPU sys过高
今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- 当忘记mysql数据库密码时如何进行修改
因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...
随机推荐
- ubuntu 12.04下gedit查看txt中文乱码解决办法
http://blog.sina.com.cn/s/blog_6273990801013dwv.html 由于我不能要求别人保存txt文件时必须用utf-8,那我只能自己找解决办法: 打开终端输入: ...
- UserAgent判断浏览器类型或爬虫类型
### 浏览器------------------------------- IEMozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; T ...
- cocos2dx遇到的坑1
记录下在cocos2dx 2.x时代遇到的问题 1.节点的观念,用节点来管理 2.pushscene popscene 和replacewithscene runwithscene对应 3.lua里释 ...
- C++ for fun & test
#include <iostream> using namespace std; class DaYe { public: const DaYe & gege() const { ...
- lua中table如何安全移除元素
在Lua中,table如何安全的移除元素这点挺重要,因为如果不小心,会没有正确的移除,造成内存泄漏. 引子 比如有些朋友常常这么做,大家看有啥问题 将test表中的偶数移除掉local test = ...
- wysiwyg+ckeditor 安装
1.下载wysiwyg模块 https://drupal.org/project/wysiwyg 2.下载ckeditor 上传/sites/all/libraries 出现问题: 解决方法: 在文 ...
- org.hibernate.hql.internal.ast.QuerySyntaxExceptionunexpected token: on near line 1
select d.content,count(s.status) from MesmachineStatus s , Mesmachinestatusdetail d where s.status=d ...
- 最大似然估计 (MLE)与 最大后验概率(MAP)在机器学习中的应用
最大似然估计 MLE 给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参,即“模型已定,参数未知”. 例如,对于线性回归,我们假定样本是服从正态分布,但是不知道 ...
- [oracle] 两种权限:系统权限VS对象权限
系统权限表示对表和表空间等 有无操作权 的权限.一般是SYS用户这种DBA来授权.比如: grant create session to lisi grant create table to l ...
- C/C++预处理指令
预处理指令 Preprocessor Directives define undef ifdef ifndef if endif else and elif line error include 预定 ...