zoukankan      html  css  js  c++  java
  • SQL Server 自学笔记

      1 --★★★SQL语句本身区分大小写吗
      2 --SQLServer 不区分大小写
      3 --Oracle 默认是区分大小写的
      4 --datetime的输入格式,2008-01-07输入进去后显示为1905-06-24 00:00:00.000 查查为什么会出现这样的错误???需要完全输入,例如'2014.11.12 11:00:12',由年到秒都要输全
      5 
      6 --------------------------------------------
      7 go语句的作用:
      8 向 SQL Server 实用工具发出一批 Transact-SQL 语句结束的信号。
      9 将SQL语句分段执行。
     10 GO 不是 Transact-SQL 语句;它是 sqlcmd 和 osql 实用工具以及 SQL Server Management Studio 代码编辑器识别的命令。
     11 SQL Server 实用工具将 GO 解释为应该向 SQL Server 实例发送当前批 Transact-SQL 语句的信号。当前批语句由上一 GO 命令后输入的所有语句组成,如果是第一条 GO 命令,则由即席会话或脚本开始后输入的所有语句组成。 
     12 GO 命令和 Transact-SQL 语句不能在同一行中。但在 GO 命令行中可包含注释。
     13 用户必须遵照使用批处理的规则。例如,在批处理中的第一条语句后执行任何存储过程必须包含 EXECUTE 关键字。局部(用户定义)变量的作用域限制在一个批处理中,不可在 GO 命令后引用。
     14 
     15 use School
     16 
     17 --一般建议执行选中的SQL语句。
     18 use itcastcn --使用itcastcn数据库,如果数据库是以数字开头的,要在数据库名称外套上[]才能正常使用
     19 
     20 --每条SQL语句后面应该跟一个分号,(不是必须的)
     21 use School;use itcastcn; 
     22 
     23 --创建数据库使用系统模板
     24 create database TestDb;
     25 
     26 --查询当前实例中的已经存在的数据库
     27 select * from sys.databases
     28 
     29 --删除TestDb数据库
     30 DROP DATABASE TESTDB;
     31 
     32 --通过代码来创建数据库并设置文件选项。
     33 create database TestDb
     34 on primary
     35 (
     36     --在这里设置主数据文件mdf
     37     name='TestDb',--主数据文件的逻辑名称
     38     filename='c:TestDb.mdf',--文件的具体存储路径。
     39     size=3MB,--设置文件的初始大小
     40     maxsize=100MB,--设置文件最大大小。UNLIMITED为不限制大小
     41     --filegrowth=1MB 
     42     filegrowth=10% --文件增长
     43 )
     44 log on
     45 (
     46     --在这里设置事务日志文件。
     47     name='TestDb_log',
     48     filename='c:TestDb.ldf',
     49     size=1MB,
     50     maxsize=unlimited,
     51     filegrowth=1mb
     52 )
     53 Go
     54 --日志文件的最大值一定要设置,
     55 --如果操作比较多,事务日志会将所有的修改操作记录下来,日志大小会增长很快
     56 
     57 --将当前的代码执行环境切换到TestDb数据库中
     58 use TestDb
     59 Go
     60 
     61 --创建一个TblClass表
     62 create table TblClass
     63 (
     64     --创建表中的列
     65     tClassId int identity(1,1) primary key,--identity自动增长,(1,1)标识增量1,标识种子1,primary key 主键
     66     tClassName varchar(50) not null,
     67     tClassDesc varchar(50) null
     68     --创建表之后,通过设计模式查看数据类型,发现可能并不是我们所写入的数据类型,例如:我们写入的是'varchar(50)',但是显示的可能是其他类型,但是只要一插入数据后,就会显示正常,估计可能是数据库还没刷新
     69 )
     70 Go
     71 
     72 --创建TblStudent表
     73 create table TblStudent
     74 (
     75     tSId int identity(1,1) primary key,
     76     tSName varchar(50),
     77     tSGender char(2) not null,
     78     tSAddress varchar(300),
     79     tSPhone varchar(100),
     80     tSAge int,
     81     tSBirthday datetime,
     82     tSCardId varchar(18) null,
     83     tSClassId int not null
     84 )
     85 Go
     86 
     87 --插入数据的两种形式:
     88 insert into TblStudent(SName) values('小赵')--在SName列插入数据‘小赵’
     89 insert into TblStudent values('小赵'0,‘三里屯’)--直接按照列的顺序添加数据(主键自动增长的除外),用代码方式添加bool值的时候用的是数字‘1’或者'0',通过编辑方式设置bool值的时候添加的是‘true’或者‘flase’
     90 
     91 --设置自动增长的值
     92 set identity_insert tblstudent off --可以设置自动增长的id值
     93 insert into tblstudent(tsId,tsname,tsage,tsclassid) values(9,'刘琦',18,4)--插入数据,原本是自动增长的tsId,插入了一个9,如果重新设置自动增长为on,以后还插入数据,但是不插入tsId了,tsId还会从接着9开始自动增长
     94 
     95 --主键不能有重复值
     96 
     97 --同时插入多行数据
     98 insert into TblStudent(tsname,tsgender,tsage,tsclassid)select'老虎',1,18,3 union 
     99 select '老马',0,18,3 union
    100 select'老兔',0,20,3 from TblStudent --这里的'from TblStudent'可加可不加,但建议加上
    101 --上面如果union替换成union all会怎么样???直接最后那个‘老兔’那条的数据会重复添加多次,其他没影响,慎用
    102 
    103 --为了防止插入的中文数据出现乱码,可以在要插入的中文数据前加N来防止出现乱码
    104 insert into tblstudent(tsname)values(N'老牛')
    105 
    106 --删除
    107 drop table tblstudent--删除表(没有有条件删除的说法,因为删除的是整个表,表都没有了,就没有条件删除的可能)
    108 drop database 0820database--删除数据库
    109 delete talstudent--清除表中数据,不需要写table在中间,直接写表名(虽然可以运行,但是该语句并不规范,建议还是写成delete from talstudent)
    110 delete from talstudent --功能与上面的语句一样,都是清除表中数据,但是多了个from
    111 delete database 0820database--该命令有报错,好像没有清除数据库的命令,即使把‘database’字样删除也不能执行
    112 truncate table tblstudent --清除表中数据
    113 --delete删除这个表中的所有信息后,再插入数据的时候,主键的ID值会继续删除之前的ID值再加1
    114 --truncate删除这个表中的所有信息后,再插入数据的时候,主键的ID值是从1开始的(重新开始),在删除大数据的时候truncate比delete高效很多(truncate语句不支持条件删除)
    115 --区别:
    116 --1.delete 语句删除数据的时候,自动编号没有恢复到默认值。但是truancate语句重新设置了自动编号
    117 --2.通过truncate语句删除表中的数据的时候,只能一次性都清空,不能根据条件来删除,而delete可以根据条件来删除。
    118 --3.truncate语句清空表中的数据时,速度(性能)比delete语句快的多的多的多。
    119 --4..truncate语句不触发delete触发器。
    120 --有选择删除
    121 delete from TblStudent where tSName='大牛' --删除tSName为'大牛'的整行数据
    122 delete TblStudent where tSName='小牛' --删除tSName为'小牛'的整行数据(功能与上面的语句一样)
    123 
    124 
    125 --更新
    126 update tblstudent set tsage=30 --更新表中tsage列的数据全部改为30
    127 update tblstudent set tsage=30 where tsname='老牛' --根据条件来更新内容
    128 update tblstudent set tsname='老牛',tsage=25 --更新多条数据
    129 update tblstudent set tsname='老牛',tsage=25 where tsid=2 --有条件的更新多条数据
    130 update tblstudent set tsage=25 where tsname<>'老牛' --所有数据'tsname'列不为'老牛'的都把'tsage'改为25
    131 update TblStudent set tSGender='',tSAge=27 where tSName='张惠妹' and tsid=28 --把所有'tSName'列为'张惠妹'并且tsid列为28的数据的'tSGender'列数据改为'男','tSAge'列数据改为27
    132 --优先级:not and or,用小括号可以改变优先级.
    133 --Null代表不知道???
    134 --更新一部分数据: update  Student set sClassId= 4 where sClassId = 1,用where语句表示只更新Name是’tom’的行,注意SQL中等于判断用单个=,而不是==
    135 --Where中还可以使用复杂的逻辑判断update Student set sAge=30 where sName='华佗' or sAge<25 ,or相当于C#中的||(或者)
    136 update TblStudent set tSAge=tSAge+2 --所有学生年龄加2
    137 --Where中可以使用的其他逻辑运算符:(||)or、(&&)and、(!)not、<、>、>=、<=、 <>(或!=)等
    138 
    139 --手动删除一列
    140 alter table Employees drop column EmpAddress --正确
    141 --手动增加一列
    142 alter table Employees add column EmpAddr nvarchar(10) not null --报错,关键字 'column' 附近有语法错误,如果把'column'去掉就没问题了
    143 alter table Employees add EmpAddr nvarchar(10) not null --正确,但是这个语句只适合空表,如果表本身有数据就会报错(报错提示在下面一行),把not null去掉就不会报错了
    144 --ALTER TABLE 只允许添加满足下述条件的列: 列可以包含 Null 值;或者列具有指定的 DEFAULT 定义;或者要添加的列是标识列或时间戳列;或者,如果前几个条件均未满足,则表必须为空以允许添加此列。不能将列"no8"添加到非空表"test"中,因为它不满足上述条件。
    145 
    146 --手动修改列
    147 alter table Employees alter column EmpAddr varchar(20)
    148 
    149 --约束:
    150 --非空(NOT NULL)
    151 --检查(Check)
    152 --唯一性(Unique)
    153 --主键(Primary key)
    154 --外键(Foreign key)
    155 
    156 --为某列增加一个主键约束
    157 alter table Employee add constraint PK_Employees_EmpId primary key(EmpId)
    158 --增加一个非空约束就是修改列
    159 alter table Employees alter column EmpName varchar(50) not null
    160 --增加唯一约束
    161 alter table Employees add constraint UQ_Employees_EmpName unique(EmpName)
    162 --为性别增加一个默认约束
    163 alter table Employees add constraint DF_Employees_EmpGender default(N'') for EmpGender
    164 --建议中文前加N,防止有可能出现的乱码
    165 --为了性别加一个检查约束(男或者女)
    166 alter table Employees add constraint CK_Employees_EmpGender check(EmpGender='' or EmpGender='')
    167 --为年龄增加一个检查约束:年龄在0-120岁之间包含0-120
    168 alter table Employees add constraint CK_Employees_EmpAge check(EmpAge>=0 and EmpAge<=120)
    169 --增加外键约束,表Employees中有一列EmpDeptId引用TblDepartment表
    170 alter table Employees add EmpDeptId int not null --EmpDeptId前面不需要加column语句吗?
    171 alter table Employees add constraint FK_Employees_EmpDeptId foreign key(EmpDeptId) references Department(DepId)
    172 
    173 --增加级联删除
    174 alter table Employees add EmpDeptId int not null
    175 alter table Employees add constraint FK_Employees_EmpDeptId foreign key(EmpDeptId) references Department(DepId) ondelete cscade
    176 
    177 --删除某个名字的约束
    178 alter table Employees drop constraint CK_Employees_EmpAge
    179 --如果删除很多就在后面逗号 然后 约束的名字
    180 
    181 --为表增加多个约束
    182 alter table Employees add constraint UQ_Employees_EmpName unique(EmpName),
    183 constraint CK_Employees_EmpAge unique(EmpAge),....
    184 --用一条语句为表增加多个约束的例子
    185 alter table Employees add 
    186 constraint PK_Employees_EmpId primary key(EmpId),--增加主键约束
    187 constraint UQ_Employees_EmpName unique(EmpName),--增加唯一约束
    188 constraint DF_Employees_EmpGender default(N'') for EmpGender,--增加默认约束
    189 constraint CK_Employees_EmpAge check(EmpAge>=0 and EmpAge<=120),--增加检查约束
    190 constraint FK_Employees_Department_DepId forign key(DepId) references Department(DepId)--增加外键约束
    191 --为表删除多个约束
    192 alter table Employees drop constraint CK_Employees_EmpAge,FK_Employees_DepId --不需要每个约束前都加个constraint语句 ??经测试,加不加都能正常运行
    193 
    194 --查询(select,print)
    195 use nononodeleteImportant
    196 select * from TblStudent --最简单的查询 查询这个表中所有的信息
    197 
    198 select '北京时间'+getdate() --报错,字符类型不能拼接时间类型
    199 select '北京时间'+convert(varchar(30),getdate) --正确,字符类型要拼接时间类型,需要把时间类型转换成字符类型
    200 
    201 print'hello' --消息栏显示‘hello’,这是另一种查询
    202 
    203 --起别名
    204 select '你好现在是' as 问好,getdate() as 时间 --输出时会把‘你好现在是’这列的列名变为‘问号’,getdate()时间函数显示这列的列名改为‘时间’;as后面所跟的字符,可以加‘’也可以不加‘’
    205 
    206 select *,tEnglish as 英语, tMath as 数学 from TblScore --这个查询语句会把原tEnglish和tMath两列的数据再新建两个列(‘英语’,‘数学’)下显示(原数据不受影响,照样输出)
    207 select tEnglish as 英语, tMath as 数学 from TblScore --只输出‘英语’,‘数学’两列数据,不显示原tEnglish和tMath等其他列的数据
    208 select tEnglish 英语, tMath 数学 from TblScore --省略as,与上面的语句功能一样
    209 select 英语=tEnglish , 数学=tMath from TblScore --与上面功能一样,另一种查询方式
    210 select 英语=tEnglish , 数学=tMath from TblScore where tsId=3 --有条件查询
    211 
    212 --查询前十条数据(top)
    213 select top 10 * from Customers
    214 
    215 --查询前百分之十的数据
    216 select top 10 percent * from Customers --原数据总共有91条数据,百分之十显示十条,百分数取整,这里百分之十为9.1(数据库取整显示10条,尽可能多的显示数据)
    217 
    218 --查询到的数据排序(order by)
    219 select * from TblStudent order by tsAge --以tsAge列为标准,默认从小到大排序
    220 select * from TblStudent order by tsAge desc --以tsAge列为标准,从大到小排序
    221 select top 5 * from TblStudent order by tsAge asc --以tsAge列为标准,从小到大排序,显示前5条数据
    222 select top 10 percent * from TblStudent order by tsAge desc --获得年纪最大的10%学生
    223 select top 10 * from TblStudent where tSClassId=10 order by tSAge desc--按tsAge从大到小顺序排序,获得tsClassId为10的前十的数据
    224 --Order by 语句一般要放到所有语句的后面,就是先让其他语句进行筛选,全部筛选完成后,最后排序一下。
    225 
    226 --去除重复信息(distinct)
    227 select distinct tSClassId from TblStudent --去除tsClassId信息重复的数据,然后只输出经过处理后的tsClassId列(原数据不受影响)
    228 select distinct tSClassId,tSName from TblStudent --去除(tsClassId and tsName)两列数据重复信息,只输出经过处理的tsClassId,tsName两列数据
    229 select distinct * from TblStudent --筛选所有列信息都重复的数据,然后输出经过处理的数据
    230 
    231 --数据拼接
    232 select tsId,tsName+tsGender+tsAddress as 信息 from TblStudent --只输出两列数据,第一列是tsId,第二列是tsName+tsGender+tsAddress多列拼接的结果
    233 
    234 --聚合函数(MAX,MIN,SUM,AVG,COUNT) NULL不参与聚合函数运算
    235 --求最大值
    236 select MAX(tEnglish) from TblScore --查询出英语成绩的最大值(即使有多个值都为同一最大数,只会显示一条最大值<单行单列一个值>)
    237 --求最小值
    238 select MIN(tEnglish) from TblScore --查询出英语成绩的最小值(即使有多个值都为同一最小数,只会显示一条最小值<单行单列一个值>)
    239 --求和
    240 select SUM(tEnglish) from TblScore --求tEnglish列总和
    241 --求平均值
    242 select AVG(tEnglish) from TblScore --求tEnglish列平均值
    243 --计算行数
    244 select COUNT(*) from TblScore --求表总行数,即使有某列有NULL值也会一起计算,因为起码主键不会是NULL值
    245 
    246 select MAX(tEnglish),MIN(tEnglish),AVG(tEnglish) from TblScore --获取TblScore表中的tEnglish列最大值,最小值,平均值
    247 select MAX(tenglish) as 最高英语成绩,MIN(tEnglish) as 最低英语成绩,AVG(tEnglish) as 英语平均成绩 from TblScore --功能与上面一样,只是起了几列别名
    248 select tsId,MAX(tEnglish) from TblScore --报错,选择列表中的列'TblStudent.tsId'无效,因为该列没有包含在聚合函数或GROUP BY子句中
    249 select MAX(tEnglish) tMath from TblStudent --陷阱,这个语句相当于 select MAX(tEnglish) as tMath from TblStudent ,容易看成两列,实际是一列
    250 select MAX(tEnglish) 最高英语成绩,MIN(tEnglish) 最低英语成绩 from TblScore --显示两列,第一列‘最高英语成绩’显示一个最大值,第二列‘最低英语成绩’显示一个最小值
    251 select MAX(tsBirthday),MIN(tsBirthday) from TblStudent where tsGender='' --以性别‘男’为根据,分两列列出tsBirthday最大值,tsBirthday最小值
    252 
    253 --查询没有及格的学生的学号
    254 select tsId from TblScore where tEnglish<60
    255 --查询年龄在20岁-30岁之间的男学生
    256 select * from TblStudent where tsGender='' and tsAge>=20 and tsAge<=30
    257 select * from TblStudent where tsGender='' and tsAge between 20 and 30 --与上面的语句效果一样,等同,建议使用between and语句代替上面的语句,因为between and语句已经经过优化处理,效率高
    258 
    259 select * from Customers where Country='UK' or Country='USA' --查询所有Country为‘UK’或者'USA'的数据
    260 select * from Customers where Country in('UK','USA') --与上面语句效果一样,运行效率也一样,其实这条语句是调用了上面那条语句来执行,如果条件比较多,就不那么高效了
    261 
    262 --模糊查询(like)
    263 select * from TblStudent where left(tsName,1)='' --查询TblStudent表中以tsName列数据左边第一个字符是‘张’的数据为依据筛选的整表数据
    264 select * from TblStudent where tsName like '张%' --功能同上
    265 --找张什么什么的
    266 --%表示任意字符多个字
    267 select * from TblStudent where tSName like '张%'
    268 --(-)表示任意字符一次
    269 select * from TblStudent where tSName like '张__' --'张__'里面有两个_
    270 select * from TblStudent where tSName like '张%' and LEN(tSName)=3 --等同于上面的语句
    271 select * from TblStudent where tSName like '张[a-z]_' --张a,张b,张c,张d....张z
    272 select * from TblStudent where tSName like '张[0-9]_' --张0,张1,张2....张9
    273 select * from TblStudent where tSName like '张[^0-9]_' -- ^表示not 
    274 select * from TblStudent where tSName like '张%[%]%' --[]里面的加%只表示字符‘%’,没有可以任意字符任意次数的意思
    275 select * from TblStudent where tSName like '张%[_]%'
    276 --[^ab]只有ms sqlserver支持,对于其他数据库,不支持。(^符号)
    277 select * from TblStudent where tSName not like '张%' --找不姓张的
    278 
    279 --数据库中,一个列如果没有指定值,那么值就为null,数据库中的null表示“不知道”,而不是表示没有。因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”
    280 
    281 --判断是否是'不知道'(null)用is null
    282 select * from tblstudent where tsscore=null --除开标题没有返回任何结果,因为连数据库也'不知道'
    283 select * from tblstudent where tsscore is null --正确
    284 select * from TblStudent where tsScore !=null --除开标题没有返回任何结果,因为连数据库也'不知道'
    285 select * from tblstudent where tsscore is not null --这个语句可以返回除NULL以外的所有数据
    286 --涉及到NULL的处理,适用is,而‘=’,‘!=’不适用
    287 
    288 --分组(group by)
    289 select tsclassid,count(tsclassid) from tblstudent group by tsclassid --查询tsclassid和每个tsclassid的总人数
    290 select tsclassid,count(tsclassid) as 班级的总人数 from tblstudent group by tsclassid --把统计的tsclassid起别名标题,方便查看
    291 select tsclassid,count(tsclassid) as 年龄为21的班级总人数 from tblstudent where tsage=21 group by tsclassid --把tsage为21的班级总人数分别统计一下
    292 select tsclassid,count(tsage) as 年龄为21的班级总人数 from tblstudent where tsage=21 group by tsclassid --效果和结果等同上面的语句,但上面写的就方便理解一点
    293 --GROUP BY子句必须放到WHERE语句的之后 ,Group By与Order By都是对筛选后的数据进行处理,而Where是用来筛选数据的。
    294 
    295 --having语句(对组的筛选,哪些组显示哪些组不显示)
    296 select tsclassid,count(tsclassid) from tblstudent where tsage=21 group by tsclassid having count(tsclassid)>=4 -- 把tsage为21的班级总人数分别统计一下,然后再筛选显示tsclassid人数大于等于4的数据
    297 select tsclassid,count(*) from tblstudent where tsage=21 group by tsclassid having count(*)>=4 --等同于上面的语句,()里面替换成*也不会改变结果
    298 --注意Having中不能使用未参与分组的列,Having不能替代where。作用不一样,Having是对组进行过滤。
    299 --Having 是Group By的条件对分组后的数据进行筛选(与Where类似,都是筛选,只不过having是用来筛选分组后的组的。)
    300 --在Where中不能使用聚合函数,必须使用Having,Having要位于Group By之后
    301 --Having的使用几乎是与where一样的,也可以用in
    302 --where是查数据的时候进行筛选,having是查完数据后的再筛选,用的地方不一样
    303 
    304 --SELECT 语句的处理顺序
    305 --以下步骤显示 SELECT 语句的处理顺序。
    306 
    307 --1.FROM
    308 --2.ON
    309 --3.JOIN
    310 --4.WHERE
    311 --5.GROUP BY
    312 --6.WITH CUBE 或 WITH ROLLUP
    313 --7.HAVING
    314 --8.SELECT
    315 --9.DISTINCT
    316 --10.ORDER BY
    317 --11.TOP
    318 
    319 select 商品名称,sum(销售数量) as 总销售数量 from MyOrders group by 商品名称 order by sum(销售数量) desc --统计每个商品的总销售数量,并按降序排列
    320 select 商品名称,sum(销售数量) as 总销售数量 from MyOrders group by 商品名称 order by 总销售数量 desc --等同于上面的语句order by后面直接跟的sum(销售数量)的别名
    321 --上面两条语句,第一条出现了两次sum语句,其实sum运行了两次,效率降低
    322 
    323 --统计销售总价超过3000元的商品名称和销售总价,并按销售总价降序排序
    324 select 商品名称,sum(销售数量*销售价格) as 销售总价 from MyOrders group by 商品名称 having sum(销售数量*销售价格)>3000 order by 销售总价 desc
    325 
    326 select 购买人,sum(销售数量) as 购买量 from MyOrders where 商品名称='可口可乐' group by 购买人 order by 购买量 desc
    327 
    328 --转换类型(CAST,CONVERT)
    329 select '演示' + CAST(GETDATE() as varchar(30)) --把数字‘9’变成varchar类型和‘演示’一起输出
    330 select '当前时间' + CAST(GETDATE() as varchar(30))
    331 select '演示' + CONVERT(varchar(2),9)
    332 select '当前时间' + CONVERT(varchar(30),GETDATE())
    333 select '求和' + convert(varchar(2),3+5)
    334 select * from T2 order by convert(int,uId) desc 
    335 -- T2表中uId列原本是varchar类型,现在需要用到order by来排序,但是字符类型不能排序,所以把uId列转为int类型使得能使用order by来排序
    336 --(但要注意如果uId列的数据不是1、2、3这类本身可以转为int类型的数据,该语句无效)
    337 
    338 --转换语法
    339 --CAST ( expression AS data_type)
    340 --CONVERT ( data_type, expression,[style])
    341 
    342 select convert(nvarchar(10),getdate(),108) --getdate()后面跟的是时间日期格式代码(数字)
    343 select isnull(convert(varchar(10)),tEnglish),'缺考') from tblscore 
    344 --ISNULL的用法看下面的语法和例子,这里的convert()是因为要把tEnglish列的float类型转换成varchar类型才能让‘缺考’适配
    345 
    346 --ISNULL语法
    347 ISNULL(check_expression,replacement_value)
    348 --ISNULL语法的参数
    349 --check_expression
    350 --将被检查是否为NULL的表达式。check_expression可以为任何类型
    351 --replacement_value
    352 --当check_expression为NULL时要返回的表达式。replacement_value必须是可以隐式转换为check_expression类型的类型
    353 --返回类型
    354 --返回与check_expression相同的类型
    355 
    356 --例子:
    357 --以下示例选择AdventureWorks中所有特价产品的说明、折扣百分比、最小量和最大量。如果某个特殊特价产品的最大量为NULL,则结果集中显示的MaxQty为0.00
    358 use AdventureWorks;
    359 go
    360 select Description,Discountpct,MinQty,ISNULL(MaxQty,0.00) AS 'Max Quantity'
    361 From Sales.SpecialOffer;
    362 go
    363 
    364 select cast(9.85 as int) --丢失精度,舍去小数
    365 ROUND() --???
    366 
    367 --在SQL语句中,两个连续的单引号,表示一个单引号(单引号的转义符)
    368 
    369 --合并表,联合结果集(union)集合运算符
    370 --合并表的时候,首先保证列的个数相同,类型相同
    371 --例子:
    372 select tsname,tsAddress from TblStudent
    373 union
    374 select ttName,ttaddress from TblTeacher --两表要合并的两列的第一和第二列的类型都是分别对应一致的
    375 
    376 --假如有不同类型的,要转换成相同类型来适配
    377 select tsname,tsAddress from TblStudent
    378 union
    379 select ttName,convert(varchar(20),ttAge) from TblTeacher --将ttAge的int类型转换成与tsAddress相匹配的varchar类型
    380 
    381 --联合:将多个结果集合并成一个结果集。union(去除重复,相当于默认应用了distinct)
    382 --如果两表相同列个数,每列都分别对应相同类型,则这两个表全部合拼也不会因为union默认去除重复的功能而出现去除重复数据的情况(如果本表自己的重复数据不会去除),因为主键不可能是一样的
    383 --union合并两个查询结果集,并且将其中完全重复的数据合并为一条
    384 --union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用union all
    385 
    386 select tName,tSex from teacher union all
    387 select sName,sSex from student 
    388 
    389 --底部汇总
    390 select tSName,tsScore from TblStudent
    391 union all
    392 select '最高分',MAX(tsscore) from TblStudent
    393 union all
    394 select '最低分',MIN(tsscore) from TblStudent
    395 --这里面union后面的all最掉一个all和两个all都是一样的排列显示效果,但是与全部没有all的排列效果不一样('最高分'和'最低分'还是在最下面),有all按原表顺序排,没有all自行分类排
    396 
    397 --备份表
    398 --把现有表的数据插入新表(表不能存在),为表建备份
    399 select * into newStudent from student --newStudent表在select查询的同时自动建立
    400 
    401 
    402 
    403 
    404 --------------------------------------------
    405 --使用Transact-SQL语句创建用户自定义数据类型
    406 --在SQL Server 2008中,使用系统数据类型sp_addtype创建用户自定义数据类型。
    407 --语法如下:
    408 sp_addtype[@typename=]type
    409 [@phystype=]system_data_type
    410 [,[@nulltype=]'null_type']
    411 [,[@owner=]'owner_name']
    412 参数说明:
    413 --[@typename=]type 指定待创建的用户自定义数据类型的名称。用户定义数据类型名称必须遵循标识符的明明规则,而且在数据库中唯一。
    414 --[@phystype=]system_data_type指定用户定义数据类型所依赖的系统数据类型
    415 --[,[@nulltype=]'null_type']指定用户定义数据类型的可空属性,即用户定义数据类型处理空值的方式,取值为NULL、NOTNULL或NONULL
    416 --例子:
    417 --创建用来存储邮政编码信息的postcode用户自定义数据类型:
    418 --SQL语句如下:
    419 USE db_CSharp
    420 EXEC sp_addtype postcode,'char(8)','not null'--创建自定义数据类型postcode
    421 --如果是修改、删除用户数据类型,可以用sp_droptype
    422 
    423 --------------------------------------------
    424 --特定标识属性(IDENTITY)
    425 --数据表中如果某列被指派特定标识属性(IDENTITY),系统将自动为表中插入的新行生成连续递增的编号。因为标识值通常唯一,所以标识列常定义为主键
    426 
    427 --------------------------------------------
    428 --约束:
    429 --非空(NOT NULL)
    430 --检查(Check)
    431 --唯一性(Unique)
    432 --主键(Primary key)
    433 --外键(Foreign key)
    434 
    435 --------------------------------------------
    436 --T-SQL语句分类:
    437 --1、变量说明语句:用来说明变量的命令
    438 --2、数据定义语句:用来建立数据库、数据库对象和定义列,大部分是以CREATE开头的命令,如CREATE TABLE、CREATE VIEW和DROP TABLE等
    439 --3、数据操纵语句:用来操纵数据库中数据的命令,如SELECT、INSERT、UPDATE、DELETE和CURSOR等
    440 --4、数据控制语句:用来控制数据库组件的存取许可、存取权限等命令,如GRANT、REVOKE等
    441 --5、流程控制语句:用于设计应用程序流程的语句,如IF WHILE和CASE等
    442 --6、内嵌函数:说明变量的命令
    443 --7、其他命令:嵌于命令中使用的标准函数
    444 
    445 --------------------------------------------
    446 --局部变量:
    447 --1、声明局部变量:
    448 --局部变量的声明需要使用DECLARE语句。语法格式如下:
    449 DECLARE
    450 {
    451 @varaible_name datatype[,...n]
    452 }
    453 --参数说明:
    454 --@varaible_name:局部变量的变量名,必须以“@”开头,另外变量名的形式必须符合SQL Server标识符的命名方式
    455 --datatype:局部变量使用的数据类型,可以是除text、ntext或者image类型外所有的系统数据类型和用户自定义数据类型。一般来说,如果没有特殊的用途,建议在应用时尽量使用系统提供的数据类型,这样做可以减少维护应用程序的工作量。
    456 --例如,声明局部变量@songname的SQL语句如下:
    457 declare @songname char(10)
    458 --2、......
    459 
    460 --------------------------------------------
    461 --流程控制:
    462 --1、BEGIN...END
    463 --2、IF
    464 --3、IF...ELSE
    465 --4、CASE
    466 --简单CASE函数:
    467 CASE input_expression
    468     WHEN when_expression THEN result_expression
    469         [...n]
    470     [
    471         ELSE else_result_expression
    472     END
    473 --CASE搜索函数:
    474 CASE
    475     WHEN Boolean_expression THEN result_expression
    476         [...n]
    477     [
    478         ELSE else_result_expression
    479     END
    480 --例子:
    481 USE [0820data]--使用‘0820data’数据库
    482 SELECT * from score--搜索‘score’数据表
    483 select*,
    484 备注=case
    485 when math>=90 then '成绩优秀'
    486 when math<90 and math>=80 then '成绩优良'
    487 when math<80 and math>=70 then '成绩及格'
    488 else '不及格'
    489 end
    490 from score
    491 --运行结果:在最后列增加一列,列名为‘备注’,‘备注’列中math成绩大于等于90显示‘成绩优秀’,math成绩小于90大于等于80显示‘成绩优良’,math成绩小于80大于等于70显示‘成绩及格’,其余显示‘不及格’
    492 --5、WHILE
    493 --WHILE子句是T-SQL语句支持的循环结构。在条件为真的情况下,WHILE子句可以循环地执行其后的一条T-SQL命令。如果想循环执行一组命令,则需要配合BEGIN...END子句使用。WHILE的语法格式如下:
    494 WHILE<条件表达式>
    495 BEGIN
    496     <命令行|程序块>
    497 END
    498 --例子:
    499 declare @n int.@sum int
    500 set @n=1
    501 set @sum=0
    502 while @n<=10
    503 begin
    504 set @sum=@sum+@n
    505 set @n=@n+1
    506 end
    507 print @sum
    508 --6、WHILE...CONTINUE...BREAK
    509 --循环结构WHILE子句还可以用CONTINUE和BREAK命令控制WHILE循环中语句的执行。语法格式如下:
    510 WHILE<条件表达式>
    511 BEGIN
    512     <命令行|程序块>
    513     [BREAK]
    514     [CONTINUE]
    515     [命令行|程序块]
    516 END
    517 --其中,CONTINUTE命令可以让程序跳过CONTINUE命令之后的语句,回到WHILE循环的第一行命令;BREAK命令则让程序完全跳出循环,结束WHILE命令的执行。
    518 --7、RETURN
    519 --RETURN语句用于从查询或过程中无条件退出。RETURN语句可在任何时候用于从过程、批处理或语句块中退出,位于RETURN之后的语句不会被执行。语法格式如下:
    520 RETURN[整数值]
    521 --在括号内可指定一个返回值。如果没有指定返回值,SQL Server系统会根据程序执行的结果返回一个内定值。
    522 --例子:
    523 declare @x int
    524 set @x=3
    525 if @x>0
    526 print'遇到return之前'
    527 return
    528 print'遇到return之后'
    529 end
    530 --运行结果:显示‘遇到return之前’
    531 --8、GOTO
    532 --GOTO命令用来改变程序执行的流程,使程序跳到标识符指定的程序行再继续往下执行下去。语法格式如下:
    533 GOTO 标识符
    534 --标识符需要在其名称后加上一个冒号“:”
    535 --例如,“33:”,“loving:”。
    536 --例子:
    537 declare @x int
    538 select @x=1
    539 loving:
    540     print @x
    541     select @x=@x+1
    542 WHILE @x<=3 GOTO loving
    543 --运行结果:连续输出三行,每行递增显示单个数字1、2、3
    544 --9、WAITFOR
    545 --WAITFOR指定触发器、存储过程或事务执行的时间、时间间隔或事件;还可以用来暂时停止程序的执行,直到所设定的等待时间已过才继续往下执行。语法格式如下:
    546 WAITFOR{DELAY<'时间'|TIME<'时间'>}
    547 --其中,“时间”必须为DATETIME类型的数据,如11:15:27,但不能包括日期。各关键字含义如下。
    548 --DELAY:用来设定等待的时间,最多可达24小时。
    549 --TIME:用来设定等待结束的时间点。
    550 --例子:
    551 --3秒后显示“祝你生日快乐!”。
    552 waitfor delay"00:00:03"
    553 print"祝你生日快乐"
    554 --15点显示“《新三国演义》开始了!”
    555 waitfor time"15:00:00"
    556 print"《新三国演义》开始了"
  • 相关阅读:
    Object.prototype.toString.call()进行类型判断
    JavaScript中的typeof操作符用法实例
    js ==与===区别(两个等号与三个等号)
    js nextSibling属性和previousSibling属性概述及使用注意
    Java 缓存技术之 ehcache
    不可不知 DDoS的攻击原理与防御方法
    jQuery的选择器中的通配符[id^='code']
    jquery $("[id$='d']").val();这句话什么意思?
    js 数组的操作
    【转】理解js中的原型链,prototype与__proto__的关系
  • 原文地址:https://www.cnblogs.com/start-from-scratch/p/5370056.html
Copyright © 2011-2022 走看看