数据库与内存、文件的比较
 
内存:
         优点:存取速度快
         缺点:-容量小
                    -断电后,数据不会保存
 文件:
         优点:数据可以持久化保存
         缺点:-读取速度慢
                    -编码格式不好控制
 数据库:
         优点:-容量大
                    -读取速度快
                    -统一的编码格式
         缺点:使用难度较高
 
SqlServer是一个关系型数据库
 
优点:性能高。相较于Mysql,SqlServer支持更大的数据量和更高的并发性能,可以更好的处理复杂的查询,提供更好的安全性和可靠性
 
关系模型概念:以行和列的形式进行数据的存储(二维表),便于用户理解
 
登录数据库
 
1、通过客户端软件登录        [.][127.0.0.1][ip地址]
 -- .:本机
 --127.0.0.1本机默认ip
 --网络ip+SqlServer身份验证
 
• SQLServer 中 4 个系统数据库: Master 、 Model 、 Msdb 、 Tempdb 。 
 
• 1 、 Master 数据库是 SQLServer 系统最重要的数据库,它记录了 SQLServer 系统的所有系统信息。 
 
• 2 、 model 数据库用作在 SQLServer 实例上创建的所有数据库的模板。 
 
• 3 、 Msdb 数据库是代理服务数据库,为其报警、任务调度和记录操作员的操作提供存储空间。 
 
• 4 、 Tempdb 是一个临时数据库,它为所有的临时表、临时存储过程及其他临时操作提供存储空间。 
 
 
数据类型
 

 

 
使用SQL语句创建数据库
 

 
使用SQL语句创建数据表
 

 
插入数据
 
插入一条数据:insert into Class(cid,cname,cdescription) values(8,'八班','张三')
 
一次性插入多条数据:
 
insert into Class(cName)
 
select 'bbb' union all
 
select 'ccc' union all
 
select 'ddd' union all
 
更新数据
 
更新一个列:update Student set sSex = ‘男’
 
更新多个列: update  Student set sSex ='女',sAge = 18,sBirthday='1989-8-8'
 
更新一部分数据: update  Student set sClassId= 4 where sClassId = 1,用where语句表示只更新Name是’tom’的行,注意SQL中等于判断用单个=,而不是==。
 
Where中还可以使用复杂的逻辑判断update Student set sAge=30 where sName='华佗' or sAge<25 ,or相当于C#中的||(或者)
 
所有学生的年龄加1update Student set sAge = sAge + 1
 
update Student set sClassId=6
 
where (sAge>20 and sAge<30) or(sAge=50)
 
Where中可以使用的其他逻辑运算符:or、and、not、<、>、>=、<=、!=(或<>)等
 
删除数据
 
删除表中全部数据:DELETE  FROM  Student。
 
Delete只是删除数据,表还在,和Drop Table不同。
 
Delete 也可以带where子句来删除一部分数据:DELETE FROM Student WHERE sAge > 20  
 
==========================
 
truncate table student 的作用与delete from student一样,都是删除student表中的全部数据,区别在于:
 
1.truncate语句非常高效。由于truncate操作采用按最小方式来记录日志,所以效率非常高。对于数百万条数据使用truncate删除只要几秒钟,而使用delete则可能耗费几小时。
 
2.truncate语句会把表中的自动编号重置为默认值。
 
3.truncate语句不触发delete触发器。
 
 约束
 
数据库约束是为了保证数据的完整性(正确性)而实现的一套机制
 
• 非空约束 
 
• 主键约束 (PK) primary key constraint  唯一且不为空 
 
• 唯一约束  (UQ)unique constraint  唯一,允许为空,但只能出现一次 
 
• 默认约束  (DF)default constraint  默认值 
 
• 检查约束  (CK)check constraint  范围以及格式限制 
 
• 外键约束  (FK)foreign key constraint  表关系 
 
– -on delete cascade   级联删除  
 
 
数据检索-查询 
 
 执行备注中的代码创建测试数据表。 
 
 简单的数据检索 : SELECT * FROM Student 
 
 只检索需要的列 : SELECT  sName  FROM Student  、 SELECT  sName,sAge  FROM Student( select 执行过程 ) 
 
 列别名: SELECT  sName  AS  姓名 , sAge  AS  年龄 , sBirthday  AS  出生日期  FROM Student 
 
 使用 where 检索符合条件的数据: SELECT  sName  FROM Student WHERE  sSex =‘ 女 ’ 。 
 
 还可以检索不与任何表关联的数据: select 1+1;select select  getdate (); 
 
 
  Top  获取前几条数据 
  • 获得年纪最小的 5 个学生 
  • 获得年纪最大的 10% 的学生 
  Distinct  去除重复数据 
  • select distinct  sName  from student 
  • select distinct  sName,sAge  from student 
  DISTINCT 是对整个结果集进行数据重复处理的,而不是针对某一个列 
  distinct&top 配合使用 
   模糊查询:
  查询所有姓张的同学 
  • Select * from student where left(sName,1)=‘ 张 ‘    看上去很美 , 如果改成查询名字中带亮的学生怎么做? 
  换一种做法  like   
  • Select  * from student where  sName  like ‘ 张 %’     会吧所有姓张的都查询到,现在我想查询姓张并且名字是一个字的学生? 
  • Select  * from student where  sName  like ‘% 亮 %’ 
  通配符  % 多字符匹配的通配符,它匹配任意次数(零或多个)出现的任意字符 
  通配符 _  单字符匹配,它匹配单个出现的字符 
  []  只匹配一个字符  并且这个字符必须是 [] 范围内的     [0-9]  [a-z]   [ a,b,c ] 
  查询姓张或者姓关的同学 
  not 与 like 一起使用: not like  …. 
  
   
  空值处理: 
   l 数据库中,一个列如果没有指定值,那么值就为 null ,这个 null 和 C# 中的 null ,数据库中的 null 表示“ 不知道 ”,而不是表示没有。因此 select null+1 结果是 null ,因为“不知道”加 1 的结果还是“不知道”。 
  l select * from score where  english  = null  ;  
  l select * from score where  english  != null  ; 都没有任何返回结果,因为数据库也“不知道”。 
  l SQL 中使用 is null 、 is not null 来进行空值判断:  select * from score where  english  is null  ;  select * from score where  english  is not null  ; 
  l ISNULL  (  check_expression  ,  replacement_value  ) 
     
 
  
数据排序:
 
 ORDER BY 子句位于 SELECT 语句的末尾,它允许指定按照一个列或者多个列进行排序,还可以指定排序方式是升序(从小到大排列, ASC )还是降序(从大到小排列, DESC )。  
 
 按照年龄升序排序所有学生信息的列表: SELECT * FROM  Student ORDER BY  sAge  ASC  
 
 l 查询班级中年龄最大的前三个学生。 
 
 按照英语成绩从大到小排序,如果英语成绩相同则按照数学成绩从大到小排序 : SELECT * FROM  Score ORDER BY  english DESC,math  DESC 
 
 ORDER BY 子句要放到 WHERE 子句之后 :  SELECT * FROM  Score where  english >=60 and math>=60 ORDER BY  english DESC,math  DESC 
 
 Order by  语句一般要放到所有语句的后面,就是先让其他语句进行筛选,全部筛选完成后,最后排序一下。 
 
 
数据分组:
 
 select  语句中可以使用 group by  子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息 
 
 按照班级进行分组统计各个班级的人数 
 
 每个班级的平均年龄 
 
 男生有多少个?女生有多少个人?  
 
 GROUP BY 子句必须放到 WHERE 语句的之后  
 
 每个班男同学的个数 
 
 没有出现在 GROUP BY 子句中的列是不能放到 SELECT 语句后的列名列表中的 (聚合函数中除外) 
 
 • 错误:  select  sClassId,count ( sName ), sAge  from student group by  sClassId 
 
 • 正确:  select  sClassId,count ( sName ),avg( sAge ) from student group by  sClassId 
 
 Having语句:
 
 查询班级人数大于 3 的班级 
 
 Having  是 Group By 的条件对分组后的数据进行筛选 
 
 在 Where 中不能使用聚合函数,必须使用 Having , Having 要位于 Group By 之后,  
 
 查询班级人数超过三个人的班级 
 
 select  sClassId,count ( sName ) from student group by  sClassId  having count( sName )>3 
 
 注意 Having 中不能使用未参与分组的列, Having 不能替代 where 。作用不一样, Having 是对组进行过滤。 
 
 查询男生个数大于 5 的班级 
 
 
 
select sClassId,count(sName) from student where count(sName)>3 group by sClassId
聚合函数不应出现在WHERE 子句中select sClassId,count(sName) from student group by sClassId having count(sName)>3Group by 前可以有where,是对筛选过后的数据进行分组
select sClassId,count(sName) from student where sSex='男' group by sClassId select sClassId,count(sName) from student group by sClassId having sAge>30
//错,having是对分组后信息的过滤,能用的列和select中能用的列是一样。
//having无法代替where。
 
SQL语句的执行顺序
 
 5>…Select 5-1> 选择列 ,5-2>distinct,5-3>top 
 
 1>…From  表 
 
 2>…Where  条件 
 
 3>…Group by  列 
 
 4>…Having  筛选条件 
 
 6>…Order by  列 
 
 select sclassid , count (*) from  student  where ssex = ' 男 ' group by sclassid having count (*) > 2 
 
 
联合结果集:
 
 简单的结果集联合: 
 
 • select  tName,tSex  from teacher union 
 
 • select  sName,sSex  from student 
 
合并老师表和学生表
 
 基本的原则:每个结果集必须有相同的列数;每个结果集的列必须类型相容。  
 
 • select tName,tSex,-1 from teacher union 
 
 • select  sName,sSex,sClassId  from student 
 
 联合:将多个结果集合并成一个结果集。 union( 去除重复 ) 、 union all 
 
 
Union all:
 
 • select  tName,tSex  from teacher union 
 
 • select  sName,sSex  from student 
 
UNION合并两个查询结果集,并且将其中完全重复的数据行合并为一条
 
 • select  tName,tSex  from teacher union all 
 
 • select  sName,sSex  from student 
 
Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用UNION ALL
 
 
 
一次插入多条数据
insert into Score(studentId,english,math)
select 1,80,100 union
select 2,60,80 union
select 3,50,59 union
select 4,66,89 union
select 5,59,100--把现有表的数据插入到新表(表不能存在)
--select * into newStudent from student
--把现有表的数据复制到一个已存在的表(backupStudent 表必须已经存在)
--insert into backupStudent select * from students
 
字符串函数
 
 LEN()  :计算字符串长度 查询名字大于 2 的人 
 
 LOWER()  、 UPPER ()  :转小写、大写 
 
 LTRIM() :字符串左侧的空格去掉  
 
 RTRIM ()  :字符串右侧的空格去掉  
 
 LTRIM(RTRIM('         bb        ')) 
 
 LEFT() 、 RIGHT()   截取取字符串 
 
 SUBSTRING( string,start_position,length ) 
 
参数string为主字符串,start_position为子字符串在主字符串中的起始位置,length为子字符串的最大长度。SELECT  SUBSTRING('abcdef111',2,3) 
 
Replace
 
日期函数
 
 GETDATE()  :取得当前日期时间  
 
 DATEADD ( datepart  , number, date ) ,计算增加以后的日期。参数 date 为待计算的日期;参数 number 为增量;参数 datepart 为计量单位,可选值见备注。 DATEADD(DAY, 3,date) 为计算日期 date 的 3 天后的日期,而 DATEADD(MONTH ,-8,date) 为计算日期 date 的 8 个月之前的日期  
 
 DATEDIFF (  datepart  ,  startdate  ,  enddate  )  :计算两个日期之间的差额。  datepart 为计量单位,可取值参考 DateAdd 。 
 
 统计不同入学年数的学生个数: select DateDiff(year,sInDate,getdate()) 
 
 ,count(*) from student Group by DateDiff(year,sInDate,getdate()) 
 
 DATEPART ( datepart,date ) :返回一个日期的特定部分 
 
 Select Year( getdate ())/Month()/Day 
 
 求本月出生的学生 
 
 统计学生的生日年份个数: select DatePart(year,sBirthday),count(*) 
 
 from student 
 
 group by DatePart(year, sBirthday) 
 
 空值处理函数:
 
 执行备注中的代码 
 
 如果是 null 则用 value 来代替。 
 
 ISNULL( expression,value )  :如果 expression 不为空则返回 expression ,否则返回 value 。 
 
 select  studentId,isnull (english,0) from score 
 
 
 
类型转换函数:
 
 Select  ‘您的班级编号’ + 1   错误这里 + 是数学运算符 
 
 CAST ( expression AS  data_type ) 
 
 CONVERT (  data_type , expression)  
 
 Round() 、 Ceiling() 、 numeric(18,4) 保留两位小数 
 
 截取日期 
 
 对日期的转换。转换成各种国家格式的日期。 
 
 • select convert(varchar( 20 ),getdate(), 104 ) 
 
 • Style 的格式,查 sql 帮助。(输入 convert 函数查询) 
 
 • 将日期转换为指定格式的字符串。 日期→字符串