您的位置:首页 > 数据库

Sql基础入门(二)

2013-12-12 23:14 309 查看

            

l 约束

l 表间数据导入

l 分页

l 事务和存储过程
1.用代码创建数据库:



2.在插入一条记录的时候,对于表中的某些(必填 not null)项,必须提供值,否则报错。
3.向表中插入一条记录,这条记录的所有列必须填值。(此时可以省略列名,直接插入值,插入顺序必须与显示的列对应)
insert into TblTeacher values('王哲','男',23,20000,'1990-10-11')
4.如果想手动修改某个表中自动编号列,需要设置该表的identity_insert 为On
Set identity_insert 表名 on    手动修改完后需要关闭     set identity_insert 表名 off  列将按插入项继续向后增长
set identity_insert TblTeacher on
insert into TblTeacher(tTId,tTName,tTGender,tTAge,tTSalary,tTBirthday) values(24,'王雅居','男',23,20000,'1990-10-11')
set identity_insert TblTeacher off
insert into TblTeacher values('王雅居','男',23,20000,'1990-10-11')
5.当字符串类型为nvarchar、nchar,排序规则为非中文时,用SQL语句加入中文字符串常量时,不加 N 会发生乱码错误。
6.Truncate table 表名  快速删除表中所有数据,会还原自动增长编号,不能加where条件;delete from 表名 删除慢,不会还原自动编号,能加where条件; drop table 表名,会删除表(包括数据和表结构)。
7.可以直接把表名拖入sql查询中
8.约束:作用于表上
 1)主键约束(设定唯一标识记录,不能重复,不能为空)
命名 :PK_表名_主键
Alter table 表名 add constraint 约束名 primary key(列名)
alter table Employees add constraint PK_Employees_EmpId primary key(EmpId)
 2)Check约束(用于给列设定条件)
命名:CK_表名_列名
Alter table 表名 add constraint 约束名 check(约束条件)
alter table Employees add constraint CK_Employees_EmpGender check(EmpGender='男' or EmpGender='女')
 3)唯一约束(允许该约束下的列有一个空值(设定允许null值),设定不重复插入)
命名:UQ_表名_列名
Alter table 表名 add constraint 约束名 unique(列名)
alter table Employees add constraint UQ_Employees_EmpName unique(EmpName)
 4)默认约束(default,设定默认值)
命名:DF_表名_列名
Alter table 表名 add constraint 约束名default(默认值) for (列名)
alter table Employees add constraint DF_Employees_EmpAddress default('北京海淀区')for EmpAddress
 5)非空约束(not null,设定不能为空)
Alter table 表名 alter column 列名 数据类型 not null
alter table Employees alter column Empage int not null
 6)外键约束(应该在外键表上建立)有约束的时候,不能直接删除主键表的数据。(需要先删除关联的外键);若是想从主键表中直接删除主键和外键表中关联,需要设置删除规则为级联关系。
命名:FK_外键表名_主键表名_主键列名
Alter table 外键表名 add constraint 约束名 foreign key(关系列)references 主键表名(主键列)
alter table Employees add constraint FK_Employees_Department_DepId foreign key(DeptId) references Department(DepId)
On delete cascade  设置级联关系(删除主键表主键时会关联对应的外键表)
Alter table 外键表名 add constraint 约束名 foreign key(关系列)references 主键表名(主键列)on delete cascade
alter table Employees add constraint FK_Employees_Department 
foreign key(DeptId) references Department(DepId) on delete cascade
9.一般删除数据库中的对象,用drop,删除约束也用drop,删除列也用drop
drop table Employees        删除表
drop database Employees         删除数据库
alter table Employees1 drop column EmpId    删除列
alter table Employees drop constraint PK_Employees_EmpId,FK_Employees_Department 删除约束
10.不能在where条件语句中通过别名限定查询条件的原因是其执行顺序从from 到where 再到前面的select
select CustomerID as '客户编号',CompanyName as '公司名称'from Customers where Country='UK'
11.Null表示“不知道(unknown)”,所以null值与任何职,进行任何计算,结果都是null,
Null值与null值进行=、<>比较,结果是不知道。判断值是否为null用is null 或 is not null。
12.检索百分比,用关键字percent 
Select top 10 percent  * from  tblstudent order by tsage desc   获取学生列表中年纪最大的百分之十(遇小数向上取整)
13.任何聚合函数都不统计null值
14.求每个人的成绩平均值
select*,平均分=(Tenglish+Tmath)/2 from TblScore
15.between  下限 and  上限    包含下限和上限
16.通配符   _   [ ]  %  ^(mssql中出现在中括号内表示非)
当把通配符放入到[]中时,通配符将不再起到通配作用 [a-z A-Z]表示所有字母[0-9]表示0-9的数字
17.按照多条件排序或分组时,先按前面的条件进行排序或分组,遇到前面条件值相等时再按后面的条件排序或分组。
18.当使用分组语句group by或者聚合函数后,在select的查询列中,只能出现group by 子句中包含的列,或着是出现各种聚合函数,绝不能在select查询列中出现那些既没有包含在group by 子句中,又没有使用聚合函数的列。
19.分组前筛选用where(group by之前),分组后筛选用having(group by 之后).where条件中不能使用聚合函数。
20.sql语句执行顺序
1.from
2.on
3.jion
4.where
5.group by
6.with cube或 with rollup
7.having
8.select
9.distinct
10.order by
11.top
21.表间数据导入
1)创建新表导入
select * into  新表  from  旧表 (可加条件)
select * into TblStudent1  from TblStudent 
select * into TblStudent2  from TblStudent where tSGender='男'
将旧表中的数据导入到新表中,在执行该语句的同时会自动创建新表,并且这个新表的表结构和数据会与旧表的表结构数据完全一致,但是旧表中的约束无法被复制。如果已经存在了与新表同名的表,则该语句发生错误。(条件限定下会导入条件限定的数据)
如果只想导入表结构不想导入数据,可以用如下两种方式:
1.   Select * into 新表 from 旧表 where 1<>1  
2.   Select top 0 * into 新表 from  旧表
2)向已建表中导入       
Insert into 已建表 select   (除自增主键外)全部列名 from 旧表 
Insert into TblStudent1 select tsname,tSGender,tSAddress,tSPhone,tSAge,tSBirthday,tSCardId ,tSClassId from TblStudent
22.在SQL中索引从1 开始
23. 几个字符串函数
1)Stuff(oldstr,intstartindex,intlength,insertstr)
从一个字符串中指定位置开始,删除指定长度,然后将另一个字符串从此处插入。
例如:select stuff('1234567',2,4,'charu')
输出结果:1charu67
2)Replicate(oldstr,inttimes)
将字符串重复指定次数。
例如:select REPLICATE('王',5)
输出结果:王王王王王
3)reverse(str)
将指定的字符串反转输出。
例如:select REVERSE('白头到老') 
输出结果:老到头白
4)ASCII(str)
返回指定字符串的第一个字符对应的ascii码,只限于英文和特殊字符等占一个字节的字符。(汉字不行)
例如:select ASCII('a')
输出结果:97
5)UNICODE(str)
返回指定字符串的第一个字符对应的ascii代码值,包括汉字。
例如:select UNICODE('赵宾宾')
输出:36213
24.几个日期函数
1)Datename(datepart,date)
返回指定日期的指定部分。
例如: SELECT DATENAME(year,getdate())
输出:2013
2)isdate(str)
确定字符串是否为有效日期。是则返回1,不是返回0。
3)set  dateformat(mdy、dmy、ymd、ydm、myd 和 dym)
用于设置解释字符串解析格式。
例如:set dateformat dmy;
declare @datevar datetime2='22-12-2013';
select @datevar
设置解析格式后,变量@datevar 将可以正确解析成日期。
25.关于SqlDataReader类
通过sqlDataReader 类实例可以对数据库中的数据进行只进式读取。当通过SqlCommand对象调用ExcuteReader方法时,Sql语句将被发送至服务器,查询出的结果将被暂存在服务器内存中,于此同时,该方法会返回一个SqlDataReader对象,调用SqlDataReader对象的Read方法将可以对查询结果进行只读只进式读取,每次读取一条数据,返回一个bool值True,当读取完成(读取不到数据)时将返回false.因而在查询多行多列的结果集中,我们可以通过循环调用该Read方法来获取需要的数据。(要求使用sqlDataReader对象的时候必须保证连接不断开)
26.在需要用手动释放资源的代码中,尽量将messagebox等可能阻塞线程资源的代码写在外面,防止资源迟迟不能释放。
27.在做数据绑定的时候,做属性不做字段。
28.通过 isDbnull 来确定SqlDataReader对象读取数据中是否包含null
29.NextResult() 读取下一个结果集
30.SQL的英文全称是Structured Query Language
31.默认情况下ado.net启动了连接池,当调用SqlConnection的Close()方法的时候,并不会真的关闭连接,而是将该连接放入到一个连接池中。只有应用程序两次连接数据库时,所使用的连接字符串一模一样的时候才会使用连接池中的现有连接对象。(前提是连接池中已经有了该连接对象)
32.using中的return语句在dispose()之后执行。
33.当一个方法返回值是集合类型时,即使没有一条数据,也要返回一个长度为0的集合而不是返回null。
34.按物理顺序创建的索引为聚集索引,不按物理顺序(逻辑排序)创建的索引为非聚集索引。一个表中只能有一个聚集索引。先建聚集索引,再见非聚集索引。
35.子查询可以独立执行叫做独立子查询,子查询也使用了外部查询的数据,叫相关子查询。
36.用=、>=等运算符是子查询只能返回一个值(多个用 in  between and 等)
37.使用top语句进行分页思路是先把已经看过的记录排除出去然后再查询。另一种分页方式是使用row_number 和over 实现(最下面的存储过程中有示例)
38.同一个sqlparameter 对象不能为多个sqlhelper对象使用。
39.外连接分两步,1在笛卡尔积中进行on条件的记录筛选,对于坐标中那些剩余的记录添加外部行。
默认情况下,SQLserver 认为一条sql语句就是一个事物,要么成功,要么失败回滚。
40.调用带输出参数的存储过程,存储过程中的输出参数,也需要传递一个变量进来。输出参数调用的时候也需要加output关键字
41.联合结果集要求每个结果集的列的个数必须一致,对应位置上的数据类型相同或者兼容。Union 会去掉重复数据,union all 不会。
42.联合结果集单独某个子集不能用order by ,整体的联合结果集可以。
43.事务的应用保证了多条sql语句同时执行成功或失败,事务的结果只有两种,rollback(回滚)和commit(提交)。下面模拟了转账过程中的的回滚操作(如果一个语句错误,则两个sql语句都会失败)
begin tran
--声明一个变量用来存储错误号
declare @sum int =0  
--尽量通过逻辑判断避免出错,尽量不要等待SQL出错后,再做其他处理
update bank set balance=balance-1000 where cid='0001' 
set @sum=@sum+@@error
update bank set balance=balance + 1000 where cid='0002'
set @sum=@sum+@@error
if @sum<>0
rollback
else
commit
44.存储过程:相当于 sql中的方法。语法:
CREATE  PROC[EDURE]  存储过程名 
    @参数1  数据类型 = 默认值 OUTPUT,
    @参数n  数据类型 = 默认值 OUTPUT
    AS
      SQL语句
调用:EXEC  过程名  [参数]
  转账存储过程:
create proc the_tran
  @first char(4), --第一个账户
  @second char(4), --第二个账户
  @money float,
  @isok bit output
 as
 begin
  begin tran
--声明一个变量用来存储错误号
declare @sum int =0  
--尽量通过逻辑判断避免出错,尽量不要等待SQL出错后,再做其他处理
update bank set balance=balance-@money where cid=@first 
set @sum=@sum+@@error
update bank set balance=balance + @money where cid=@second
set @sum=@sum+@@error
if @sum<>0
begin
    set @isok=0
rollback
end
else
begin
   set @isok=1
commit
end
 end
  调用:
declare @is bit
 exec the_tran @first='0001',@second='0002',@money=1000,@isok=@is output
 if(@is=0)
 select '转账成功'
 else
 select '转账失败'
分页存储过程:
begin
--1.查询表中一共有多少条记录
set @recordcount=(select count(*) from Customers)   --select @recordcount= count(*) from Customers
--2.根据总的记录条数,计算一共需要分多少页
set @pagecount=ceiling(@recordcount*1.0/@pagesize)
--3.根据用户查询的条件,将对应的记录返回给用户
select 
*
from
(
select
*,
RowNumber=row_number() over(order by CustomerID asc)
from Customers
) as t
where t.RowNumber between (@pageindex-1)*@pagesize+1 and @pageindex*@pagesize
End
调用:
declare @counta int,@reacount int
exec the_Page @pagesize=6,@pageindex=6,@pagecount=@counta  output,@recordcount=@reacount output
select @counta as '总页数',@reacount as '总记录条数'
 
存储过程通过传参的方式传递数据,防止了SQL注入漏洞。(直接执行SQL语句时使用参数替换方式也能解决SQL注入漏洞)
45.几句话

l 要的比你值的高点,才会有压力,更上进

l 尝试1000遍之后,再跟我说你不行

l Update和delete,永远记住他们后边有个where(不然你会哭)

l 曾经,我少写了一个public( )
 
 
 
 
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息