大家晚上好,今天我们继续讲解查询。今天要用的数据库:http://download.csdn.net/detail/xc5683/4764010。今天给大家的是一个mdf和ldf文件,这两个一个是主数据文件,一个是日志文件。这里要教给大家怎么将这种数据库文件导入数据库。
今天的内容可能不太好理解,我尽量多用点例子了。
先来看一下今天要介绍的内容连接和子查询。先来看连接Join。
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
子查询是一个select语句,子查询中的表与外查询无关。
还是用例子来看吧。我怕我越说越糊涂了
USE commoditysell; SELECT * FROM EmporiumSell --排序子句:Order By --任务:查询ProductInfo表中所有产品的ProdName、UnitPrice,按UnitPrice降序排列 SELECT * FROM ProductInfo ORDER BY UnitPrice DESC; --查询最贵的2种电视机 SELECT TOP 2 * FROM ProductInfo WHERE ProdName LIKE '%电视机%' ORDER BY UnitPrice DESC; --用这个就可以解决我们昨天查询后5条的信息了吧。 --任务:查询SalerInfo中SalerName、SalerAge、SalerSex、Salary,按SaleAge升序、Salary降序 SELECT * FROM SalerInfo ORDER BY SalerAge ASC,Salary DESC; --分组子句:Group By --任务:简单分组:查询按SalerAge分组的员工的平均Salary --大家看一下这个会正确的执行吗? SELECT * FROM SalerInfo GROUP BY SalerAge; SELECT Salary FROM SalerInfo GROUP BY SalerAge; --上面这两条都出现了同样的问题,就是“因为该列没有包含在聚合函数或 GROUP BY 子句中” --如何解决呢,就是我们下面的两条语句 SELECT avg(Salary) FROM SalerInfo GROUP BY SalerAge; SELECT SalerAge,Salary FROM SalerInfo GROUP BY SalerAge,Salary; --通过上述的例子要记住一点: --使用group by子句,查询的列必须出现在group by子句中,后者使用聚合函数 --任务:查询按各年龄段的员工人数 SELECT SalerAge,count(SalerId) FROM SalerInfo GROUP BY SalerAge; SELECT SalerAge,count(*) FROM SalerInfo GROUP BY SalerAge HAVING avg(Salary)>1500;上面是我们昨天剩的内容,下面开始今天的内容。
--------------------------------------------------------------------------------------------------------------------- -- 多表查询 --------------------------------------------------------------------------------------------------------------------- USE commoditysell; --交叉连接 SELECT * FROM ProductInfo;--这个表共有9列 SELECT * FROM EmporiumSell;--这个表共有51列 SELECT * FROM ProductInfo CROSS JOIN EmporiumSell; --这个结果是459列,就是9*51了,所以交叉连接就是A表的一条记录对应B表的所有记录 --这里执行的是笛卡尔积 --我们使用where子句看一下 SELECT * FROM ProductInfo CROSS JOIN EmporiumSell WHERE ProductInfo.ProdID=EmporiumSell.ProdID; --这下就是51条了 --可以使用表的别名 SELECT * FROM ProductInfo pit CROSS JOIN EmporiumSell est WHERE pit.ProdID=est.ProdID; --内连接(自然连接) --写法一(推荐) SELECT * FROM ProductInfo INNER JOIN EmporiumSell ON ProductInfo.ProdID=EmporiumSell.ProdID; --写法二 SELECT * FROM ProductInfo,EmporiumSell WHERE ProductInfo.ProdID=EmporiumSell.ProdID; --我们发现这个和上面的带where的cross一样的,这里他们的确是一样的,他们 --的性能也是一样的,但是推荐使用inner join --cross join是老语法里面的了 --左外连接left outer join和left join一样 SELECT * FROM ProductInfo LEFT OUTER JOIN EmporiumSell ON ProductInfo.ProdID=EmporiumSell.ProdID; --大家观察下这个结果,ProdID的顺序是连续9个050105,然后接着连续9个050201…… --右外连接 SELECT * FROM ProductInfo RIGHT OUTER JOIN EmporiumSell ON ProductInfo.ProdID=EmporiumSell.ProdID; --这个不是刚才的排序了哦 SELECT * FROM EmporiumSell; --全外连接 SELECT * FROM ProductInfo FULL OUTER JOIN EmporiumSell ON ProductInfo.ProdID=EmporiumSell.ProdID --这个和左连接时一样的他们之间的区别是: