您的位置:首页 > 数据库

测试人员必知必会的SQL知识10

2012-11-16 21:14 232 查看
大家晚上好,这几天感冒的比较多,我也不幸中标了,所以这两天没有更新博客了。我们还是继续看SQL吧,今天我们的SQL就介绍完了。我们只介绍了一些最基本的语句,还有一些视图啊,存储过程这些,大家可以自己在学习一下。这里就不介绍了,因为我们用的也不是很多了。在强调一下,我们的重点是查询语句了。

USE commoditysell;

--我们先来看一道题来复习一下上次学习的内容,上次我们学习了多表查询的连接

--查询销售总量大于20的产品的信息
--我们来看,这个题目要求我们查询的是产品信息,那么产品信息是在ProductInfo这个表里吧
--我们肯定要用这个表了。又要是销售总量大于20,这个信息又在EmporiumSell这个表里,所以
--这个就是多表查询了,
SELECT * FROM EmporiumSell;
SELECT * FROM ProductInfo;

SELECT pd.ProdID,pd.ProdName,UnitPrice,ProdFact FROM ProductInfo pd
	LEFT JOIN Emporiumsell em ON pd.prodid=em.prodid
	WHERE em.sellamout>20;

SELECT pd.ProdID,pd.ProdName,UnitPrice,ProdFact FROM ProductInfo pd
	RIGHT JOIN Emporiumsell em ON pd.prodid=em.prodid
	WHERE em.sellamout>20;

SELECT pd.ProdID,pd.ProdName,UnitPrice,ProdFact FROM ProductInfo pd
	INNER JOIN Emporiumsell em ON pd.prodid=em.prodid
	WHERE em.sellamout>20;

--查询单价大于“060101”产品的单价的产品信息
--这个题目的查询的信息都在一个表了啊?他自己和自己连接可以吗?我们来看一下
SELECT * FROM ProductInfo pd1
	LEFT JOIN ProductInfo pd2
	ON pd2.ProdID='060101' AND pd1.UnitPrice>pd2.UnitPrice;
--哦,这个结果里有很多NULL哦,怎么回事
--我们来看一下这个连接时怎么连的,ProductInfo表里共有9行记录,那么自己连接自己,先来看第一个
--条件,ProdID是'060101',也就是把060101的所有信息都连接到这个表里,也就是ProductInfo表
--里每条记录后面都多了060101的这条记录的信息,而且还有一个条件pd1.UnitPrice>pd2.UnitPrice;
--所以,不满足这条记录的,后面060101的信息就是NULL了,怎么解决呢,把NULL屏蔽掉就可以了

SELECT * FROM ProductInfo pit1
	RIGHT OUTER JOIN ProductInfo pit2
	ON pit2.ProdID='060101' AND pit1.UnitPrice>pit2.UnitPrice
	WHERE pit1.ProdID IS NOT NULL;
--这样就好了吧

--那有没有更好的方法呢,看下下面的方法
SELECT * FROM ProductInfo
	WHERE UnitPrice>(SELECT UnitPrice FROM ProductInfo WHERE ProdID='060101');
--哦,这个结果比之前的好了啊,这个就是我们接下来要介绍的子查询了
--通过这个例子我们可以看出,子查询就是在查询里还有查询了

--再来看两个题目看一下查询
--查询单价大于平均单价的产品信息
--哦,这个不是很简单吗,用一个avg函数就行了啊
SELECT * FROM ProductInfo
	WHERE UnitPrice>avg(UnitPrice);
--哦哦,报错了啊,这个就是我们前面说的了,where里不能包含聚合函数了
--我们可以用前面讲的使用having子句,也可以用今天的子查询
SELECT * FROM ProductInfo
	WHERE UnitPrice>(SELECT avg(UnitPrice) FROM ProductInfo); 

--我们前面用的子查询的表都是外查询的表,可不可以是其他表呢,当然可以了
--任务:查询已销售商品的厂家的所有信息(返回列表)
SELECT * FROM ProductInfo
	WHERE ProdID IN (SELECT DISTINCT ProdID FROM EmporiumSell);
--这里的IN就是在……里的,相当于连续的OR了

--下面一个综合的题目,这个数据库是我们前面用过的了
--任务:对TeachingDB库进行查询,统计年龄大于平均年龄的教师的姓名(Tname)、
--性别(Tsex)、年龄(Tage)、职称(Trank)、所授课程名(Cname)、学分(Credit)、
--课时数(Coursehour)、选修该课程的学生的姓名(Sname),按照教师年龄降序排列。

--大家自己思考一下,下面是答案,这个不是唯一答案了,有很多种了

SELECT tin.Tname,tin.Tsex,tin.Tage,tin.Trank,cin.Cname,cin.Credit,cin.CouresHour,sn.Sname
	FROM TeacherInfo tin
		RIGHT JOIN Teach t on tin.Tno=t.Tno
		RIGHT JOIN CourseInfo cin ON t.Cno=cin.Cno 
		RIGHT JOIN StudentCourse sc ON cin.Cno=sc.Cno
		RIGHT JOIN StudentInfo sn ON sn.Sno=sc.Sno
	WHERE Tage>(SELECT avg(Tage) FROM TeacherInfo) AND
		cin.Cno in (SELECT cin.Cno 
			FROM TeacherInfo tin
				right join Teach t on tin.Tno=t.Tno
				right join CourseInfo cin ON t.Cno=cin.Cno
			WHERE Tage>(SELECT avg(Tage) FROM TeacherInfo))
	ORDER BY tin.Tage DESC
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: