【H2O2|全栈】MySQL的基本操作(三)
目录
前言
开篇语
准备工作
案例准备
多表查询
笛卡尔积
等值连接
外连接
内连接
自连接
子查询
存在和所有
含于
分页查询
建表语句
结束语
前言
开篇语
本篇继续讲解MySQL的一些基础的操作——数据字段的查询中的多表查询和分页查询,与单表查询相比,这些在面试时会更加常用。
准备工作
软件:【参考版本】Navicat Premium 16 / SQLyog - 32 bit
语言:MySQL
版本信息:MySQL5.7
案例准备
本次的案例为四张表,创建的语句比较长,放在本章的最后,请自行跳转至对应位置复制创建。
参考库结构——
dept部门表结构(4行3列)——
emp员工表结构(14行8列)——
多表查询
笛卡尔积
概念
笛卡尔积查询的结果是两张被查询的表的列数相加,行数相乘。
比如说一张三列四行的表和一张四列六行的表查询,在不进行过滤去重的条件下,查询的结果就是一张七列二十四行的新表,相同的列不会合并。
案例
1.员工表emp和部门表dept的笛卡尔积
select emp.*,dept.*
from emp,dept
可以看到,多表查询的from语句里不止有一张表。查询的结果是11*56,相同的列deptno(部门编号并未被合并)。
等值连接
概念
当过滤条件中涉及到两张表的某一条件对应相同(=)时,就可以使用等值连接查询。
而其余的情况就是非等值连接,比如使用>=,<=,<>,betwen and等作为过滤条件。
关键字
=
案例
1.使用等值连接,显示员工的编号,姓名,部门编号,部门名
select empno, ename, e.deptno, dname
from emp e, dept d where e.deptno = d.deptno
order by e.deptno
由于部门编号实际上在两张表中都有,所以我们可以将该列作为等值连接的过滤条件。
注意,由于这里有两张表,所以要指定使用哪一张表的部门编号,否则会提醒你不知道要找的是哪一张表的这一列——
外连接
概念
外连接实际上分为左外连接和右外连接两种,一般来说,以左表作为基准就是左外连接,反之就是右外连接。
那么,什么是以左表为基准呢?实际上就是左表中有的条件,右表中可能是没有的,但是我们需要把右表强行对应拼到左表中,如果拼接位置找不到对应的数据,则结果里的该位置处为NULL。
即以谁为基准,就应当保证结果中有谁的全部数据,而不保证另一侧。
关键字
LEFT JOIN
ON
RIGHT JOIN
ON
案例
1.外连接 查询 员工编号 员工姓名 部门编号 部门名称
这里以左外连接为例——
select empno, ename, e.deptno, d.dname
from emp e left join dept don e.deptno = d.deptno order by e.deptno
可以看到,外连接和笛卡尔积查询的结果非常相似,只是把并列的两张表变成了外连接,然后把过滤条件放到ON中了。
实质上,笛卡尔积查询和外连接查询可以相互转化。
内连接
概念
当数据项既满足左外连接,又满足右外连接,即为两表有关联(不会补NULL)的数据项时,就是内连接了。
在数学上,我们也可以把内连接的结果看做是两表的交集。
关键字
INNER JOIN
ON
案例
1.内连接 查询 员工编号 员工姓名 部门编号 部门名称
select empno,ename,e.deptno, d.dname
from emp e inner join dept d on e.deptno = d.deptno order by e.deptno
自连接
概念
自连接实际上就是相当于将自身复制一份,然后让自身和复制表之间实现连接。
案例
1.使用自连接,显示"XXX的上级是XXX"这种格式,对于没有上级的,显示为“无”
select concat(u.ename, '的上级是', ifnull(boss.ename, "无")) 附属关系
from emp u
left join emp boss
on u.mgr = boss.empno;
实际上,这里就是将一张表作为员工表,取的是员工姓名;
而部分员工是有下属的,所以员工表也可以作为上级表使用,两表的连接条件就是员工表的mgr编号与上级表的empno编号一致。
而部分员工可能没有上级,比如说KING的mgr为NULL,说明员工表实际上是外连接中的基准表。
使用IFNULL()来处理NULL的问题,否则整个varchar的值在拼接后会变为NULL。
子查询
概念
子查询的作用是,查询条件未知的事物,将查询的结果作为父查询的条件使用。
一般来说,子查询有下面的要点——
1) 子查询与父查询可以针对不同的表,也可以针对同一张表
2) 子查询与父查询在传参时,参数数量、类型和含义要相同
说白了,子查询可以看做一个(组)参数,或代表一张表。
但是子查询的效率是很低的,应当尽量少用。
案例
1.查询出高于10号部门的平均工资的员工信息
select *
from emp
where sal > (select avg(sal) from emp where deptno = 10)
实际上,我们需要做两次查表的操作,第一次是查询所有员工的信息(父查询),第二次是查询10号部门的平均工资(子查询)。
然后,将子查询的结果(avg(sal))作为父查询的过滤条件,完成查询需求。
2.查询出有哪些部门的平均工资高于30号部门的平均工资,部门编号 部门名称 平均工资
select e.deptno, dname, avg(sal)
from emp e, dept d
where e.deptno <> 30 and e.deptno = d.deptno
group by e.deptno, dname
having avg(sal) > (select avg(sal) from emp where deptno = 30)
对于多行函数AVG(),该过滤条件需要添加到HAVING分组过滤关键字中。
不要忘记两表公有的列一定要指定是哪一张表的该列。
3.查询各部门中工资比本部门平均工资高的员工的员工号 姓名 工资
select empno, ename, sal
from emp e, (select avg(sal) avsa, deptno from emp group by deptno) f
where e.deptno = f.deptno
and sal > avsa
子查询的结果实际上也可以看成一张表,为了使这张新表 f 能够与员工表 e 有关联,我们可以为新表添加一个公共列deptno。
存在和所有
概念
存在是指,在结果集中至少有一个结果符合条件就符合;
所有是指,结果集的所有结果都符合条件才符合。
关键字
ANY()
ALL()
案例
1.查询出比20号部门任一员工薪资高的员工信息
select *
from emp
where sal > any(select sal from emp where deptno = 30)
这里涉及到员工表和只有30号部门员工的子表,所以用到的是子查询。
而过滤条件里要求查询的工资比任一结果高,即至少有一个符合(最低薪资)即可,所以可以使用ANY关键字。
2.查询出比30号部门任何员工薪资高的员工信息
select *
from emp
where sal > all(select sal from emp where deptno = 30)
这里要求比任何30号部门员工工资都高,所以使用ALL关键字。
实际上,在部分情况下,ANY和ALL与MIN()和MAX()函数的作用是相同。
含于
概念
含于是指某个(些)筛选内容包含在结果集中,筛选内容需要与结果集中内容对应。
关键字
IN()
案例
1.查询工作和工资与MARTIN完全相同的员工信息
select *
from emp
where (job, sal) in(select job, sal from emp where ename = "MARTIN")
我们的子查询查询出了两列的内容,而筛选条件job和sal与这两列一一对应。
分页查询
概念
分页查询是指查询指定表中的某一条至某一条的行。
关键字
LIMIT start, number
其中start为开始的索引值(从0开始),number为查询的条数。
案例
1.查询工资排名第4到8名的员工的信息
select *
from emp
order by sal
limit 3, 5
建表语句
员工表
CREATE TABLE `emp` (`empno` INT(4) NOT NULL COMMENT '员工编号',`ename` VARCHAR(10) DEFAULT NULL COMMENT '员工姓名',`job` VARCHAR(9) DEFAULT NULL COMMENT '员工岗位',`mgr` INT(4) DEFAULT NULL COMMENT '领导编号',`hiredate` DATE DEFAULT NULL COMMENT '入职时间',`sal` DECIMAL(7,2) DEFAULT NULL COMMENT '工资',`comm` DECIMAL(7,2) DEFAULT NULL COMMENT '奖金',`deptno` INT(2) DEFAULT NULL COMMENT '部门编号',PRIMARY KEY (`empno`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
员工表数据
INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7369', 'SMITH', 'CLERK', '7902','1980-12-17', '800', NULL, '20');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600', '300', '30');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250', '500', '30');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975', NULL, '20');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250', '1400', '30');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850', NULL, '30');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450', NULL, '10');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-06-13', '3000', NULL, '20');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7839', 'KING', 'PRESIDENT', NULL, '1981-11-17', '5000', NULL, '10');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500', '0', '30');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-06-13', '1100', NULL, '20');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950', NULL, '30');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000', NULL, '20');INSERT INTO emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300', NULL, '10');
部门表
CREATE TABLE dept(deptno INT(2) PRIMARY KEY NOT NULL,dname VARCHAR(14),loc VARCHAR(13)
);
部门表数据
INSERT INTO dept (DEPTNO, DNAME, LOC)
VALUES ('10', 'ACCOUNTING', 'NEW YORK');INSERT INTO dept (DEPTNO, DNAME, LOC)
VALUES ('20', 'RESEARCH', 'DALLAS');INSERT INTO dept (DEPTNO, DNAME, LOC)
VALUES ('30', 'SALES', 'CHICAGO');INSERT INTO dept (DEPTNO, DNAME, LOC)
VALUES ('40', 'OPERATIONS', 'BOSTON');
结束语
本期内容到此结束。关于本系列的其他博客,可以查看我的MySQL专栏。
本系列的博客主要是记录学习经历,并总结阶段的知识点。全篇的操作过程由笔者完成并核验,在部分定义上有参考其他的内容。本身也是新手,多多包涵。
==期待与你在下一期博客中再次相遇==
——放了挺久的【H2O2】
相关文章:

【H2O2|全栈】MySQL的基本操作(三)
目录 前言 开篇语 准备工作 案例准备 多表查询 笛卡尔积 等值连接 外连接 内连接 自连接 子查询 存在和所有 含于 分页查询 建表语句 结束语 前言 开篇语 本篇继续讲解MySQL的一些基础的操作——数据字段的查询中的多表查询和分页查询,与单表查询…...
2、C++命名空间
命名空间 命名空间是一种用来避免命名冲突的机制; 原理是将一个全局的作用域分成一个个命名空间,每个命名空间是个单独的作用域,从而有效避免命名冲突。 注意:命名空间定义在全局 命名空间定义格式 使用: …...

Elemenu-UI时间日期单个组件,限制当前日期之后的时间
element的时间日期组件, type"datetime" ,当你设置了:picker-options"pickerOptions"之后 pickerOptions: { disabledDate(time) { return time.getTime() > Date.now(); }, }, 会发现,他只会限制日期,但不…...
flutter修改状态栏学习
在flutter中如何动态更改状态栏的颜色和风格。 前置知识点学习 AnnotatedRegion AnnotatedRegion 是 Flutter 中的一个小部件,用于在特定区域中提供元数据(metadata)以影响某些系统级的行为或外观。它通常用于改变系统 UI 的外观ÿ…...

解决Unity编辑器Inspector视图中文注释乱码
1.问题介绍 新创建一个脚本,用VS打开编辑,增加一行中文注释保存,在Unity中找到该脚本并选中,Inspector视图中预览的显示内容,该中文注释显示为乱码,如下图所示: 2.图示解决步骤 按上述步骤操作…...
关于csgo的游戏作弊与封禁
关于csgo的游戏作弊与封禁 一.关于作弊 什么叫作弊? 1.换肤,换库存 2.各种参(回溯,自瞄,透视,急停,连跳,假身,子弹跟踪等) 3.某一部分更改游戏内存&…...

严格单元测试造就安全软件
在信息技术迅速发展的今天,软件在各个行业中扮演着至关重要的角色,尤其是在汽车行业,其中软件的可靠性和安全性直接影响到人们的生命安全。软件缺陷所带来的潜在风险不容小觑,尤其在涉及到自动驾驶和车辆控制等关键系统时…...
ubuntu 根分区逻辑卷扩容
1、虚拟机关机通过管理界面给磁盘扩容。 rootcurtis:/home/curtis/git_code# pvdisplay--- Physical volume ---PV Name /dev/vda3VG Name ubuntu-vgPV Size <239.00 GiB / not usable 0Allocatable yes (but full)PE…...
如何查看电脑生产日期
查看电脑的生产日期通常可以通过以下方法实现,具体方式取决于操作系统和电脑类型: 方法 1:检查电脑 BIOS 生产日期通常记录在 BIOS 中。可以通过以下步骤查看: 重启电脑并进入 BIOS: 启动时按下特定的键(…...
MAC M1 mysql 8.0 如何修改root用户密码
关闭mysql服务 使用brew方式安装,可以通过一下命令关闭 brew services stop mysql使用安装包安装的方式 可以选择🍎->系统偏好设置->最下方单机MySQL图标->stop mysql server 启动 MySQL 到安全模式 sudo mysqld_safe --skip-grant-tables …...

漫画之家系统:Spring Boot框架下的漫画版权保护
摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…...

在 MacOS 上为 LM Studio 更换镜像源
在 MacOS 之中使用 LM Studio 部署本地 LLM时,用户可能会遇到无法下载模型的问题。 一般的解决方法是在 huggingface.co 或者国内的镜像站 hf-mirror.com 的项目介绍卡页面下载模型后拖入 LM Studio 的模型文件夹。这样无法利用 LM Studio 本身的搜索功能。 本文将…...

Nginx配置https(Ubuntu、Debian、Linux、麒麟)
Ubuntu操作系统,Debian系统底层是Ubuntu,差异不大 ubuntu 安装nginx 1.安装依赖 sudo apt-get update sudo apt-get install gcc sudo apt-get install libpcre3 libpcre3-dev sudo apt-get install zlib1g zlib1g-dev sudo apt-get install openssl lib…...

「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
本篇将带你实现一个简单的照片墙布局应用,通过展示多张图片组成照片墙效果,用户可以点击图片查看其状态变化。 关键词 UI互动应用照片墙布局Grid 布局动态图片加载用户交互 一、功能说明 照片墙布局应用的特点: 动态加载多张图片组成网格布…...

VMware Workstation 安装Ubuntu 系统(图文步骤)
之前一直在讲Ubuntu Linux的用户和组 链接: Linux专栏 今天来讲讲Ubuntu 系统基础的安装步骤!!! 废话少说,马上开始! 文章目录 前言准备安装环境先下载Ubuntu 镜像 详细安装步骤如下新建虚拟机默认使用 15.…...

mybatis用pagehelper 然后用CountJSqlParser45,发现自己手写的mapper查询效率很慢
如题 效率慢疑惑 效率慢 分页查询,发现效率很慢,然后发现是比较复杂的sql,CountJSqlParser45它不会帮忙优化掉,就是select多少字段它count的时候也还是这么多字段 框架里的用法是这样的 所以去看了CountJSqlParser45里面的代码,发现如果有group之类的,它就不帮忙把count优化…...

【优选算法 二分查找】二分查找入门详解:二分查找 & 在排序数组中查找元素的第一个和最后一个位置
二分查找 题目描述 题目解析 暴力解法 我们可以从左往右遍历一次数组,如果存在 target 则返回数组的下标,否则返回 -1; 时间复杂度 O(N),因为没有利用数组有序的特点,每次比较只能舍弃一个要比较的数&…...

WPF编写工业相机镜头选型程序
该程序满足面阵和线阵的要求。 前端代码 <Window x:Class"相机镜头选型.MainWindow" Loaded"Window_Loaded"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml…...

网络安全内容整理二
网络嗅探技术 网络监听 网络监听,也称网络嗅探(Network Sniffing):在他方未察觉的情况下捕获其通信报文、通信内容的技术 网卡的工作模式: 1.广播模式(Broadcast Mode):网卡能够接收网络中的广播信息 2.组播模式(Multicast Mo…...

解决git did not exit cleanly (exit code 128)问题
解决 git did not exit cleanly (exit code 128)问题 1、错误描述2、解决方法2.1 方法一2.2 方法二 1、错误描述 使用TortoiseGit进行操作时,总是提示下述错误。 2、解决方法 2.1 方法一 打开 TortoiseGit -> Settings 点击 Network&…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...