名站网址导航为大家提供关于数据库教程相关的教程网站知识。
1.1.1 摘要oracle求同比,环比函数(LAG与LEAD)的详解
Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值。这种操作办法可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率。,复制具体相关代码 具体相关代码如下:,CREATE TABLE salaryByMonth ( employeeNo varchar2(20), yearMonth varchar2(6), salary number ) ; inser,SELECT EMPLOYEENO ,YEARMONTh ,SALARY ,MIN(SALARY) KEEP(DENSE_RANK FIRST ORDER BY YEARMONTh) OVER(PAR,
Join是关系型网站数据库系统的重要操作办法之一,SQL Server中包含的经常用的Join:内联接、外联接和交叉联接等。假如如果咱们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时咱们应该考虑使用Join,因为Join具体联接表或函数进行查询的特性
本文将通过具体例子介绍SQL中的各种经常用的Join的特性和使用场合:
1.1.2 正文
首先咱们在tempdb中分别定义三个表College、Student和Apply,具体SQL具体相关代码如下:
复制具体相关代码 具体相关代码如下:
USE tempdb
---- If database exists the same name datatable deletes it.
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SChEMA.TABLES WhERE TABLE_NAME = 'College') DROP TABLE College;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SChEMA.TABLES WhERE TABLE_NAME = 'Student') DROP TABLE Student;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SChEMA.TABLES WhERE TABLE_NAME = 'Apply') DROP TABLE Apply;
---- Create Database.
create table College(cName nvarchar(50), state text, enrollment int);
create table Student(sID int, sName nvarchar(50), GPA real, sizehS int);
create table Apply(sID int, cName nvarchar(50), major nvarchar(50), decision text);
Inner join
内联接(Inner join)是最经常用的的联接类型之一,它查询满足联接谓词的数据。
假设咱们要查询申请表Apply中申请学校的相关信息,由于Apply表中包含学校名字咱们并不能预知,所以咱们可以根据cName来内联接(Inner join)表College和Apply,从而找到Apply表中包含学校的信息。
具体SQL具体相关代码如下:
复制具体相关代码 具体相关代码如下:
---- Gets college information from college table
---- bases on college name.
SELECT DISTINCT College.cName, College.enrollment
FROM College INNER JOIN
Apply ON College.cName = Apply.cName
图3左联接查询结果
如上图3所示:由于在Apply表中并没有学生申请harvard,但是咱们通过左联接(left outer join)把所有学校信息查询出来了。
由于左联接(left outer join)产生表College的完全集,而Apply表中匹配的则有值,而不匹配的则以NULL值取代,所以咱们知道Apply表中没有学生申请harvard。
通过左联接查询咱们可以获取College的完全集,假设现在咱们既要获取College的完全集又要获取Apply的完全集,那么咱们可以考虑使用完整外部联接(full outer join)。使用完整外部联接,咱们可以查询所有的学校,不管它们是否匹配联接谓词:
复制具体相关代码 具体相关代码如下:
---- Gets all information from college and apply table.
SELECT College.cName, College.state, College.enrollment,
Apply.cName, Apply.major, Apply.decision
FROM College FULL OUTER JOIN
Apply ON College.cName = Apply.cName
图4 College表和Apply表的行数
图6 Cross apply查询
Outer apply
在介绍Cross apply和Outer join之后,现在让咱们理解Out apply也就不难了,Outer apply使表可以和表值函数(table-valued functions TVF‘s)结果进行join查询,找到匹配值则有值,没有找到匹配值则以NULL表示。
复制具体相关代码 具体相关代码如下:
---- Student outer apply function fn_Apply.
SELECT Student.sName, Student.GPA, Student.sizehS,
cName, major
FROM Student OUTER APPLY dbo.fn_Apply([sID])
图8 执行计划
如图8所示:Cross apply首先执行TVF(table-valued functions),然后对表Studnet进行全表扫描,接着通过遍历sID查找匹配值。
Inner join对表Student和Apply进行全表扫描,然后通过哈希匹配查找匹配的sID值。
通过以上的SQL执行时间和执行计划,咱们能不能说Inner join比Cross apply好呢?答案是否定的,假如如果表的数据量很大,那么Inner join的全表扫描耗费时间和CPU资源就增加了(可通过数据量大的表进行测试)。
虽然大多数采用Cross apply实现的查询,可以通过Inner join实现,但Cross apply可能产生更好的执行计划和更佳的性能,因为它可以在联接执行之前限制集合加入。
Semi-join和Anti-semi-join
Semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询(查找到匹配的数据行就返回,不再继续查找)。
Anti-semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询,然后返回不匹配的数据。
不同于其他的联接运算,Semi-join和Anti-semi-join没有明确的语法来实现,但Semi-join和Anti-semi-join在SQL Server中有多种应用场合。咱们可以使用EXISTS子来实现Semi-join查询,Not EXISTS来实现Anti-semi-join。现在让咱们通过具体的例子说明吧!
假设要求咱们找出Apply和Student表中sID匹配的学生信息,这和前面的Inner join查询结果将一样,具体SQL具体相关代码如下:
复制具体相关代码 具体相关代码如下:
关于数据库教程相关的教程网站知识今天我们就说到这里了,希望可以帮到大家。