--★★★SQL语句本身区分大小写吗
--SQLServer 不区分大小写
--Oracle 默认是区分大小写的
--datetime的输入格式,2008-01-07输入进去后显示为1905-06-24 00:00:00.000 查查为什么会出现这样的错误???需要完全输入,例如'2014.11.12 11:00:12',由年到秒都要输全 --------------------------------------------
go语句的作用:
向 SQL Server 实用工具发出一批 Transact-SQL 语句结束的信号。
将SQL语句分段执行。
GO 不是 Transact-SQL 语句;它是 sqlcmd 和 osql 实用工具以及 SQL Server Management Studio 代码编辑器识别的命令。
SQL Server 实用工具将 GO 解释为应该向 SQL Server 实例发送当前批 Transact-SQL 语句的信号。当前批语句由上一 GO 命令后输入的所有语句组成,如果是第一条 GO 命令,则由即席会话或脚本开始后输入的所有语句组成。
GO 命令和 Transact-SQL 语句不能在同一行中。但在 GO 命令行中可包含注释。
用户必须遵照使用批处理的规则。例如,在批处理中的第一条语句后执行任何存储过程必须包含 EXECUTE 关键字。局部(用户定义)变量的作用域限制在一个批处理中,不可在 GO 命令后引用。 use School --一般建议执行选中的SQL语句。
use itcastcn --使用itcastcn数据库,如果数据库是以数字开头的,要在数据库名称外套上[]才能正常使用 --每条SQL语句后面应该跟一个分号,(不是必须的)
use School;use itcastcn; --创建数据库使用系统模板
create database TestDb; --查询当前实例中的已经存在的数据库
select * from sys.databases --删除TestDb数据库
DROP DATABASE TESTDB; --通过代码来创建数据库并设置文件选项。
create database TestDb
on primary
(
--在这里设置主数据文件mdf
name='TestDb',--主数据文件的逻辑名称
filename='c:\TestDb.mdf',--文件的具体存储路径。
size=3MB,--设置文件的初始大小
maxsize=100MB,--设置文件最大大小。UNLIMITED为不限制大小
--filegrowth=1MB
filegrowth=10% --文件增长
)
log on
(
--在这里设置事务日志文件。
name='TestDb_log',
filename='c:\TestDb.ldf',
size=1MB,
maxsize=unlimited,
filegrowth=1mb
)
Go
--日志文件的最大值一定要设置,
--如果操作比较多,事务日志会将所有的修改操作记录下来,日志大小会增长很快 --将当前的代码执行环境切换到TestDb数据库中
use TestDb
Go --创建一个TblClass表
create table TblClass
(
--创建表中的列
tClassId int identity(1,1) primary key,--identity自动增长,(1,1)标识增量1,标识种子1,primary key 主键
tClassName varchar(50) not null,
tClassDesc varchar(50) null
--创建表之后,通过设计模式查看数据类型,发现可能并不是我们所写入的数据类型,例如:我们写入的是'varchar(50)',但是显示的可能是其他类型,但是只要一插入数据后,就会显示正常,估计可能是数据库还没刷新
)
Go --创建TblStudent表
create table TblStudent
(
tSId int identity(1,1) primary key,
tSName varchar(50),
tSGender char(2) not null,
tSAddress varchar(300),
tSPhone varchar(100),
tSAge int,
tSBirthday datetime,
tSCardId varchar(18) null,
tSClassId int not null
)
Go --插入数据的两种形式:
insert into TblStudent(SName) values('小赵')--在SName列插入数据‘小赵’
insert into TblStudent values('小赵',0,‘三里屯’)--直接按照列的顺序添加数据(主键自动增长的除外),用代码方式添加bool值的时候用的是数字‘1’或者'0',通过编辑方式设置bool值的时候添加的是‘true’或者‘flase’ --设置自动增长的值
set identity_insert tblstudent off --可以设置自动增长的id值
insert into tblstudent(tsId,tsname,tsage,tsclassid) values(9,'刘琦',18,4)--插入数据,原本是自动增长的tsId,插入了一个9,如果重新设置自动增长为on,以后还插入数据,但是不插入tsId了,tsId还会从接着9开始自动增长 --主键不能有重复值 --同时插入多行数据
insert into TblStudent(tsname,tsgender,tsage,tsclassid)select'老虎',1,18,3 union
select '老马',0,18,3 union
select'老兔',0,20,3 from TblStudent --这里的'from TblStudent'可加可不加,但建议加上
--上面如果union替换成union all会怎么样???直接最后那个‘老兔’那条的数据会重复添加多次,其他没影响,慎用 --为了防止插入的中文数据出现乱码,可以在要插入的中文数据前加N来防止出现乱码
insert into tblstudent(tsname)values(N'老牛') --删除
drop table tblstudent--删除表(没有有条件删除的说法,因为删除的是整个表,表都没有了,就没有条件删除的可能)
drop database 0820database--删除数据库
delete talstudent--清除表中数据,不需要写table在中间,直接写表名(虽然可以运行,但是该语句并不规范,建议还是写成delete from talstudent)
delete from talstudent --功能与上面的语句一样,都是清除表中数据,但是多了个from
delete database 0820database--该命令有报错,好像没有清除数据库的命令,即使把‘database’字样删除也不能执行
truncate table tblstudent --清除表中数据
--delete删除这个表中的所有信息后,再插入数据的时候,主键的ID值会继续删除之前的ID值再加1
--truncate删除这个表中的所有信息后,再插入数据的时候,主键的ID值是从1开始的(重新开始),在删除大数据的时候truncate比delete高效很多(truncate语句不支持条件删除)
--区别:
--1.delete 语句删除数据的时候,自动编号没有恢复到默认值。但是truancate语句重新设置了自动编号
--2.通过truncate语句删除表中的数据的时候,只能一次性都清空,不能根据条件来删除,而delete可以根据条件来删除。
--3.truncate语句清空表中的数据时,速度(性能)比delete语句快的多的多的多。
--4..truncate语句不触发delete触发器。
--有选择删除
delete from TblStudent where tSName='大牛' --删除tSName为'大牛'的整行数据
delete TblStudent where tSName='小牛' --删除tSName为'小牛'的整行数据(功能与上面的语句一样) --更新
update tblstudent set tsage=30 --更新表中tsage列的数据全部改为30
update tblstudent set tsage=30 where tsname='老牛' --根据条件来更新内容
update tblstudent set tsname='老牛',tsage=25 --更新多条数据
update tblstudent set tsname='老牛',tsage=25 where tsid=2 --有条件的更新多条数据
update tblstudent set tsage=25 where tsname<>'老牛' --所有数据'tsname'列不为'老牛'的都把'tsage'改为25
update TblStudent set tSGender='男',tSAge=27 where tSName='张惠妹' and tsid=28 --把所有'tSName'列为'张惠妹'并且tsid列为28的数据的'tSGender'列数据改为'男','tSAge'列数据改为27
--优先级:not and or,用小括号可以改变优先级.
--Null代表不知道???
--更新一部分数据: update Student set sClassId= 4 where sClassId = 1,用where语句表示只更新Name是’tom’的行,注意SQL中等于判断用单个=,而不是==
--Where中还可以使用复杂的逻辑判断update Student set sAge=30 where sName='华佗' or sAge<25 ,or相当于C#中的||(或者)
update TblStudent set tSAge=tSAge+2 --所有学生年龄加2
--Where中可以使用的其他逻辑运算符:(||)or、(&&)and、(!)not、<、>、>=、<=、 <>(或!=)等 --手动删除一列
alter table Employees drop column EmpAddress --正确
--手动增加一列
alter table Employees add column EmpAddr nvarchar(10) not null --报错,关键字 'column' 附近有语法错误,如果把'column'去掉就没问题了
alter table Employees add EmpAddr nvarchar(10) not null --正确,但是这个语句只适合空表,如果表本身有数据就会报错(报错提示在下面一行),把not null去掉就不会报错了
--ALTER TABLE 只允许添加满足下述条件的列: 列可以包含 Null 值;或者列具有指定的 DEFAULT 定义;或者要添加的列是标识列或时间戳列;或者,如果前几个条件均未满足,则表必须为空以允许添加此列。不能将列"no8"添加到非空表"test"中,因为它不满足上述条件。 --手动修改列
alter table Employees alter column EmpAddr varchar(20) --约束:
--非空(NOT NULL)
--检查(Check)
--唯一性(Unique)
--主键(Primary key)
--外键(Foreign key) --为某列增加一个主键约束
alter table Employee add constraint PK_Employees_EmpId primary key(EmpId)
--增加一个非空约束就是修改列
alter table Employees alter column EmpName varchar(50) not null
--增加唯一约束
alter table Employees add constraint UQ_Employees_EmpName unique(EmpName)
--为性别增加一个默认约束
alter table Employees add constraint DF_Employees_EmpGender default(N'男') for EmpGender
--建议中文前加N,防止有可能出现的乱码
--为了性别加一个检查约束(男或者女)
alter table Employees add constraint CK_Employees_EmpGender check(EmpGender='男' or EmpGender='女')
--为年龄增加一个检查约束:年龄在0-120岁之间包含0-120
alter table Employees add constraint CK_Employees_EmpAge check(EmpAge>=0 and EmpAge<=120)
--增加外键约束,表Employees中有一列EmpDeptId引用TblDepartment表
alter table Employees add EmpDeptId int not null --EmpDeptId前面不需要加column语句吗?
alter table Employees add constraint FK_Employees_EmpDeptId foreign key(EmpDeptId) references Department(DepId) --增加级联删除
alter table Employees add EmpDeptId int not null
alter table Employees add constraint FK_Employees_EmpDeptId foreign key(EmpDeptId) references Department(DepId) ondelete cscade --删除某个名字的约束
alter table Employees drop constraint CK_Employees_EmpAge
--如果删除很多就在后面逗号 然后 约束的名字 --为表增加多个约束
alter table Employees add constraint UQ_Employees_EmpName unique(EmpName),
constraint CK_Employees_EmpAge unique(EmpAge),....
--用一条语句为表增加多个约束的例子
alter table Employees add
constraint PK_Employees_EmpId primary key(EmpId),--增加主键约束
constraint UQ_Employees_EmpName unique(EmpName),--增加唯一约束
constraint DF_Employees_EmpGender default(N'女') for EmpGender,--增加默认约束
constraint CK_Employees_EmpAge check(EmpAge>=0 and EmpAge<=120),--增加检查约束
constraint FK_Employees_Department_DepId forign key(DepId) references Department(DepId)--增加外键约束
--为表删除多个约束
alter table Employees drop constraint CK_Employees_EmpAge,FK_Employees_DepId --不需要每个约束前都加个constraint语句 ??经测试,加不加都能正常运行 --查询(select,print)
use nononodeleteImportant
select * from TblStudent --最简单的查询 查询这个表中所有的信息 select '北京时间'+getdate() --报错,字符类型不能拼接时间类型
select '北京时间'+convert(varchar(30),getdate) --正确,字符类型要拼接时间类型,需要把时间类型转换成字符类型 print'hello' --消息栏显示‘hello’,这是另一种查询 --起别名
select '你好现在是' as 问好,getdate() as 时间 --输出时会把‘你好现在是’这列的列名变为‘问号’,getdate()时间函数显示这列的列名改为‘时间’;as后面所跟的字符,可以加‘’也可以不加‘’ select *,tEnglish as 英语, tMath as 数学 from TblScore --这个查询语句会把原tEnglish和tMath两列的数据再新建两个列(‘英语’,‘数学’)下显示(原数据不受影响,照样输出)
select tEnglish as 英语, tMath as 数学 from TblScore --只输出‘英语’,‘数学’两列数据,不显示原tEnglish和tMath等其他列的数据
select tEnglish 英语, tMath 数学 from TblScore --省略as,与上面的语句功能一样
select 英语=tEnglish , 数学=tMath from TblScore --与上面功能一样,另一种查询方式
select 英语=tEnglish , 数学=tMath from TblScore where tsId=3 --有条件查询 --查询前十条数据(top)
select top 10 * from Customers --查询前百分之十的数据
select top 10 percent * from Customers --原数据总共有91条数据,百分之十显示十条,百分数取整,这里百分之十为9.1(数据库取整显示10条,尽可能多的显示数据) --查询到的数据排序(order by)
select * from TblStudent order by tsAge --以tsAge列为标准,默认从小到大排序
select * from TblStudent order by tsAge desc --以tsAge列为标准,从大到小排序
select top 5 * from TblStudent order by tsAge asc --以tsAge列为标准,从小到大排序,显示前5条数据
select top 10 percent * from TblStudent order by tsAge desc --获得年纪最大的10%学生
select top 10 * from TblStudent where tSClassId=10 order by tSAge desc--按tsAge从大到小顺序排序,获得tsClassId为10的前十的数据
--Order by 语句一般要放到所有语句的后面,就是先让其他语句进行筛选,全部筛选完成后,最后排序一下。 --去除重复信息(distinct)
select distinct tSClassId from TblStudent --去除tsClassId信息重复的数据,然后只输出经过处理后的tsClassId列(原数据不受影响)
select distinct tSClassId,tSName from TblStudent --去除(tsClassId and tsName)两列数据重复信息,只输出经过处理的tsClassId,tsName两列数据
select distinct * from TblStudent --筛选所有列信息都重复的数据,然后输出经过处理的数据 --数据拼接
select tsId,tsName+tsGender+tsAddress as 信息 from TblStudent --只输出两列数据,第一列是tsId,第二列是tsName+tsGender+tsAddress多列拼接的结果 --聚合函数(MAX,MIN,SUM,AVG,COUNT) NULL不参与聚合函数运算
--求最大值
select MAX(tEnglish) from TblScore --查询出英语成绩的最大值(即使有多个值都为同一最大数,只会显示一条最大值<单行单列一个值>)
--求最小值
select MIN(tEnglish) from TblScore --查询出英语成绩的最小值(即使有多个值都为同一最小数,只会显示一条最小值<单行单列一个值>)
--求和
select SUM(tEnglish) from TblScore --求tEnglish列总和
--求平均值
select AVG(tEnglish) from TblScore --求tEnglish列平均值
--计算行数
select COUNT(*) from TblScore --求表总行数,即使有某列有NULL值也会一起计算,因为起码主键不会是NULL值 select MAX(tEnglish),MIN(tEnglish),AVG(tEnglish) from TblScore --获取TblScore表中的tEnglish列最大值,最小值,平均值
select MAX(tenglish) as 最高英语成绩,MIN(tEnglish) as 最低英语成绩,AVG(tEnglish) as 英语平均成绩 from TblScore --功能与上面一样,只是起了几列别名
select tsId,MAX(tEnglish) from TblScore --报错,选择列表中的列'TblStudent.tsId'无效,因为该列没有包含在聚合函数或GROUP BY子句中
select MAX(tEnglish) tMath from TblStudent --陷阱,这个语句相当于 select MAX(tEnglish) as tMath from TblStudent ,容易看成两列,实际是一列
select MAX(tEnglish) 最高英语成绩,MIN(tEnglish) 最低英语成绩 from TblScore --显示两列,第一列‘最高英语成绩’显示一个最大值,第二列‘最低英语成绩’显示一个最小值
select MAX(tsBirthday),MIN(tsBirthday) from TblStudent where tsGender='男' --以性别‘男’为根据,分两列列出tsBirthday最大值,tsBirthday最小值 --查询没有及格的学生的学号
select tsId from TblScore where tEnglish<60
--查询年龄在20岁-30岁之间的男学生
select * from TblStudent where tsGender='男' and tsAge>=20 and tsAge<=30
select * from TblStudent where tsGender='男' and tsAge between 20 and 30 --与上面的语句效果一样,等同,建议使用between and语句代替上面的语句,因为between and语句已经经过优化处理,效率高 select * from Customers where Country='UK' or Country='USA' --查询所有Country为‘UK’或者'USA'的数据
select * from Customers where Country in('UK','USA') --与上面语句效果一样,运行效率也一样,其实这条语句是调用了上面那条语句来执行,如果条件比较多,就不那么高效了 --模糊查询(like)
select * from TblStudent where left(tsName,1)='张' --查询TblStudent表中以tsName列数据左边第一个字符是‘张’的数据为依据筛选的整表数据
select * from TblStudent where tsName like '张%' --功能同上
--找张什么什么的
--%表示任意字符多个字
select * from TblStudent where tSName like '张%'
--(-)表示任意字符一次
select * from TblStudent where tSName like '张__' --'张__'里面有两个_
select * from TblStudent where tSName like '张%' and LEN(tSName)=3 --等同于上面的语句
select * from TblStudent where tSName like '张[a-z]_' --张a,张b,张c,张d....张z
select * from TblStudent where tSName like '张[0-9]_' --张0,张1,张2....张9
select * from TblStudent where tSName like '张[^0-9]_' -- ^表示not
select * from TblStudent where tSName like '张%[%]%' --[]里面的加%只表示字符‘%’,没有可以任意字符任意次数的意思
select * from TblStudent where tSName like '张%[_]%'
--[^ab]只有ms sqlserver支持,对于其他数据库,不支持。(^符号)
select * from TblStudent where tSName not like '张%' --找不姓张的 --数据库中,一个列如果没有指定值,那么值就为null,数据库中的null表示“不知道”,而不是表示没有。因此select null+1结果是null,因为“不知道”加1的结果还是“不知道” --判断是否是'不知道'(null)用is null
select * from tblstudent where tsscore=null --除开标题没有返回任何结果,因为连数据库也'不知道'
select * from tblstudent where tsscore is null --正确
select * from TblStudent where tsScore !=null --除开标题没有返回任何结果,因为连数据库也'不知道'
select * from tblstudent where tsscore is not null --这个语句可以返回除NULL以外的所有数据
--涉及到NULL的处理,适用is,而‘=’,‘!=’不适用 --分组(group by)
select tsclassid,count(tsclassid) from tblstudent group by tsclassid --查询tsclassid和每个tsclassid的总人数
select tsclassid,count(tsclassid) as 班级的总人数 from tblstudent group by tsclassid --把统计的tsclassid起别名标题,方便查看
select tsclassid,count(tsclassid) as 年龄为21的班级总人数 from tblstudent where tsage=21 group by tsclassid --把tsage为21的班级总人数分别统计一下
select tsclassid,count(tsage) as 年龄为21的班级总人数 from tblstudent where tsage=21 group by tsclassid --效果和结果等同上面的语句,但上面写的就方便理解一点
--GROUP BY子句必须放到WHERE语句的之后 ,Group By与Order By都是对筛选后的数据进行处理,而Where是用来筛选数据的。 --having语句(对组的筛选,哪些组显示哪些组不显示)
select tsclassid,count(tsclassid) from tblstudent where tsage=21 group by tsclassid having count(tsclassid)>=4 -- 把tsage为21的班级总人数分别统计一下,然后再筛选显示tsclassid人数大于等于4的数据
select tsclassid,count(*) from tblstudent where tsage=21 group by tsclassid having count(*)>=4 --等同于上面的语句,()里面替换成*也不会改变结果
--注意Having中不能使用未参与分组的列,Having不能替代where。作用不一样,Having是对组进行过滤。
--Having 是Group By的条件对分组后的数据进行筛选(与Where类似,都是筛选,只不过having是用来筛选分组后的组的。)
--在Where中不能使用聚合函数,必须使用Having,Having要位于Group By之后
--Having的使用几乎是与where一样的,也可以用in
--where是查数据的时候进行筛选,having是查完数据后的再筛选,用的地方不一样 --SELECT 语句的处理顺序
--以下步骤显示 SELECT 语句的处理顺序。 --1.FROM
--2.ON
--3.JOIN
--4.WHERE
--5.GROUP BY
--6.WITH CUBE 或 WITH ROLLUP
--7.HAVING
--8.SELECT
--9.DISTINCT
--10.ORDER BY
--11.TOP select 商品名称,sum(销售数量) as 总销售数量 from MyOrders group by 商品名称 order by sum(销售数量) desc --统计每个商品的总销售数量,并按降序排列
select 商品名称,sum(销售数量) as 总销售数量 from MyOrders group by 商品名称 order by 总销售数量 desc --等同于上面的语句order by后面直接跟的sum(销售数量)的别名
--上面两条语句,第一条出现了两次sum语句,其实sum运行了两次,效率降低 --统计销售总价超过3000元的商品名称和销售总价,并按销售总价降序排序
select 商品名称,sum(销售数量*销售价格) as 销售总价 from MyOrders group by 商品名称 having sum(销售数量*销售价格)>3000 order by 销售总价 desc select 购买人,sum(销售数量) as 购买量 from MyOrders where 商品名称='可口可乐' group by 购买人 order by 购买量 desc --转换类型(CAST,CONVERT)
select '演示' + CAST(GETDATE() as varchar(30)) --把数字‘9’变成varchar类型和‘演示’一起输出
select '当前时间' + CAST(GETDATE() as varchar(30))
select '演示' + CONVERT(varchar(2),9)
select '当前时间' + CONVERT(varchar(30),GETDATE())
select '求和' + convert(varchar(2),3+5)
select * from T2 order by convert(int,uId) desc
-- T2表中uId列原本是varchar类型,现在需要用到order by来排序,但是字符类型不能排序,所以把uId列转为int类型使得能使用order by来排序
--(但要注意如果uId列的数据不是1、2、3这类本身可以转为int类型的数据,该语句无效) --转换语法
--CAST ( expression AS data_type)
--CONVERT ( data_type, expression,[style]) select convert(nvarchar(10),getdate(),108) --getdate()后面跟的是时间日期格式代码(数字)
select isnull(convert(varchar(10)),tEnglish),'缺考') from tblscore
--ISNULL的用法看下面的语法和例子,这里的convert()是因为要把tEnglish列的float类型转换成varchar类型才能让‘缺考’适配 --ISNULL语法
ISNULL(check_expression,replacement_value)
--ISNULL语法的参数
--check_expression
--将被检查是否为NULL的表达式。check_expression可以为任何类型
--replacement_value
--当check_expression为NULL时要返回的表达式。replacement_value必须是可以隐式转换为check_expression类型的类型
--返回类型
--返回与check_expression相同的类型 --例子:
--以下示例选择AdventureWorks中所有特价产品的说明、折扣百分比、最小量和最大量。如果某个特殊特价产品的最大量为NULL,则结果集中显示的MaxQty为0.00
use AdventureWorks;
go
select Description,Discountpct,MinQty,ISNULL(MaxQty,0.00) AS 'Max Quantity'
From Sales.SpecialOffer;
go select cast(9.85 as int) --丢失精度,舍去小数
ROUND() --??? --在SQL语句中,两个连续的单引号,表示一个单引号(单引号的转义符) --合并表,联合结果集(union)集合运算符
--合并表的时候,首先保证列的个数相同,类型相同
--例子:
select tsname,tsAddress from TblStudent
union
select ttName,ttaddress from TblTeacher --两表要合并的两列的第一和第二列的类型都是分别对应一致的 --假如有不同类型的,要转换成相同类型来适配
select tsname,tsAddress from TblStudent
union
select ttName,convert(varchar(20),ttAge) from TblTeacher --将ttAge的int类型转换成与tsAddress相匹配的varchar类型 --联合:将多个结果集合并成一个结果集。union(去除重复,相当于默认应用了distinct)
--如果两表相同列个数,每列都分别对应相同类型,则这两个表全部合拼也不会因为union默认去除重复的功能而出现去除重复数据的情况(如果本表自己的重复数据不会去除),因为主键不可能是一样的
--union合并两个查询结果集,并且将其中完全重复的数据合并为一条
--union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用union all select tName,tSex from teacher union all
select sName,sSex from student --底部汇总
select tSName,tsScore from TblStudent
union all
select '最高分',MAX(tsscore) from TblStudent
union all
select '最低分',MIN(tsscore) from TblStudent
--这里面union后面的all最掉一个all和两个all都是一样的排列显示效果,但是与全部没有all的排列效果不一样('最高分'和'最低分'还是在最下面),有all按原表顺序排,没有all自行分类排 --备份表
--把现有表的数据插入新表(表不能存在),为表建备份
select * into newStudent from student --newStudent表在select查询的同时自动建立 --------------------------------------------
--使用Transact-SQL语句创建用户自定义数据类型
--在SQL Server 2008中,使用系统数据类型sp_addtype创建用户自定义数据类型。
--语法如下:
sp_addtype[@typename=]type
[@phystype=]system_data_type
[,[@nulltype=]'null_type']
[,[@owner=]'owner_name']
参数说明:
--[@typename=]type 指定待创建的用户自定义数据类型的名称。用户定义数据类型名称必须遵循标识符的明明规则,而且在数据库中唯一。
--[@phystype=]system_data_type指定用户定义数据类型所依赖的系统数据类型
--[,[@nulltype=]'null_type']指定用户定义数据类型的可空属性,即用户定义数据类型处理空值的方式,取值为NULL、NOTNULL或NONULL
--例子:
--创建用来存储邮政编码信息的postcode用户自定义数据类型:
--SQL语句如下:
USE db_CSharp
EXEC sp_addtype postcode,'char(8)','not null'--创建自定义数据类型postcode
--如果是修改、删除用户数据类型,可以用sp_droptype --------------------------------------------
--特定标识属性(IDENTITY)
--数据表中如果某列被指派特定标识属性(IDENTITY),系统将自动为表中插入的新行生成连续递增的编号。因为标识值通常唯一,所以标识列常定义为主键 --------------------------------------------
--约束:
--非空(NOT NULL)
--检查(Check)
--唯一性(Unique)
--主键(Primary key)
--外键(Foreign key) --------------------------------------------
--T-SQL语句分类:
--1、变量说明语句:用来说明变量的命令
--2、数据定义语句:用来建立数据库、数据库对象和定义列,大部分是以CREATE开头的命令,如CREATE TABLE、CREATE VIEW和DROP TABLE等
--3、数据操纵语句:用来操纵数据库中数据的命令,如SELECT、INSERT、UPDATE、DELETE和CURSOR等
--4、数据控制语句:用来控制数据库组件的存取许可、存取权限等命令,如GRANT、REVOKE等
--5、流程控制语句:用于设计应用程序流程的语句,如IF WHILE和CASE等
--6、内嵌函数:说明变量的命令
--7、其他命令:嵌于命令中使用的标准函数 --------------------------------------------
--局部变量:
--1、声明局部变量:
--局部变量的声明需要使用DECLARE语句。语法格式如下:
DECLARE
{
@varaible_name datatype[,...n]
}
--参数说明:
--@varaible_name:局部变量的变量名,必须以“@”开头,另外变量名的形式必须符合SQL Server标识符的命名方式
--datatype:局部变量使用的数据类型,可以是除text、ntext或者image类型外所有的系统数据类型和用户自定义数据类型。一般来说,如果没有特殊的用途,建议在应用时尽量使用系统提供的数据类型,这样做可以减少维护应用程序的工作量。
--例如,声明局部变量@songname的SQL语句如下:
declare @songname char(10)
--2、...... --------------------------------------------
--流程控制:
--1、BEGIN...END
--2、IF
--3、IF...ELSE
--4、CASE
--简单CASE函数:
CASE input_expression
WHEN when_expression THEN result_expression
[...n]
[
ELSE else_result_expression
END
--CASE搜索函数:
CASE
WHEN Boolean_expression THEN result_expression
[...n]
[
ELSE else_result_expression
END
--例子:
USE [0820data]--使用‘0820data’数据库
SELECT * from score--搜索‘score’数据表
select*,
备注=case
when math>=90 then '成绩优秀'
when math<90 and math>=80 then '成绩优良'
when math<80 and math>=70 then '成绩及格'
else '不及格'
end
from score
--运行结果:在最后列增加一列,列名为‘备注’,‘备注’列中math成绩大于等于90显示‘成绩优秀’,math成绩小于90大于等于80显示‘成绩优良’,math成绩小于80大于等于70显示‘成绩及格’,其余显示‘不及格’
--5、WHILE
--WHILE子句是T-SQL语句支持的循环结构。在条件为真的情况下,WHILE子句可以循环地执行其后的一条T-SQL命令。如果想循环执行一组命令,则需要配合BEGIN...END子句使用。WHILE的语法格式如下:
WHILE<条件表达式>
BEGIN
<命令行|程序块>
END
--例子:
declare @n int.@sum int
set @n=1
set @sum=0
while @n<=10
begin
set @sum=@sum+@n
set @n=@n+1
end
print @sum
--6、WHILE...CONTINUE...BREAK
--循环结构WHILE子句还可以用CONTINUE和BREAK命令控制WHILE循环中语句的执行。语法格式如下:
WHILE<条件表达式>
BEGIN
<命令行|程序块>
[BREAK]
[CONTINUE]
[命令行|程序块]
END
--其中,CONTINUTE命令可以让程序跳过CONTINUE命令之后的语句,回到WHILE循环的第一行命令;BREAK命令则让程序完全跳出循环,结束WHILE命令的执行。
--7、RETURN
--RETURN语句用于从查询或过程中无条件退出。RETURN语句可在任何时候用于从过程、批处理或语句块中退出,位于RETURN之后的语句不会被执行。语法格式如下:
RETURN[整数值]
--在括号内可指定一个返回值。如果没有指定返回值,SQL Server系统会根据程序执行的结果返回一个内定值。
--例子:
declare @x int
set @x=3
if @x>0
print'遇到return之前'
return
print'遇到return之后'
end
--运行结果:显示‘遇到return之前’
--8、GOTO
--GOTO命令用来改变程序执行的流程,使程序跳到标识符指定的程序行再继续往下执行下去。语法格式如下:
GOTO 标识符
--标识符需要在其名称后加上一个冒号“:”
--例如,“33:”,“loving:”。
--例子:
declare @x int
select @x=1
loving:
print @x
select @x=@x+1
WHILE @x<=3 GOTO loving
--运行结果:连续输出三行,每行递增显示单个数字1、2、3
--9、WAITFOR
--WAITFOR指定触发器、存储过程或事务执行的时间、时间间隔或事件;还可以用来暂时停止程序的执行,直到所设定的等待时间已过才继续往下执行。语法格式如下:
WAITFOR{DELAY<'时间'|TIME<'时间'>}
--其中,“时间”必须为DATETIME类型的数据,如11:15:27,但不能包括日期。各关键字含义如下。
--DELAY:用来设定等待的时间,最多可达24小时。
--TIME:用来设定等待结束的时间点。
--例子:
--3秒后显示“祝你生日快乐!”。
waitfor delay"00:00:03"
print"祝你生日快乐"
--15点显示“《新三国演义》开始了!”
waitfor time"15:00:00"
print"《新三国演义》开始了"