菜鸟之路Day32一一多表查询,事物,索引

简介: 本文由作者blue撰写于2025年5月14日,主要内容涵盖数据库的多表查询、事物处理和索引技术。在多表查询部分,详细介绍了内连接、外连接及子查询的语法与应用场景;事物部分讲解了其四大特性(原子性、一致性、隔离性、持久性)及操作控制语句;索引部分则重点说明了B+Tree结构的优势与局限性,并提供了创建、查看和删除索引的具体示例。文章通过实例解析,帮助读者深入理解数据库核心操作。

菜鸟之路Day32一一多表查询,事物,索引

作者:blue

时间:2025.5.14

[TOC]

1.多表查询

连接查询

​ 内连接:相当于查询A,B交集部分的数据

​ 外连接:

​ 左外连接:查询左表所有数据(包括两张表交集部分的数据)

​ 右外连接:查询右表所有数据 (包括两张表交集部分的数据)

子查询

1.1内连接

语法:

隐式内连接:select 字段列表 from1,表2 where 条件...;

显示内连接:select 字段列表 from1 [inner] join2 on 连接条件

练习:

-- A. 查询员工姓名,及所属部门名称(隐式内连接)
select tb_emp.name,tb_dept.name from tb_emp,tb_dept
                                where tb_emp.dept_id = tb_dept.id;

-- B. 查询员工姓名,及所属的部门名称(显示内连接实现)
select tb_emp.name,tb_dept.name from db01.tb_emp
    inner join tb_dept on tb_emp.dept_id = tb_dept.id

1.2外连接

左外连接:查询左表所有数据(包括两张表交集部分的数据)

右外连接:查询右表所有数据 (包括两张表交集部分的数据)

左外连接:select 字段列表 from1 left [outer] join2 on 连接条件...;

右外连接:select 字段列表 from1 right [outer] join2 on 连接条件...;

练习:

-- A. 查询员工表 所有 员工的姓名,和对应的部门名称 (左外连接)
select tb_emp.name,tb_dept.name from tb_emp
    left outer join tb_dept on tb_dept.id = tb_emp.dept_id;

-- B. 查询部门表 所有 部门名称,和对应的员工名称 (右外连接)
select tb_emp.name,tb_dept.name from tb_emp
    right outer join tb_dept on tb_dept.id = tb_emp.dept_id;

1.3子查询

介绍:SQL语句中嵌套的select语句,称为嵌套查询,又称为子查询

形式:

select * from t1 where column1 = (select column1 from t2 ...);

子查询外部的语句可以是insert/update/delete/select 的任何一个,最常见的是select

标量子查询:子查询返回的结果为单个值

-- 标量子查询
-- A. 查询"教研部"的所有员工信息
-- a. 查询 教研部 的部门 ID - tb_dept
select id from tb_dept where name='教研部';

-- b. 再查询该部门ID下的员工信息 - tb_emp
select * from tb_emp
         where dept_id = (select id from tb_dept where name='教研部');

列子查询:子查询返回的结果为一列

-- 列子查询
-- A. 查询"教研部"和"咨询部"的所有员工信息
-- a. 查询"教研部"和"咨询部"的部门ID - tb_dept
select id from tb_dept where name='教研部' or name='咨询部';

-- b. 根据部门ID,查询该部门下的员工信息 - tb_dept
select * from tb_emp
        where tb_emp.dept_id
        in (select id from tb_dept where name='教研部' or name='咨询部');

行子查询:子查询返回的结果为一行(但可以是多列)

select * from tb_emp where (entrydate,job) = (select entrydate,job from tb_emp where name= 'XXX');

表子查询:子查询返回的结果为多行多列

-- a. 查询入职日期是“2006-01-01”之后的员工信息
select * from tb_emp where entry_time > '2006-01-01';

-- b. 查询这部分员工信息及其部门名称 - tb_dept
select e.*,d.name from (select * from tb_emp where entry_time>'2006-01-01') e,tb_dept d
       where e.dept_id = d.id;

2.事物

事物是一组操作的集合,它是一个不可分割的工作单位。事物会把所有操作作为一个整体一起向系统提交或者撤销操作请求,即这些操作要么同时成功,要么同时失败

-- 事物控制

-- 开启事物
start transaction;begin;

-- 提交事物
commit;

-- 回滚事物
rollback;

例子:

-- 开启事物
start transaction;

-- 删除部门
delete from tb_dept where id = 3;

-- 删除部门下的员工
delete from tb_emp where dept_id = 3;

-- 提交事物
commit;

-- 回滚事物
rollback;

事物的四大特性

原子性:事物是不可分割的最小单元,要么全部成功,要么全部失败

一致性:事物完成时,必须使所有数据都保持一致的状态

隔离性:数据库系统提供的隔离机制,保证事物在不受外部并发操作影响的独立环境下运行

持久性:事物一旦提交或回滚,它对数据库中的数据的改变就是永久的

3.索引

索引是帮助数据库高效获取数据数据结构(利用树形结构)

优点:提高数据查询的效率,降低数据库的IO成本

​ 通过索引对数据进行排序,降低数据排序的成本,降低CPU消耗

缺点:索引会占用存储空间

​ 索引大大提高了查询效率,同时也降低了insert,update,delete的效率

索引的结构

MySQL中:B+Tree(多路平衡搜索树)

每一个节点,可以存储多个key(有n个key,就有n个指针)

所有数据都存在叶子节点,非叶子节点仅用于索引数据

叶子节点形成了一颗双向链表,便于数据的排序及区间范围查询

语法:

创建索引:create [unique] index 索引名 on 表名(字段名....);

查看索引:show index from 表名

删除索引:drop index 索引名 on 表名

例子:

-- 创建:为tb_emp表的name字段建立一个索引
create index idx_emp_name on tb_emp(name);

-- 查询:查询tb_emp表的索引信息
show index from tb_emp;

-- 删除:删除tb_emp表中name字段的索引
drop index index_emp_name on tb_emp;

注意事项:

主键字段,在建表时,会自动创建主键索引

添加唯一约束时,数据库实际上会添加唯一索引

目录
相关文章
|
Java Spring 容器
@Resource 这个注解什么用啊
@Resource 这个注解什么用啊
994 0
|
存储 Java 数据库连接
MyBatis-Plus 基础操作指南:实现高效的增删改查
MyBatis-Plus 基础操作指南:实现高效的增删改查
1025 0
|
SQL 关系型数据库 MySQL
菜鸟之路Day30一一MySQL之DML&DQL
本文介绍了MySQL中DML(数据操作语言)和DQL(数据查询语言)的核心用法。DML主要包括插入(insert)、更新(update)和删除(delete)语句,通过具体示例演示了如何对表数据进行增删改操作。DQL则聚焦于数据查询,涵盖基本查询、条件查询、聚合函数、分组查询、排序查询和分页查询等内容。文章通过丰富的SQL语句实例,帮助读者掌握如何高效查询和操作数据库中的数据,适合初学者学习和实践。
621 12
|
前端开发 Java
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
文章通过一个表白墙/留言墙的初级SpringBoot项目实例,详细讲解了如何进行前后端开发,包括定义前后端交互接口、创建SpringBoot项目、编写前端页面、后端代码逻辑及实体类封装的全过程。
613 3
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
10月前
|
安全 Java API
Java日期时间API:从Date到Java.time
本文深入解析了Java 8中引入的全新日期时间API,涵盖LocalDate、LocalTime、LocalDateTime、ZonedDateTime等核心类的使用,以及时间调整、格式化、时区处理和与旧API的互操作。通过实例对比,展示了新API在可变性、线程安全与易用性方面的显著优势,并提供迁移方案与实战技巧,助你掌握现代Java时间处理的最佳实践。
|
存储 Java 程序员
菜鸟之路Day26一一Maven
本文由blue撰写,发布于2025年3月25日,主要介绍Maven工具的使用。Maven是Apache旗下的开源项目,用于管理和构建Java项目,基于项目对象模型(POM)概念。文章详细讲解了Maven的安装配置、IDEA中集成Maven的方法、依赖管理(包括依赖配置、传递与排除、依赖范围)、以及Maven的生命周期(clean、default、site)。通过学习,读者可掌握Maven的基本功能及其在项目中的应用。
627 12
|
SQL 数据安全/隐私保护 索引
SQL语句速成
《SQL语句速成》由blue编写,涵盖建表、插入、查询、更新、删除、视图创建、权限管理及索引操作等核心内容。通过具体示例介绍SQL基本语法和常用聚合函数,帮助读者快速掌握SQL编程技巧。发布于2024年7月19日。
359 7
|
Java 程序员
菜鸟之路Day22一一反射与动态代理
本文介绍了Java反射机制和动态代理的基本概念及应用。反射允许编程访问类的成员变量、构造方法和成员方法,通过三种方式获取Class对象,并演示了如何使用反射创建对象、调用方法和修改字段值。动态代理则通过接口实现无侵入式功能增强,展示了如何利用`Proxy`类和`InvocationHandler`接口生成代理对象并拦截方法调用。结合实例代码,详细讲解了反射在实际开发中的应用场景,如保存对象信息到文件和根据配置文件动态创建对象。 反射的主要作用包括: 1. 获取类的所有信息。 2. 结合配置文件动态创建对象。 动态代理的核心优势在于能够在不修改原有代码的情况下,为对象添加额外功能。
267 0
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`<if>`、`<where>`、`<set>`、`<foreach>`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`<sql>`和`<include>`实现代码复用,优化维护效率。
1255 5
|
JSON Java 数据库
java 常用注解大全、注解笔记
关于Java常用注解的大全和笔记,涵盖了实体类、JSON处理、HTTP请求映射等多个方面的注解使用。
546 0
java 常用注解大全、注解笔记