《MySQL必知必会学习笔记》:子查询

子查询

在开始了解子查询之前,首先做下准备工作,建立3个表,

  • 一个是customers表,其中包括:客户名字、客户ID、客户Tel等。
  • 一个是orders表,其中包括:订单号、客户ID、订单时间等。
  • 一个是ordersitems表,其中包括:订单物品、订单号、物品数量。

准备工作

1、建表

建customers表的命令如下,其它的表与之类似:

create table customers(cust_name varchar(10),cust_id int(10),cust_tel varchar(10));

2、插入内容

为customers表插入内容的命令如下,其它的与子类似:

insert into customers values(‘wu‘,2,‘1387234‘);

最后三个表的内容截图如下:

子查询

前面我们所学的东西都是简单的查询,即从单个数据库表中检索数据的单条语句。

到底什么是子查询呢?通过下面这个例子,相信我们就更好的理解了。

上面我们建了三个表,分别为customers/orders/ordersitems.

现在,假如,我们想看下订购了物品 apple的所有客户信息,应该怎样检索呢?

下面列出具体的步骤:

  • 第一步:在ordersitems表中找出包含有apple的订单号order_id.
  • 第二步:根据上一步查找的结果,找出订单号为order_id的客户ID(cust_id).
  • 最后:根据上一步查找的结果,在customers表中根据客户ID(cust_id)找出客户信息。

现在我们按照步骤来查询下,观察下结果:

从上面可以看出,我们就是按照步骤,将第一步的结果当做第二步的条件来进行查询,将第二步的结果直接作为第三步的条件来进行查询,最后得到最终的结果。

现在,我们分别把第一个子查询(返回订单号的那一个)变为子查询组合到第二个查询中。

第一个查询的代码如下:

select order_id from ordersitems where content=‘apple‘;

作为子查询组合到第二个查询后的代码如下:

select cust_id from orders where order_id in (
    select order_id from ordersitems where content=‘apple‘
);

结果如下,从结果可以看出,与我们单个查询的结果是一致的:

现在,我们就把上面的查询作为子查询组合到第三个查询中,代码如下:

select cust_name,cust_tel from customers where cust_id in(
    select cust_id from orders where order_id in(
        select order_id from ordersitems where content=‘apple‘)
    )
);

注意:包含子查询的select语句难以阅读和调试,特别是他们较为复杂时。如上所示把子查询分解为多行并且适当地进行缩进,能极大地简化子查询的使用。

在where子句中使用子查询能够编写出功能很强并且很灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。

注意:在子查询中,列必须匹配

作为计算字段使用子查询

上面介绍的都是作为条件使用子查询,下面就介绍下作为计算字段使用子查询。

还是以一个例子来进行说明。

假如需要显示customers表中每个客户的订单总数。

为执行这个操作,步骤如下:

  • 从customers表中检索客户列表
  • 对于检索出的每个客户,统计其在orders表中的订单数目。

例如:查询客户id=1的订单数的命令如下:

select count(*) as order_total from orders where cust_id=1;

将上面的命令作为字段的子查询的代码如下:

select cust_name,cust_tel,(select count(*) from orders where orders.cust_id==customers.cust_id) from customers ;

小结

子查询可以理解为嵌套,这里方便理解一点。但是在我们使用子查询的过程中,要先分步骤来完成,然后将子查询一个一个的组合起来,直到这个子查询加入之后得到的结果是符合要求的,然后继续将下一个子查询组合进行直至完成所有的子查询都全部正确的加入。

时间: 2024-10-19 19:54:43

《MySQL必知必会学习笔记》:子查询的相关文章

MySQL学习笔记-子查询和连接

MySQL学习笔记-子查询和连接 使客户端进入gbk编码方式显示: mysql> SET NAMES gbk; 1.子查询 子查询的定义: 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句. 例如:  SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中SELECT * FROM t1 称为Outer Query / Outer Statement (外部查询) SELECT col2 FROM t2 , 被称为Su

MySQL必知必会 学习笔记(一)

第一章  了解SQL 模式:   关于数据库和表的布局以及特性的信息.[描述表可以存储什么样的数据,数据如何分解,各部分信息如何命名等等,可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)]. 第二章 MySQL简介 MySQL是一种DBMS,即它是一种数据库软件.基于客户机----服务器的数据库. MySQL工具: 1.mysql 命令行实用程序 2.MySQL Administrator 3.MySQL query Browser 第四章 检索数据 LIMIT 5 表示MySQL返

《MySQL必知必会》学习笔记_1

#选择数据库 USE mysql #返回可用数据库列表 SHOW DATABASES #返回当前数据库中可用表 SHOW TABLES #返回表列 SHOW COLUMNS FROM db #显示特定数据库的创建语句 SHOW CREATE DATABASE mysql #显示广泛的服务器状态信息 SHOW STATUS #显示授权用户的安全权限 SHOW GRANTS 多条SQL语句必须以分号分隔. SQL语句不区分大小写,习惯性大写. 检索不同的行用DISTINCT,只返回不同的值. 限制结

《MySQL必知必会学习笔记》:正则表达式

正则表达式的应用 前面的几节的过滤例子允许用匹配.比较和通配操作符来寻找数据.对于基本的数据过滤,这样就足够了.但是随着过滤条件的复杂性的增加,where子句本身的复杂性也有必要增加.这也就是正则表达式变得有用的地方. 正则表达式是用来匹配文本中特殊的字符集合. 正则表达式不是自己第一次见,在JAVA/C++ 这些语言中,都有正则表达式,不过他们的用途是一样的,都是匹配文本中的字符串.可能具体的用法不太一样,但也差不多.下面将一一进行学习.介绍. 基本字符的匹配 当我们想查找某列中的字符中是否有

《MySQL必知必会》学习笔记

<MySQL必知必会>注重实用性,操作性很强,适用于广大软件开发和数据库管理人员学习参考,Amazon全五星评价.学习与参考皆宜.

《MySQL必知必会》读书笔记_3

PS:这次的信息量有点大. 聚集不同值 SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003 #相同的值不会被计算 组合聚集函数 SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products

《SQL必知必会》学习笔记二)

<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语句,但是实际应用中的业务逻辑往往会非常复杂,所以会用到一些比较复杂的查询,如子查询,联合查询. 1.子查询 当一个查询是另一个查询的条件时,称为子查询.但是说到子查询又不的不说它与嵌套查询两者的区别,下面一张图来说明 下面再用一条sql语句来说明他们的关系. 其中在查询中又分为嵌套子查询和相关子查询,他们之间

《mysql必知必会》读书笔记--存储过程的使用

以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书笔记. 如有转载请注明出处~ 存储过程的使用 执行存储过程 CALL productpricing() 执行名为productpricing的存储过程 创建存储过程 CREATE PROCEDURE productpricing() BEGIN SELECT avg(prod_price) AS pricea

《MySQL必知必会》读书笔记_4

PS:一个实际的存储过程案例 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_delete_article_by_id`(IN `id` int) BEGIN #Routine body goes here... DECLARE temp INT; SET @aid = id; SELECT COUNT(*) FROM gk_reply_article WHERE a_id = @aid INTO temp; IF(temp <> 0) THEN

mysql学习--mysql必知必会1

?? 例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式处理. (.)是正則表達式的一个符号,表示匹配随意一个字符: mysql> select prod_name -> from products -> where prod_name regexp '.000' -> order by prod_name; +--------------