美文网首页《mysql必知必会》笔记
Mysql语法之使用子查询和联结表

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

作者: etron_jay | 来源:发表于2019-08-05 16:19 被阅读2次

一、使用子查询

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

SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。

二、利用子查询过滤

订单存储在两个表中。对于包含订单号、客户ID、订单日期的每个订单,orders表存储一行。各订单的物品存储在相关的orderitems表中。orders表不存储客户信息。它只存储客户的ID。实际的客户信息存储在customers中。

现在需要列出订购物品TNT2的所有客户:

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

上述每个步骤都可以单独作为一个查询来执行。可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句。

mysql>select order_num from orderitems where prod_id=‘TNT2’; 得到20005,20007

mysql>select cust_id from orders where order_num in (20005,20007); 得到10001,10004

mysql>select cust_name,cust_contact from customers where cust_id IN (10001,10004);

也可以使用子查询:

mysql>select cust_id from orders where order_num IN (select order_num from orderitems where prod_id=‘TNT2’);

mysql>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’));

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

mysql>select cust_name,cust_state , (select count(*) from orders where orders.cust_id= customers.cust_id) AS orders

from customers

order by cust_name;

四、联结

SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表。

举个例子:这里两张表,一个存储供应商信息,另一个存储产品信息。vendors表包含所有供应商信息,每个供应商占一行,每个供应商具有唯一的标识。此标识称为主键(primary key),可以是供应商ID或任何其他唯一值。

products 表只存储产品信息,它除了存储供应商ID(venders 表的主键)外不存储其他供应商信息。<u>vendors表的主键又叫作products的外键</u>,它将vendors表与products表关联,利用供应商ID能从vendors表中找出相应供应商的详细信息。

外键(foreign key)外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

如果数据存储在多个表中,怎样用单挑SELECT语句检索出数据?答案就是使用联结。

五、创建联结

十分简单,规定要联结的所有表以及它们如何关联即可。

mysql>select vend_name,prod_name,prod_price from vendors, products where vendors.vend_id = products.vend_id order by vend_name,prod_name;

现在考察一下此代码:

  • 所指定的两个列(prod_name,prod_price)在一个表中,而另一个列(vend_name)在另外一个表中
  • form子句列出了两个表
  • where子句指示MYSQL匹配vendors表中的vend_id和products表中的vend_id。

由此可得出where语句的重要性

应该保证所有的联结查询都有where子句,否则就成为了笛卡尔积。

mysql>select vend_name,prod_name,prod_price from vendors,products order by vend_name,prod_name;

笛卡尔积(cartesian product):由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

来看看内部联结

目前为止所用的联结称为等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为<u>内部联结。</u>

对于这种联结可以使用稍微不同的语法来明确指定联结的类型。

mysql>select vend_name, prod_name, prod_price from vendors INNER JOIN products ON vendors.vend_id = products.vend_id;

联结多张表其实也就不言而喻。

相关文章

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

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

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

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

  • 03随风而逝

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

  • (001)SQL基本查询

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

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

    子查询 联结表 组合查询

  • SQL入门笔记(中)

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

  • 子查询和联结表

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

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

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

  • MySQL 13-16章实操

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

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

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

网友评论

    本文标题:Mysql语法之使用子查询和联结表

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