【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&…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
