MySql : 三、 多表查询和事务

MySql

前言

本篇主要介绍了数据库中多表查询以及事务相关的知识。

目录

一、多表查询
二、子查询
三、事务

一、多表查询

1.1 多表查询的分类

多表查询

  • 内连接
    • 隐式内连接
    • 显示内连接
  • 外连接
    • 左外连接
    • 右外连接

1.2 内连接

内连接的概念:
用左边表的记录去匹配右边表的记录,如果符合条件的则显示

1.2.1 隐式内连接

看不到 JOIN 关键字,条件使用 WHERE 指定

SELECT 字段名 FROM 左表, 右表 WHERE 条件

例如:

SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id`= t2.`id`;

1.2.2 显式内连接

使用 INNER JOIN ... ON 语句, 可以省略 INNER

SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件

例如:

SELECT * FROM emp t1 JOIN dept t2 ON t1.`dept_id`=t2.`id`; 

1.3 外连接

1.3.1 左外连接

用左边表的记录去匹配右边表的记录(左表的记录会全部显示出来),如果符合条件的则显示;
否则,显示 NULL

可以理解为:
在内连接的基础上保证左表的数据全部显示
查询的是左表所有数据以及其交集部分。

使用 LEFT OUTER JOIN ... ON,OUTER 可以省略

SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件

例如:

-- 使用左外连接查询
-- 左外连接查询能保证左表(dept )中的数据全部显示出来
SELECT * FROM dept t1 LEFT JOIN emp t2 ON t1.`id`=t2.`dept_id`;

1.3.2 右外连接

用右边表的记录去匹配左边表的记录,如果符合条件的则显示;
否则,显示 NULL

可以理解为:
在内连接的基础上保证右表的数据全部显示

使用 RIGHT OUTER JOIN ... ON,OUTER 可以省略

SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件

二、子查询

2.1 子查询的概念

  • 一个查询的结果做为另一个查询的条件
  • 有查询的嵌套,内部的查询称为子查询
  • 子查询要使用括号

例如:

-- 查询市场部中有哪些员
SELECT * FROM emp WHERE emp.dept_id=(SELECT id FROM dept WHERE dept.`name`='市场部');

2.2 子查询结果的三种情况

2.2.1 子查询的结果是单行单列

子查询结果只要是单行单列,肯定在 WHERE 后面作为条件,
父查询使用:比较运算符,如:> 、<、<>、= 等

SELECT 查询字段 FROM 表 WHERE 字段=(子查询);

例如:

-- 查询工资最高的员工是谁
SELECT t1.`name`,t1.`salary` FROM emp t1 WHERE t1.`salary`=(SELECT MAX(salary) FROM emp); 

--查询工资小于平均工资的员工有哪些
SELECT t1.name ,t1.`salary` FROM emp t1 WHERE t1.`salary`<(SELECT AVG(salary) FROM emp);

2.2.2 子查询的结果是多行单列

子查询结果是单例多行,结果集类似于一个数组
父查询使用 IN 运算符

SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);

例如:

--查询工资大于 4000 的员工,来自于哪些部门的名字
SELECT t1.name FROM dept t1 WHERE t1.`id` IN (SELECT t2.dept_id FROM emp t2 WHERE t2.`salary`>4000);

-- 查询开发部与财务部所有的员工信息
SELECT * FROM emp t1 WHERE t1.`dept_id` IN (SELECT t2.id FROM dept t2 WHERE t2.`name` IN ('开发部','财务部'));

2.2.3 子查询的结果是多行多列

子查询结果只要是多列,肯定在 FROM 后面作为表
子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段

例如:

-- 查询出 2011 年以后入职的员工信息,包括部门名称
SELECT * FROM dept t1, (SELECT * FROM emp  WHERE join_date > '2011-1-1') t2 WHERE t2.dept_id = t1.id;

-- 也可以使用表连接
SELECT * FROM emp t1 JOIN dept t2 ON t1.`dept_id`=t2.`id` WHERE t1.`join_date`>'2011-1-1';

SELECT * FROM emp t1 JOIN dept t2 ON t1.`dept_id`=t2.`id` AND t1.`join_date`>'2011-1-1';

2.2.4 子查询小结

  1. 子查询结果只要是单列,则在 WHERE 后面作为条件
  2. 子查询结果只要是多列,则在 FROM 后面作为表进行二次查询

三、事务

3.1 什么是事务

在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。
转账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL 语句出现异常,这条 SQL 就可能执行失败。

事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 条 SQL 语句出现异常,则所有的SQL 语句都要回滚,整个业务执行失败。

MYSQL 中可以有两种方式进行事务的操作:

  1. 手动提交事务
  2. 自动提交事务

3.2 手动提交事务

手动提交事务的 SQL 语句:

  • start transaction :开启事务
  • commit :提交事务
  • rollback :回滚事务

手动提交事务使用过程:

  1. 执行成功的情况: 开启事务 -> 执行多条 SQL 语句 -> 成功提交事务
  2. 执行失败的情况: 开启事务 -> 执行多条 SQL 语句 -> 事务的回滚

如果事务中 SQL 语句没有问题,commit 提交事务,会对数据库数据的数据进行改变。
如果事务中 SQL语句有问题,rollback 回滚事务,会回退到开启事务时的状态。

3.3 自动提交事务

MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕
自动提交事务,MySQL 默认开始自动提交事务

3.4 事务原理

事务开启之后, 所有的操作都会临时保存到事务日志中, 事务日志只有在得到 commit 命令才会同步到数据表
中,其他任何情况都会清空事务日志(rollback,断开连接)

3.5 事务的四大特征

  1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
  2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
  3. 隔离性:多个事务之间。相互独立。
  4. 一致性:事务操作前后,数据总量不变。

注:由于本人水平有限,所以难免会有理解偏差或者使用不正确的问题。如果小伙伴们有更好的理解或者发现有什么问题,欢迎留言批评指正~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容