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

本文详细介绍了如何在MySQL中使用子查询进行数据过滤和计算字段的操作,并探讨了联结表的概念,包括内部联结的创建和使用。通过实例展示了如何从多个表中检索数据,强调了WHERE子句在联结查询中的重要性。
摘要由CSDN通过智能技术生成

一、使用子查询

迄今为止我们所看到的的所有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 表的主键)外不存储其他供应商信息。vendors表的主键又叫作products的外键,它将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),它基于两个表之间的相等测试。这种联结也称为**内部联结。**

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值