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
))

