MySQL_2.6【高级查询2】详细讲解

目录

一、多表查询

1、笛卡尔积现象

2、等值连接查询

3、自连接查询

4、内连接查询

5、外连接

二、子查询

1、单列子查询

2、单行子查询

3、多行子查询

4、多列子查询

5、关联子查询【了解】

6、子查询的综合应用

 加油!!!

 


一、多表查询

1、笛卡尔积现象

笛卡尔乘积 是数据库表连接的一种现象,连接两个或多个不相关的表,将第一个表(T1)中的每一行与第二个表(T2)中的每一行进行组合,得到的结果集就是笛卡尔积。在没有任何限制条件的情况下,两表连接必然会形成笛卡尔积。如果表1有m行a列,表2有n行b列,两表无条件连接时会将两表里所有行两两组合到一起,所形成的表就有m*n行,a+b列 。所谓的笛卡尔乘积即是每个表的每一行都和其他表的每一 行组合。

以下是笛卡尔积的例子:

SELECT *
FROM customers
CROSS JOIN orders;

这条语句将customers表和orders表中的所有行连接在一起。如果customers表中有1000行,orders表中有1000行,那么笛卡尔积的结果将有1000万行。

笛卡尔积通常不是我们想要的结果。我们通常希望在连接两个表时指定一些连接条件,以便只返回满足条件的行。例如,我们可以使用以下语句来返回订单金额大于100美元的订单:

SELECT *
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id
WHERE order_amount > 100;

这条语句将只返回订单金额大于100美元的订单。

在使用MySQL时,应该注意笛卡尔积的潜在影响。如果没有指定任何连接条件,笛卡尔积的结果可能会非常大,这可能会导致性能问题。

2、等值连接查询

在 MySQL 中,等值连接查询是一种将两个表连接在一起的查询,两个表中具有相等值的列被连接在一起。等值连接查询的语法如下:

SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column1 = table2.column2;

其中,INNER JOIN 表示等值连接,ON table1.column1 = table2.column2 表示连接条件,column1column2 是两个表中具有相等值的列。

以下是等值连接查询的一个示例:

SELECT customer_id, customer_name, order_id, order_date
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;

这条语句将从 customers 表和 orders 表中连接具有相等 id 值的行,并返回 customer_idcustomer_nameorder_idorder_date 列的值。

等值连接查询是一种非常常用的查询类型,它可以用于从两个表中检索数据。

通常是在存在主键外键关联关系的表之间的连接进行,使用"="连接相关的表

n个表进行等值连接查询,最少需要n-1个等值条件来约束

3、自连接查询

自连接查询是指将表与自身连接的查询。自连接查询通常用于检索表中的关系数据。

自连接查询的语法如下:

SELECT column1, column2, ...
FROM table1 AS t1
INNER JOIN table1 AS t2
ON t1.column1 = t2.column2;

其中,AS t1AS t2 是表的别名。

  • 以下是自连接查询的一个示例:
SELECT t1.student_id, t1.student_name, t2.class_name
FROM students AS t1
INNER JOIN classes AS t2
ON t1.class_id = t2.class_id;

这条语句将从 students 表和 classes 表中连接具有相同 class_id 值的行,并返回 student_idstudent_nameclass_name 列的值。

4、内连接查询

内连接查询使用 inner join 关键字实现, inner 可以省略。内连接查询时,条件用 on 连接,多个条件使用 () 将其括起来.

内连接查询是指将两个表连接在一起的查询,只返回两个表中具有相同值的行。内连接查询的语法如下:

SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column1 = table2.column2;

其中,INNER JOIN 表示内连接,ON table1.column1 = table2.column2 表示连接条件,column1column2 是两个表中具有相同值的列。

以下是内连接查询的一个示例:

SELECT customer_id, customer_name, order_id, order_date
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;

这条语句将从 customers 表和 orders 表中连接具有相同 id 值的行,并返回 customer_idcustomer_nameorder_idorder_date 列的值。

5、外连接

外连接分为左外连接( left outer join ) 和右外连接( right outer join )其值 oute r 可以省略。外连接查询时,条件用 on 连接,多个条件使用 () 将其括起来. 左外连接表示以左表为主表,右外连接表示以右表为主表。查询时将主表信息在从表中进 行匹配。

在 MySQL 中,外连接查询是指将两个表连接在一起的查询,即使两个表中没有相同值的行,也返回所有行。外连接查询的语法如下:

SELECT column1, column2, ...
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column1 = table2.column2;

其中,LEFT [OUTER] JOIN 表示左外连接,ON table1.column1 = table2.column2 表示连接条件,column1column2 是两个表中具有相同值的列。

以下是左外连接查询的一个示例:

SELECT customer_id, customer_name, order_id, order_date
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id;

这条语句将从 customers 表和 orders 表中连接具有相同 id 值的行,并返回 customer_idcustomer_nameorder_idorder_date 列的值。

如果 customers 表中存在 orders 表中不存在的行,则这些行也会返回,order_idorder_date 列将为 NULL

外连接查询是一种非常有用的查询类型,它可以用于从两个表中检索所有数据。

二、子查询

存在于另外一个SQL语句中、被小括号包起来的查询语句就是子查询。相对于子查询来 说,在外部直接执行的查询语句被称作主查询

子查询分为:

  • 单列子查询: 返回单行单列数据的子查询
  • 单行子查询: 返回单行多列数据的子查询
  • 多行子查询: 返回数据是多行单列的数据
  • 关联子查询: 子查询中如果使用了外部主SQL中的表或列,就说这个子查询跟外部SQL是 相关的

1、单列子查询

在 MySQL 中,单列子查询是指在 WHERE 子句中使用的子查询,该子查询返回单个列的值。单列子查询的语法如下:

WHERE column IN (SELECT column FROM table WHERE condition);

其中,column 是主查询中使用的列,column 是子查询中使用的列,condition 是子查询的条件。

以下是单列子查询的一个示例:

SELECT *
FROM customers
WHERE id IN (SELECT customer_id FROM orders WHERE order_status = 'paid');

这条语句将从 customers 表中检索所有客户的记录,他们的 ID 在 orders 表中存在,订单状态为 "paid"。

单列子查询是一种非常常用的查询类型,它可以用于从表中检索满足特定条件的行。

2、单行子查询

在 MySQL 中,单行子查询是指在 SELECT 语句中使用子查询,并且子查询只返回一行数据。单行子查询的语法如下:

SELECT column1, column2, ...
FROM table1
WHERE condition = (SELECT column1FROM table2WHERE condition2
);

其中,conditionWHERE 子句中的条件,column1column2SELECT 列表中的列。

以下是单行子查询的一个示例:

SELECT customer_id, customer_name
FROM customers
WHERE id = (SELECT customer_idFROM ordersWHERE order_id = 1234567890;

这条语句将从 customers 表中检索 order_id 为 1234567890 的客户的客户 ID 和客户姓名。

3、多行子查询

1. 在 MySQL 中,多行子查询是指在 WHERE 子句中使用的子查询,该子查询返回多行数据。多行子查询的语法如下:

SELECT column1, column2, ...
FROM table1
WHERE column1 IN (SELECT column1 FROM table2);

其中,IN 是多行子查询的比较运算符,column1column2 是两个表中具有相同值的列。

以下是多行子查询的一个示例:

SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_status = 'completed');

这条语句将从 customers 表中检索所有顾客的 ID 和姓名,这些顾客的订单状态为 completed

2. 在 MySQL 中,ANYALL 是多行子查询中使用的比较运算符。ANY 表示子查询返回的行中的任意一行,ALL 表示子查询返回的所有行。

  • >any 表示大于子查询中的任意一个值,即大于最小值
  • >all 表示大于子查询中的所有值,即大于最大的值

以下是 ANYALL 的使用示例:

SELECT customer_id, customer_name
FROM customers
WHERE customer_id > ANY (SELECT customer_id FROM orders WHERE order_status = 'completed');

这条语句将从 customers 表中检索所有顾客的 ID 和姓名,这些顾客的 ID 大于 orders 表中订单状态为 completed 的顾客的 ID。

SELECT customer_id, customer_name
FROM customers
WHERE customer_id > ALL (SELECT customer_id FROM orders WHERE order_status = 'completed');

这条语句将从 customers 表中检索所有顾客的 ID 和姓名,这些顾客的 ID 大于 orders 表中所有订单状态为 completed 的顾客的 ID。

ANYALL 是多行子查询中非常有用的比较运算符,它们可以用于从两个表中检索数据。

4、多列子查询

在MySQL中,多列子查询是指在WHERE子句中使用的子查询,该子查询返回多列数据。多列子查询的语法如下:

SELECT column1, column2, ...
FROM table1
WHERE (column1, column2) IN (SELECT column1, column2 FROM table2);

其中,IN是多列子查询的比较运算符,column1column2是两个表中具有相同值的列。

以下是多列子查询的一个示例:

SELECT customer_id, customer_name 
FROM customers 
WHERE (customer_id, customer_name) 
IN (SELECT customer_id, customer_name FROM orders WHERE order_status = 'completed');

这条语句将从customers表中检索所有顾客的ID和姓名,这些顾客的ID和姓名都出现在orders表中订单状态为completed的订单中。

5、关联子查询【了解】

查询哪些员工与SMITH不在同一个部门:

SELECT * 
FROM emp e 
WHERE EXISTS ( SELECT * FROM emp p WHERE p.ename = 'SMITH' AND p.deptno != e.deptno );

6、子查询的综合应用

子查询是 SQL 查询中非常强大的工具,它可以用于从两个或多个表中检索数据。子查询可以出现在 WHERE、JOIN 和 HAVING 子句中。

以下是 MySQL 中子查询的综合应用举例:

  • WHERE 子句中的子查询

子查询可以用来过滤外部查询返回的行。例如,以下查询将返回所有客户的 ID 和姓名,这些客户的订单状态为已完成:

SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_idFROM ordersWHERE order_status = 'completed');
  • JOIN 子句中的子查询

子查询可以用来将两个或多个表连接在一起。例如,以下查询将返回所有订单的信息,这些订单由在美国订购的客户下单:

SELECT order_id, order_date, customer_id, customer_name
FROM orders
INNER JOIN customers
ON customers.customer_id = orders.customer_id
WHERE customers.country = 'USA';
  • HAVING 子句中的子查询

子查询可以用来过滤 GROUP BY 子句返回的组。例如,以下查询将返回所有客户的数量,这些客户的订单总金额超过 100 美元:

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING SUM(order_amount) > 100;

 加油!!!


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

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

相关文章

Sklearn学习-iris数据集学习

Sklearn学习-逻辑回归(iris数据集) 使用load_iris加载数据集,查看包含的keys查看数据的列名,分类目标的名称获取data和target,并打印各自的shape拆分训练集和测试集使用逻辑回归训练。在测试集上计算准确率在测试集上实…

【云原生】Docker容器资源限制(CPU/内存/磁盘)

目录 ​编辑 1.限制容器对内存的使用 2.限制容器对CPU的使用 3.block IO权重 4.实现容器的底层技术 1.cgroup 1.查看容器的ID 2.在文件中查找 2.namespace 1.Mount 2.UTS 3.IPC 4.PID 5.Network 6.User 1.限制容器对内存的使用 ⼀个 docker host 上会运⾏若⼲容…

React几种避免子组件无效刷新的方案

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~ 前言 一个很常见的场景,React中父组件和子组件在一起,子组件不依赖于父组件任何数据,但是会一起发生变化。 在探究原…

平面设计软件都有哪些?推荐这7款

优秀的平面广告设计可以给产品带来良好的效益,正确传播品牌的价值和色调,而功能强大、使用方便的平面广告设计软件是创造优秀平面广告设计的关键。本文推荐7款备受好评的平面广告设计软件,易于使用! 1.即时设计 即时设计是国内一…

如何通过企业工商信息初步判断企业是否靠谱?

银行、投资机构等对企业进行融资、授信、合作时,需要如何评估企业的可靠性。企业工商信息作为企业的基础信息,是初步判断企业是否靠谱的重要依据之一,通过对企业工商信息的综合分析,我们可以了解企业的经营状况、财务实力、法律风…

Bug记录: CUDA error_ device-side assert triggered

Bug记录: CUDA error: device-side assert triggered 在接触AIGC算法的过程中偶尔会遇到这样的bug:RuntimeError: CUDA error: device-side assert triggered return torch._C._cuda_synchronize() RuntimeError: CUDA error: device-side assert trig…

python在不同坐标系中绘制曲线

文章目录 平面直角坐标系空间直角坐标系极坐标地理坐标 平面直角坐标系 回顾我们的数据可视化的学习历程,其实始于笛卡尔坐标系的创建,并由此建立了数与形的对应关系。在笛卡尔坐标系中随便点上一点,这个点天生具备坐标,从而与数…

CloudDriver一款将各种网盘云盘挂在到电脑本地变成本地磁盘的工具 教程

平时我们的电脑可能由于大量的文件资料之类的导致存储空间可能不够,所以我们可以选择将网盘我们的本地磁盘用来存放东西。 CloudDrive 是一款可以将 115、阿里云盘、天翼云盘、沃家云盘、WebDAV 挂载到电脑中,成为本地硬盘的工具,支持 Window…

sql-从一个或多个表中向一个表中插入 多行

INSERT还可以将SELECT语句查询的结果插入到表中,此时不需要把每一条记录的值一个一个输入,只需 要使用一条INSERT语句和一条SELECT语句组成的组合语句即可快速地从一个或多个表中向一个表中插入 多行。 基本语法格式如下: INSERT INTO 目标表…

短视频平台视频怎么去掉水印?

短视频怎么去水印,困扰很多人,例如,有些logo水印,动态水印等等,分享操作经验: 抖音作为中国最受欢迎的社交娱乐应用程序之一,已成为许多人日常生活中不可或缺的一部分。在使用抖音过程中&#x…

数据结构--基础知识

数据结构是什么? 数据结构是计算机科学中研究数据组织、存储和管理的方法和原则。它涉及存储和操作数据的方式,以便能够高效地使用和访问数据。 相关内容 基本组成 数组(Array):数组是一种线性数据结构,…

K8S暴露pod内多个端口

K8S暴露pod内多个端口 一、背景 公司统一用的某个底包跑jar服务,只暴露了8080端口 二、需求 由于有些服务在启动jar服务后,会启动多个端口,除了8080端口,还有别的端口需要暴露,我这里就还需要暴露9999端口。 注&a…

matlab进阶:求解在约束条件下的多元目标函数最值(fmincon函数详解)

🌅*🔹** φ(゜▽゜*)♪ **🔹*🌅 欢迎来到馒头侠的博客,该类目主要讲数学建模的知识,大家一起学习,联系最后的横幅! 喜欢的朋友可以关注下,私信下次更新不迷路&#xff0…

Vue 基础语法(二)

一、背景: 我们对于基础语法,说白了就是实现元素赋值,循环,判断,以及事件响应即可! 二、v-bind 我们已经成功创建了第一个 Vue 应用!看起来这跟渲染一个字符串模板非常类似,但是 V…

vue中在使用keep-alive时,会出现在页面跳转后el-tooltip或el-dropdown不消失的问题以及解决方法

一、 问题复现 跳转前: 跳转后: 二、分析 由于在vue中使用了keep-alive,页面在切换时,上一个页面的实例被缓存了,跳转后并没有销毁,所以才会残留 tooltip或dropdown,所以有以下解决思路&am…

[运维|系统] Centos设置本地编码

以下是在CentOS上更改系统编码的一般步骤: 使用locale命令查看当前的系统编码: locale如果需要更改系统编码,可以使用类似下面的命令来生成相应的locale设置(以UTF-8为例): sudo localedef -i en_US -f …

这就是ChatGPT,走进我们的生活!

这就是ChatGPT,走进我们的生活! 早在年初,合作导师将我叫过去,让我了解学习一下ChatGPT,看能不能对我们的生活有所帮助。一直使用着国内镜像,五月份我才注册了OpenAI的账户。如今,打开购物商城购…

docker小记-容器中启动映射端口号但访问不到

在docker容器中是每一个容器隔离分开的。 每个容器视为一个独立的环境,当在外部环境访问不到的时候就是说明端口号还是没映射到。 之前使用的映射说白了就是将docker中的独立的ip地址端口号映射到主机的ip地址和端口号。这一步没有成功。 docker inspect 容器名 …

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU2

KPU的基础架构 让我们回顾下经典神经网络的基础运算操作: 卷积(Convolution):1x1卷积,3x3卷积,5x5及更高的卷积 批归一化(Batch Normalization) 激活(Activate) 池化&…

无人机调试笔记——常见参数

无人机的PID调试以及速度相关参数 1、Multicopter Position Control主要是用来设置无人机的各种速度和位置参数。调试顺序是先调试内环PID,也就是无人机的速度闭环控制,确认没有问题后再进行外环位置控制,也就是定点模式控制。 2、调试的时…