菜鸟之路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;

注意事项:

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

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

目录
相关文章
|
29天前
|
缓存 JSON JavaScript
鸿蒙开发实现图片上传(上传用户头像)
本内容介绍了一种基于HarmonyOS的应用场景,主要实现图片选择、拷贝到缓存目录以及上传的功能。首先通过系统文件选择器(FilePicker)选择图片,无需额外权限;接着使用`fs`模块将选中的图片复制到应用缓存目录(cacheDir),以满足上传功能的路径要求;最后利用`request.uploadFile`方法将图片上传至服务器,并处理响应结果。代码详细展示了每个步骤的实现逻辑,包括图片选择、文件操作和网络请求,适用于需要实现图片上传功能的开发者。
|
29天前
|
vr&ar Android开发 云计算
《云端共生体:Flutter与AR Cloud如何改写社交交互规则》
当Flutter遇上AR Cloud,社交应用迎来跨设备增强现实内容共享与协作的新纪元。Flutter作为谷歌开源的UI开发工具包,支持一套代码多平台部署,大幅降低开发成本,其强大的渲染能力和丰富组件库为社交应用提供了流畅美观的用户体验。AR Cloud通过结合增强现实与云计算,构建虚实融合的共享空间,让用户突破地理限制,在虚拟环境中实时互动。手势识别与空间音频技术进一步提升沉浸感,使用户在虚拟音乐会、办公室等场景中实现自然交互。随着5G/6G网络普及和相关技术进步,未来社交应用将迈向更逼真、高效的沉浸式体验时代。
60 15
位运算基础
本文由blue编写,发布于2024年3月,主要讲解位运算的基础知识及其应用。内容涵盖计算二进制中1的个数、`x & -x`运算规则及其实用场景(如获取LowBit)、与、或、非、异或运算的定义与妙用,以及左移和右移操作。通过实例代码展示了如何利用位运算解决实际问题,例如信号灯灯管变化模拟。适合初学者学习位运算的核心概念与技巧。
78 43
|
21天前
|
SQL Java 数据库连接
菜鸟之路Day34一一Mybatis-基础操作
本文介绍了MyBatis的基础操作,包括删除、插入、修改和查询功能的实现。通过`@Delete`、`@Insert`、`@Update`和`@Select`注解完成对应操作,支持主键自动生成与返回。同时探讨了`#{}`和`${}`的区别,前者用于预编译SQL提升安全性,后者直接拼接但存在SQL注入风险。文章还提供了根据ID查询及条件查询的示例,并介绍了实体类属性与数据库字段不一致时的解决方案,如使用驼峰命名规则或配置映射关系,确保数据封装准确。
93 32
|
1月前
|
消息中间件 运维 监控
加一个JVM参数,让系统可用率从95%提高到99.995%
本文针对一个高并发(10W+ QPS)、低延迟(毫秒级返回)的系统因内存索引切换导致的不稳定问题,深入分析并优化了JVM参数配置。通过定位问题根源为GC压力大,尝试了多种优化手段:调整MaxTenuringThreshold、InitialTenuringThreshold、AlwaysTenure等参数让索引尽早晋升到老年代;探索PretenureSizeThreshold和G1HeapRegionSize实现索引直接分配到老年代;加速索引复制过程以及升级至JDK11使用ZGC。
368 82
加一个JVM参数,让系统可用率从95%提高到99.995%
|
27天前
|
人工智能 自然语言处理 搜索推荐
AI 零成本搭建个人网站,小白 3 步搞定!通义灵码智能体+MCP 新玩法
通过AI技术,即使不编写代码也能高效开发项目。从生成诗朗诵网页到3D游戏创建,这些令人惊叹的操作如今触手可及。经过摸索,我利用AI成功上线了个人站点:https://koi0101-max.github.io/web。无需一行代码,借助强大的工具即可实现创意,让开发变得简单快捷!
960 68
|
27天前
|
SQL 存储 关系型数据库
滴滴面试:明明 mysql 加的是 行锁,怎么就变 表锁 了?
滴滴面试:明明 mysql 加的是 行锁,怎么就变 表锁 了?
|
29天前
|
负载均衡 应用服务中间件 nginx
Nginx配置与命令
Nginx 是一款高性能的 HTTP 和反向代理服务器,其配置文件灵活且功能强大。本文介绍了 Nginx 配置的基础结构和常用指令,包括全局块、Events 块、HTTP 块及 Server 块的配置方法,以及静态资源服务、反向代理、负载均衡、HTTPS 和 URL 重写等功能实现。此外,还提供了常用的 Nginx 命令操作,如启动、停止、重载配置和日志管理等,帮助用户高效管理和优化服务器性能。
|
1月前
|
前端开发 算法 API
构建高性能图像处理Web应用:Next.js与TailwindCSS实践
本文分享了构建在线图像黑白转换工具的技术实践,涵盖技术栈选择、架构设计与性能优化。项目采用Next.js提供优秀的SSR性能和SEO支持,TailwindCSS加速UI开发,WebAssembly实现高性能图像处理算法。通过渐进式处理、WebWorker隔离及内存管理等策略,解决大图像处理性能瓶颈,并确保跨浏览器兼容性和移动设备优化。实际应用案例展示了其即时处理、高质量输出和客户端隐私保护等特点。未来计划引入WebGPU加速、AI增强等功能,进一步提升用户体验。此技术栈为Web图像处理应用提供了高效可行的解决方案。
|
29天前
|
自然语言处理 前端开发 语音技术
《虚拟即真实:数字人驱动技术在React Native社交中的涅槃》
本文探讨了React Native与数字人驱动技术结合在社交应用中塑造智能客服与虚拟主播自然交互的可能性。React Native作为跨平台开发框架,具备高效开发、丰富组件和强大社区支持的优势,为社交应用提供了流畅体验。数字人技术通过计算机视觉、语音识别和自然语言处理等实现逼真互动,使虚拟形象能实时响应用户表情与动作。两者融合可打造个性化、沉浸式的交互体验,例如智能客服能根据用户情绪调整回应,虚拟主播则通过实时互动提升直播效果,显著提高用户满意度和应用活跃度。
64 14