码迷,mamicode.com
首页 > 数据库 > 详细

数据库2

时间:2015-10-22 01:36:17      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:

1. char/nchar,varchar/nvarchar

 

char(10) 只能放五个中文,定长,如果只放一个字节,后面就是九个空格(一个中文两个字节)

nchar(10) 放十个中文,定长

 

varchar(10)放五个中文,变长,如果只放一个字节,就只放一个字节

nvarchar(10)放十个中文,变长。。。。。。。

 

2.创建一个数据库,在数据库里面创建表,以及添加表里面的项

create database Library

go

use Library

go

 

create table Users

(

UID int primary key,

userName nvarchar(20) not null,

userPwd  nvarchar(20) not null

)

 

creat table Books

(

BID int primary key,

bookName nvarchar(20) not null,

price int not null,

authors nvarchar(15),

 

)

 

 

3.select语句用法

 

select*from Products--查询出Products表里面的所有信息

 

select ProductID,ProductName from Products--查询出Products表里面所有的ProductID,ProductName

 

select ProductID,ProductName from Products where ProductID=1--查询出Products表里面ProductID=1的所有ProductID和ProductName

 

use pubs

go

select address from authors where au_id=‘172-32-1176‘--先导入指定的数据库pubs,查询出authors表里面,au_id为172-32-1176的address

 

select productID,productName from products order by productID asc--默认是asc(可以不写)从小到大排序,desc是从大到小

 

select *from products where UnitPrice>20--查询出products表里面UnitPrice>20的所有信息

 

select* from Emloyees where LastName=‘King‘ and City=‘London‘

 

use pubs

go

select* from employee where fname=‘Paul‘ and job_id=5

 

select*from Products where ProductID in(4,5,6)--查询出Products表中ProductID为4,5,6的所有信息

 

select*from Products where UnitPrice<10 and UnitPrice<30 order by UnitPrice--查询出Products表中UnitPrice<10并且UnitPrice<30的所有信息,并按照UnitPrice的大小由小到大排序

select*from Products where UnitPrice between 10 and 30 order by UnitPrice--上面的另外一种写法

 

select * from Employees where FirstName like ‘A%‘--查询出Employees中FirstName里面第一个字母是A的所有人信息

select*from Employees where FirstName like ‘%A%‘--查询出Employees中FirstName里面中间有A的所有人信息

select*from Employees where FirstName like ‘%A‘--查询出Employees中FirstName里面最后一个字母是A的所有人信息

 

select count(*) from Employees--查询出Employees表中的所有记录数

 

select min(Unitprice)from Products--查询出Products表中Unitprice的最小值

select max(Unitprice)from Products--查询出Products表中Unitprice的最大值

select avg(Unitprice)from Products----查询出Products表中Unitprice的平均值

select sum(Unitprice)from Products----查询出Products表中Unitprice的总和

 

select top 5* from Products--查询出前五条的记录信息

 

select * from Products where Unitprice> --有子查询,查找出比平均值高的商品信息

(

    select avg(Unitprice) from Products

)

 

4.insert /update

 

insert into BOOK(bookName,bookPrice,bookAuthors)

values(‘C#基础‘,‘35‘,‘ji‘)

insert into BOOK(bookName,bookPrice,bookAuthors)

values(‘VB基础‘,‘12‘,‘ni‘)

insert into BOOK(bookName,bookPrice,bookAuthors)

values(‘C基础‘,‘35‘,‘das‘)

 

update BOOK set bookPrice=30 where bookName=‘C#基础‘--修改BOOK表,让bookName为C#基础的项中的bookPrice=30

 

delete BOOK where bookName=‘C#基础‘

 

5.有一个student表(学号,姓名,系名,课程名,成绩),查询至少修了四门课程的学生学号,姓名以及平均成绩的SQL语句。

select stu,sname,avg(sorce)

from students

group by stu,sname

having count(*)>=4

 

6.

select distinct [name] from Category  //查出Category  中不重复的name

select count(distinct name) from Category //查出Category  中不重复的name的数量

 

7.连接

inner join on, left join on, right join on区别:

表A记录如下:

aID               aNum

1                  a20050111

2                  a20050112

3                  a20050113

4                  a20050114

5                  a20050115

表B记录如下:

bID               bName

1                   2006032401

2                  2006032402

3                  2006032403

4                  2006032404

8                  2006032408

 

实验如下:

1.left join

sql语句如下:

select * from A

left join B

on A.aID = B.bID

结果如下:

aID               aNum                          bID                  bName

1                   a20050111                1                      2006032401

2                   a20050112                2                     2006032402

3                   a20050113                3                     2006032403

4                   a20050114                4                     2006032404

5                        a20050115                              NULL             

(所影响的行数为 5 行)

结果说明:

               left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.

换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).

B表记录不足的地方均为NULL.

2.right join

sql语句如下:

select * from A

right join B

on A.aID = B.bID

结果如下:

aID               aNum                          bID                  bName

1                   a20050111                1                      2006032401

2                   a20050112                2                     2006032402

3                   a20050113                3                     2006032403

4                   a20050114                4                     2006032404

NULL           NULL                          8                     2006032408

(所影响的行数为 5 行)

结果说明:

        仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

 

3.inner join

sql语句如下:

select * from A

innerjoin B

on A.aID = B.bID

结果如下:

aID               aNum                          bID                  bName

1                   a20050111                1                      2006032401

2                   a20050112                2                     2006032402

3                   a20050113                3                     2006032403

4                   a20050114                4                     2006032404

结果说明:

很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.

 

8. 用这种查询语句就可以查出指定区间记录的数据了

select * from

 (select id, row_number() over(order by id desc) as row from [entry])Entry

where row between 1 and 5000

 

9.给表添加一字段

alter table Category

add

age int null  

 

删除表:

drop table Users

 

10.约束

1.UNIQUE约束,与PK的区别:

一张表只能有一个PK,但可以有多个UNIQUE约束

PK约束定义主键不能为空,但UNIQUE可以为空值

方法:点"管理索引和键"---"添加"---"类型"选择"唯一键"---"列"添加进多个UNIQUE--关闭保存

它的作用是,当那多个unique同时都相同的时候,就会报错,实现了实体的完整性。

也可以用SQL语言来实现:

声明UNIQE约束

//单列处理

creat table T2

(

ID int primary key identity(1,1),

Ename nvarchar(20) unique

)

 

//组合列处理

creat table T3

(

ID int primary key identity(1,1)

Ename nvachar(20),

Ebir datetime

unique(Ename,Ebir)

)

 

2.check约束,它的作用是,约束一个键值,实现域完整性

方法:

"管理check约束"---"添加"---"常规"表达式---写入你要约束的键值的表达式比如:laborage>=2000 and laborage<=5000

---"关闭"保存

这样,在输入laborage的值的时候,如果不是大于等于2000小于等于5000就会报错

也可以用SQL语言实现

creat table T1

(

工资 money not null check(工资 between 2000 and 4000)

)

 

 

11.选择出年月日

 

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‘)

 

Month

 mm、m

 

Dayofyear

 dy、y

 

Day

 dd、d

 

Week

 wk、ww

 

Weekday

 dw、w

 

Hour

 Hh

 

Minute

 mi、n

 

Second

 ss、s

 

Millisecond

 Ms

 

 

12.isnull

 

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

 

13.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

 

一、索引

(1)       概述

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

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

索引分为:

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

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

(2)两者选择

情况描述                                   使用聚簇索引            使用非聚簇索引

用于返回某范围内数据的列                     应                      不应

经常被用作分组排序的列                        应                       应

小数目不同值的列                                 应                      不应

连接操作使用的列                                应                       应

频繁更新、修改的列                             不应                       应

一个或极少不同值的列                          不应                      不应

大数目不同值的列                                不应                       应

(3)创建索引时注意事项

1)      默认情况下,SQL Server会默认主键为聚集索引,这样会造成资源的浪费。

 

假设病人费用表名为“brfy”,其中住院号字段名为“zyh”,日期字段名为“riqi”,要求是从表brfy中检索zyh为“028246”的病人2005年3月1日到20日的费用,对应的SQL语句如下:
Select * from brfy where zyh=’028246’ and riqi>=’20050301’ and riqi<=’20050320’;
第一种情况,用ID列建立聚簇索引,不为zyh和riqi建立索引,查询时间为87秒。
第二种情况,用ID列建立聚簇索引,为zyh和riqi两列建立非聚簇索引(zyh在前),查询时间为33秒。
第三种情况,用zyh和riqi两列建立聚簇索引(zyh在前),查询时间为2秒。
由以上分析可以看出聚簇索引是非常宝贵的,应该为经常用于检索某个范围内数据的列或group by、order by等子句的列建立聚簇索引,这样能够极大的提高系统性能。

2)顺序问题

在第二、第三种情况下,如果把riqi放在zyh前面,执行上述SQL语句就不会用到这两个索引,检索的时间也会变得很长。应该按照顺序来。

 

3)索引的维护
数据库系统运行一段时间后,随着数据行的插入、删除和数据页的分裂,索引对系统的优化性能就会大大降低。这时候,我们需要对索引进行分析和重建。
SQL Server使用DBCC SHOWCONTIG确定是否需要重建表的索引。在 SQL Server的查询分析器中输入命令:
Use database_name
Declare @table_id int
Set @table_id=object_id (‘Employee‘)
Dbcc showcontig (@table_id)
在命令返回的参数中Scan Density 是索引性能的关键指示器,这个值越接近100%越好,一般在低于90%的情况下,就需要重建索引。重建索引可以使用DBCC DBREINDEX,使用方式如下:
dbcc dbreindex(‘表名‘, 索引名, 填充因子)       /*填充因子一般为90或100*/
如果重建后,Scan Density还没有达到100%,可以重建该表的所有索引:
dbcc dbreindex(‘表名‘, ‘‘, 填充因子)

 

(4)如何建索引

1     在“索引/键”对话框中单击“添加”。

2     从“选定的主/唯一键或索引”列表中选择新索引。

3     在网格中选择“创建为聚集的”,然后从该属性右侧的下拉列表中选择“是”。保存表时将在数据库中创建索引。

 

二、视图

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

创建一个视图:

Eg:

create view CurrentEmployees_vw

as

select categoryID,[name],age from Category

where state=1

 

在Management stodio中编辑视图(方法略)

 

三.存储过程

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

 

1)基本语法

Eg:

create proc procCategorySelect

(

  @name varchar(200),

  @age  int

)

as

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

2)  查看结果exec procCategorySelect ‘xudads‘,11

3)      更改/删除存储过程

ALTER proc

Drop proc

 

4)流控制语句

Eg:

create proc procNewsInsert

(

   @creatTime datetime

)

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‘

 

结果:

 

 

 

四 触发器

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

新建一个触发器:

 

写的脚本:

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

 

自动备份

Backup DATABASE MyDB

TO DISK = ‘e:\MyDB.bak‘

 

执行:

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

 

数据库2

标签:

原文地址:http://www.cnblogs.com/relstart/p/4899688.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!