SQL简略教程.docx
《SQL简略教程.docx》由会员分享,可在线阅读,更多相关《SQL简略教程.docx(18页珍藏版)》请在冰豆网上搜索。
SQL简略教程
1.创建数据库
createdatabasebvtc_db --数据库名
onprimary --在主文件组中指定文件.默认为第一个文件
(
name='bvtc_db_data', --指定主数据文件名称(逻辑名)
filename='F:
\bvtc_db_data.mdf',--指定主文件的操作系统文件名称和路径.必须为安装SQL服务器的计算机上的文件夹.(物理文件名)
size=5MB, --初始容量大小
maxsize=20MB,--最大容量
filegrowth=20% --文件增长量(默认时为10%,不能超过maxsize)
)
logon --指定建立数据库的事务日志文件,文件扩展名为:
ldf
(name='bvtc_db_log',--指定事务日志文件逻辑名称
filename='F:
\bvtc_db_log.ldf',--指定物理文件名
size=10MB, --初始容量大小
filegrowth=2MB --文件增长量
)
collateChinese_PRC_CI_AS --指定默认排序方法
GO
2.查看数据库信息
除了直接查看数据库属性外,我们以用系统存储过程式sp_helpdb:
execsp_helpdb'bvtc_db' --exec为执行语句,bvtc_db为数据库名
3.管理数据库
(1)打开或切换数据库:
usebvtc_db
(2)修改数据库容量:
可以直接在数据库属性里改,也可以用如下语句:
usebvtc_db
go
alterdatabasebvtc_db
modifyfile
(
name=bvtc_db_data,--同样也可以是事务日志文件(bvtc_db_log)
size=20MB
)
(3)缩减数据库容量:
方法1:
右击数据库名-所有任务-收缩数据库
方法2:
dbccshrinkdatabase(database_name[,new_size,[,'masteroverride']])
实例:
usebvtc_db
go
execsp_dboption'bvtc_db','singleuser',TRUE--在缩减数据库前要将其设为单用户模式.
go
dbccshrinkdatabase('bvtc_db') --此处将数据库缩减到最小容量.
go
execsp_dboption'bvtc_db','singleuser',FALSE
go
(4).设定修改数据库选项:
方法1:
数据库属性,选项
方法2:
(1)查看数据库选项:
execsp_dboption'database_name'
(2)修改数据库选项:
execsp_dboption[database_name,option_name,{true|false}]
实例:
更改数据库bvtc_db为只读状态:
execsp_dboption'bvtc_db','readonly',true
go
(5)更改数据库名称:
execsp_renamedboldname,newname --权限仅限于sa
实例:
将数据库bvtc_db改名为bvtc1_db
execsp_dboption'bvtc_db','readonly',false
go
execsp_renamedb'bvtc_db','bvtc_db1',
go
(6)删除数据库:
dropdatabasedatabase_name1[,database_name2...]
或:
execsp_dbremovedatabase_name --这是利用系统存储过程.
实例:
将bvtc_db数据库删除:
Usemaster
dropdatabasebvtc_db
go
4.数据库表的操作
(1)创建表:
在数据库student创建"学生表"
usestudent
go
createtable学生
(学号 char(12)constraintpk_xhprimarykey, --设定学号为该表的主键.
姓名 char(8)notnull,--不充许为空.
性别 char
(2),
出生日期datetime,
入学时间datetime,
班级代码char(9)constraintfk_bjdmreferences班级(班级代码), --将班级代码设为此表的外键.
专业代码char
(2),
系部代码char
(2)
)
onstugroup1--将学生表创建在stugroup1文件组上.
go
(2)修改表:
使用altertable语句可以对表的结构和约束进行修改.
实例:
<1>在"学生"表中增加"家庭住址"一列,数据类型为varchar(30),不允许为空.
usestudent
go
altertable学生
add家庭住址varchar(30)notNULL--add为增加列或约束的子句.
go
<2>在"学生"表中修改"家庭住址"一列为varchar(50),允许为空.
usestudent
go
altertable学生
altercolumn家庭住址varchar(50)NULL --altercolumn为修改表列属性的子句.
go
<3>删除字段
usestudent
go
altertable学生
dropcolumn家庭住址
go
(3)删除表:
usestudent
go
droptable学生
go
(4)数据的添加与表的查看.
<1>向表中添加数据:
insert[into]tablename(字段1,字段2,...)values(value1,value2,...)
usestudent
go
insert学生 --表名
(学号,姓名,家庭住址) --所要插入的列名
values('001','种子张','我家') --所插入的值
如果是按顺序逐个列插入数据,则可以省略列名.
还可以将select查询结果插入到表中:
insert[into]tablename1(字段1,字段2,...)select字段1,字段2...fromtablename2
例:
insertinto系部1
(系部代码,系部名称,系部主任)
select系部代码,系部名称,系部主任
from系部
go
(5)数据的修改:
update
updatetable_namesetColumn_Name=**whereID=***
实例:
根据"教学计划"表中的课程号,专业代码和专业学级修改教师任课表中的"起始周","结束周"列的值.
usestudent
go
update教师任课
set教师任课.起始周=教学计划.起始周,教师任课.结束周=教学计划.结束周
from教学计划
where教学计划.课程号=教师任课.课程号
and教学计划.专业代码=教师任课.专业代码
and教学计划.专业学级=教师任课.专业学级
(6)数据的删除:
<1>delete语句,Deletetable_name删除"表格记录"会把操作记录在日志中,可以通过事务回滚来恢复删除的数据
deletefromtable_namewhere条件
实例:
删除"课程注册"表中姓名为"种子张"的课程号为"001"的选课信息.
usestudent
go
delete课程注册
from学生
where学生.姓名='王丽'and课程注册.专业代码='001'
go
<2>truncatetabletablename清空表格,删除"表格记录"不可恢复.
5.简单查询.
(1)select语句的主要格式.
selectselect_list
[intonew_table_name] --指定使用结果集来创建一个新的数据表,表名为:
new_table_name
fromtable_list
[wheresearch_conditions]
[Groupbygroup_by_list] --将结果集按照group_by_list列分组.
[havingsearch_conditions]
[orderbyorder_list[asc|desc] --asc为升序(默认),desc为倒序.
(2)实例:
<1>查询"学生"表中全体学生的记录*
usestudent
go
select*from学生
go
<2>为结果集指定别名 as
usestudent
go
select姓名,year(getdate()-year(出生日期)as年龄from学生 --注意是用as,年龄即为别名.
go
<3>选择表中不重复的记录distinct
usestudent
go
selectdistinct姓名
from学生表
go
<4>限制返回行数top
限制返回行数
选取第一条记录:
selecttop1*fromtable_name
选取前N条记录:
selecttopN*fromtable_name
选取最后一条记录:
selecttop1*fromtable_nameorderbycolumn_namedesc
选取最后N条记录:
selecttopN*fromtable_nameorderbycolumn_namedesc
选取任意一条记录(随机):
selecttop1*fromtable_nameorderbynewid()
(3)查询满足条件的元组(常与where联用)
<1>查询条件:
比 较:
=,<,>,>=,!
=,<>,!
>,!
<;not+上述运算符
确定范围:
betweenand,notbetweenand判断是否在范围内
确定集合:
in,notin判断是否为列表中的值
字符匹配:
like,notlike判断是否与指定的字符通配格式相符
空 值:
isnull,notisnull判断是否为空
多重条件:
and,or,not用于多重判断
实例:
1.查询学生表中出生日期在1980-01-01和1982-01-01之间的学生姓名
select姓名from学生where出生日期between'1980-01-01'and'1982-01-01'
<2>.字符匹配.
[not]like'<匹配串>'[escape'<换码字符>']
其中,匹配串可以是一个完整的字符串,也可以是与通配符组成的字符串.
通配符有:
%,_,[],[^]四种.%表示任意个字符如a%b表示以a开头,b结尾的任意个字符.,_表示任意一个字符,
[]表示方括号里的任意一个字符如a[bcde]表示以a头,bcde中任一个结尾的字符串.[^]表示不取方括号里的值.
实例:
查询"学生"表中姓王的同学的所有信息.
select*from学生where姓名like'王%'
如果要查询的字符本身就含有%,_等就要使用escape'<换码字符>'短语对通配答进行转义了.
例:
要查询delphi_2.9
where课程名like'delphi/_2.9'escape'/'表示匹配字符串中紧跟在/之后的字符"_"不再是通配符.
<3>涉及空值的查询.notisnull
实例:
查询"班级"表中备注为空的班级信息.
select*from班级where备注isnull --is不能用"="代替.
<4>对查询结果进行排序 asc升序(默认),desc降序.
实例:
查询选修了课程号为001的课程的学生学号.按成绩降序排列.
select学号,成绩from课程注册where课程号='001'orderby学号asc,成绩desc --有多个排序,先排前面的,相同则排后面的.
4)对数据进行统计.
集合函数:
count([distinct|all]*)统计记录个数.
count([distinct|all]<列名>)统计一列中值的个数.
sum([distinct|all]<列名>计算一列值的总和(必须为数据类型).
avg,max,min分别求一列值中的平均数,最大值,最小值.
实例:
<1>返回学生表中学生总人数.
selectcount(*)as学生人数from学生
<2>返回一列的平均数
selectavg(成绩)as平均分from课程注册
<3>对结果进行分组.
groupby列名[having筛选条件表达式]
<4>使用compute子句
格式如下:
compute集合函数[by列名] --分类汇总.它显示详细记录,groupby不显示。
其中,集合函数:
sum(),avg(),count()等.
select*from课程注册orderby学号computesum(成绩)by学号
(5)用查询结果生成新表selectinto
select*into课程注册副表from课程注册
创建空副表:
select*into学生副表from学生表where1=2
(6)合并结果集union
将多个查询结果集合并为一个结果集
select语句
{unionselect语句},[,...n]
各个结果集列数必须相同,对应数据类型也要相同.最后结果集返回第一个select语句.
实例:
查看“课程注册”表中选修了001课程或者选修了002课程的学生,也就是选择两者的并并集.
select*from课程注册 where课程号='001'
union
select*form课程注册where课程号='002'
(7)连接查询 crossjoin (并集)
select列名列表 fromtable_name1crossjointable_name2
实例:
select*from产品crossjoin 产品销售
(8)等值与非等值连接查询
连接条件:
[表名1].<列名><比较运算符>[表名2].<列名> 其中比较运算符有=,>=,<=,!
=,>,<.
格式:
select 列名列表fromtable_name1[inner]table_name2ontable_name1.列名=table_name2.列名 --inner指定为内连接,可以省.
(on主键=外键)
实例:
select*from产品innerjoin产品销售on产品.产品编号=产品销售.产品编号 --innerjoin为交集,不同于crossjoin
自然连接:
在等值连接中,把目标列中重复的属性列去掉则为自然连接.
(9)自身连接查询
实例:
查询选修了两门或两门以上课程的学生学号和课程号
selecta.学号,a.课程号from课程注册asajoin课程注册 asb
ona.学号=b.学号anda.课程号=b.课程号
(10)外连接查询(分为左外连接,右外连接和全外连接)
<1>.左外连接(table_name1在左边)
Select*fromtable_name1leftouterjointable_name2ontable_name1.column_name=table_name2.column_name
<2>.右外连接(把left改为right就行了)
<3>.全外连接(触类旁通,left改为full)将左表所有记录分别与右表的每一条记录进行连接组合,结果集中不满足连接条件的以null显示出来.
(11)复合连接条件查询.
实例:
查询成绩在75分以上的学生的学号,姓名,选修课的课程号,课程名,专业代码,成绩,任课老师的教师编号,姓名.
selectb.课程号,c.教师编号,c.姓名,a.学号,b.专业代码,b.专业学级,b.学期,b.成绩
from学生asajoin课程注册asbona.学号=b.学号andb.成绩>75join教师asc
(12)子查询(查询块的嵌套)
select* from产品
where产品编号in(select产品编号 from产品销售) --()内为子查询,其中in可以改为比较运算符.
(13)带有any或all运算符的子查询.
实例:
查询比"1"班中所有学生年龄都要小的其它班上的学生学号与姓名
select学号,姓名
from学生
where出生日期>all
(select出生日期from学生where班级代码='1')
and班级代码<>'1'
(14)带有exists,notexists运算符的子查询.不返回任何数据,只产生逻辑true,false.
实例:
查询所有选修了'1'课程的学生姓名
select学号,姓名
from学生
where exists
(select*from课程注册
where学号=学生.学号and课程号='1'
)
触发器入门
创建一个简单的触发器
------------
触发器是一种特殊的存储过程,类似于事件函数,SQLServer"允许为INSERT、UPDATE、DELETE创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列T-SQL语句。
触发器可以在查询分析器里创建,也可