数据的连接与关联查询

INNER JOIN

INNER JOIN是MySQL中的一种表连接操作,用于将两个或多个表中的行基于一个共同的列进行匹配,并返回匹配的结果集。

下面是一个案例,假设有两个表:orders和customers,分别存储订单信息和客户信息。表结构如下:

orders表:

+----+---------+------------+
| id | order_no| customer_id|
+----+---------+------------+
| 1 | 1001 | 1 |
| 2 | 1002 | 2 |
| 3 | 1003 | 1 |
+----+---------+------------+

customers表:

+----+---------+
| id | name |
+----+---------+
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
+----+---------+

现在我们想要查询订单表中的订单号和对应的客户名字,可以使用INNER JOIN来实现。SQL语句如下:

SELECT orders.order_no, customers.name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.id;

解释SQL语句:

- SELECT orders.order_no, customers.name:选择要查询的列,即订单号和客户名字。

- FROM orders:指定要查询的主表为orders表。

- INNER JOIN customers:指定要连接的表为customers表,并使用INNER JOIN进行连接操作。

- ON orders.customer_id = customers.id:指定连接条件,即orders表的customer_id列与customers表的id列进行匹配。

- 最终返回匹配的结果集,包含订单号和对应的客户名字。

执行以上SQL语句后,将返回以下结果:

+---------+---------+
| order_no| name |
+---------+---------+
| 1001 | Alice |
| 1002 | Bob |
| 1003 | Alice |
+---------+---------+

结果集中的每一行表示一个订单和对应的客户名字。

LEFT JION

LEFT JOIN是MySQL中的一种表连接操作,用于将左表中的所有行与右表中的匹配行进行连接,并返回匹配的结果集。如果右表中没有匹配的行,则返回NULL值。

以下是一个案例,假设有两个表:orders和customers,分别存储订单信息和客户信息。表结构与之前的案例相同。

现在我们想要查询订单表中的订单号和对应的客户名字,包括没有匹配的订单。可以使用LEFT JOIN来实现。SQL语句如下:

SELECT orders.order_no, customers.name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.id;

解释SQL语句:

- SELECT orders.order_no, customers.name:选择要查询的列,即订单号和客户名字。

- FROM orders:指定要查询的主表为orders表。

- LEFT JOIN customers:指定要连接的表为customers表,并使用LEFT JOIN进行连接操作。

- ON orders.customer_id = customers.id:指定连接条件,即orders表的customer_id列与customers表的id列进行匹配。

- 最终返回匹配的结果集,包含订单号和对应的客户名字。如果没有匹配的行,则客户名字列的值为NULL。

执行以上SQL语句后,将返回以下结果:

+---------+---------+
| order_no| name |
+---------+---------+
| 1001 | Alice |
| 1002 | Bob |
| 1003 | Alice |
+---------+---------+

结果集中的每一行表示一个订单和对应的客户名字。如果订单没有对应的客户信息,则客户名字列的值为NULL。

RIGHT JOIN

RIGHT JOIN是MySQL中的一种表连接操作,用于将右表中的所有行与左表中的匹配行进行连接,并返回匹配的结果集。如果左表中没有匹配的行,则返回NULL值。

以下是一个案例,假设有两个表:orders和customers,分别存储订单信息和客户信息。表结构与之前的案例相同。

现在我们想要查询客户表中的客户名字和对应的订单号,包括没有匹配的客户。可以使用RIGHT JOIN来实现。SQL语句如下:

SELECT orders.order_no, customers.name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.id;

解释SQL语句:

- SELECT orders.order_no, customers.name:选择要查询的列,即订单号和客户名字。

- FROM orders:指定要查询的主表为orders表。

- RIGHT JOIN customers:指定要连接的表为customers表,并使用RIGHT JOIN进行连接操作。

- ON orders.customer_id = customers.id:指定连接条件,即orders表的customer_id列与customers表的id列进行匹配。

- 最终返回匹配的结果集,包含客户名字和对应的订单号。如果没有匹配的行,则订单号列的值为NULL。

执行以上SQL语句后,将返回以下结果:

+---------+---------+
| order_no| name |
+---------+---------+
| 1001 | Alice |
| 1002 | Bob |
| 1003 | Alice |
+---------+---------+

结果集中的每一行表示一个客户和对应的订单号。如果客户没有对应的订单信息,则订单号列的值为NULL。

FULL JOIN

FULL JOIN是MySQL中的一种表连接操作,用于将左表和右表中的所有行进行连接,并返回匹配的结果集。如果左表或右表中没有匹配的行,则返回NULL值。

以下是一个案例,假设有两个表:orders和customers,分别存储订单信息和客户信息。表结构与之前的案例相同。

现在我们想要查询所有的订单和客户信息,包括没有匹配的行。可以使用FULL JOIN来实现。SQL语句如下:

SELECT orders.order_no, customers.name
FROM orders
FULL JOIN customers ON orders.customer_id = customers.id;

解释SQL语句:

- SELECT orders.order_no, customers.name:选择要查询的列,即订单号和客户名字。

- FROM orders:指定要查询的主表为orders表。

- FULL JOIN customers:指定要连接的表为customers表,并使用FULL JOIN进行连接操作。

- ON orders.customer_id = customers.id:指定连接条件,即orders表的customer_id列与customers表的id列进行匹配。

- 最终返回匹配的结果集,包含订单号和对应的客户名字。如果没有匹配的行,则订单号或客户名字列的值为NULL。

执行以上SQL语句后,将返回以下结果:

+---------+---------+
| order_no| name |
+---------+---------+
| 1001 | Alice |
| 1002 | Bob |
| 1003 | Alice |
| NULL | Charlie |
+---------+---------+

结果集中的每一行表示一个订单和对应的客户名字。如果订单或客户没有对应的匹配行,则订单号或客户名字列的值为NULL。

数据的多表操作

UNION操作符

UNION是MySQL中的一种集合操作,用于将多个SELECT语句的结果合并成一个结果集,并去除重复的行。

以下是一个案例,假设有两个表:orders1和orders2,分别存储不同时间段的订单信息。表结构如下:

orders1表:

+----+---------+
| id | order_no|
+----+---------+
| 1 | 1001 |
| 2 | 1002 |
| 3 | 1003 |
+----+---------+

orders2表:

+----+---------+
| id | order_no|
+----+---------+
| 4 | 1004 |
| 5 | 1005 |
| 6 | 1006 |
+----+---------+

现在我们想要查询两个表中的所有订单号,并合并成一个结果集。可以使用UNION来实现。SQL语句如下:

SELECT order_no FROM orders1
UNION
SELECT order_no FROM orders2;

解释SQL语句:

- SELECT order_no FROM orders1:选择要查询的列,即orders1表中的订单号。

- UNION:使用UNION操作符将两个SELECT语句的结果合并。

- SELECT order_no FROM orders2:选择要查询的列,即orders2表中的订单号。

- 最终返回合并后的结果集,包含两个表中的所有订单号,并去除重复的行。

执行以上SQL语句后,将返回以下结果:

+---------+
| order_no|
+---------+
| 1001 |
| 1002 |
| 1003 |
| 1004 |
| 1005 |
| 1006 |
+---------+

结果集中的每一行表示一个订单号,包括两个表中的所有订单号,并去除了重复的行。

EXISTS 关键字

EXISTS是MySQL中的一个条件操作符,用于检查一个子查询是否返回任何行。如果子查询返回至少一行,则条件成立,返回TRUE;否则,条件不成立,返回FALSE。

以下是一个案例,假设有两个表:orders和customers,分别存储订单信息和客户信息。表结构与之前的案例相同。

现在我们想要查询存在至少一个订单的客户信息。可以使用EXISTS来实现。SQL语句如下:

SELECT *
FROM customers
WHERE EXISTS (
SELECT 1
FROM orders
WHERE orders.customer_id = customers.id
);

解释SQL语句:

- SELECT * FROM customers:选择要查询的表为customers表,即查询客户信息。

- WHERE EXISTS (...):使用EXISTS条件操作符来判断是否存在满足条件的子查询结果。

- SELECT 1 FROM orders WHERE orders.customer_id = customers.id:子查询,查询orders表中是否存在与customers表中的id匹配的订单。

- 最终返回满足条件的客户信息。

执行以上SQL语句后,将返回存在至少一个订单的客户信息。

注意:在实际使用中,可以根据具体需求选择需要查询的列,而不是使用通配符*来查询所有列。

IN关键字

IN是MySQL中的一个条件操作符,用于判断一个值是否存在于一个列表或子查询的结果中。如果值存在于列表或子查询的结果中,则条件成立,返回TRUE;否则,条件不成立,返回FALSE。

以下是一个案例,假设有一个表:orders,存储订单信息。表结构如下:

orders表:

+----+---------+
| id | order_no|
+----+---------+
| 1 | 1001 |
| 2 | 1002 |
| 3 | 1003 |
+----+---------+

现在我们想要查询订单号为1001和1003的订单信息。可以使用IN来实现。SQL语句如下:

SELECT *
FROM orders
WHERE order_no IN (1001, 1003);

解释SQL语句:

- SELECT * FROM orders:选择要查询的表为orders表,即查询订单信息。

- WHERE order_no IN (1001, 1003):使用IN条件操作符来判断订单号是否存在于指定的列表中。

- (1001, 1003):指定一个列表,包含要匹配的订单号。

- 最终返回满足条件的订单信息。

执行以上SQL语句后,将返回订单号为1001和1003的订单信息。

注意:IN操作符也可以与子查询一起使用,用于判断一个值是否存在于子查询的结果中。例如,可以将(1001, 1003)替换为一个子查询,来动态地获取要匹配的订单号。

【技术积累】Mysql中的SQL语言【技术篇】【四】的更多相关文章

  1. MySQL中的SQL语言

    从功能上划分,SQL 语言可以分为DDL,DML和DCL三大类.1. DDL(Data Definition Language)数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言 :CRE ...

  2. MySQL入门——MySQL数据库和SQL语言

    MySQL入门——MySQL数据库和SQL语言 摘要:本文主要了解了MySQL关系型数据库和SQL语言的基本知识. MySQL数据库 简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB ...

  3. MySQL中执行sql语句错误 Error Code: 1093. You can't specify target table 'car' for update in FROM clause

    MySQL中执行sql语句错误 Error Code: 1093. You can't specify target table 'car' for update in FROM clause 201 ...

  4. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  5. 【原创】6. 在MYSQL++中实现SQL语法中的NULL

    这次要说明的是在MYSQL++中为了实现SQL中的NULL而做出的一系列的举措.我的感觉是Null<T, B>类型通常出现在SSQLS和template Query中比较多. 1. 什么是 ...

  6. Mysql中的sql是如何执行的 --- 极客时间学习笔记

    MySQL中的SQL是如何执行的 MySQL是典型的C/S架构,也就是Client/Server架构,服务器端程序使用的mysqld.整体的MySQL流程如下图所示: MySQL是有三层组成: 连接层 ...

  7. MySQL中的SQL的常见优化策略

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 1 避免全表扫描对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 ...

  8. ORCAL 数据库的约束以及SQL语言的四种类型

    oracle数据库约束: 定义:要输入的这个值是一个什么样的值, 或者是哪个范围内的值 作用: 确保完整性, 确保精确性 1, 非空约束(not null) 记录一条信息的时候如果用户名和密码没有被记 ...

  9. 【MySQL笔记】SQL语言四大类语言

     SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL.   1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句, ...

  10. mysql数据库基本操作sql语言

    mysql的启动与关闭 启动 /etc/init.d/mysql start 多实例使用自建脚本启动 2种关闭数据库方法 mysqladmin -uroot -p密码 shutdown #优雅关闭/e ...

随机推荐

  1. YII2.0框架分页

    这篇文章主要介绍了Yii分页用法,以实例形式详细分析了比较常见的几种分页方法及其应用特点,非常具有实用价值,需要的朋友可以参考下: 在这里我主要联查的 book 表和 book_press 两张表进行 ...

  2. Vue2的组件中data为什么不能使用对象

    当一个组件被定义,data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例. 如果 data 仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!通过提供 data 函数 ...

  3. Spring原理探究篇

    spring ioc原理 首先了解一下ioc 的特征,控制反转,就是把之前手动去new对象的操作,现在来交给ioc来实现了,完成代码相对的接偶. 那么,它是怎么去创建bean对象的呐? 原理: 底层依 ...

  4. 一个WPF开发的、界面简洁漂亮的音频播放器

    今天推荐一个界面简洁.美观的.支持国际化开源音频播放器. 项目简介 这是一个基于C# + WPF开发的,界面外观简洁大方,操作体验良好的音频播放器. 支持各种音频格式,包括:MP4.WMA.OGG.F ...

  5. 2022-09-28:以下go语言代码输出什么?A:1 1;B:1 2;C:2 2;D:不确定。 package main import ( “fmt“ ) func main() { var

    2022-09-28:以下go语言代码输出什么?A:1 1:B:1 2:C:2 2:D:不确定. package main import ( "fmt" ) func main() ...

  6. 2020-09-08:KVM和OpenStack的区别?

    福哥答案2020-09-08:[此答案来自知乎](https://www.zhihu.com/question/419987391)KVM只是一个虚拟机技术,别的还有xen,商业的vmware.vir ...

  7. 分库分表的 21 条法则,hold 住!

    大家好,我是小富- (一)好好的系统,为什么要分库分表? 本文是<分库分表ShardingSphere5.x原理与实战>系列的第二篇文章,距离上一篇文章已经过去好久了,惭愧惭愧- 还是不着 ...

  8. query查询原生sql

    print(str(Teahcer.objects.filter(fans__gte=500).order_by('name').query)

  9. 为什么有了 HTTP 还要 RPC

    哈喽大家好,我是咸鱼 随着互联网技术的发展,分布式架构越来越被人们所采用.在分布式架构下,为了实现复杂的业务逻辑,应用程序需要分布式通信实现远程调用 而这时候就需要一种协议来支持远程过程调用,以便实现 ...

  10. 解密Prompt7. 偏好对齐RLHF-OpenAI·DeepMind·Anthropic对比分析

    前三章都围绕指令微调,这一章来唠唠RLHF.何为优秀的人工智能?抽象说是可以帮助人类解决问题的AI, 也可以简化成3H原则:Helpful + Honesty + Harmless.面向以上1个或多个 ...