标签:
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的东东了 */
标签:
原文地址:http://www.cnblogs.com/relstart/p/4899688.html