关系型数据库学习(四)

SQL 2020-03-01 111 次浏览 本文字数:2414字

本文主要内容:多表查询、事务

多表查询

1. 最简单的多表查询: select * from 列名1, 列名2...;
    * 结果: 结果集为笛卡儿积: 集合A、B, 取两个集合的所有情况
    * 要完成多表查询需要消除笛卡儿积产生的无用数据
2. 多表查询的分类
    * 内连接查询:
        1. 隐式内连接: 使用where条件消除无用的数据
            * 实例: select t1.name, t1.gender, t2.name from emp t1, dept t2, where t1.'dept_id' = t2.id;
        2. 显示内连接:
            * 语法: select 字段列表 from 表名1 inner join 表名2 on 条件;
            * 实例: select * from emp inner join dept on emp.'dept_id' = dept.'id';
        3. 内连接查询的注意事项:
            1. 从哪些表中查询数据
            2. 查询条件要确定
            3. 查询哪些字段
        4. 查询的是多表的交集
    * 外连接查询:
        1. 左外连接:
            * 语法: select 字段列表 from 表1 left join 表2 on 条件;
            * 查询的是左表所有数据以及其交集(条件产生交集)
        2. 右外连接:
            * 语法: select 字段列表 from 表1 right join 表2 on 条件;
            * 查询的是右表所有数据以及其交集
    * 子查询: 查询中嵌套查询,称嵌套查询为子查询
        1. 子查询的结果是单行单列:
            * 子查询可以作为条件,使用运算符去判断
            * 实例: select * from emp where emp.salary < (select avg(salary) from emp);
        2. 子查询的结果是单行多列:
            * 子查询可以作为条件, 使用运算符in来判断
            * 实例: select * from emp where dept_id in (select id from dept where name in ("财务部" or "市场部"));
        3. 子查询的结果是多行多列:
            * 子查询作为一张虚拟表
            * 实例: select * from dept t1, (select * from emp where mep.'join_data' > '2011-11-11') t2 where ti.id = t2.dept_id;

事务

1. 事物的基本介绍
    1. 概念: 如果一个包含多个步骤的业务操作,被事物管理,那么这些操作要么同时成功,要么同时失败
    2. 操作:
        1. 开启事务: start transaction;
        2. 回滚: rollback;
        3. 提交: commit;
    3. MySQL数据库中的事物默认自动提交
        * 事物提交的两种方式:
            * 自动提交
                * MySQL就是自动提交
                * 一条DML(增删改)语句会自动提交一次事务
            * 手动提交
                * Oracle数据库默认手动提交
                * 需要先开启事务,再提交
        * 修改事物的默认提交方式
            * 查询事物的默认提交方式: select @@autocommit;
                1-代表自动提交 0-代表手动提交
            * 修改默认提交方式: set @@autocommit = 0;
                修改后更新数据需要手动提交
2. 事物的四大特征
    1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
    2. 持久性:当事务提交或回滚后,数据库会持久化保存数据
    3. 隔离性:多个事务之间,相互独立
    4. 一致性:事务操作前后,事务总量不变
3. 事物的隔离级别
    * 概念:多个事务之间是隔离的,相互独立的,但如果多个事务操作同一批数据,则会引发引发一些问题,设置不同的隔离级别就可以解决这些问题
    * 存在问题:
        1.脏读:一个事务读取到另一个事务中没有提交的数据
        2.不可重复读(虚读):在同一个事务中,两次读到的数据不一样的
        3.幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
    * 隔离级别:
        1. read uncommitted: 读未提交
            * 产生的问题:脏读,不可重复读,幻读
        2. read committed: 读已提交(Oracle默认隔离级别)
            * 产生的问题:不可重复读,幻读
        3. repeatable read: 可重复读(MySQL默认隔离级别)
            * 产生的问题:幻读
        4. serializable: 串行化
            * 可以解决所有问题
        * 注意:隔离级别从小到大安全性越来越高,但效率越来越低
        * 数据库查询隔离级别:
            * select @@tx_isolation;
        * 数据库设置隔离级别:
            * set global transaction isolation level 级别字符串(隔离级别);  //需要关闭重启数据库才能生效

本文由 WarlockMarten 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。