美文网首页MySQL
MySQL——使用子查询和联结表(九)

MySQL——使用子查询和联结表(九)

作者: 开心糖果的夏天 | 来源:发表于2017-06-20 16:38 被阅读59次

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。

使用子查询

查询:任何SQL语句都是查询。但此术语一般指SELECT语句。SQL还允许创建子查询,即嵌套在其他查询中的查询。

一、利用子查询进行过滤

例如:列出订购物品TNT2的所有客户
步骤:(1)检索包含物品TNT2的所有订单的编号。
(2)检索具有前一步骤列出的订单编号的所有客户的ID。
(3)检索前一步骤返回的所有客户ID的客户信息。

SELECT order_num FROM orderitems WHERE prod_id='TNT2';

此语句的输出如下图所示:


SELECT cust_id FROM orders WHERE order_num IN (20005,20007);

此语句的输出如下图所示:



现在,把第一个查询(返回订单号的那一个)变为子查询组合两个查询,如下所示:

SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2');

此语句的输出如下图所示:



现在得到了订购物品TNT2的所有客户的ID。下一步是检索这些客户ID的客户信息。检索两列的SQL语句为:
如下所示:

SELECT cust_name,cust_contact FROM customers WHERE cust_id IN (10001,10004);

此语句的输出如下图所示:


最终的查询语句如下所示:

SELECT cust_name,cust_contact FROM customers WHERE cust_id IN (SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2'));

此语句的输出如下图所示:


二、作为计算字段使用子查询

使用子查询的另一方法是创建计算字段。例如:显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。
步骤:(1)在customers表中检索客户列表。
(2)对于检索出来的每个客户,统计其在orders表中的订单数目。
为了对每个客户执行COUNT()计算,应该将COUNT()作为一个子查询。代码如下:

SELECT cust_name,cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id=customers.cust_id) AS orders FROM customers ORDER BY cust_name;

此语句的输出如下图所示:

联结表

如果数据存储在多个表中,怎样用单条SELECT语句检索出数据?
使用联结。简单地说,联结是一种机制,用来在一条SELECT语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

一、创建联结

SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name,prod_name;

此语句的输出如下图所示:


SELECT语句与前面的语句一样指定要检索的列。这里,最大的差别是所指定的两个列(prod_name和prod_price)在一个表中,而另一个列(vend_name)在另一个表中。这条语句的FROM子句列出了两个表,分别是vendors和products。它们就是这条SELECT语句联结的两个表的名字。这两个表用WHERE子句正确联结,WHERE子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id。

二、内部联结(重要)

目前为止所用的联结称为等值联结,它基于两个表之间的相等测试。这种联结也称为内部联结。下面的SELECT语句返回与前面例子完全相同的数据:

SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN products ON vendors.vend_id=products.vend_id ORDER BY vend_name,prod_name;

此语句的输出如下图所示:


此语句中的SELECT与前面的SELECT语句相同,但FROM子句不同。这里,两个表之间的关系是FROM子句的组成部分,以 INNER JOIN 指定。在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句给出。传递给ON的实际条件与传递给WHERE的相同。

三、联结多个表

SQL对于一条SELECT语句中可以联结的表的数目没有限制。创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系。例如:

SELECT prod_name,vend_name,prod_price,quantity FROM orderitems,vendors ,products WHERE products.vend_id=vendors.vend_id AND orderitems.prod_id=products.prod_id AND order_num=20005;

此语句的输出如下图所示:

相关文章

  • MySQL——使用子查询和联结表(九)

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQ...

  • 03随风而逝

    写写今天学到的知识, 简单,少。 《mysql必知必会》:有 子查询,联结表,高级联结,组合查询,插入数据,更新和...

  • (001)SQL基本查询

    该篇文章主要是对mysql的查漏补缺,该篇包括: 排序和限制 聚合 表联结 子查询与联合 排序和限制 使用关键字 ...

  • 《SQL必知必会》—— 检索2

    子查询 联结表 组合查询

  • Mysql语法之使用子查询和联结表

    一、使用子查询 迄今为止我们所看到的的所有select语句都是简单查询,即从单个数据库表中检索数据的单条语句。 S...

  • SQL入门笔记(中)

    主要内容:查询、联结、表与行列的增删 子查询 内联结 其他联结方式 复合查询 插入(行)数据 篡改和删除(行)数据...

  • 子查询和联结表

    子查询 子查询即嵌套在其它查询中的查询。 利用子查询进行过滤 下面是两个单独的查询语句: 上面两个子查询进行组合:...

  • MySQL 学习 Part7 - MySQL子查询和连接表

    ? MySQL的子查询和连接表以及高级连接表的使用? 兼顾工作和考试实在是太累了 1.子查询语句 1.子查询 需求...

  • MySQL 13-16章实操

    第十三章 分组数据 创建分组 过滤分组 分组和排序 第十四章 使用子查询 作为计算字段使用子查询 第十五章 联结表...

  • SQL基本语句(以MySQL为例)-- 第三部分

    ***11、子查询 *** 作为计算字段的子查询 12、联结查询 等值联结 或者使用内联(INNER JOIN) ...

网友评论

    本文标题:MySQL——使用子查询和联结表(九)

    本文链接:https://www.haomeiwen.com/subject/pfrmqxtx.html