SqlServer 常用

时间:2021-11-25 06:12:08

Sql的函数

newId() 获得guid;

  1. getDatatime() 获得当前时间;
  2. Row_number() 分页常用的函数。

    比top 好用的函数select  Row_Number() over (order by Fsalary Desc//按Fsalary进行排序) As rownum, Fnumber,Fname,FSalary,Fage From T_Employee

  3. distinct :消除重复的数据。distinct 消除完全重复的行,针对的是整行。
  4. Union:两个表的列要一样 ,两个表的两个类型要相容。Union会合并查询结果集,会将完全重复的数据合并为一条,不想合并时加一个All即:Union All。Union的速度快。
  5. Abs()求绝对值。
  6. Ceiling()舍入到最大整数。
  7. Floor()舍入到最小整数。
  8. Round()四舍五入。
  9. Len(0计算字符串的长度。
  10. Lower()小写。
  11. Updata()大写。
  12. ltrin()去掉左边的空格。
  13. Rtrin()去掉右边的空格。
  14. Ltrin(Rtrin())或者Rtrin(Ltrin())去掉左右的空格。
  15. subString(string ,start,Length)截取字符串,和C#一样。
  16. GetDate()获得当前日期
  17. DateAdd()计算增加后的日期参数为date,为待计算的日期;参数date为增量;参数DataPart为计量单位。例如:select DATEADD(DAY|Month|Year(任选一个),3,GETDATE())
  18. datediff(datepart,startdate,enddate)计算两个日期之间的差额。datepart为计量单位。
  19. datepart (datepart,date) 返回一个日期的特定部分
  20. Cast(expression As data_type)例如:cast('2008-08-26' as datetime)。
  21. Convert(data_type,expreession[表达式])。例如:convert (datetime,'2009-09-05')。
  22. Right()获得小数位,例如:Right(1235.123,3) 返回 123。
  23. IsNull(espression,value) 如果expression不为空则返回expression 否则返回value。例如:isnull(name,‘益民’),name为空则返回'益民'。
  24. case函数用法,第一种:case Score when 1 then ‘aa’  else data end  例如:select Fname {case Fleve1(字段名字) when 1 then '普通客户'  when 2 then ‘会员’  else ‘客户’  end}  as 客户类型  from   TCuaTomet;第二种:select  FName{case when fsalary<=200 then ‘ 低收入’else end} as
    endName例题:表中有ABC三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列选择B列否则选择C列
    答案:select(case when a>b then a else b end),(case when b >c then b else c end)from t
  25. adf
  26. sdf

datepart 可选值:
取值  别名    说明
year  yy,yyy  年份
quarter  qq.q 季度
dayofyear dy,y 当年度的第几天
day   dd,d  日
week  wk     ww
hour  hh    小时
minute  mi,n  分
second   ss,s   秒
millisecond  ms  毫秒

Sql中注意事项

  1. Sql中字段出现中文的,例如Name=‘N张三’。中文字符前面记得加'N'。有时候不加'N'可能会出现问题。
  2. 没有有出现在group by 中的列,不能出现在select语句后的列名列表中的。
  3. 聚合函数是不能出现在 where中,要用到聚合函数时就要使用having。如果有group by的话,having要出现在group by之后。
  4. having是对分组后信息的过滤 ,能用的列是和select中能用的列是一样的。 having无法代替where,where是对原始数据进行分组的。

 续1:

自动增长列,即使插入错误也会占一位数字。
让自动编号可以编辑:set Identity_insert TbName on,将on改为off即可关闭自动编号。
一条语句插入多条数据:insertinto tbName  select 值1,值,值,值,值 union select 值1,值,值,值,值 ,union可以去掉重复。union all 可以插入多条。
将表一备份到表二中(不存在):select * into 表二 from 表一 。此时表二中将创建并插入表一的数据。
修改列:alter table tName alter column colName 类型

向一个表中插入数据,数据源来自另一个表中
insert  into newTb(列名1,列名1,列名1)   select 列名1,列名1,列名1) from  表二 where --正常的sql语句

N前缀:N字符,在服务器上执行的大妈中显示的Unicode字符串常量必须以大写字母N为前缀。即使所引用的列已经定义为Unicode类型,也应该如此。如果不适用N为前缀,字符串将转换为数据库默认的编码,这可能导致乱码。

char和nchar  编码格式不同,nchar用的是Unicode编码。
varchar和nvarchar 都是可变的,差别也就是编码格式不同。
char(1000)和varchar(1000)同等数据条件下,char用的空间明显偏大,删除数据后记得要收缩数据库。

逻辑运算符优先级:not >and>or

delete    from TbName  自动增长还是使用后的。
 truncate table Tbname 删除表中数据,自动增长还是从1开始,只是表中数据是一次性删除的。Truncate table Tbname 比delete 删除表中数据速度快的多。Truncate 不触发delete触发器。
update TbName set colN=(case  when  列  then 修改后的值)

设计器中建立约束:
可通过设计器进行添加,在关系中添加。

手动建立约束:
手动删除一列:alter  table tabName drop column colName
手动增加一列:alter table tabName add  colName   nvarchar(1000)
修改一个列:alter table tabName alter column cloName varchar(200)
增加一个主键约束:alter table tabName add constraint pk_tbName_tbColName primary key (colId)
非空约束(其实就是修改列):alter table tbName alter column colName varchar(50) not null
增加一个唯一约束:alter table tbName add constraint Uq_tbName_colName unique(colName)
增加一个默认约束:alter table tbName add constraint Pf_tbName_colName default('value') for colName
检查约束,年龄大于0,小于150:alter  table tbName add constraint ck_tbNam_colName check(colName>=0 and colName<=150)
增加一个外键约束:alter table tbName add constraint FK_TbName_ColName foreign key(colId) references fTbNaame)
增加外键时,设置级联更新、级联删除:【ON Delete(NO ACTION|CASCADE(级联删除)|SET NULL|SET DEFALILT(设置默认值))】【ON uPDATE(NO ACTION|CASCADE|SET NULL|SET DEFALILT)】
删除原来的外键:alter tabel tbName drop constraint FK_TbName_ColName
一条语句删除多个约束,约束名,逗号隔开:alter tabel tbName drop constraint FK_TbName_ColName1,FK_TbName_ColName12,FK_TbName_ColNamel3
一条语句,可以给一列增加多条约束:alter table tbName add   constraint Pf_tbName_colName default('value')  for colName   constraint ck_tbNam_colName check   (colName>=0 and colName<=150)

列名改变的三种方法:fid as 学号,fid  学号,学号=fid

select  语文=100,数学=90:查看没有的列和没有的数据。是语文列值为100,数学列值为:90.
select *...,自定义的列=100 from tabel 自定义列为表中没有的列。

top后加percent ,按百分比取条数:select top 30 percent * from tabel order by id asc(--升序)
Distinct :去除重复  是对查询出的整个结果集进行数据重复处理的,而不是针对某一个列。

聚合函数是把多个函数聚合成一个。使用多个聚合函数时,可以使用子查询,聚合函数不对null进行处理。count(all|distict|表达式),count(1)表示永远不为空。

where fage >=20 and fage<=30 and fgender='男'  等价于:where fage between 20 and 30 and fgender='男'  --建议使用这个,这个可能已经优化过。

select * fromstudent where sClass=1 or sClassId=2 or sClassId=3 等价于 select * fromstudent where sClass in(1,2,3)
模糊查询

匹配的都是是字符,常用的是_、[]、^、%。
like '赵__'  等价  '赵%' and len(colName)=3
数据库中的转移符是用[]来表示。这个是除去关键字和空格。

自己定义查询的时候,注意同一列数据类型一致。例如把成绩中的null替换为'缺考',成句中的数据类型是int,查询时可以转换为nvarchar,转换的数据类型只存在于查询出的结果集中,表中的数据没有变化。关键语句如:isnull(cast(fmath as varchar(50)),'缺考')

集合是无序的,子表中的数据order by Id desc 此表不能作为数据源,但是前面加入To N。
having是对组的筛选。having中不能使用未参与分组的列,Having不能替代where。作用不一样,Having是对组进行过滤。where 中不能使用聚合函数,必须使用Having。
Having语句后能跟什么列,主要看富足后的结果集中包含什么列。

sql语句的执行顺序问题
1》 From 表
2》 Where条件
3》Group by 列
4》 Having筛选条件
5》Select 5-1>选择列,5.2>distinct,5.3>top
6》Order by列

类型转换函数
cast(expression As data_type)
convert(data_type,expression[,style])
例如:
select FldNumber,cast(right(sno,3) as integer) as 后三位的整数形式,cast(right(sno,3) as integer)+ 1 as 后三位加1,convert(integer,right(sno,3))/2 as 后三位除以2 from student 。
这里的类型转换并没有改变表中的数据类型,只是暂时改变了查询数据中的数据类型。对字符数字进行排序时,可以临时将字符型转换为数字进行排序。

联合结果集union
联合:将多个结果集合并成一个结果集。
聚合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐式转换的),最终输出的集合的列名由第一个集合的列名来确定。(可以用来连接多个结果)
基本的原则:每个结果集必须有相同的列数;每个结果集的列必须类型形容。
union 可以一次性插入多条数据。例如:
insert into Score(student,english,math)
select 1,80,100,union
select 2,80,100,union
select 1,50,100,union
select 1,90,100,union
select 1,70,100
此处如果用union all 不会去除重复数据。

常见应用:底部汇总。例如:销售金额:20000

把现有表的数据插入到新表(表不能存在),为表备份
select * into newStudent from student (newStudent表在select查询的同时自动建立)。这种复制对于约束,不会复制过来。

insert into backupStudent select * from students(backupStudent表必须提前建好)

拷贝表结构:
select * from NewStudent form Mstudent where 1<>1--有些数据库的执行效率较低
--建议使用
select  top0  * from NewStudent form Mstudent

字符串函数中的参数可以使用列名。

续2:

getDate():获得当前日期时间。
DateAdd(datepart,number,date),计算增加以后的日期。
dateDiff(datepart,startdate,enddate):计算两个日期之间的差额。datepart为计量单位。
datePart(datePart,date):返回一个日期的特定部分。

windows身份验证:
string constr="Data Source=;initial Catalog=;Integrated Security=True";

SqlConnectionStringBuilder 帮助获取字符串。
只能打开一次,可以关闭多次。释放资源:connection.Dispose()。
con有一个事件:
statementCompleted事件,每条sql语句执行完毕后触发。多条语句同时执行,如何获取每条语句所影响的行数?实际返回值为每条语句所影响的行数和和。
reader.HasRows//判读reader中的服务器中是否有数据。
if(reader.HasRows)
{
while(reader.Read()){}
}
内部异常不用捕获,在最外层捕获。内部会把异常掩盖。

返回插入列的自动增列的Id的方法:
1--insert into TbName value(1,2,3);select @@identity
这个方法有点不准,因为@@identity都能用
2.insert into TbName output inserted.colId value(1,2,3);
执行插入语句返回刚刚生成的自动编号。
这里的output语句使用的是inserted、delete两个临时表。应用时使用 cmd.ExecuteScalar();

执行任何sql语句其实调用Command对象的ExecuteNonQuery()、ExecuteScalar()、ExecuteReader()都可以,只不过是执行时选对方法比较有意义。
返回自增数列时,可以使用ExecuteScalar();

ExecuteScalar返回第一行第一列,返回类型是object。
ExecuteScalar()方法内部也是调用ExecuteReader()实现的。