MySQL内外连接、索引特性

news2024/11/28 9:44:58

目录

内连接

外连接

索引特性

理解索引

 删除索引


MySQL内外连接是一种用于联接两个或多个表的操作。内连接只返回满足连接条件的行,外连接返回满足条件和不满足条件的行。

内连接

SQL如下:

SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;

案例一:显示SMITH的名字和部门名字

多表查询:

多表查询本质就是内连接,用内连接方法: 

外连接

分为左外连接和右外连接。

左外连接(LEFT JOIN)是指将左边的表(左表)的所有记录和右边的表(右表)的匹配记录进行连接,如果右表中没有匹配的记录,则右表的字段值为NULL。

右外连接(RIGHT JOIN)是指将右边的表(右表)的所有记录和左边的表(左表)的匹配记录进行连接,如果左表中没有匹配的记录,则左表的字段值为NULL。

简单来说,左外连接返回左表的所有记录和右表的匹配记录,右外连接返回右表的所有记录和左表的匹配记录。

左外连接 

 左外连接SQL如下:

SELECT ... FROM t1 LEFT JOIN t2 on 连接条件 [LEFT JOIN t3 on 连接条件] ... AND 其他条件 

案例一:给定一个学生表和地址表,查询学生的地址,就算学生无地址也要显示

给定表如下: 

 使用左外连接:

右连接

 右外连接SQL如下:

SELECT ... FROM t1 RIGHT JOIN t2 on 连接条件 [RIGHT JOIN t3 on 连接条件] ... AND 其他条件 

案例一:给定一个员工表和部门表,列出部门名称和这些部门的员工信息,同时列出没有员工的部门

 给定表:

使用右外连接:

索引特性

理解索引

为什么需要索引?

        当查询数据直接遍历时,查询时间复杂度为O(N),建立索引的价值在于提高海量数据的检索速度,只要执行了正确的创建索引的操作,数据库底层就会为表中的数据记录构建特定的数据结构,后续在查询表中的数据就能通过查询该数据结构快速查询到数据。但是一定程度也降低了增删改的效率,因为在增删改操作之外,可能需要对底层建立的数据结构进行调整维护。

常见的索引:

主键索引,唯一索引,普通索引,全文索引

验证索引

使用下面SQL创建一个海量数据的表,这段SQL将创建一个名为bit_index的数据库,一个名为EMP的表,并向表中插入了8000000条记录的数据。

drop database if exists `bit_index`;
create database if not exists `bit_index` default character set utf8;
use `bit_index`;

-- 构建一个8000000条记录的数据
-- 构建的海量表数据需要有差异性,所以使用存储过程来创建, 拷贝下面代码就可以了,暂时不用理解

-- 产生随机字符串
delimiter $$
create function rand_string(n INT)
returns varchar(255)
begin
declare chars_str varchar(100) default
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
declare return_str varchar(255) default '';
declare i int default 0;
while i < n do
set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));
set i = i + 1;
end while;
return return_str;
end $$
delimiter ;


-- 产生随机数字
delimiter $$
create function rand_num( )
returns int(5)
begin
declare i int default 0;
set i = floor(10+rand()*500);
return i;
end $$
delimiter ;

-- 创建存储过程,向雇员表添加海量数据
delimiter $$
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0;
set autocommit = 0;
repeat
set i = i + 1;
insert into EMP values ((start+i)
,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
until i = max_num
end repeat;
commit;
end $$
delimiter ;

-- 雇员表
CREATE TABLE `EMP` (
  `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
  `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(9) DEFAULT NULL COMMENT '雇员职位',
  `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
  `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
  `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',
  `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);


-- 执行存储过程,添加8000000条记录
call insert_emp(100001, 8000000);

倘若在执行call insert_emp出现错误:

ERROR 1728 (HY000): Cannot load from mysql.proc. The table is probably corrupted

可以尝试使用下面命令去修复myproc表,然后再重新执行SQL。

USE mysql;
REPAIR TABLE proc;

记录数较多,执行SQL较耗时:

通过desc命令查看表,表中没有索引:

查询EMP中指定员工信息花费4秒以上:

以员工工号建立索引:

 

建立索引后查询,飞速:

注:索引创建原则 

频繁查询、唯一性、更新不频繁、能作为查询条件

 使用explain加在SQL前面,可见使用了索引:

 使用select keys from 表名 SQL查询表的索引信息:

说明:

        Table: 表名
   Non_unique: 是否是唯一键索引
     Key_name: 索引名
 Seq_in_index: 该列在索引中的位置,当索引为单列时,值为1,复合索引时,该值为每列在索引定义中的顺序。
  Column_name: 定义索引的列字段
    Collation: 表示列以何种顺序存储在索引中,“A”表示升序,NULL表无分类
  Cardinality: 索引中唯一值的估计值。
     Sub_part: 列中被编入索引的字符的数量,若列只是部分被编入索引,则该列的值为被编入的索引的字符的数目,若整列被编入,该列值为NULL
       Packed: 指示关键字如何被压缩,没有则为NULL
         Null: 索引列中是否包含NULL,有则为YES,不包含则为NO
   Index_type: 索引类型,有BTREE、FULLTEXT(全文索引)、HASH、RTREE(B树的高维形式)
      Comment: 注释
Index_comment: 索引注释

也可以使用 show index from 表名 来查询索引,还可以用前面的desc查看索引

 删除索引

方法一:删除主键索引

alter table 表名 drop primary key

因为一个表只有一个主键索引,所以删除主键索引时不用指明索引名。 

方法二:删除非主键索引

alter table 表名 drop index 索引名

drop index 索引名 on 表名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用香橙派 学习Linux的串口开发

串口的回顾 & 硬件接线 关于串口也是之前学习过很多次了&#xff0c;详见&#xff1a; 认识串口 和 蓝牙模块HC08_hc08蓝牙模块_mjmmm的博客-CSDN博客 串口的再认识-CSDN博客 香橙派提供了两路串口&#xff0c;第一路就是在刷机时串口连接的引脚&#xff08;对应驱动ttyS0&…

input标签,新增那些属性

input标签作为页面与用户交互的重要入口&#xff0c;了解掌握input的属性&#xff0c;至为重要。 type属性 HTML5给input表现的type属性&#xff0c;添加了很多的属性值&#xff0c;用来丰富了文本框类型。比如&#xff1a; <body><input type"email" na…

前端--HTML

文章目录 HTML结构快速生成代码框架HTML常见标签 表格标签 编写简历信息 填写简历信息 Emmet 快捷键 HTML 特殊字符 一、HTML结构 1.认识HTML标签 HTML 代码是由 "标签" 构成的. 形如: <body>hello</body> 标签名 (body) 放到 < > 中 大部分标…

Spring框架中的@Conditional系列注解

目录 1 Contidional 介绍1.1 Condition 接口1.2 Spring Conditional注解实例1.3 Conditional 与Profile 的对比 2 Spring boot 扩展2.1 ConditionalOnClass和ConditionalOnMissingClass注解2.2 ConditionalOnBean 和ConditionalOnMissingBean注解2.3 ConditionalOnProperty注解…

(二十八)大数据实战——Flume数据采集之kafka数据生产与消费集成案例

前言 本节内容我们主要介绍一下flume数据采集和kafka消息中间键的整合。通过flume监听nc端口的数据&#xff0c;将数据发送到kafka消息的first主题中&#xff0c;然后在通过flume消费kafka中的主题消息&#xff0c;将消费到的消息打印到控制台上。集成使用flume作为kafka的生产…

18. 线性代数 - 线性变换

文章目录 线性空间线性变换线性变换的几何意义特征值与特征向量NumPy的矩阵操作Hi, 你好。我是茶桁。 经历了几节线性代数课程之后,终于咱们到了最后一节课了。本节课的内容说多不多,说少也不少。 我们先是要理解一下线性空间和线性变换,并且探讨一下线性变换的几何意义。…

Mapbox加载arcgis的底图

成果图 这种底图基本上都是按照raster来加载的&#xff0c;主要就是知道地址了&#xff0c;拼参数 具体参数请参考官网 https://developers.arcgis.com/rest/services-reference/enterprise/export-map.htm 源码 我的服务列表是这样的 http://XXXX:XXXX/arcgis/rest/services/…

Rsync远程同步inotify监控

Rsync 简介 rsync&#xff08;Remote Sync&#xff0c;远程同步&#xff09; 是一个开源的快速备份工具&#xff0c;可以在不同主机之间镜像同步整个目录树&#xff0c;支持增量备份&#xff0c;并保持链接和权限 在远程同步任务中&#xff0c;负责发起rsync同步操作的客户机…

【Docker】Docker简介

Docker简介 &#x1f4cb;导航 1. Docker简介1.1 什么是Docker&#xff1f;1.2 什么是容器&#xff1f;1.3 容器的优势&#xff1f;1.4 Docker的优势&#xff1f;1.5 虚拟技术与容器技术Docker的区别&#xff1f;1.6 为什么学习Docker? 2. 安装Docker3. Docker架构4. Docker命…

【算法训练-栈 一】【结构特性】有效的括号

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【栈的使用】&#xff0c;使用【栈】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&#x…

影刀RPA解决WPS不存在的问题

问题阐述 明明电脑上已经安装了WPS&#xff0c;但影刀程序还是提示没有安装的问题 解决办法 1.打开WPS并关闭所有其他网页 2. 配置与修复 3.开始修复 出现这个框&#xff0c;就要关闭WPS&#xff0c;否则无法执行&#xff0c;关闭WPS不影响其修复 4.等待修复完成即可

《打造高可用PostgreSQL:策略与工具》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

性能测试、负载测试、压力测试、稳定性测试简单区分

是一个总称&#xff0c;可细分为性能测试、负载测试、压力测试、稳定性测试。 性能测试 以系统设计初期规划的性能指标为预期目标&#xff0c;对系统不断施加压力&#xff0c;验证系统在资源可接受范围内&#xff0c;是否能达到性能瓶颈。 关键词提取理解 有性能指标&#…

【SpringMVC】JSON数据传输与异常处理的使用

文章目录 一、Jackson1.1 Jackson是什么1.2 常用注解1.3 实例1.3.1导入依赖1.3.2 配置spring-mvc.xml1.3.3 JsonController.java 二、Spring MVC异常处理机制2.1 使用原因2.2 SpringMVC异常处理2.2.1 异常处理机制流程图2.2.2 异常处理的三种方式 一、Jackson 1.1 Jackson是什…

Spring Boot配置文件(YAML Properties)总结

文章目录 配置文件的作用YAML配置文件Properties配置文件配置文件的加载顺序激活不同的配置文件配置文件的占位符自定义配置属性加密敏感信息配置文件的最佳实践结论 &#x1f389;欢迎来到架构设计专栏~Spring Boot配置文件&#xff08;YAML & Properties&#xff09;总结…

解决Java应用程序中的SQLException:Access denied for user ‘root‘@‘localhost‘ 错误

目录 问题背景 解决方案 如何重置 MySQL root 密码&#xff1a; 问题背景 java.sql.SQLException: Access denied for user rootlocalhost (using password: YES) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127) at com.mysql.cj.jdbc.ex…

树控件、下拉框、文本框常用测试用例

01 控件的测试外观操作 1&#xff09;项目中的所有树是否风格一致 2&#xff09;树结构的默认状态是怎样的。比如默认树是否是展开&#xff0c;是展开几级&#xff1f; 是否有默认的焦点&#xff1f;默认值是什么&#xff1f;展开的节点图标和颜色&#xff1f; 3&#xff09…

springboot整合actuator、admin对应用程序进行监控

Spring Boot Actuator 是 Spring Boot 的一个子项目&#xff0c;可以对 Spring Boot 应用程序进行监控和管理&#xff0c;并对外提供了大量的端点&#xff0c;可以选择使用 HTTP 端点或 JMX 来管理和监控应用程序。 这篇文章主要介绍我们的应用程序中怎么加入actuator来对应用进…

算法课程入门

1、算法这门课&#xff0c;主要讲这三件事&#xff1a; 状态空间 最优可行解问题。 确定与非确定。 状态空间的思维方式要掌握住&#xff0c;要能使用状态空间解决新问题。 2、课程安排&#xff1a; 前几本也要看&#xff0c;但是最后一本强烈推荐。 3、经验之谈&#xff1a; …

SpringMVC 的三种异常处理方式详解

目录 1. 什么是异常 2. 为什么要全局异常处理 3. SpringMVC异常分类 4. 异常处理思路 5. 三种异常处理方式示例 ① 配置 SimpleMappingExceptionResolver 处理器 ② 实现 HandlerExceptionResolver 接口 ③ 使用ControllerAdviceExceptionHandler实现全局异常 6. 响应…