子查询
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