newId() 获得guid;
比top 好用的函数select Row_Number() over (order by Fsalary Desc//按Fsalary进行排序) As rownum, Fnumber,Fname,FSalary,Fage From T_Employee
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 毫秒
自动增长列,即使插入错误也会占一位数字。
让自动编号可以编辑: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()实现的。