当前位置: 首页 > news >正文

【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 d

on 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的一些基础的操作——数据字段的查询中的多表查询和分页查询&#xff0c;与单表查询…...

2、C++命名空间

命名空间 命名空间是一种用来避免命名冲突的机制; 原理是将一个全局的作用域分成一个个命名空间&#xff0c;每个命名空间是个单独的作用域,从而有效避免命名冲突。 注意&#xff1a;命名空间定义在全局 命名空间定义格式 使用&#xff1a; …...

Elemenu-UI时间日期单个组件,限制当前日期之后的时间

element的时间日期组件&#xff0c; type"datetime" &#xff0c;当你设置了:picker-options"pickerOptions"之后 pickerOptions: { disabledDate(time) { return time.getTime() > Date.now(); }, }, 会发现&#xff0c;他只会限制日期&#xff0c;但不…...

flutter修改状态栏学习

在flutter中如何动态更改状态栏的颜色和风格。 前置知识点学习 AnnotatedRegion AnnotatedRegion 是 Flutter 中的一个小部件&#xff0c;用于在特定区域中提供元数据&#xff08;metadata&#xff09;以影响某些系统级的行为或外观。它通常用于改变系统 UI 的外观&#xff…...

解决Unity编辑器Inspector视图中文注释乱码

1.问题介绍 新创建一个脚本&#xff0c;用VS打开编辑&#xff0c;增加一行中文注释保存&#xff0c;在Unity中找到该脚本并选中&#xff0c;Inspector视图中预览的显示内容&#xff0c;该中文注释显示为乱码&#xff0c;如下图所示&#xff1a; 2.图示解决步骤 按上述步骤操作…...

关于csgo的游戏作弊与封禁

关于csgo的游戏作弊与封禁 一.关于作弊 什么叫作弊&#xff1f; 1.换肤&#xff0c;换库存 2.各种参&#xff08;回溯&#xff0c;自瞄&#xff0c;透视&#xff0c;急停&#xff0c;连跳&#xff0c;假身&#xff0c;子弹跟踪等&#xff09; 3.某一部分更改游戏内存&…...

严格单元测试造就安全软件

在信息技术迅速发展的今天&#xff0c;软件在各个行业中扮演着至关重要的角色&#xff0c;尤其是在汽车行业&#xff0c;其中软件的可靠性和安全性直接影响到人们的生命安全。软件缺陷所带来的潜在风险不容小觑&#xff0c;尤其在涉及到自动驾驶和车辆控制等关键系统时&#xf…...

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…...

如何查看电脑生产日期

查看电脑的生产日期通常可以通过以下方法实现&#xff0c;具体方式取决于操作系统和电脑类型&#xff1a; 方法 1&#xff1a;检查电脑 BIOS 生产日期通常记录在 BIOS 中。可以通过以下步骤查看&#xff1a; 重启电脑并进入 BIOS&#xff1a; 启动时按下特定的键&#xff08;…...

MAC M1 mysql 8.0 如何修改root用户密码

关闭mysql服务 使用brew方式安装&#xff0c;可以通过一下命令关闭 brew services stop mysql使用安装包安装的方式 可以选择&#x1f34e;->系统偏好设置->最下方单机MySQL图标->stop mysql server 启动 MySQL 到安全模式 sudo mysqld_safe --skip-grant-tables …...

漫画之家系统:Spring Boot框架下的漫画版权保护

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…...

在 MacOS 上为 LM Studio 更换镜像源

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

Nginx配置https(Ubuntu、Debian、Linux、麒麟)

Ubuntu操作系统&#xff0c;Debian系统底层是Ubuntu&#xff0c;差异不大 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 - 照片墙布局

本篇将带你实现一个简单的照片墙布局应用&#xff0c;通过展示多张图片组成照片墙效果&#xff0c;用户可以点击图片查看其状态变化。 关键词 UI互动应用照片墙布局Grid 布局动态图片加载用户交互 一、功能说明 照片墙布局应用的特点&#xff1a; 动态加载多张图片组成网格布…...

VMware Workstation 安装Ubuntu 系统(图文步骤)

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

mybatis用pagehelper 然后用CountJSqlParser45,发现自己手写的mapper查询效率很慢

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

【优选算法 二分查找】二分查找入门详解:二分查找 & 在排序数组中查找元素的第一个和最后一个位置

二分查找 题目描述 题目解析 暴力解法 我们可以从左往右遍历一次数组&#xff0c;如果存在 target 则返回数组的下标&#xff0c;否则返回 -1&#xff1b; 时间复杂度 O(N)&#xff0c;因为没有利用数组有序的特点&#xff0c;每次比较只能舍弃一个要比较的数&…...

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…...

网络安全内容整理二

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

解决git did not exit cleanly (exit code 128)问题

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

Linux入门攻坚——40、Linux集群系统入门-lvs(1)

Cluster&#xff0c;集群&#xff0c;为了解决某个特定问题将多台计算机组合起来形成的单个系统。 这个单个集群系统可以扩展&#xff0c;系统扩展的方式&#xff1a;scale up&#xff0c;向上扩展&#xff0c;更换更好的主机&#xff1b;scale out&#xff0c;向外扩展&…...

momentum 和 weight_decay 的区别

momentum 和 weight_decay 的区别 两者在优化器中的作用不同,主要体现在优化的目的和机制上。 1. momentum(动量) 作用:加速收敛并减少优化过程中的震荡。 机制: momentum 是用于在梯度下降中积累动量的机制。它通过在每一步中综合之前的更新方向,帮助模型在陡峭区域加速…...

Vue 3 + TypeScript进阶用法

在掌握了 Vue 3 和 TypeScript 的基本使用后&#xff0c;你可以进一步探索一些进阶特性和最佳实践。这些包括更复杂的类型定义、自定义 hooks、全局状态管理等。下面是一些关键点&#xff1a; 1. 更复杂的类型定义 Props 和 Emits 的类型 对于组件的 props 和 emits&#xf…...

AbutionGraph-时序向量图谱数据库-快速安装部署

运行环境 1&#xff09;操作系统 最好是使用CentOS7或者Ubuntu18以上系统&#xff0c;不满足的话请升级系统内核gcc版本至8以上版本。 支持所有国产主流操作系统银河麒麟、统信OS、深度等等&#xff0c;均做过兼容性测试&#xff1b; 2&#xff09;CPU 为确保数据库每个进…...

Delphi-HTTP通讯及JSON解析

HTTP POST 请求函数 HttpPost 此函数用于发送带有JSON内容的POST请求到指定的URL&#xff0c;并接收服务器响应。它包括了必要的异常处理&#xff0c;确保在遇到错误时可以记录日志。 参数&#xff1a; sUrl&#xff1a;目标URL。sJson&#xff1a;要发送的JSON格式字符串。 返…...

Postgres 如何使事务原子化?

原子性&#xff08;“ACID”意义上的&#xff09;要求 对于对数据库执行的一系列操作&#xff0c;要么一起提交&#xff0c;要么全部回滚&#xff1b;不允许中间状态。对于现实世界的混乱的代码来说&#xff0c;这是天赐之物。 这些更改将被恢复&#xff0c;而不是导致生产环境…...

[Vue3]简易版Vue

简易版Vue 实现ref功能 ref功能主要是收集依赖和触发依赖的过程。 export class Dep { // 创建一个类&#xff0c;使用时使用new Depconstructor(value) { // 初始化可传入一个值this._val value;this.effects new Set(); //收集依赖的容器&#xff0c;使用set数据结构}…...

ElasticSearch学习记录

服务器操作系统版本&#xff1a;Ubuntu 24.04 Java版本&#xff1a;21 Spring Boot版本&#xff1a;3.3.5 如果打算用GUI&#xff0c;虚拟机安装Ubuntu 24.04&#xff0c;见 虚拟机安装Ubuntu 24.04及其常用软件(2024.7)_ubuntu24.04-CSDN博客文章浏览阅读6.6k次&#xff0…...

LabVIEW算法执行时间评估与Windows硬件支持

在设计和实现复杂系统时&#xff0c;准确估算算法的执行时间是关键步骤&#xff0c;尤其在实时性要求较高的应用中。这一评估有助于确定是否需要依赖硬件加速来满足性能需求。首先需要对算法进行时间复杂度分析并进行实验测试&#xff0c;了解其在Windows系统中的运行表现。根据…...

经验帖 | Matlab安装成功后打不开的解决方法

最近在安装Matlab2023时遇到了一个问题&#xff1a; 按照网上的安装教程成功安装 在打开软件时 界面闪一下就消失 无法打开 但是 任务管理器显示matlab在运行中 解决方法如下&#xff1a; matlab快捷方式–>右键打开属性–>目标 填写许可证文件路径 D:\MATLAB\MatlabR20…...