Sql的函数
newId() 获得guid;
- getDatatime() 获得当前时间;
- Row_number() 分页常用的函数。
比top 好用的函数select Row_Number() over (order by Fsalary Desc//按Fsalary进行排序) As rownum, Fnumber,Fname,FSalary,Fage From T_Employee
- distinct :消除重复的数据。distinct 消除完全重复的行,针对的是整行。
- Union:两个表的列要一样 ,两个表的两个类型要相容。Union会合并查询结果集,会将完全重复的数据合并为一条,不想合并时加一个All即:Union All。Union的速度快。
- Abs()求绝对值。
- Ceiling()舍入到最大整数。
- Floor()舍入到最小整数。
- Round()四舍五入。
- Len(0计算字符串的长度。
- Lower()小写。
- Updata()大写。
- ltrin()去掉左边的空格。
- Rtrin()去掉右边的空格。
- Ltrin(Rtrin())或者Rtrin(Ltrin())去掉左右的空格。
- subString(string ,start,Length)截取字符串,和C#一样。
- GetDate()获得当前日期
- DateAdd()计算增加后的日期参数为date,为待计算的日期;参数date为增量;参数DataPart为计量单位。例如:select DATEADD(DAY|Month|Year(任选一个),3,GETDATE())
- datediff(datepart,startdate,enddate)计算两个日期之间的差额。datepart为计量单位。
- datepart (datepart,date) 返回一个日期的特定部分
- Cast(expression As data_type)例如:cast('2008-08-26' as datetime)。
- Convert(data_type,expreession[表达式])。例如:convert (datetime,'2009-09-05')。
- Right()获得小数位,例如:Right(1235.123,3) 返回 123。
- IsNull(espression,value) 如果expression不为空则返回expression 否则返回value。例如:isnull(name,‘益民’),name为空则返回'益民'。
- 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 - adf
- 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中注意事项
- Sql中字段出现中文的,例如Name=‘N张三’。中文字符前面记得加'N'。有时候不加'N'可能会出现问题。
- 没有有出现在group by 中的列,不能出现在select语句后的列名列表中的。
- 聚合函数是不能出现在 where中,要用到聚合函数时就要使用having。如果有group by的话,having要出现在group by之后。
- 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()实现的。