MySQL-6.表的高级查询(多表查询、子查询、表复制、合并查询、表外连接)

6.1 多表查询

  • 基于两个或以上表的查询,默认从表1取出一行,与表2的每一行组合,返回的记录数为表1×表2,默认返回的结果为笛卡尔集,需写出正确的WHERE条件进行筛选。
  • 多表查询的条件不能少于表的个数-1,否则会出现笛卡尔集。
  • 指定显示某个表的列:表.列
# 显示雇员名,雇员工资及所在部门的名字
SELECT ename,sal,dname,emp.deptnoFROM emp, deptWHERE emp.deptno = dept.deptno;
# 显示部门号为 10 的部门名、员工名和工资
SELECT ename,sal,dname,emp.deptnoFROM emp, deptWHERE emp.deptno = dept.deptno AND emp.deptno = 10
# 显示各个员工的姓名,工资,及其工资的级别
# 思路: 姓名,工资来自emp,工资级别salgrade
# 先写一个简单,然后加入过滤条件... 
select ename, sal, gradefrom emp , salgradewhere sal between losal and hisal;
  • 自连接:在同一张表的连续查询,即将该表看做两张表;
                        需要给表取别名:表名 表别名;
                        列名不明确可以指定列的别名。
# 显示公司员工名字和他的上级的名字
# 员工名字在 emp, 上级的名字在 emp
# 员工和上级是通过 emp 表的 mgr 列关联
SELECT worker.ename AS '职员名' , boss.ename AS '上级名' FROM emp worker, emp bossWHERE worker.mgr = boss.empno;

6.2 表子查询(嵌套查询)

1. 子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询。
2. 单行子查询是指只返回一行数据的子查询语句。
3. 多行子查询指返回多行数据的子查询,使用关键字 in。
# 显示与 SMITH 同一部门的所有员工
# 先查询 SMITH 的部门号
SELECT deptno FROM emp WHERE ename = 'SMITH';
# 把上面的 select 语句当做一个子查询来使用
SELECT * FROM empWHERE deptno = (SELECT deptno FROM emp WHERE ename = 'SMITH');
# 查询和部门10的工作相同的雇员名字、岗位、工资、部门号, 但是不含 10 号部门自己的雇员
# 先查询部门10有哪些工作
SELECT DISTINCT job FROM emp WHERE depno = 10;
# 把上面查询的结果当做子查询使用
SELECT ename, job, sal, depnoFROM empWHERE job in (SELECT DISTINCT job FROM emp WHERE depno = 10)AND depno <> 10;
4. 可以将子查询当做临时表使用:在FROM中使用
# 查询 ecshop 中各个类别中,价格最高的商品
# 查询商品表
# 先得到各个类别中,价格最高的商品 max + group by cat_id, 当做临时表
SELECT cat_id , MAX(shop_price) as max_priceFROM ecs_goodsGROUP BY cat_id
# 把子查询当做一张临时表可以解决很多复杂的查询,再给这个临时表去个别名temp
SELECT *FROM(SELECT cat_id , MAX(shop_price) as max_priceFROM ecs_goodsGROUP BY cat_id)temp, ecs_goodswhere temp.cat_id = ecs_goods.cat_idand temp.max_price = ecs_goods.shop_price;
# 查找每个部门工资高于本部门平均工资的人的资料
# 先得到每个部门的部门号和对应的平均工资
SELECT deptno, AVG(sal) AS avg_salFROM emp GROUP BY deptno;
# 把上面的结果当做子查询,临时表,和 emp 进行多表查询
SELECT ename, sal, temp.avg_sal, emp.deptnoFROM emp, (SELECT deptno, AVG(sal) AS avg_salFROM empGROUP BY deptno) tempWHERE emp.deptno = temp.deptno AND emp.sal > temp.avg_sal;
5. 在多行子查询中使用 all 操作符:所有

all和any的区别:all强调所有,any则是其中之一即可。

# 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
# 先查询部门30员工的工资
SELECT sal FROM emp WHERE deptno = 30;
# 比部门30的所有员工工资高——all关键字
SELECT ename, sal, deptnoFROM empWHERE sal > ALL(SELECT sal FROM emp WHERE deptno = 30);# 也可以使用MAX()
SELECT ename, sal, deptnoFROM empWHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno = 30);
# 显示工资比部门 30 的其中一个员工的工资高的员工的姓名、工资和部门号
SELECT ename, sal, deptnoFROM empWHERE sal > any(SELECT sal FROM emp WHERE deptno = 30);# 也可以使用MIN
SELECT ename, sal, deptnoFROM empWHERE sal > (SELECT MIN(sal) FROM emp WHERE deptno = 30);
6. 多列子查询:查询返回多个列的子查询

# 查询与 allen 的部门和岗位完全相同的所有雇员(并且不含 allen 本人)
# 得到 allen 的部门和岗位
SELECT depno, job FROM emp WHERE `name` = "allen";SELECT * FROM empWHERE (depno, job) = (SELECT depno, job FROM empWHERE `name` = "allen") AND name != "allen";
# 查询和宋江数学,英语,语文成绩完全相同的学生
SELECT `name`FROM studentWHERE (math, english, chinese) = (SELECT math, english, chineseFROM studentWHERE `name` = '宋江' );

6.3 表复制和去重

也称自我复制数据(蠕虫复制),有时需对sql语句测试效率需要大量数据,用此进行自我复制。

# 先把 emp 表的记录复制到 my_tab01
INSERT INTO my_tab01(id, `name`, sal, job,deptno)SELECT empno, ename, sal, job, deptno FROM emp;# 自我复制
INSERT INTO my_tab01SELECT * FROM my_tab01;
# 删除my_tab02表的重复记录
# 思路
# (1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样
# (2) 把 my_tmp 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp
# (3) 清除掉 my_tab02 记录
# (4) 把 my_tmp 表的记录复制到 my_tab02
# (5) drop 掉 临时表 my_tmpcreate table my_tmp like my_tab02;
insert into my_tmp select distinct * from my_tab02;
delete from my_tab02;
insert into my_tab02 select * from my_tmp;
drop table my_tmp;

6.4 合并查询

        合并多个SELECT语句的查询结果,可以使用集合操作符号:union all、union,直接加在两句之间。
  • union all:对两个结果集取并集,不会去掉重复行
  • union:取并集,去掉重复行。
SELECT ename,sal,job FROM emp WHERE sal>2500;
SELECT ename,sal,job FROM emp WHERE job='MANAGER';SELECT ename,sal,job FROM emp WHERE sal>2500UNION ALLSELECT ename,sal,job FROM emp WHERE job='MANAGER';SELECT ename,sal,job FROM emp WHERE sal>2500UNIONSELECT ename,sal,job FROM emp WHERE job='MANAGER';

6.5 表外连接

外连接可以弥补多表查询无法做到的操作。
多表查询利用 where 子句对两张表或者多张表,形成的笛卡尔集进行筛选,根据关联条件,显示所有匹配的记录,匹配不上的,不显示(即弥补这一部分)
# 列出部门名称和这些部门的员工名称和工作,同时显示出没有员工的部门
# 多表查询:无法同时显示出没有员工的部门
SELECT dname, ename, jobFROM emp, deptWHERE emp.deptno = dept.deptnoORDER BY dname;# 右连接:显示部门的全部信息,把部门做右表
SELECT dname, ename, jobFROM emp RIGHT JOIN deptON dept.deptno = emp.deptno
# 左连接:把部门做左表
SELECT dname, ename, jobFROM dept LEFT JOIN empON dept.deptno = emp.deptno
  • 左外连接:如果左侧的表完全显示我们就说是左外连接
        select ... from 表1 left join 表2 on 条件;               (表1为左表)
  • 右外连接:如果右侧的表完全显示我们就说是右外连接
        select ... from 表1 right join 表2 on 条件;
# 外连接
# 学生表stu和成绩表exam
# 左连接:显示所有人的成绩,如果没有成绩,也要显示该人的姓名和 id 号,成绩显示为空
# 如果使用多表查询,只能显示有成绩的学生,没有成绩的无法显示
SELECT `name`, stu.id, gradeFROM stu, examWHERE stu.id = exam.id;# 左连接:
SELECT `name`, stu.id, gradeFROM stu LEFT JOIN examON stu.id = exam.id;# 右连接:显示所有成绩,如果没有名字匹配,显示空
SELECT `name`, stu.id, gradeFROM stu RIGHT JOIN examON stu.id = exam.id;
 参考:韩顺平mysql

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

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

相关文章

LeetCode刷题之105. 从前序与中序遍历序列构造二叉树

文章目录 1.题目描述2. 分析2.1 前序遍历2.1.1 什么是前序遍历&#xff1f;2.1.2 前序遍历有什么特点&#xff1f; 2.2 中序遍历2.2.1 什么是中序遍历2.2.2 中序遍历有什么特点&#xff1f; 2.3 后序遍历2.3.1 什么是后序遍历&#xff1f;2.3.2 特点 2.4 总结 3. 解法 1.题目描…

漏洞挖掘 | 两个src案例分享

案例一 - 存储型XSS 文前废话:某天正在刷着**社区的帖子,突然间评论区的一条评论引起了我的注意,类似于下面这样 其中字体是蓝色的&#xff0c;这种评论在html标签中代码格式是<a>这是文字</a>这样的链接个格式。 同时评论区XSS漏洞的高发区,想着可能会有操作点 …

每日一题|字符迁移【算法赛】|字符数组+前缀和+差分

每日一题|字符迁移【算法赛】 字符迁移 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 字符迁移 注意&#xff1a; 预习知识&#xf…

【InternLM 实战营第二期笔记】使用茴香豆搭建你的RAG智能助理

RAG RAG是什么 RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追…

C++STL(list类)

文章目录 1.list类的介绍2.list的基本用法2.1 基本用法2.2 迭代器失效2.3 reverse(逆置)2.3 sort(排序)2.4 unique(去重)2.5 splice(转移) 3.list的底层(模拟实现)3.1 list的3.2 修改链表问题3.3 完整代码 1.list类的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列…

vue快速入门(十)v-bind动态属性绑定

注释很详细&#xff0c;直接上代码 上一篇 新增内容 图片切换逻辑动态绑定的完整写法与简写方法 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

【SpringBoot整合系列】SpringBoot整合FastDFS(二)

目录 SpringBoot整合FastDFSJava客户端/依赖常用api接口解释1.uploadFile参数返回值 2.uploadSlaveFile参数返回值 3.getMetadata参数返回值 4.overwriteMetadata参数&#xff1a;返回值&#xff1a;无 5.mergeMetadata参数&#xff1a;返回值&#xff1a;无 6.queryFileInfo参…

Shoplazza闪耀Shoptalk 2024,新零售创新解决方案引领行业新篇章!

在近期举办的全球零售业瞩目盛事——Shoptalk 2024大会上,全球*的零售技术平台-店匠科技(Shoplazza)以其*的创新实力与前瞻的技术理念,成功吸引了与会者的广泛关注。此次盛会于3月17日至20日在拉斯维加斯曼德勒湾隆重举行,汇聚了逾万名行业精英。在这场零售业的盛大聚会上,Shop…

Unity开发一个FPS游戏之三

在前面的两篇博客中&#xff0c;我已实现了一个FPS游戏的大部分功能&#xff0c;包括了第一人称的主角运动控制&#xff0c;武器射击以及敌人的智能行为。这里我将继续完善这个游戏&#xff0c;包括以下几个方面&#xff1a; 增加一个真实的游戏场景&#xff0c;模拟一个废弃的…

谷粒商城实战(011 业务-检索服务)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第173p-第p194的内容 介绍 这些过滤条件都可以写在must里&#xff0c;但是filter不参与评分&#xff0c;速度会快一些&#xff0c;所以一些分类等…

AssetBundle打包

AssetBundle技术的概念 Unity的AssetBundle是一个资源压缩包&#xff0c;包含模型、贴图、预制体、声音甚至整个场景&#xff0c;可以在游戏运行时被加载。   AssetBundle自身保存着相互的依赖关系&#xff0c;压缩包可以使用LZMA和LZ4压缩算法&#xff0c;减少包大小&#x…

【学习】移动端App性能测试流程有哪些

移动端App性能测试是保证App性能表现的重要环节之一。随着移动设备的普及和移动互联网的发展&#xff0c;移动端App的性能测试变得越来越重要&#xff0c;通过科学合理的性能测试可以发现并解决潜在的性能问题优化App运行效果提高用户体验。性能测试旨在评估App在各种场景下的性…

基于视频监管与AI智能识别技术的水利河道综合治理解决方案

一、方案介绍 TSINGSEE青犀视频水利河道综合治理解决方案是依托视频AI智能分析技术&#xff0c;利用水质/水文等传感器、高清摄像机、水利球、无人机、无人船等感知设备实时采集数据&#xff0c;并与视频能力进行联动&#xff0c;达到智能预警的目的。 TSINGSEE青犀方案以信息…

Spring Cloud微服务入门(三)

服务注册与发现的概念 服务之间相互访问&#xff1a; 例如&#xff1a;用户中心与内容中心之间相互调用。 问题&#xff1a; 服务调用需要知道对方的服务地址&#xff0c;地址写在哪里&#xff1f; 如果服务是多个实例部署&#xff0c;该调用哪一个&#xff1f; 如果服务是多…

Jetpack Compose -> 状态机制的背后秘密

前言 上一章我们讲解了 Jetpack Compose 的无状态、状态提升、单向数据流 本章我们讲解下状态机制的背后秘密 List 前面我们讲过&#xff0c;通过 by mustableStateOf() 就可以被 Compose 自动订阅了&#xff1b;我们前面是通过 String 类型进行的自动订阅&#xff0c;那么换成…

【深度学习】YOLO-World: Real-Time Open-Vocabulary Object Detection,目标检测

介绍一个酷炫的目标检测方式&#xff1a; 论文&#xff1a;https://arxiv.org/abs/2401.17270 代码&#xff1a;https://github.com/AILab-CVC/YOLO-World 文章目录 摘要Introduction第2章 相关工作2.1 传统目标检测2.2 开放词汇目标检测 第3章 方法3.1 预训练公式&#xff1a…

电容隔离型±10V输入隔离放大器特点:ISOC 124P

产品特点: 50KHz(-3dB)高带宽与ISO 124P隔离器Pin-Pin兼容 低成本小体积&#xff0c;标准DIP16Pin阻燃材料封装 精度等级:0.01级&#xff0c;全量程内非线性度0.01% 信号输入与输出之间:3000VDC隔离耐压 电源范围:4.5V~18V 双极运算:Vo10V 方便易用&#xff0c;固定单位增益配置…

ubuntu安装nginx以及开启文件服务器

1. 下载源码 下载页面&#xff1a;https://nginx.org/en/download.html 下载地址&#xff1a;https://nginx.org/download/nginx-1.24.0.tar.gz curl -O https://nginx.org/download/nginx-1.24.0.tar.gz2. 依赖配置 sudo apt install gcc make libpcre3-dev zlib1g-dev ope…

【分治算法】Strassen矩阵乘法Python实现

文章目录 [toc]问题描述基础算法时间复杂性 Strassen算法时间复杂性 问题时间复杂性Python实现 个人主页&#xff1a;丷从心. 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 问题描述 设 A A A和 B B B是两个 n n n \times n nn矩阵&#xff0c; A A…

CICD流水线 发布应用到docker镜像仓库

准备工作 1.先注册免费的镜像仓库 复制链接: https://cr.console.aliyun.com/cn-beijing/instances 实施 1. 新建流水线&#xff0c;选择模板 2.添加流水线源&#xff0c;及是你的代码仓库, 选择对应分支. 3.代码检查以及单元测试&#xff0c;这个步骤可以不用动它. 4. …