利用SELECT检索数据
工作一年多,由于一直使用的MongoDB,把在学校学的关系型数据库相关只是已经忘的差不多了,最近换了工作,使用的是Oracle,因此,趁着闲暇时间把以前的知识捡起来。之前学过,因此这里作为个人复习过程中的点滴记录,方便自己记忆。
GROUP BY 子句
GROUP BY 是统计数据时经常用的语句,使用该子句时,有以下几点需要注意:
- 当查询中存在
GROUP BY
子句时,SELECT 列表中只能存在分组函数,或出现GRIUP BY 子句中的字段。 -
GROUP BY
子句中不允许出现在WHERE 条件中,但允许出现其后,也就是可以和WHERE条件并列使用。
HAVING 子句
HAVING子句通常和GROUP BY子句一起使用,限制搜索条件。它和WHERE子句不一样,HAVING子句与组有关,而不是与单个的值有关。在GROUP BY子句中,它会作用于GROUP BY创建的组。
HAVING
的使用方式如下:
eg: 计算出不同类型产品的平均价格,并列出平均价格高于2000的数据,脚本如下:
SELECT category , AVG(productprice) 平均价格 FROM productinfo GROUP BY categpry HAVING AVG (productprice) > 2000;
子查询
如果子查询返回的值是多行值,那么需要用到IN关键字,此时IN的用法和前面介绍的方法一致。除此之外,也可以使用量化比较关键字SOME,ANY,ALL,这些需要配合<、 <=、 =、 > 、>= 使用.它们的含义如下:
- ANY: 表示满足子查询结果的任何一个.和< , <=搭配,表示小于等于列表中的最大值; 而和> , >= 配合时表示大于等于列表中的最小值.
- SOME: 可以认为和ANY 含义相同
- ALL: 表示满足子查询结果的所有结果.和 <, <= 搭配,表示小于等于列表中的最小值;而和 > , >= 配合时,表示大于等于列表中的最大值.
IN示例:
查询产品表中产品类型为"电视"和"MP3"的数据.脚本如下:
SELECT productname,productprice FROM productinfo WHERE CATEGORY IN (SELECT caregory FROM catrgoryinfo WHERE categoryname = '电视' OR categoryname = 'MP3');
ANY示例:
从产品表PRODUCTINFO中查询出价格低于指定价格列表中的最大值.指定的价格列表就是指产品类型为"0100030002"的所有产品价格.脚本如下:
SELECT productname,productprice FROM productinfo WHERE productprice < ANY (SELECT productprice FROM productinfo WHERE category = '0100030002') AND category <> '0100030002';
SOME 示例:
SELECT productname,productprice FROM productinfo WHERE productprice = SOME (SELECT productprice FROM productinfo WHERE category = '0100030002') AND category <> '0100030002';
SOME用法和ANY用法一样,只不过ANY多用在非"="环境中.SOME这里表示找出和子查询中任何价格相等的产品.
连接查询
连接分为内连接、外连接、和全连接,还有一种叫做自连接,其中最常用的是内连接和外连接。
内连接
内连接会把两个以上的表进行连接,只能查询出匹配的记录.内连接中最常用的就是等值连接和不等只连接.
分为两种写法如下所示:
SELECT p.productname,p.productprice,c.categoryname FROM productinfo p , categoryinfo c WHERE p.category = c.categoryid;
或者:
SELECT p.productname,p.productprice,c.categoryname FROM productinfo p INNER JOIN categoryinfo c ON p.category = c.categoryid;
内连接中的关键字"INNER JOIN" 可以直接写成"JOIN",系统会把"JOIN"识别成内连接.但是"ON"关键字不能省略。