2015-10-20 SQL 第二次课 (约束、日期、isnull、case、exists、castconvert、索引、视图、存储过程、触发器、备份与还原)

 Primary Key 约束

    SQLServer 中有五种约束, Primary Key 约束、 Foreign Key 约束、 Unique 约束、 Default 约束和 Check 约束.

    在表中常有一列或多列的组合,其值能唯一标识表中的每一行。

    这样的一列或多列成为表的主键(PrimaryKey)。一个表只能有一个主键,而且主键约束中的列不能为空值。只有主键列才能被作为其他表的外键所创建。

   创建主键约束可以右键单击表,选择设计 。

 

   选中要创建主键的列,然后单击上面的小钥匙。

 

    也可以右键需要创建主键的列,然后单击小钥匙。

 

 Foreign Key 约束

    外键约束是用来加强两个表(主表和从表)的一列或多列数据之间的连接的。创建外键约束的顺序是先定义主表的主键,然后定义从表的外键。也就是说只有主表的主键才能被从表用来作为外键使用,被约束的从表中的列可以不是主键,主表限制了从表更新和插入的操作。

   右键单击需要设置外键的列(此时的表是作为从表在外键中出现),选择关系。

 

   接下来点击添加 --> 表和列规范。

 

   在主键表中选择主表和主表的主键列。

 

   设置完后保存即可。

 Unique 约束

    唯一约束确保表中的一列数据没有相同的值。与主键约束类似,唯一约束也强制唯一性,但唯一约束用于非主键的一列或者多列的组合,且一个表可以定义多个唯一约束。

   右键单击要设置的列选择索引 / 键。

 

   然后单击添加按钮。

 

   选择需要设置的列,可以是一列也可以是多列的组合。

 

   关闭并保存设置。

 Default 约束

    若在表中定义了默认值约束,用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果我们不设置默认值,系统默认为 NULL 。

  以学生信息表为例,在表设计器中,为性别 sex 列填写默认值男。

 

 Check 约束

    Check 约束通过逻辑表达式来判断数据的有效性,用来限制输入一列或多列的值的范围。在列中更新数据时,所要输入的内容必须满足 Check 约束的条件,否则将无法正确输入。

   以学生信息表中的 sex 为例,我们要限制 sex 列的值只能为男或女。

 

 

  

关闭并保存设计。

6.选择出年月日

 select year(getdate()) //获取当前的年

select month(getdate()) //获取当前的月

select day(getdate()) //获取当前的天

 select * from employ where month(birthday)=8   // 打印出8月份过生日的员工的所有信息

 select * from employ where year(getdate())-year(birthday)>25// year(getdate())为当前年份,打印出年龄大于25岁的员工的所有信息

 select * from employ where year(birthday)=2008 and month(birthday)=8 and day(birthday)=12 //打印出生日为2008-8-12日的所有员工信息

 select dateadd(yy,100,getdate())//当天加上100年的时间,getdate()也可以换成具体的某一天比如写成:'2108/12/31'

select dateadd(mm,1,getdate())//当天加上1个月的时间

select dateadd(dd,100,getdate())//当天加上100天的时间 

select datediff(yy,getdate(),'2108/12/31')//当天距离2108/12/31还有多少年

select datediff(mm,getdate(),'2108/12/31')

select datediff(dd,getdate(),'2108/12/31')

 7.isnull的用法

 select title,content,isnull(categoryID,0) from news  //为null的categoryID用0显示出来

 8.case用法

//查找categoryID=13的state,并对state进行判断

select state,case

when(state=1)then '待审'

when(state=2)then '已审'

end as pro_state

from category where categoryID=13

//查找出低级的多少个,中级的多少个,高级的多少个

select Count(*) as [Count] from category

group by

case

when categoryID<15 then '低级'

when categoryID between 15 and 20 then '中级'

else  '高级'

end

//查出category 中的CategoryID,name以及判断每个categoryID 的大小

select CategoryID,name,

case

when categoryID<15 then '低级'

when categoryID between 15 and 20 then '中级'

else  '高级'

end as categoryRange from category

9.Category与新表cr(select结果集作为新表),做左联接的应用

Select c.*, IsNull(cr.Count,0) as [Count]

From Category c

Left Join

(

       select cr.CategoryID,Count(*) as [Count] from CategoryRelative cr

       right Join Entry e ON cr.ChildID = e.ID and e.state <> 2 and e.IsActive = 1

       where cr.blogid = 8785

       Group by cr.CategoryID

) cr ON c.CategoryID = cr.CategoryID

Where BlogID = 8785 and CategoryType = 1 

10.exists的用法 

//查出Category 表中categoryID不等于n.categoryID的c.categoryID,c.[name]

第一种查询语句:select c.categoryID,c.[name] from Category c  left join News n on c.categoryID=n.categoryID where n.categoryID is null  

第二种查询语句:select categoryID,[name] from category where not exists

(

   select * from News where category.categoryID=News.categoryID

)

*当News 表中categoryID无大量重复时第一种性能无疑是最好的,反之,第二种性能好。 

11.SQL 语句转换格式函数Cast、Convert

  CAST和CONVERT都经常被使用。特别提取出来作为一篇文章,方便查找。

  CAST、CONVERT都可以执行数据类型转换。在大部分情况下,两者执行同样的功能,不同的是CONVERT还提供一些特别的日期格式转换,而CAST没有这个功能。

  既然CONVERT包括了CAST的所有功能,而且CONVERT还能进行日期转换,那么为什么需要使用CAST呢?实际上,这是为了ANSI/ISO兼容。CAST是ANSI兼容的,而CONVERT则不是。

  语法:

  CAST (expression AS data_type [ (length ) ]) 

  CONVERT (data_type [ ( length ) ] , expression [ , style ]) 

  示例:

  SELECT 'AB' + 1    --此语句报错,在将 varchar 值 'AB' 转换成数据类型 int 时失败。

   SELECT 'AB' + CAST(1 AS varchar)    --输出 AB1 

  SELECT 'AB' + CONVERT(varchar,1)    --输出 AB1

  CAST和CONVERT都能转换时间:

  SELECT CONVERT(DateTime,'2011-07-11')    --输出 2011-07-11 00:00:00.000

   SELECT CAST('2011-07-11' AS DateTime)    --输出 2011-07-11 00:00:00.000

  但是时间转字符串,CAST没有CONVERT这么多花样:

  SELECT CONVERT(varchar,GETDATE(),5)    --输出 01-07-13

  SELECT CONVERT(varchar,GETDATE(),111)  --输出 2013/07/01

  SELECT CONVERT(varchar,GETDATE(),1)    --输出 07/01/13

   SELECT CAST(GETDATE() AS varchar)    --输出 07 1 2013 9:56PM

12.索引:

http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html

详细内容可以通过以上网页了解。

表的存储由两部分组成,一部分用来存放数据页面,另一部分存放索引页面。

索引的功能类似百科全书中的目录,使用索引是快速查找数据库中实际信息的一种方法。

索引分为:

聚集索引--------每一个表只能有一个聚集索引,它对应的表按照其索引进行物理排序,对于百科全书,聚集索引就类似于书的页码,按页码顺序保存着百科全书的信息。

非聚集索引-------每一个表可以有多个非聚集索引,对于百科群书,非聚集索引指的是百科全书后面的关键字目录。

13.视图

视图是一种虚拟表,它的使用基本和表的使用类似,主要目的是控制用户所要显示的数据。

创建一个视图:

Eg:

create view CurrentEmployees_vw

as

select categoryID,[name],age from Category

where state=1

 

 

操作方法:

1、右键添加新视图;

2、选择要查询的表格;

3、选择对应的关联字段;

4、保存即可生成视图,即相当于全联接的SQl语句。

14.存储过程

1)优点:在创建时进行编译,以后每次执行存储过程不需要再编译,而一般的SQL语句要每执行一次编译一次(所以一些复杂逻辑的SQL建议写在存储过程里面);存储过程过重复使用,可减少数据库开发人员的工作量(所以一些经常被调用到的SQL建议写在存储过程里面);安全性高,可设定只有某些用户才具有指定存储过程的使用权。

1)基本语法

Eg:

create proc procCategorySelect

(

  @name varchar(200),

  @age  int

)

as

select * from Category where [name]=@name and age=@age

1)  查看结果exec procCategorySelect 'xudads',11

2)       更改/删除存储过程

ALTER proc      //修改存储过程

Drop proc      //删除存储过程

4)流控制语句

Eg:

create proc procNewsInsert

(

   @creatTime datetime             //设置一个CratTime的变量,执行时加入实参

)

as

if datediff(dd,@creatTime,getdate())>7  /*creatTime距离当天大于天*/

begin;

select * from News

end;

else

begin;

select top 3* from News

end;

执行:exec procNewsInsert '2009-05-10 11:36:43.810'

结果:

 

 15. 触发器

触发器是一种特殊的存储过程,它是在数据在进行增、删、改的时候同时进行的操作,相当于一个事件。

新建一个触发器:

 

写的脚本:

Eg1:

create trigger trigCategoryDelete

   ON  Category

   after delete /* 有三种INSERT,DELETE,UPDATE*/

AS

begin

    select * from deleted /*在删除后同时查出删除后的内容*/

end

GO

 执行:

 

 Eg2:

create trigger trigCategoryDelete

   ON  Category

   instead of delete /* instead of,表示当执行删除的时候这个删除语句被begin下面的语句所代替*/

AS

begin

    declare @id int

select @id=id from deleted

delete news where caID=@id

delete category where id=@id

end

GO

执行:

delete from category where id=5 /*这样就可以删除category里面id=5的东东的同时删除news里面id=5的东东了 */

16.数据库备份与还原

一、SQL数据库的备份

1、依次打开 开始菜单 → 程序 → Microsoft SQL Server 2008 → SQL Server Management Studio → 数据库:Dsideal_school_db既是我们需要备份的学籍数据库

 

图(1)

2、选择要备份的数据库“Dsideal_school_db”,点击鼠标右键 → 任务 → 备份,如图(2):

 

图(2)

3、在打开的“备份数据库 —Dsideal_school_db”对话框中,先点击删除,然后点击“添加”,如图(3):

 

图(3)

4、在弹出的“选择备份目标”对话框中,如图(4)

 

图(4)

5、选择好备份的路径(如D盘的江西-学籍-数据库备份文件夹中),文件类型选择“所有文件”,“文件名”那个位置填写上您要备份的数据库的名字(最好在您备份的数据库的名字后面加上日期,以方便以后查找),之后连续点击“确定”按钮即可完成数据库的备份操作,如图(5):

 

图(5

二、SQL数据库的还原

1、选择您要还原的数据库“Dsideal_school_db”,点击鼠标右键 → 任务 → 还原 → 数据库,如图(6):

 

图(6)

2、在出现的“还原数据库 — school_web_db”对话框中选择“源设备”,然后点击后面的“…”按钮,如图(7):

 

图(7)

3、在出现的“指定备份”对话框中,点击“添加”按钮,如图(8):

 

图(8)

4、找到数据库备份的路径,选择您所要还原的数据库“Dsideal_school_db”(注意:文件类型选择所有文件),然后连续“两次”点击“确定”按钮,如图(9):

 

图(9)

5、在出现的“还原数据库 — Dsideal_school_db”对话框中,勾选上“选择用户还原的备份集”下的数据库前的复选框,如图(10)

 

图(10)

6、然后选择“选项”,勾选上“覆盖现有数据库”,如图(11):

 

图(11)

三、还原数据库问题解决方案

 

在还原数据库“Dsideal_school_db”时,有时会遇见上图中的问题“因为数据库正在使用,所以无法获得对数据库的独占访问权”,此时我们可以按照以下步骤解决此问题

1、右键数据库“Dsideal_school_db”,然后选择“属性”,如下图

 

2、在出现的“数据库属性 — Dsideal_school_db ”对话框中,选择“选项”,在“其他选项”下的“状态”中找到“限制访问”。选择“SINGLE_USER”,点击“确定”按钮,如下图:

 

3、按照正常还原数据库的步骤,还原数据库。

原文地址:https://www.cnblogs.com/admi88/p/4915218.html