MYSQL 学习笔记记录整理之三:子查询

1、利用子查询进行过滤

eg:假如需要列出订购物品TNT2的所有客户,具体步骤:

检索包含物品TNT2的所有订单编号

检索具有前一步骤列出的订单编号的所有客户的ID

检索前一步骤返回的所有客户ID的客户信息

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

select order_num FROM orderitems WHERE prod_id=‘TNT2‘;

输出结果为:

order_num:20005,20007

下一步,查询具有订单20005和20007的客户ID。

SELECT cust_id from orders where order_num IN(20005,20007);

输出结果:

cust_id:10001,10004

现在,把第一个查询(返回订单号的那一个)变为子查询组合两个查询。请看:

SELECT cust_id from orders where order_num IN(select order_num FROM orderitems WHERE prod_id=‘TNT2‘);

输出结果为:

cust_id:10001,10004

分析:在SELECT语句中,子查询总是从内向外处理。在处理上面的语句时,mysql

实际执行了两个操作。

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

SELECT cust_name ,cust_contact from customers where cust_Id in(10001,10004);

上面,可以把其中的where子句转换为子查询而不是硬编码这些客户ID。

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‘));

分析:为了执行上面的select 语句,mysql实际上必须执行3条SELECT语句。最里边的子查询返回订单号列表,此列表用于其外面的子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层查询的WHERE子句。最外层查询确实返回所需的数据。

不过,在实际使用时由于性能的限制,不能嵌套太多的子查询。

注意:列必须匹配。在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列,通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等。

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

使用子查询的另一种方法就是创建计算字段。假如需要显示customers表中每个客户的订单总数,为了执行这个操作,遵循下面的步骤:

从customers表中检索客户列表

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

例如:下面的代码对客户10001的订单进行计数。

SELECT COUNT(*) AS orders FROM orders WHERE cust_id=10001;

为了对每个客户执行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 语句对customers表中的每个客户返回3列: cust_name,cust_state,orders。orders是一个计算字段,它是由圆括号的子查询建立,该子查询对检索出的每个客户执行一次。在此例子汇总,该子查询执行了5次,因此检索出了5个客户。

小结:子查询最常见的使用是在WHERE子句的IN操作符中,以及用来填充计算列。

时间: 2024-08-28 07:01:27

MYSQL 学习笔记记录整理之三:子查询的相关文章

MySQL学习笔记(五)—— 子查询及联结

子查询: 子查询,即嵌套在其他查询中的查询.例如我们有这样几个表,顾客表,订单表,商品表,我们想知道有哪些客户买了商品A,那么我们就需要先查看哪些订单里包含了商品A,然后根据订单查出是哪些客户. mysql> select cust_id from orders where order_num in (select order_num from orderitems where prod_id = '1'); +---------+ | cust_id | +---------+ |    10

MYSQL 学习笔记记录整理之一聚集函数

函数 说明 AVG() 返回某列的平均值 COUNT() 返回某列的行数 MAX() 返回某列的最大值 MIN() 返回某列的最小值 SUM() 返回某列值之和 1.AVG()函数,可以返回所有列的平均值,也可以返回特定列或者行的平均值. 例子: SELECT AVG(prod_price) AS avg_price 别名 FROM products: 说明:返回表中所有产品的平均价格. SELECT AVG(prod_price) AS avg_price 别名 FROM products W

MYSQL 学习笔记记录整理之二:分组数据

1.创建分组 GROUP BY SELECT ven_id,COUNT(*) AS num_prods FROM products GROUP BY ven_id: 注意: GROUP BY可以包含任意数目的列 GROUP BY列出的每个列都必须是检索列或者有效的表达式(但不能是聚集函数).如果在SELECT语句中使用表达式,则必须在GROUP BY中指定相同的表达式,不能使用别名. 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出. GROUP BY必须出现在WH

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学习笔记之三 表类型

你能用的数据库引擎取决于MySQL在安装时候是如何被编译的.要添加一个新的引擎,就必须编译MySQL.仅仅为了添加一个特性而编译应用程序的想法对于Windows的开发人员来说可能有点小题大做,得不偿失,但是在Unix的世界里,这已经成为了标准.在缺省的情况下,MySQL支持三个引擎:ISAM.MyISAM和HEAP.另外两种类型InnoDB和Berkley(BDB),也常常可以使用. ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之初就考虑到数据库被查询的次数远远大于

MySQL学习笔记-操作数据表中的记录

MySQL学习笔记-操作数据表中的记录 1.插入记录 INSERT INSERT [INTO] tbl_name [(col_name,...)] {VAULES|VALUE} ({expr|DEFAULT},...),(...),... 例,插入单条记录: mysql> USE testDatabase changed mysql> CREATE TABLE users(    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,   

MySql学习笔记(一)之DQL常用查询

MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前,我们先做一些准备工作. 需要安装的软件如下: 1.mysql,版本可以选择5.1或者5.5,安装过程可以参考博客:http://www.cnblogs.com/ixan/p/7341637.html 2.mysql图形化管理软件:Navicate,sqlyog(二选一,推荐使用sqlyog). 本文

MySql学习笔记(转载)

/* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld --skip-grant-tables-- 修改root密码密码加密函数password()update mysql.user set password=password('root'); SHOW PROCESSLIST -- 显示哪些线程正在运行SHOW VARIABLES -- /* 数据库操

Mysql学习笔记(三)对表数据的增删改查。

写在前面:(一些牢骚,可以直接跳到分割线后) 太过敏感的人不会快乐,不幸的是我正是这种性格的人. 从培训机构毕业后,迫于经济方面的压力,和当时的班里的一个同学住在了一起,我们在一个公司上班.谁知道这都是不开心生活的源头,从每天早晨开始心情就很糟糕.他是个脾气很慢的人,我是个急脾气,特别是在早上上班的时候.由此种种吧,实在是不胜枚举.算了,还是不说了,太痛苦了,我不太喜欢说别人的坏话.我是学心理学的,已经用各种方法去安慰自己,但是都不太奏效. 回想以往和朋友的交往中,我虽然不算十分合群的人,但绝对