SQL基础
SQL基础
一、SQL语言特点
1功能的一体化
2 两种使用方式,统一的语法结构
即联机交互使用方式、嵌入到某种高级程序设语言中(宿主语言)。
3 高度非过程化
SQL是一种描述性的语言(即结构化查询语言)。
4 基于集合的操作方式
5 语言简洁易学
二、SQL语言中的动词
SQL语言按功能分类 主要动词
数据库定义语言DDL create drop alter
数据库查询语言QL select
数据库操纵语言DML insert update delete
数据库控制语言DCL grant revoke
三、SQL Servler集合函数
函数 描述
Sum()
Min()
Max()
Avg()
Count() 返回非空表达式的个数
Count(*) 返回找到的行数
Distinct count() 不重复的输入值的数目
四、SQL Servler通配符
1 %:包含0个或更多个字符的任意字符串
%ab%:表示所有包含两个ab相连的任何字符串,如aabb,babb等。
2 _(下划线):任何单个字符。以_开头的任何字符串。
_ean:匹配以_ean结尾的所有4个字母的字符串,如dean,sean等。
3 [ ]:指定范围[a-f]或集合[abcdef]中的任何单个字符。
4 [^]:不属于指定范围[a-f]或集合[abcdef]中的任何单个字符。
de[^1]%:将匹配以de开头且其后的字母不为1的所有字符串。
五、使用变量
T-SQL中的变量分为局部变量和全局变量。全局变量由系统定义和维护,我们直接使用即可,一般不自定义全局变量。
1 局部变量:它的名称必须以标记@作为前缘。
声明语法: declear @变量名称数据类型
如:
declare @name varchar(8)
declare @seat int
赋值语法:
set @变量名=值
select @变量名=值
如:
/**//**查找张三的信息**/
declear @name varchar(8)
set @name="张三"
select * from stuInfo where=@name
/**//**查找张三的左右同桌**/
declare @seat int;
select @seat=stuSeat form stuInfo where stuName=@name
select * from stuInfo where (stuSeat=@seat+1) or (stuSeat=@seat-1)
go
从上可以可出,局部变量可用于在上下语句中传递数据。
set赋值语句一般用于赋给变量指定的数据常量。
select赋值语句一般用于从表中查询数据,然后再赋给变量。
2 全局变量
SQL Servler中的所有全局变量都使用2个@标志合作为前缀。常用的全局变量。
变 量 含 义
@@ERROR 最后个T-SQL错误的错误号(整型值)
@@IDENTITY 最后一次插入的标识值
@@LANGUAGE 当前使用的语言的名称
@@MAX_CONNECTIONS 可以创建的同时连接的最大数目
@@ROWCOUNT 受上一个语句影响的行数
@@SERVERNAME 本地服务器的名称
@@SERVICENAME 该计算机上SQL服务的名称
@@TIMETICKS 当前计算机上每刻度的微秒数
@@TRANSCOUNT 当前连接打开的事务数
@@VERSION SQL Server的版本信息
@@PROCID 当前存储过程的标识值
@@CURSOR_ROWS 返回游标打开后,游标中的行数。
@@CONNECTIONS 返回SQL Servler启动后,所接受的连接或试图连接的次数
六、输出语句
常用的输出语句有两种:
1 print局部变量或字符串
2 select局部变量as自定义列名(查询语句的特殊应用)
print '服务器名称'+@@SERVICENAME –-以文本方式显示-
select @@SERVERNAME as '服务器名称' –以网格方式显示--
七、批处理语句
批处理语句go:它是一条名多条SQL语句的集合。SQL Servet 将批处理语句编译成一个可执行单元,此单元称为执行计划。批处理的主要好外是简化数据库管理。
八、SQL中的流程控制语句
1 if..else..
if (条件)
语句或语句块
else
语句或语句块
2 begin..end..:标志SQL代码块的开始和结束.类似于C中的{}.
if (条件)
begin
语句
语句
end
else
...
3 return:无条件从当前过程退出.
4 case..when..else..end:类似于C中的多分支语句.
case
when 条件then结果
when 条件then结果
[else 其他结果]
end
采用美国的ABCDE五级打分制来显示成绩
select * from stuInfo --原始成绩
print 'ABCDE五级显示成绩如下:'
select stuNo,成绩=case
when scoure<60 then 'E'
when scoure between 60 and 69 then 'D'
when scoure between 70 and 79 then 'C'
when scoure between 80 and 89 then 'C'
else 'A'
end
from stuInfo
5 goto:用于立即跳转到T-SQL代码中的某个特定位置(即标号).
declare @i int
set @i=0
while(@i<10)
begin
set @i=@i+1
if(@i=4)
set @i=@i+95
goto mark
mark:
print 'i=5时的值是: '+cast(@i as varchar(8))
end
6 while:
while (条件)
语句或语句块
[break | continue]
7 break:退出while循环
8 continue:用于在特定的情况下重新开始while循环.
9 waitfor:
在:00执行存储过程usp_proc
waitfor time '23:00'
begin
execute usp_proc
end
从现在开始分种内一直执行存储过程usp_proc
waitfor delay '000:05:00'/*时:分:秒*/
begin
execute usp_proc
end
九、其它T-SQL编程语句
1 注释语句
/*这是注释*/或--这是注释
2 execute:执行SQL系统存储过程或自定义存储过程.
3 raiserror:允许客户端程序处理错误(异常),并让SQL通知出现了错误.
语法:
raiserror({msg_id | msg_str},severity,state
[,argument[,...n]])
[with [log | nowait | seterror]]
其中:
1 msg_id:是存留在sysmessages系统表中中的消息数量.小于等于的地方保留给SQL,用户定义的消息编号大于.
2 msg_str:用户定义的特定信息,最到个字符.
3 severity:与特定信息相关联,表示用户定义的严重性级别.
用户可使用的级别是-18.
sysadmin角色成员的级别是-25,且要指定with log选项
致命错误级别-25
4 state:错误的状态.1-127之间的值.
5 with:3个参数:
log: 在错误和应用程序日志中记录错误
nowait: 立即向客户程序报告错误
seterror:无条件的将错误报告给
如下示例:
当用户调用存储过程时.传入的及格线不在-100之间时,将弹出错误警告.
use stuDB
go
if exists(select * from sysobjects where name='proc_stu')
drop procedure proc_stu
go
/**//*--创建存储过程--*/
create procedure proc_stu
@notpassSum int output, --指出是输出参数
@writtenPass int=60, --输入参数,笔试及格线,默认参数放后.
@labPass int=60 --输入参数,机试及格线,默认参数放后.
as
/**//*------------错误处理----------------*/
if(not @writtenPass between 0 and 100)or(not @labPass between 0 and 100)
begin
raiserror('及格线错误,请指定-100之间的数,统计中断退出!',16,1)
return --立即返回,退出存储过程
end
print '笔试平均分: '+convert(varchar(5),@writtenPass)
print '机试平均分: '+cast(@labPass as varchar(5))
print '-------------------------------------'
print ' 参加本次考试没有通过的学生 '
select stuName,stuInfo.stuNo,writtenExam,labExam from stuInfo
inner join stuMarks on stuInfo.stuNo=stuMarks.stuNo
where writtenExam<@writtenPass or labExam<@labPass
/**//*------统计不有通过考试的学员人数------*/
select @notpassSum=count(stuNo) from stuMarks
where writtenExam<@writtenPass or labExam<@labPass
go
/**//**--调用存储过程--**/
--定义变量,用于存放调用存储过程时返回的结果--
declare @sum int,@t int
--调用时也带output,笔试及格线为,机试及格线默认为
execute proc_stu @sum output,800 --大于报错
set @t=@@ERROR --raiserror报错误后@@ERROR将不等于,表示有错
if @t<>0
print '@@ERROR的值是: '+convert(varchar(5),@t)
return --退出批处理,后续语句不执行.
select '未通过人数'+ cast(@sum as varchar(5))+'人'
go
十、SQL函数
语法:
create function 函数名(传入的参数参数类型)
return 返回值的类型
as
SQL语句或语句块
return 返回的值
其中:
[return 返回值的类型]和[return 返回的值]的数据类型要一致
use stuDB
go
--函数getSerial(@variable datetime)得到流水号--
if exists(select * from sysobjects where name='getSerial')
drop function getSerial
go
create function getSerial(@dt datetime)
returns varchar(50)
as
begin
declare @dtstr varchar(50)
select @dtstr=datename(year,@dt)+datename(month,@dt)+datename(day,@dt)+
datename(hour,@dt)+datename(minute,@dt)+datename(second,@dt)+
datename(millisecond,@dt)
return @dtstr
end
go
/**//*调用* 必须以stuDB.dbo.这种方式调用*/
/**//*否则报:'getSerial' 不是可以识别的内置函数名称。*/
print cast(stuDB.dbo.getSerial(getdate()) as char(20))
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zerolsy/archive/2008/02/26/2123511.aspx