【SQL Server】查询总结--知识详解与回顾

1、为表起别名as

select * from classinfo as ui

查询全部列、指定列
为列起别名as

select ui.cid from classinfo ui

2、查询前n部分数据:top n 列名:表示查看前n行

select top 3 * from classinfo--查询前三行所有列

top n percent 列名:表示查看前百分之几的数据

select top 5 percent *from classinfo--查询前百分之五的所有列数据

3、排序:order by 列名1 asc(升序)|desc(降序),列名1 asc|desc…

select * from Userinfo
order by cid desc ,cname desc--先根据cis降序排,再根据cname升序排

4、消除重复行:distinct

select distinct cname from classinfo--消除classinfo里的cname相同的(只是查询时消除,并不是删除数据库里的)

5、条件查询:写在where后面

对行进行筛选,返回bool类型的值,如果某行中的列数据满足条件,则加入结果集,否则不出现在结果集中
比较运算符:=,>,>=,<,<=,!=或<>

select * from classinfo
where cid>3

between … and …表示在一个连续的范围内

select * from classinfo
where cid between 2 and 4

in表示在一个非连续的范围内

select * from classinfo
where cid in(3,5)

逻辑运算符:and,or,not

select * from classinfo
where cid=3 or cid=5

select * from classinfo
where not cid>=2 and cid<=5

6、模糊查询:用于处理字符串类型的值,运算符包括:like % _ [] ^

%若干个

select * from studentinfo
where sphone like '%4%'--电话号中含4

_单个

select * from studentinfo
where sname like '虎_'--虎某某

[]范围
在[]表示一个连续的范围可以使用-

select * from studentinfo
where sphone like '1[3-5]%'--电话号1开头第二个数字时3到5范围内的电话号

%与_写在[]中表示本身的含义
^写在[]内部的开头,表示不使用内部的任何字符

select * from studentinfo
where sphone like '1[^553]%'--电话号1开头接着非553内的电话号

7、null的判断:使用is null或is not null,与其它值计算时返回null,排序时null被认为是最小

select * from studentinfo
where sphone is null--查询电话是空的

8、连接:join 表名 on 关联条件

内连接:inner join,两表中完全匹配的数据
左外连接:left outer join,两表中完全匹配的数据,左表中特有的数据
右外连接:right outer join,两表中完全匹配的数据,右表中特有的数据
完全外连接:full outer join,两表中完全匹配的数据,左表中特有的数据,右表中特有的数据

select * 
from studentinfo
inner join classinfo on studentinfo.cid=classinfo.cid 

select studentinfo.sname,classinfo.cname
from studentinfo
inner join classinfo on studentinfo.cid=classinfo.cid 

select so.sname,co.cname--建议使用别名
from studentinfo as so
inner join classinfo as co on so.cid=co.cid 

select so.sname,co.cname
from studentinfo as so
right join classinfo as co on so.cid=co.cid 

select so.sname,co.cname
from studentinfo as so
left join classinfo as co on so.cid=co.cid 

select *
from studentinfo as so
full join classinfo as co on so.cid=co.cid 

多表查询:

select st.sname,cl.cname,sc.score,su.sucourse
from sc
inner join  studentinfo as st on sc.cid=st.cid
inner join  subjectinfo as su on sc.sid=su.suid
inner join  classinfo as cl on st.cid=cl.cid

9、聚合函数:对行数据进行合并

sum,avg,count,max,min
一般是对数字类型的列进行操作
一条查询中可以同时写多个聚合函数,但是不能与普通列混写
聚合中的null问题:不参与计算

select count(*) from studentinfo

select sum(score) 
from sc
inner join subjectinfo as su on sc.sid=su.suid
where su.sucourse='语文' 

select avg(score) 
from sc
inner join subjectinfo as su on sc.sid=su.suid
where su.sucourse='语文' 

select max(score) 
from sc
inner join subjectinfo as su on sc.sid=su.suid
where su.sucourse='语文' 

select min(score) 
from sc
inner join subjectinfo as su on sc.sid=su.suid
where su.sucourse='语文' 



10、开窗函数: over()

将统计出来的数据分布到原表的每一行中
结合聚合函数、排名函数使用

select sc.*,avg(score) over()
from sc
where sid=1

11、分组:group by 列名1,列名2…

聚合函数一般结合分组使用,进行分组内的数据进行统计
根据指定列进行分组

select COUNT(*)
from studentinfo
group by sgender--计算男女分别总数是多少
select studentinfo.sgender ,studentinfo.cid ,classinfo.cname,COUNT(*) 
from studentinfo
inner join classinfo on classinfo.cid=studentinfo.cid
group by studentinfo.sgender,studentinfo.cid,classinfo.cname
--求每班男女人数且显示班级(先分男女,再分班级)

注:select后面只能跟group by后面跟过的

--统计学生编号大于2各班级的各性别的学生人数
select sgender,cid,COUNT(*)
from studentinfo
where sid>2
group by sgender,cid

分组后条件筛选:having …

--统计学生编号大于2各班级的各性别的学生人数大于1的信息
select sgender,cid,COUNT(*)
from studentinfo
where sid>2
group by sgender,cid having count(*)>1
发布了44 篇原创文章 · 获赞 4 · 访问量 1041

猜你喜欢

转载自blog.csdn.net/qq_44162236/article/details/104749144