您当前的位置: 首页 >  sql

java持续实践

暂无认证

  • 2浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MySQL基础 子查询的好处

java持续实践 发布时间:2018-10-23 11:43:34 ,浏览量:2

  • 开发环境 MySQL版本: 5.5.49
表结构与基本数据的准备
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
  `pid` int(11) NOT NULL AUTO_INCREMENT,
  `pname` varchar(20) DEFAULT NULL,
  `price` double DEFAULT NULL,
  `pnum` int(11) DEFAULT NULL,
  `cno` int(11) DEFAULT NULL,
  `pdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

INSERT INTO `products` VALUES ('1', '泰国大榴莲', '98', '12', '1', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('2', '新疆大枣', '38', '123', '1', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('3', '新疆切糕', '68', '50', '2', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('4', '十三香', '10', '200', '3', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('5', '老干妈', '20', '180', '3', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('6', '豌豆黄', '20', '120', '2', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('7', '新疆大枣', '35', '100', '3', '2018-10-23 10:44:09');
INSERT INTO `products` VALUES ('8', '新疆大枣', '63', '80', '1', '2018-10-23 10:44:27');

products表整体的情况如下

进行查询

需求, 查询出当前年内的,新疆大枣占了多少该数据库多少列

错误的写法,不用子查询.
SELECT
	COUNT(*)
FROM
	products
GROUP BY
	pname
HAVING
	pdate >= "2018-01-01"
AND "2018-12-31" > pdate
AND pname = "新疆大枣"

报错信息如下 Unknown column 'pdate' in 'having clause' 说的是找不到列pdate. 原因是select中使用的是count(*) , 没有pdate列, 导致了报错.

使用子查询
SELECT COUNT(*) from (
		SELECT
		pname,pdate
	FROM
		products
	WHERE
		pdate >= "2018-01-01"
	AND "2018-12-31" > pdate
	AND pname = "新疆大枣"
)tt

结果如下图 可以看到查询出了数量为3个. 这次之所以能查询出来, 是因为嵌套的子查询中, 有pname,pdate这两列. 更为简便的写法

SELECT
	COUNT(*)
FROM
	products
WHERE
	pdate >= "2018-01-01"
AND "2018-12-31" > pdate
AND pname = "新疆大枣"

直接不使用子查询,直接where条件查询即可. 查询出当前年的,pname为新疆大枣的. 复杂的问题简单化

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0386s