WHERE c.clno = f.clno
AND c.account_balance = MAX(c.account_balance);
错误的原因是:invalid use of group function,就是这个聚合函数,Max,不允许出现在where子句当中。这也就是子查询诞生的原因,在本文当中,我将简短的描述添加到mysql数据库系统的子查询功能。
子查询就是包含在括号中选择语句
简单的将,子查询就是一个被写在另一个sql语句(一般情况下,是select语句,但是不总是这样)中的查询语句。判断是否是子查询的方式是看查询语句是否在括号中间,下面是一个例子。
SELECT * FROM clients WHERE clno IN -- outer query
(SELECT clno FROM firms WHERE city = ''''leduc''''); -- inner query
SELECT * FROM clients WHERE clno IN -- 外部查询
(SELECT clno FROM firms WHERE city = ''''leduc''''); -- 内部查询
这个查询将会返回表clients中clno中所有城市为’leduc’的记录。为了得到结果,dbms首先会取得内部查询的结果,查找所有 表 clno中所有城市为‘leduc’的记录。然后比较表clients,返回符合clno值的每一行。因为只有一个值符合子查询,实际上,等效于下面语句:
SELECT * FROM clients WHERE clno = 10;
当然,这个查询语句也可以写成以下方式:
SELECT
c.clno, fname, lname, job, account_balance
FROM clients c INNER JOIN firms f USING (clno)
WHERE city = ''''leduc'''';
目前,就上面提到的问题,可以通过子查询解决(查询这些客户clno值最大的记录):
SELECT fname, lname FROM clients WHERE clno =
(SELECT MAX(clno) FROM firms);
如果内部查询返回空结果集,子查询会返回错误,举例说明,参看下面查询:
SELECT * FROM clients WHERE clno =
(SELECT clno FROM firms WHERE city = ''''gibbons'''');
如果内部查询单独运行的话,很显然结果为空:因为这个表中没有city等于’gibbons’的记录。但是空的结果集不能作为值来比较。SQL 标准要求子查询的结果集,空的结果集,或者为空。因为没有任何东西等于null,查询返回空消息。
一般来说,子查询是嵌套在其他的查询当中,MySql支持子查询嵌套在其他sql语句当中,这是一个很好的功能。
Types of Subqueries
子查询类型
子查询共有三种类型,区分它们的方法是根据返回结果的列数和行数。
- 如果一个子查询返回仅仅一列一行数据,被成为数量级子查询。一个数量级子查询可以用在任何适合数据值比较的地方(一个列值或者文本)。它常常被使用在where子句当中,跟随在比较操作符号后面。
- 如果子查询返回多个列,并且是一行记录的话,它被称为行级子查询。行级子查询是数量级子查询的发展,可以用在任何适合数量级子查询的地方。
- 最后,如果一个子查询返回多个列和多行的话,它被称为表级子查询。表级子查询可以用作涉及到表的查询操作,包含在from子句当中。它也常常被用在where子句当中,后面使用in 或者 exist或者一个确定的比较操作(确定的比较操作是一个比较操作通过使用some,all,或者any限定)。
数量级子查询和表级子查询的区别非常小。经常会出现在一个数量级子查询被编写的情况下,但是子查询返回多个记录行。假设我们有两个表和一些记录数据。
INSERT INTO clients VALUES
(10, ''''sam'''',''''smith'''',''''auditor'''',5525.75);
上一页 [1] [2] [3] [4] [5] 下一页 [MySql]PHP存取 Mysql 数据乱码终极解决方案 [MySql]解决Table xxx is marked as crashed and should … [MySql][MySQL]快速解决"is marked as crashed and shoul… [MySql]MySQL DELETE语法用法详解 [MySql]mysql中时间日期格式化 [MySql]修改mysql导入文件大小限制 [其他]MySql常用命令大全 [Web开发]把ACCESS的数据导入到Mysql中的方法详解 [MySql]解决mysql 1040错误Too many connections的方法 [系统软件]利用crontab系统每天定时备份MySQL数据库
|