SQL常用语法手册
相应符号说明:
-- 后面就是注释说明,不参与执行
{} 内是必须写的内容[] 内可以不写| 表示或者<>内的数据要写
一、数据库
1.创建数据库格式:
create database <数据库名>
on(name=数据库文件名,
filename='数据库存放的物理位置',
size=数据库初始化大小,
filegrowth=文件增长率,
maxsize=最大文件大小)
log on
(name=,
filename=,
size=,
filegrowth=,
maxsize=)
2.删除数据库格式:
drop database <数据库名称>
二、表格
1.创建表格式:
create table <表名>
( <列名> <列类型> <列说明>…,
[constraint <约束名称><约束条件>] )
<列类型>是列的数据类型。
<列说明>说明列的长度、列的默认值、主键等有关该列的约束条件。
2.修改表格式:
alter table <表名>
{ add <列说明>
| drop column <列名>
| alter column <列说明>
| add <约束说明>
| drop <约束> }
3.删除表格式:
drop table <表名>
4.创建主键约束:
constraint 主键约束名primary key(被定义为主键的列名)
5.创建外键约束:
constratint 外键约束名foreign key(本表中作为外键的列名) references 参照表(参照列) 6.check约束格式:
constraint <约束名称> check (<表达式>)
本章节例子
create table 学生基本信息表
( 学号char(4) not null constraint PK_学号primary key,
性别char(2) not null default('男') constraint CK_性别check (性别='男'or 性别='女'),
出生日期datetime not null,
奖学金money default(0) constraint CK_奖学金check (奖学金>=0 and 奖学金<=5000),
constraint CK_日期check (出生日期<入学日期) )
三、操纵数据
1.插入数据格式:
insert into <表名> [(列名)] values(<对应列的值表>)
列名可以不用写,但是values()里面的数据,就必须跟表格内的列相对应上,如果写列名,values()内的内容就是跟列名相对应的。
2.修改数据格式:
update<表名>
set <列>=<值>[,<列>=<值>]
[where <定位条件>]
3.删除数据格式:
delete from <表名>
[where<条件>]
四、Select语句
select <输出结果列表> from<表>
[where<选择条件>]
[order by<排序条件>]
[group by<分类条件>]
<排序条件>对输出结果进行排序的列明和次序说明
<分类条件>是分组统计的标准
select语句的几点补充
1.distinct关键字:
select distinct 列名from 表名
作用:可以从查询结果中去除重复的数据行
2.TOP关键字:
select top n [percent] <列名> from <表名>
top n:表示返回前n行数据
top n percent:表示返回百分之n的数据
3.下几个关键字多用于where子句
between and 操作符
举例来说明
where 奖学金between 300 and 500
表示的就是奖学金在300到500的范围,包含300和500。等价于下面表达式
where 奖学金>=300 and 奖学金<=500
IN操作符:
表达式或者字段名[not] in (列表或者子查询)
用于:表示根据表达式是包含在指定范围内还是范围外来制定表达式的搜索。
all操作符any操作符:
all和any 都是在select语句中包含where子句时,才有意义。
语法如下:
<列名> < | > | != | <= | >= [all] | [any] <查询语句>
例子如下:
select 学号,姓名from 学生基本信息表
where 出生日期< all(select 出生日期from 学生基本信息表where 院系名称='商学院') and 院系名称='信息学院'
结果就是:查询信息学院的学生中比商学院任一学生年龄都大的学生学号和姓名
如果把all换成any,表示的就是查询信息学院的学生中比商学院某一个学生的年龄大的学生学号和姓名
all 等价于and 逻辑关系,any相当于or 逻辑关系
exists操作符:
[not] exists <子查询>
用于:测试子查询中是否有结果行,如果有返回真值,否则返回假。
LIKE关键字P200:
<字符串表达式> [not] like <可以带通配符串表达式>
通配符有四种:
%表示任意个字符
_ 表示1个任意字符
[] 表示可以在方括号里列出的任意一个字符
[^] 表示不在方括号里列出的任意一个字符
like用处:当不能精确知道查询条件是使用。
空值:
在要查询中使用空值,需要在where子句中使用is null 或者is not null。
举例
where 备注is null 表示找到符合备注数据中是null的数据行
where 备注is not null 表示找到备注数据中不是null的数据行
空值输出:
isnull (<检查表达式>,<替换值>)
<检查表达式>将被检查是否为null的表达式,可以是任何类型
<替换值>代替显示空值的值
4.group by
对于group by子句中的列,在使用上有一个限制,出现在查询的select列表中的列必须同时出现在group by子句中
group by子句都会于聚合函数使用。
聚合函数
可以用于表的所有行,不局限于group by子句:
count([distinct]<列名>) 统计<列名>中数值的个数,如果使用distinct就是先去除重复的数值,然后再进行统计。
count(*) 表示统计结果行
max()最大值min()最小值sum()求和avg()求平均
--------------------------------------
having子句常与group by 子句连用,用法跟where子句类似。
5.本章练习题书P237,三、练习题2
(1)查询学生基本信息表、课程表、成绩表三张表的笛卡尔积的结果集中元组个数
select count(*) from 学生基本信息表,课程表,成绩表
(2)查询所有学生的学号、姓名、选课名称和成绩
select x.学号,x.姓名,k.课程名称,c.考试成绩from 学生基本信息表x,课程表k,成绩表c
where x.学号=c.学号and k.课程号=c.课程号
(3)查询每门课的平均成绩
select k.课程名称,avg(c.考试成绩) as '平均成绩' from 课程表k,成绩表c
where c.课程号=k.课程号
group by k.课程名称
(4)查询说有女生的姓名和选课成绩
select x.姓名,k.课程名称,c.考试成绩from 学生基本信息表x,课程表k,成绩表c
where x.学号=c.学号and k.课程号=c.课程号and x.性别='女'
(5)查询至少选修了两门课程的学生学号和姓名
select x.学号,x.姓名from 学生基本信息表x,成绩表c
where x.学号=c.学号
group by x.学号,x.姓名
having count(c.课程号)>=2
(6)查询平均分数大于等于80分的学生学号
select 学号from 成绩表
group by 学号
having avg(考试成绩) >=80
五、视图
1.创建视图
create view <视图名>(<列名>……)
[with encryption]
as <查询>
[with check option]
<列名>新视图中的列名,与<查询>中的列名对应
<查询>是定义视图的select语句
with encryption:视图语句定义内容加密。
with check option:如果修改数据不满足视图定义条件,则不允许修改。
2.修改视图
alter view <视图名>(<列名>……)
[with encryption]
as <查询>
[with check option]
3.删除视图
drop view <视图名>
4.举例
(1)建立视图,名称“学生平均成绩”,它由学号、姓名、平均考试成绩三列组成。
create view 学生平均成绩(学号,姓名,平均成绩)
as select x.学号,x.姓名,avg(c.考试成绩) as '平均成绩'
from 学生基本信息表x,成绩表c
where x.学号=c.学号
group by x.学号,x.姓名
(2)根据“学生平均成绩”视图,查询学习成绩优秀(平均成绩>=90)的学生学号select 学号from 学生平均成绩
where 平均成绩>=90
六、索引
1.创建索引
create [unique]
[clustered]|[nonclustered]
index <索引名称>
on <表名>(<列名>[,<列名>])
其中:
unique:唯一性索引
clustered:聚集索引
nonclustered:非聚集索引2.举例
(3)在学生基本信息表上为出生日期建立索引,名称“年龄大小索引”
create index 年龄大小索引
on 学生基本信息表(出生日期)
2.删除索引
drop index <索引名称>
七、存储过程
1.创建存储过程
create procedure <存储过程名>
[{@<参数名><数据类型>[output]}]
as{
<参数名>是存储过程的输入输出参数
2.修改存储过程
alter procedure <存储过程名>
[{@<参数名><数据类型>[output]}]
as{
3.删除存储过程
drop procedure <存储过程名>
4.存储过程的重命名
exec sp_rename 旧名字,新名字
5.举例
建立一个存储过程get_age 能够根据输入参数param_sno(表示学号),显示该学生的年龄值create procedure get_age @param_sno char(4)
as
select (year(getdate())-year(出生日期))as '年龄'
from 学生基本信息表
where 学号=@param_sno
6.
1)语句块
一个语句块可以有多个SQL语句,每个语句块从begin关键字开始,以end关键字结束begin
<语句>
……
end
2)if语句
if语句是一个条件判断语句
if<逻辑表达式>
{
[else
{
3)局部变量
适用于在处理过程中存储临时计算数据,定义格式如下
declare @变量名数据类型[,@变量名]
赋值格式
set @变量名= 一个值
4)return语句
用于无条件终止一个查询、存储过程、批处理的执行。在return语句之后的语句不会被执行。如果reurn语句中有整数表达式,则会返回一个整数值。
return [<整数表达式>]
5)while循环,格式如下:
while <判断表达式>
{循环体}
[break]
{循环体}
[continue]
举个例子
给pubs数据库的书的价格加倍
while(select avg(price) from titles)<$30 --判断条件为平均价格小于$30
begin --开始执行语句块,到end结束
update titles --更新titles表的数据
set price=price*2 --设置价格翻倍
select max(price) from titles --找出最高价格
if(select max(price) from titles)>$50 --如果存在最高价格大于50的书
break --符合上面的话,就中断,跳出while循环
else --如果不符合if语句的话
continue --如果不符合,则执行本语句,也就是回到while循环开始处end
print '循环完毕' --循环结束的时候,输出循环完毕字样。
6)case和go to 语句基本上不常用,就不说明了
八、触发器
create trigger <触发器名称>
on{<表名>|<视图名>}
{for | instead of | after}
{[update][,][insert][,][delete]}
As{
用法:基本上在执行所在表的相应的{[update][,][insert][,][delete]}中的功能后,激活触发器AS后面的语句
常用函数整理
1.字符串函数
长度与分析用
datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格
substring(expression,start,length) 不多说了,取子串
right(char_expr,int_expr) 返回字符串右边int_expr个字符
字符操作类
upper(char_expr) 转为大写
lower(char_expr) 转为小写
space(int_expr) 生成int_expr个空格
replicate(char_expr,int_expr)复制字符串int_expr次
reverse(char_expr) 反转字符串
stuff(char_expr1,start,length,char_expr2)
将字符串char_expr1中的从start开始的length个字符用char_expr2代替ltrim(char_expr) rtrim(char_expr)取掉空格
ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符
字符串查找
charindex(char_expr,expression) 返回char_expr的起始位置
patindex("%pattern%",expression)返回指定模式的起始位置,否则为0
2.数学函数
abs(numeric_expr) 求绝对值
ceiling(numeric_expr) 取大于等于指定值的最小整数
exp(float_expr)取指数
floor(numeric_expr) 小于等于指定值得最大整数
pi() 3.1415926.........
power(numeric_expr,power) 返回power次方
rand([int_expr]) 随机数产生器
round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入
sign(int_expr) 根据正数,0,负数,,返回+1,0,-1
sqrt(float_expr) 平方根
3.日期函数
getdate() 获取当前日期
datename(datepart,date_expr) 返回名称如June
datepart(datepart,date_expr) 取日期一部份
datediff(datepart,date_expr1.dateexpr2) 日期差
dateadd(datepart,number,date_expr) 返回日期加上number