第一篇:sql2008教案T_SQL语句创建数据库
SQL Server 2008 数据库的管理
(二)一、T-SQL 概述
1.SQL:Structured Query Language:结构化查询语言,现在已经作为国际计算机查询语言的通用标准,92年美国国家标准局ANSI推出ANSI SQL 92标准,我们安装的sql server 2008所用的标准就是ANSI SQL 92标准的一个扩展集,叫做T-SQL。2.T-SQL T-SQL:Transact-SQL,是SQL的一个扩展集,对功能有了很大的补充,例如变量说明,流程控制,功能函数等。
二、T-SQL的语言主要组成部分 1.DML(数据操作语言)
用于查询、插入、修改、和删除数据库中的数据。SELECT、INSERT、UPDATE、DELETE等
2、DDL(数据定义语言)
用于在数据库系统中创建数据库、表、视图、索引等 CREATE DATABASE DROP DATABASE等
3、DCL(数据控制语言)用来控制存取许可、存取权限等 GRANT,REVOKE等 4.其他
海标扩变量说明、内部函数等其他的命令。
二、数据库的相关概念和命名规则
1、物理存储结构
数据库文件在磁盘上的存储形式
主数据文件:
*.mdf,用来存储数据库的启动信息,存储部分或者全部的数据。一个数据库只能有一个主数据文件。
辅助数据文件:*.ndf,用来存储主数据文件未能存储的数据。一个数据库可以有很多个ndf,也可以一个都没有。
日志文件:*.ldf,用来存储数据库的更新等日志信息,当数据库损坏的时候管理员可以通过日志文件来进行恢复。曾删改都会被记录在日志文件中。查询是不会被记录在日志中。一个数据库必须有一个日志文件。
文件组:类似于文件夹,用来方便管理文件,分为主文件组和次文件组,日志不属于任何一个文件组。(查看测试1数据库)
2、逻辑存储结构
有数据表,视图,索引等国中不同的数据对象组成,分别用来存储特定信息并支持特定功能。
3、数据库明明规则
第一个字符必须是字母或者”_”、”@”、”#”。数据库名称不能直接是T-SQL的保留字。不允许嵌入空格或其他特殊字符。
4、数据库的分类(1)系统数据库
master:非常重要的数据库,记录了数据库的系统级别信息,包括所有的登陆账户,系统配置以及数据库和数据库文件的存放位置和初始化信息等等。
usemaster--纸箱操作的数据库
select*fromsysdatabases--查询系统表sysdatabases中的所有数据
model:模板数据库,当我们创建新数据库的时候会有一个模板,模板就存放在model数据库中
msdb:备份和还原数据库的时候使用的。
Tempdb:临时数据库,存储临时表和临时数据过程,过程当程序结束后就会消失。
Resource:隐藏的数据库,是无法看到的,包含了SQL server的系统对象,在物理存储结构上实在resource数据库中的额。但是逻辑上他会出现在每个数据库的sys架构当中。
(2)用户数据库(日文翻译的书经常叫做平民数据库):用户自己创建的数据库。
三、使用T-SQL视图创建数据库
1、单一文件组的数据库。例如:使用管理器创建一个电子商城E_Market数据库,要求如下(只有一个primary文件组)
数据库名称为E_Market,包含一个数据文件,初始容量大小为5M,文件按15%自动增长,最大容量为100M 一个日志文件,初始容量大小为1M,不启用自动增长,所有文件存放在E盘,project目录下。
说明:建完数据库后,右键单击数据库名称,选择属性—选项(1)兼容级别:高版本的数据库是可以兼容低版本数据库的,可以根据自己的需要自行设定
(2)限制访问:三种状态,默认是multi user,是不限制访问的,single user是当我们对数据库进行维护的时候,旺旺只会同意自己访问对数据库进行维护,single user就是这时候使用的,restricted user 是只允许特定用户访问数据库。
(3)数据库的只读状态,制度数据库不能再被写入数据,只能读取数据。
创建数据库是需要指定哪些属性
文件名称,存放位置,非配的初始空间,属于哪个文件组 文件增长,文件容量设置 兼容级别:版本号 数据库是否只读 限制访问的三种模式 2.创建多个文件组的数据库。
例如:使用管理器创建一个DemoDB数据库,要求如下
数据库的名称为DemoDB,包含一个数据文件,除是容量为10M,文件按10%自动增长,最大容量为500M。
第二个文件组FG,辅助数据文件为FG_DemoDB,初始大小为10M,不启用自动增长。
一个日志文件,出事容量大小为5M,不启用自动增长,所有文件存放在E:project目录下。
顺序:首先创建数据库DemoDB,设置大小和自动增长以及存放位置,更改日志文件大小和自动增长以及存放位置。进入文件组,新建文件组FG。
回到文件,创建文件FG_DemoDB,修改文件组、大小、增长以及存放位置,设置改文件属于文件组FG。
四、使用SQL语句创建数据库
1.创建一个数据文件和一个日志文件的数据库 题目要求同上
USEmaster--当前指向的操作的数据库 GO CREATEDATABASEE_Market ONPRIMARY--主文件组()NAME='E_Market_data',--逻辑文件名
FILENAME='E:projectE_Market_data.mdf',--物理文件名 SIZE=5MB,--初始大小
MAXSIZE=100MB,--最大容量 FILEGROWTH=15%--增长率
LOGON--日志文件(NAME='E_Market_log', FILENAME='E:projectE_Market_log.ldf', SIZE=5MB, FILEGROWTH=0--未启用自动增长)
Go 注意:每句语句后面跟的是英文的逗号,最后一句不用逗号,开始的go和最后的go是告诉数据库将两个go之间的代码当做一段语句块执行,因为我们创建数据库是要求主文件和日志文件同事存在的,所以要同事执行。
2.创建多个文件组的数据库。题目同上
USEmaster--当前指向的操作的数据库 GO CREATEDATABASEE_Market ONPRIMARY--主文件组(NAME='E_Market_data',--逻辑文件名
FILENAME='E:projectE_Market_data.mdf',--物理文件名 SIZE=5MB,--初始大小 MAXSIZE=100MB,--最大容量 FILEGROWTH=15%--增长率), FILEGROUPFG--创建了一个次文件组(NAME='E_Market2_data', FILENAME='E:projectE_Market2_data.ndf', SIZE=4MB, FILEGROWTH=10%)LOGON--日志文件
(NAME='E_Market_log', FILENAME='E:projectE_Market_log.ldf', SIZE=5MB, FILEGROWTH=0--未启用自动增长),(NAME='E_Market2_log', FILENAME='E:projectE_Market2_log.ldf', SIZE=3MB, FILEGROWTH=10%, MAXSIZE=100MB)GO 注意:如果只有一个primary文件组写完文件组后不用在最后添加英文的逗号,如果需要写一个此文件组,则需要在写完主文件组后添加英文的逗号,然后继续写filegroup。3.向现有数据库添加文件组和文件(1)利用视图添加文件组和文件
找到E_Market数据库,右键单击该数据库—属性—文件组—添加—写好文件组名fg2.选择文件—添加—文件名等属性(2)利用SQL语句添加文件
useE_Market
alterdatabasee_marketaddfilegroupfg1--添加文件组fg1 go alterdatabasee_marketaddfile--向刚创建的文件组fg1添加文件(name='fg1_e_market_data', filename='e:projectfg1_e_market_data.ndf', size=5mb, filegrowth=10%)tofilegroupfg1 go--将fg1文件组设置为默认文件组 alterdatabasee_market modifyfilegroupfg1default go 4.删除数据库
(1)利用sql语句删除数据库
USEmaster--当前指向的操作的数据库
GO IFEXISTS(SELECT*FROMsysdatabasesWHEREname='E_Market')
DROPDATABASEE_Market--删除数据库 GO 注意:特别小心删除数据库的操作,如果执行则会从磁盘上将所有数据库文件都删除,一旦删除是无法恢复的。(2)完整的创建数据库的方法
USEmaster--当前指向的操作的数据库
GO IFEXISTS(SELECT*FROMsysdatabasesWHEREname='E_Market')
DROPDATABASEE_Market--删除数据库--创建数据库
CREATEDATABASEE_Market ONPRIMARY--主文件组(NAME='E_Market_data',--逻辑文件名
--物理文件名
FILENAME='e:projectE_Market_data.mdf', SIZE=5MB,--初始大小 MAXSIZE=100MB,--最大容量 FILEGROWTH=15%--增长率), FILEGROUPFG--创建了一个次文件组()NAME='E_Market2_data', FILENAME='e:projectE_Market2_data.ndf', SIZE=4MB, FILEGROWTH=10% LOGON--日志文件
(NAME='E_Market_log', FILENAME='e:projectE_Market_log.ldf', SIZE=5MB, FILEGROWTH=0--未启用自动增长),(NAME='E_Market2_log', FILENAME='e:projectE_Market2_log.ldf', SIZE=3MB, FILEGROWTH=10%, MAXSIZE=100MB)GO SELECT*FROMsysdatabases
第二篇:数据库SQL语句十题
作业十题
1.查询所有学生的基本信息,并按学号降序排列
SELECT * FROM STUDENT
ORDER BY sno DESC;
2.查询系别代码为“02”的女同学信息
SELECT * FROM STUDENT
WHERE ssex=’女’ and sdept=‘02’;
3.查询学生的总人数
SELECT COUNT(*)AS 学生总人数
FROM STUDENT;
4.所有选修课学生的姓名,课程名及成绩
SELECT sname,cname,grade
FROM STUDENT,COURSE,SC
WHERE STUDENT.sno=SC.sno and COURSE.cno=SC.cno;
5.不及格学生姓名(合并重复项)
SELECT distinct sname
FROM SC,STUDENT
WHERE grade<=60 and STUDENT.sno=SC.sno;
6.查询学号为“011110”的学生的哪些课程的成绩比他数据库的成绩要高 SELECT cno
FROM COURSE
WHERE sno=’011110’ and grade>(SELECT grade FROM COURSE,SC
WHERE cname=’数据库’ and sno=‘011110’ and
COURSE.cno=SC.cno);
7.查询选修课在3门以上(包括3门)的学生学号及选课门数 SELECT sno,COUNT(*)AS 选修门数
FROM SC
GROUP BY sno HAVING COUNT(*)>=3;
8.查询学号为“011110”的学生的平均成绩,并以平均成绩命名 SELECT AVG(grade)AS average grade
FROM SC
WHERE sno=’011110’;
9.查询计算机系或英语系的所有学生的个人信息
SELECT*FROM STUDENT
WHERE sdeptIN(SELECT sdept FROM DEPT
WHERE sdname=’计算机系’OR sdname=’英语系’);
10.查询与“罗宇波”同一个系的学生情况
SELECT * FROM STUDENT
WHERE sdept=(SELECT sdept FROM STUDENT
WHERE sname=’罗宇波’);
第三篇:SQL数据库编程学习应用语句
SQL数据库编程学习应用语句大全
1as 的用处
as可以对表和列取别名
在开发过程中经常遇到开始给某一个的字段去field1的名称,但后来有感觉field1字段指定不确切,于是又把此字段改成了field2,由于开始认为field1是常量,于是到处使用字符串field1,而且程序中又含有大量对field1的处理,此时就可以使用as
例如原来的 select field1 from tableA,改为selectfield2 asfield1 from tableA 代码基本就可以不动了。
2自增长的字段的插入
开发中经常遇到某个字段类型为IDENTITY,也就是自增长类型,但由于特殊需要,又要插入数据
需要临时去掉,可以使用如下语句set IDENTITY_INSERTtablename on,在处理完成后在使用如下语句恢复 set IDENTITY_INSERTtablenameoff
3分组取每组的前N个数据
开发中还会遇到需要对某一组数据先分组,然后取每组的前n条记录的情况
不妨试试如下代码
[sql] view plaincopy
/*
按CurrentNodeLevel列分组,每组按NodeID排序,取出每个组中的前3个元素*/
declare @temp table(NodeIDint, CurrentNodeLevelint ,rowNumberint)--定义临时表insert into @temp
selectNodeID,CurrentNodeLevel,ROW_NUMBER()
OVER(partitionby CurrentNodeLevel
order by NodeID)as rowNumber
from SchoolTerminalStruct---给临时表中插入数据
select * from @temp where rowNumber<=3--从临时表中取数据
4生成随机数
主意此方法只能写成存储过程,不能写成函数
[sql] view plaincopy
-----返回Max,Min之间的随机数不能写成函数
createproc [dbo].[getRAND]
(@Max int,--最大值
@Min int--,--最小值)
AS
BEGIN
DECLARE @result int
SELECT @result=RAND()*(@Max-@Min)+@Min
select@result
END
5把满足一定条件的数据用逗号分隔
这可能也是一个很常用的语句了,经常出现在一对多的关系中对外展示,要求把子表中的数据取出来用逗号或者其他符号分隔开
[sql] view plaincopy
/*
把满足 t2.NodeID=t1.NodeID的tableA 的字段NodeName 以逗号分隔开合并为一个字段输出
*/
select *,stuff((select ',' + t1.NodeName from tableA t1,tableB t2
wheret2.NodeID=t1.NodeID
for xml path('')), 1 , 1 , '')as text
fromtableA
6在数据库中处理异常
通过个参数附加output标志来输出参数,通过TRY,CATCH捕捉异常
[sql] view plaincopy
CREATE PROCEDURE [dbo].[sp_UpdateFunctionTree]
@nodenameint,@Result int output---2,操作失败;0操作成功
AS
BEGIN
begin
BEGIN TRY
UPDATE FunctionTree SET NodeName=@nodename
set @Result=0--操作成功
END TRY
BEGIN CATCH
set @Result=-2--操作失败
END CATCH
end
END
7查询中的条件判断
经常遇到在某些条件下应该查询这个字段,在另外一些条件下需要其他字段的情况,可以通过unoin来完成,但也可以通过CASE WHEN 完成[sql] view plaincopy
/*
在State=0 时返回field1 ,在State=1时返回 field2 ,其他时返回field3
*/
SELECT(CASE WHENState=0 THEN field1 WHENState=1 THEN field2
ELSE field3 END)as State
FROM tablename
8单引号的处理
在包含单引号时应该使用两个单引号转义
[sql] view plaincopy
dbo.sp_executesql @statement = N' select indexID,Sex=(case when Sex=0then ''男'' else ''女'' end)
fromtablename '
9使用游标
[sql] view plaincopy
declare @temp table(TaskIDint ,NodeIdint)--声明临时表
insert into @temp select A.TaskID ,A.NodeIdfrom tableAA,tableB B
whereA.TaskID=B.TaskID--//--给声明的临时表中插入记录
DECLARE tnames_cursor CURSORLOCAL FORWARD_ONLY READ_ONLY--声明游标
FOR select TaskID,NodeId from @temp;--游标需要用到的列
open tnames_cursor--打开游标
DECLARE @TaskIDint,@NodeIdint;--声明变量
FETCH NEXT FROM tnames_cursor INTO @TaskID,@NodeId--移动游标给变量赋值,应该与游标需要用到的列一一对应,顺序类型应该一致
WHILE(@@FETCH_STATUS = 0)--循环
BEGIN
BEGIN
exec TaskType @TaskID,@NodeId--调用存储过程
END
FETCH NEXT FROM tnames_cursor INTO @TaskID,@NodeId ,@TaskRunCYCType--移动游标给变量赋值 应该与游标需要用到的列一一对应,顺序类型应该一致
END
CLOSE tnames_cursor--关闭游标
DEALLOCATE tnames_cursor--释放游标
10合并更新和插入
在开发中大部分情况下,插入和更新传递的参数基本上是一样,那为什么不合并呢
[sql] view plaincopy
createproc [dbo].[Save_TableName]
(@field1 varchar(50),@field2varchar(200),@ID int,@insertOrUpdate--小于0插入 大于0更新)
as
begin
if(@insertOrUpdate<0)
begin
INSERT INTOTableName(field1,field2,ID)
values(@field1,@field2,@ID);
end
else
begin
UPDATE TableNameSET field1= @field1, field2 = @field2
where ID =@ID;
end
end
11定义函数
在没有满足要求的情况时,可以定义函数,但是使用自己定义的函数时需要加上架构名称
[sql] view plaincopy
create FUNCTION [dbo].[CheckTime]
(@startTimedatetime,@endTimedatetime--,)
RETURNSint
AS
BEGIN
DECLARE @result int
SET@result=DATEDIFF(hour, @startTime, @endTime)--
if(@result=0)--小时相同 比较分钟
begin
SET@result=DATEDIFF(minute, @startTime, @endTime)
if(@result=0)--分钟相同比较秒
begin
SET@result=DATEDIFF(second, @startTime, @endTime)
end
end
RETURN @result
END
调用此函数
[sql] view plaincopy
dbo.CheckTime(@startTime1, @startTime2)--需要加上架构名称
12递归读取数据
在实际的应用中经常遇到树结构的表,但读取会比较麻烦,这里提够一个函数
[sql] view plaincopy
/*
函数 返回表,返回给定节点的所有子孙节点,而不仅仅是子节点
*/
Create Function [dbo].[GetChildren](@NodeIDInt)
Returns @Tree Table(NodeIDInt, NodeNameVarchar(50), ParentIDInt)
As
Begin
Insert @Tree Select NodeID, NodeName, ParentIDFromTreetable Where ParentID = @NodeID
While @@Rowcount> 0
Insert @Tree Select A.NodeID, A.NodeName, A.ParentID
From Treetable A
Inner Join @Tree B
On A.ParentID = B.NodeIDAndA.NodeID Not In(Select NodeID From @Tree)Return
End
13通过默认值实现存储过程重载
存储过程可以使用默认值,估计都知道,但以此就可以实现类似函数重载的效果
例如,如下的存储过程由于使用了默认值,就可以不传递参数,传递一个参数,两个,三个,[sql] view plaincopy
CREATE PROCEDURE dbo.my_proc
@firstint = NULL,--NULL default value
@secondint = 2,--Default value of 2
@thirdint = 3--Default value of 3
AS SELECT @first, @second, @third;
14在数据库中拼字符串,也可以用参数
在实际的开发中,某些情况下在数据库中拼字符串不可避免,但又担心有特殊字符,导致拼出来的SQL有问题,其实数据库中拼字符串也可以使用参数,这就要用到dbo.sp_executesql,这样就可以避免SQL注入和特殊字符导致的错误
如
[sql] view plaincopy
DECLARE @IntVariable INT;--定义变量
DECLARE @SQLString NVARCHAR(500);--存储拼出来的SQL
DECLARE @ParmDefinition NVARCHAR(500);---存储拼出来的SQL中的参数
/* Build the SQL string one time.*/
SET @SQLString =
N'SELECT * FROM AdventureWorks.Sales.Store WHERE SalesPersonID = @SalesID';/* Specify the parameter format one time.*/
SET @ParmDefinition = N'@SalesIDint';--赋值
/* Execute the string with the first parameter value.*/
SET @IntVariable = 275;--赋值
EXECUTE dbo.sp_executesql@SQLString, @ParmDefinition,@SalesID = @IntVariable;
/* Execute the same string with the second parameter value.*/
SET @IntVariable = 276;
EXECUTE dbo.sp_executesql@SQLString, @ParmDefinition,@SalesID = @IntVariable;
16触发器需要注意的问题
在使用触发器时有一个问题,或许很少有人注意到,一条更新语句一次更新了十条记录,会触发几次触发器?只有一次!很奇怪,但却是事实,所以这需要注意,一不小心就会把好
多数据漏了
第四篇:sql语句
简单基本的sql语句 几个简单的基本的sql语句
选择:select * from table1 where范围
插入:insert into table1(field1,field2)values(value1,value2)
删除:delete from table1 where范围
更新:update table1 set field1=value1 where范围
查找:select * from table1 where field1 like ’%value1%’
(1)数据记录筛选:
sql=“select * from 数据表 where 字段名=字段值 order by 字段名 [desc]”
sql=“select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]”sql=“select top 10 * from 数据表 where 字段名=字段值 order by 字段名 [desc]”sql=“select top 10 * from 数据表 order by 字段名 [desc]”
sql=“select * from 数据表 where 字段名 in('值1','值2','值3')”
sql=“select * from 数据表 where 字段名 between 值1 and 值2”
(2)更新数据记录:
sql=“update 数据表 set 字段名=字段值 where 条件表达式”
sql=“update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式”
(3)添加数据记录:
sql=“insert into 数据表(字段1,字段2,字段3 …)values(值1,值2,值3 …)”
sql=“insert into 目标数据表 select * from 源数据表”(把源数据表的记录添加到目标数据表)
(4)数据记录统计函数:
AVG(字段名)得出一个表格栏平均值
COUNT(*;字段名)对数据行数的统计或对某一栏有值的数据行数统计MAX(字段名)取得一个表格栏最大的值
MIN(字段名)取得一个表格栏最小的值
SUM(字段名)把数据栏的值相加
引用以上函数的方法:
sql=“select sum(字段名)as 别名 from 数据表 where 条件表达式”
set rs=conn.excute(sql)
用 rs(“别名”)获取统计的值,其它函数运用同上。
查询去除重复值:select distinct * from table1between的用法
between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
in 的使用方法
select * from table1 where a [not] in(‘值1’,’值2’,’值4’,’值6’)
第五篇:SQL语句
SQL语句,用友的SQL2000,通过查询管理器写的语句
1、查询
2、修改
3、删除
4、插入
表名:users 包含字段:id,sname,sage
查询 select * from users查询users表中所有数据
select id,sname,sage from users查询users表中id,sname,sage字段所有数据
可以限定查询条件比如:
select sname from users where sage>20查询年龄大于20岁的所有人的名字
修改 update users set sname='李四',sage=22将users表中数据都改为姓名李四,年龄22
update users set sname='李四',sage=22 where id=1限定id为1的人的信息修改为
姓名李四,年龄22
可以加where条件。
删除 delete from users where id=2删除users表中id为2的一行数据delete from users 代表删除users中所有数据
插入 insert into users(id,sname,sage)values(5,'刘三',21)插入一条数据
SQL四条最基本的数据操作语句:Insert,Select,Update和Delete。
例如:SELECT columns FROM tables;其中columns为列的名称,tables为表格名称
1、查询:select 字段名 from 表名 where 条件
查找在表(如A)中符合条件的字段
2、修改:update 表名 set 字段名=‘所要修改的内容’
修改在表(如A)中的字段的值为:所要修改的内容
3、删除: delete from 表名 where 条件
删除符合条件的表(如A)中的信息
4、插入: insert into 表名(字段名)(‘插入内容’)
在表(如A)中插入字段为:插入内容 的一条信息