Sql高级查询
1.1.1子查询优势:
- 使用灵活(作为临时表,作为列,查询条件使用)
- 降低sql语句的复杂度,提高sql语句的复杂度。
例如:查询学号在王五前面学生的信息
- 作为查询条件使用
例如:查询学号在王五前面学生的信息
Select * from stuinfo where stuid< (select stuid from stuinfo where stuname=’王五’ )
注意:在查询条件中使用<,>,=符号后面只能有一个值
- 作为临时表使用
例如:查询所有学员的html成绩,没有成绩显示null
Select s1.*,s2.score from stuinfo s1 left join (select * from stuMark where subject=’html’)s2 on s1.stuid=s2.stuid
(3) 作为列使用
例如:查询所有学员的html成绩,没有成绩显示null
Select s1.*,(select s2.score from stumark s2 where s1.stuid=s2.stuid and subject=’html’ )score from stuinfo s1
1.1.2使用in 和 not in 完成子查询
In 和 not in通常在where字句中使用,在in not in后的子查询中,可以有多个值出现,但是只能有一列。
例如:查询学号为1,3的信息
Select * from stuinfo where stuid in(1,3)
例如:查询html成绩大于80学生姓名
Select stuname from stuinfo where stuid in(select stuid from stumark where score>80 and subject=’html’)
1.1.3使用exists 和 not exists 完成子查询(表示存在和不存在)
例如:查询存在分数的学生信息
Select * from stuinfo where exists(select * from stumark where stumark.stuid=stuinfo.stuid)
1.1.4使用some,any,all进行子查询
Some,any的查询功能是一样的,表示其中任何一项,all表示所有的项
2.1聚合技术
使用computer和computer by 进行汇总查询
Computer字句需要下列信息
- 可选by 关键字,它基于每一列计算指定的行聚合
- 行聚合函数名称包括sum,avg,min,max,count
- 要对其执行行聚集函数的列
在有些场景中要先分组,进行汇总计算,我们可以使用computer by进行分组查询
例如:显示每一门课的的明细及平均分
Select * from stumark order by subject computer avg(score)by(subject)
3.1排序函数
排序函数语法:
排序函数over([分组字句] 排序字句[desc][asc])
排序字句:order by 排序列,排序列,
分组字句:partition by 分组列
row_number函数(没有并列编号,不跳空编号)
rink函数(存在并列时跳空)
dense_rank函数(存在并列不跳空)
例如:
Select row_number over (order by score desc )as 排名,s1.stuNAME,s2.score from stuinfo s1,
Stumark s2 where s1.stuid=s2.stuid and s2.subject=’java’
索引
索引就是数据表中数据和相应储存位置的列表,利用索引可以提高在表或视图中查找数据的速度。Sql系统中,可管理的最小空间是页,一个页面有8kb的存储空间。
索引分类:(主要这两类)还有唯一索引,索引视图,全文索引,XML索引
聚集索引:是指表中数据行的物理存储顺序和索引顺序完成相同。
非聚集索引:不改变表中数据行的物理存储位置,数据与索引分开存储,通过索引指向的地址与表中的数据发生关系。
聚集索引与非聚集索引区别
聚集索引 | 非聚集索引 |
每个表只有一个聚集索引 | 最多有249个非聚集索引 |
物理的重排表中的数据以符合索引约束 | 创建一个键值列表,键值指向数据在数据页中的位置 |
用于经常查找数据的列 | 用于从中查找单个值的列 |
创建索引:
基本语法:
Create [unique][clustered][nonclustered]
Index 索引名
on 表名称/视图名称(列名称…)
[ with fillfactor=x]
Unique:创建唯一索引
Clustered:创建聚集索引
Nonclustered:创建非聚集索引
Fillfactor:填充因子大小,0-100之间的值,该值指示索引页填满的空间所占的百分比
例如:创建非聚集索引
Use students
Go
If exists(select name from dbo.sysindexes where name=’IX_score’)
Drop index students.IX_score –删除索引的语法
Create nonclustereda
Index IX_score
on stumark(score)
with fillfactor=30
查询使用该索引:
Select * from stumark with (index= IX_score)where score between 60 and 90
适合创建索引的列:当某一列被频繁的用于数据搜索时,或者该列用于对数据进行排序时可以创建索引。
不适合创建索引的列:如何列中仅有几个不同的值,或者表中仅包含几行值,不推荐使用。
视图
视图是一个虚拟的数据表。视图中并不存在数据,而是存放在视图所引用的原始表中,
同一张原始表,根据不同用户不同需求,可以创建不同的视图。
创建视图准则:
- 视图名称必须遵循标符
- 可以对其他视图创建视图,但嵌套不能超过32层
- 不能将规则或default定义与视图相关联
- 视图查询不能包含computer字句,computer by字句,into关键字。
- 视图查询不能包含order by 字句,除非select语句中还有top字句。
创建视图:
语法:
Create view 视图名称
As 查询语句
例如:创建视图
Use master
Go
If exists(select * from sys.views where name=’view_stuinfo’)
Drop view view_stuinfo
Go
Create view view_stuinfo
As
Select stuname,stuinfo.stuid,score from stuinfo left join stumark on
Stuinfo.stuid=stumark.stuid
查询视图:
Select * from view_stuinfo
加密视图:
语法:
Create view 视图名称
With encryption
As 查询语句
事务
事务:是有若干条T-sql指令组成,并且所有指令作为一个整体提交给数据库系统,执行时,这组指令要么全部执行完成,要么全部撤销。事务是一个不可分割的逻辑单元。
事务的属性:
原子性:
一致性:
隔离性:
持久性:
事务的模式:
显示模式 自动提交模式 隐式模式
事物处理:
Begin transaction 语句(事务开始)
Commit transaction 语句(提交事务,标志结束,说明事务执行成功)
Rollback transaction 语句(事务回滚)
游标
游标实际上是一种能从包括多条数据记录的结果集中每次提交一条记录的机制。使用游标可以实现:允许定位到结果集的特定行,从结果集的当前位置检索一行或多行数据,支持对结果集中当前位置的行进行修改。
使用游标会一行一行取出来,添加了服务器负担。除非是很复杂的操作,不要使用游标。
三种游标:
1.T-sql 游标(重点)2.API游标3.客户端游标
游标基本操作:
- 定义游标
Declare 游标名
Cursor [local|global]—全局的局部的
[forward only|scroll]—游标滚动方式
[read_only | scroll_locks | optimistic]—游标读取方式
For 查询语句
[for update[of column_name[,….N]]]—可更改字段
- 打开游标
Open 游标名
- 检索记录
Fetch 游标名
- 关闭游标
Close 游标名
- 删除游标
Deallocate 游标名