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

 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][email protected] and [email protected]

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 [email protected]

delete category where [email protected]

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、按照正常还原数据库的步骤,还原数据库。

时间: 2024-10-14 10:29:18

2015-10-20 SQL 第二次课 (约束、日期、isnull、case、exists、cast\convert、索引、视图、存储过程、触发器、备份与还原)的相关文章

SQL Server 2014存储过程的备份和还原

Sql Server 2014存储过程备份和恢复... 1 1.      备份存储过程:... 1 2.      还原... 8 Sql Server 2014存储过程备份和恢复 1. 备份存储过程: 在数据库管理软件中先备份好存储过程 操作步骤:数据库->可编程性->存储过程 看到有几个存储过程,然后 选择生产脚本 选择下一步 还可以展开选择要备份的存储过程: 选择下一步,设置脚本编写选项:确定就好: 选择确定之后选择下一步 就开始备份存储过程了: 备份完成: 在磁盘上找到该存储过程的备

SQL第二节课

SQL练习题 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示.用SQL语句创建四个表并完成相关题目. 表1-1数据库的表结构  表(一)Student (学生表) 属性名 数据类型 可否为空 含 义 Sno Char(3) 否 学号(主码) Sname Char(8) 否 学生姓名 Ssex Ch

2015.10.20

#include<stdio.h> main() { int a,b; char hh,mm; /*定义字符变量op*/ hh='+'; mm='='; scanf("%d",&a); putchar(hh); scanf("%d",&b); putchar(mm); printf("%d",a+b); /*整数计算器*/ int y,q; char m,n; n='='; scanf("%d%c%d&quo

2018.4.10 三周第二次课

磁盘挂载 mount (挂载点) 概念:mount命令可以查看当前系统已经挂载的所有分区.分区文件系统的类型.挂载点及一些选项等信息: 如果想知道某个已挂载分区的文件系统类型,直接用mount命令查看即可: 而未挂载的分区,可以使用blkid命令查看,后续会讲. 选项: 常用的有-a.-t.-o,在/etc/fstab下有讲解.可以man mount看一下 我们先把添加的硬盘格式化 mkfs.xfs -f /dev/sdb [[email protected] ~]# mkfs.xfs -f /

2015.10.20 2014--- 广州

前两天练的了, 做了过的人最多的三道后 ---------- wtw发现第一题据说是西工大说的那个暴力出奇迹的题 第四题刚推出轨迹是个圆,,syh发现 ,,, 求的是圆和多边形的面积交--- 于是弃疗又开了另一场比赛---- Dogs' Candies The E-pang Palace 从30个点里面选择8个点组成两个矩形,使得它们的面积和最大 枚举每个矩形的左下,右上这两个点--- 虽然意识到了有大矩形包含小矩形的情况---- 这种包含的情况的时候,只算外面那个大矩形的面积----(sb地还

Liam的计组学习历程(二):对比程序运算时间(2015.10.20)

对比执行时间实验 机器规格: CPU型号:Intel Core i7-366U: CPU主频:2.0 GHz(最大睿频:3.2GHz): 核心数: 双核心, 线程数:四线程: RAM :8GB: 操作系统位数:64位. 在VS中编写代码如下: #include "stdafx.h" #include "iostream" #include "windows.h" #include "time.h" using namespac

SQL SERVER 判断是否存在并删除某个数据库、表、视图、触发器、储存过程、函数

-- SQL SERVER 判断是否存在某个触发器.储存过程 -- 判断储存过程,如果存在则删除IF (EXISTS(SELECT * FROM sysobjects WHERE name='procedurename' AND type='P')) DROP PROCEDURE procedurename -- 判断触发器,如果存在则删除IF (EXISTS(SELECT * FROM sysobjects WHERE id=object_id(N'[dbo].[triggername]')

一周第二次课(3月20日)笔记

一周第二次课(3月20日) 1.6/1.7 配置IP 1.8 网络问题排查 1.6/1.7 配置IP 配置IP的作用:1.使虚拟机可以和外部通信,通过远程连接虚拟机 2.使虚拟机可以上网 配置IP的步骤: 1.自动获取IP # dhclient   自动获取IP(类似于电脑中dhcp自动获取IP地址) 2.查看IP 正常情况下dhclient命令执行后不会有任何信息反馈,因此需要用其他命令查看执行结果(查看IP) # ip address  查看IP地址 可简写为# ip addr 通过这个命令

个人回忆录 2014.10.20 至 2015.7.30

时间过的太快.以至于对我来说都记不起来每天做了些什么事情.工作节奏太快,下班.上班 然后再下班再上班. 每天下班后都晚上9点左右.真的看不见日出看不见日落. 从2014.10.20 到现在已经快10个月了.新的工作环境以及新的同事.上司都已熟悉了.回想刚刚开始进入这个研发团队的时候. 高原反应非常强烈,总是在疑问自己为何选择这个方向—C++ 客户端开发.为何不沿用最熟悉的.NET 平台开发.当从新学习一门新技术的时候 才发现自己太笨.有点像当年的高考,时间很紧.因为没有太多的时间用在学习上.MF