SQL高级查询

子查询

1.作为查询条件使用  where

	
	--1.子查询作为条件
		--查询学号在王五前边的同学
		select * from StuInfo where stuid < (select stuid from StuInfo where stuname='王五')
		

2.作为临时表使用  from

--子查询3:stuinfo、StuMarks都作为子查询
		select stuname,subject,score from 
		(select * from stuinfo where stuname = '李四') s1,
		(select * from stumarks where score > 80) s2
		where s1.stuid = s2.stuid

3.作为列使用 select

--3.子查询作为列使用
		--查询所有学员html成绩,没有成绩以null显示
		select s.*,
		(select score from StuMarks where subject='html' and  s.stuid=StuMarks.stuid) as '成绩' 
		from StuInfo s

在条件查询中使用   '<'  ,   '>'  ,   '='后+查询句只能查一列。

in和not in 通常在where子句中使用,在in和not in后接的子查询中,可以有多个值出现,但必须只能有一列

--in 符合in后面所有条件都能够查询出来,一系列确定的值或表中的某一列
		--查询学号为1和3的学员信息
		--select * from stuinfo where stuid = 1 or stuid = 3
		select * from stuinfo where stuid in (1,3)
--not..in 对in取反,不符合in后面所有条件都能够查询出来
		--查询学号除了1和3的以外的学员信息
		select * from stuinfo where stuid not in (1,3)

 

使用EXISTS和NOT EXISTS子查询

1.EXISTS和NOT EXISTS表示在和不存在的意思

2.在语句中会判断EXISTS和NOT EXISTS后接的子句是否存在和是否存在

3.NOT EXISTS的用法与EXISTS一样,唯一的区别就是意义相反。

--EXISTS 和 NOT..EXISTS 后必须跟子查询,表示存在和不存在的意思。
		--查询存在分数的学员的信息
		SELECT * FROM StuInfo WHERE EXISTS (SELECT * FROM StuMarks WHERE StuMarks.StuID = StuInfo.StuID)
		--查询没有成绩的学员的信息
		SELECT * FROM StuInfo WHERE not EXISTS (SELECT * FROM StuMarks WHERE StuMarks.StuID = StuInfo.StuID)

使用SOME,ANY,ALL进行子查询

1.在SQL查询中,SOME,ANY,ALL后必须跟子查询。

2.在SQL查询中,SOME,ANY,ALL的作用是一样的,表示其中的任何一项。ALL则表示其中的所有的项。

 

--SOME、 ANY、 ALL后必须跟子查询
--SOME 和 ANY 的作用是一样的,表示其中的任何一项 
select * from StuInfo where stuid > any(select stuid from StuInfo where stuid>1)
select * from StuInfo where stuid > some(select stuid from StuInfo where stuid>1)
--all表示其中的所有的项
select * from StuInfo where stuid > all(select stuid from StuInfo where stuid>1)

compute  聚合技术

1.使用了comput进行总计算后的查询得到了两个结果集,第一个结果集返回查询前面的查询明细,后一个结果返回汇总的结果,我们也可以在compute子句中添加多个汇总计算表达式。

COMPUT子句需要下列信息:

①可选BY关键字。它基于每一列计算指定的行聚合。

②行聚合函数名称。包括SUM,AVG,MIN,MAX或COUNT。

③要对其执行行聚合函数的列。

eg:

--对信息进行查询并统计
	select * from StuMarks  where subject='html' 
	compute max(score),min(score),avg(score)

	--对信息进行分组查询并统计
	select * from StuMarks order by stuid desc
	compute avg(score),sum(score) by stuid

 

        排序函数

--排序函数 over([分组子句] 排序语句[排序方式])   

排序函数:

①POW_NUMBER函数生成的排序根据排序子句给出递增连续的序号。

--row_number()	行号
		select row_number() over(order by score desc) as '排名',
		StuInfo.stuid,stuname,score from StuInfo,StuMarks
		where StuInfo.stuid=StuMarks.stuid  and StuMarks.subject='java'

②RANK函数生成的排序根据排序子句给出递增的序号,但是存在并列并且跳空。

--rank()  存在并列时跳空
		select rank() over(order by score desc) as '排名',
		StuInfo.stuid,stuname,stusex,score from StuInfo,StuMarks
		where StuInfo.stuid=StuMarks.stuid  and StuMarks.subject='java'

③DENSE_RANK 函数生成的排序根据排序子句给出递增的序号,但是存在并列不跳空

--dense_rank()  存在并列时不跳空
select dense_rank() over(order by score desc) as '排名',
StuInfo.stuid,stuname,stusex,score from StuInfo,StuMarks
where StuInfo.stuid = StuMarks.stuid  and StuMarks.subject='java'

分组子句:PARTITION BY分组列,分组列...

排序子句:ORDER BY排序列,排序列...

公示表达式

--在一个批中建立一个临时表,保存所有学生的SQL成绩
    --可以用别名,但要与查询结果列一一对应(学号,姓名,成绩)

WITH StuInfo_StuMarks (StuID, StuName, Score)
	AS
	(
		SELECT S1.StuID, S1.StuName, S2.Score 
		FROM StuInfo S1, StuMarks S2
		WHERE S1.StuID=S2.StuID and subject = 'SQL'
	)
	select * from StuInfo_StuMarks
	go

 

你可能感兴趣的:(SQL高级查询)