一点数据库笔记

2017/01/03

Markdown 是个好东西,用了一段时间,这次把自己一点数据库课的笔记放上来,练习下 Markdown 。

函数介绍

数据语句

循环控制语句

聚合函数

数学函数

字符串函数

日期和时间函数

语句提升

约束与规则

规则

  1. 规则只允许在当前数据库创建
  2. 规则不能绑定到数据类型 char、 int、 image、 text 中
create rule 规则名
as 规则
/* 规则可以是where语句任何有效的表达式 */
use 数据库名
exec sp_bindrule '规则名','数据库表字段'
use 数据库名
exec sp_unbindrule '数据库表字段'
drop rule '规则名'

约束

alter table 表名
add [constraint 约束名] check(约束)
alter table 表名
drop constraint 约束名

区别

  1. 约束和表的定义联系,删除表的同时约束也删除。规则是单独存储的数据库对象,独立于表外,删除表时并不能删除规则。
  2. 一个字段可有多个约束,但只能有一个规则。

SELECT高级查询

IN, NULL

select * from table1 where score in (70,80,90);
select * from table2 where score in (select score from table1);
select * from table1 where items in null;

SELECT

用于将查询结果存储到另一个表

select top 5 *
into table3
from table2;

GROUP BY

用于数据汇总

select name,avg(age) as avg_age
from student
group by name;

嵌套查询

select avg_score = (
select avg(score)
  from score
)from score
order by score.id;
select a.name
from student as a
where a.id in(
select b.id
  from score as b
where b.score = 80
)order by a.id;
select a.name
from student as a
where a.id in(
select b.id
from score as b
where b.score <= 80
) order by a.id;
select a.name
from student as a
where a.id in(
select b.id 
from score as b
where b.score
between 80 and 90
) order by a.id;
select *
from table1
where exists(
select score
from table1
where score = 80)
/* IN和EXISTS都代表的是子查询存在某个值,但是IN用的时候,子查询只能是一个字段,但是EXISTS可以用多个字段。 */

多表连接

JOIN…ON

举例

snum name age sex
1 AA 12 M
2 BB 13 F
3 CC 24 M
4 DD 21 F
snum score
1 10
2 20
5 40

inner join

snum name age sex snum score
1 AA 12 M 1 10
2 BB 13 F 2 20

left join

snum name age sex snum score
1 AA 12 M 1 10
2 BB 13 F 2 20
3 CC 24 M null null
4 DD 21 F null null

right join

snum score snum name age sex
1 10 1 AA 12 M
2 20 2 BB 13 F
5 40 null null null null

full join

snum name age sex snum score
1 AA 12 M 1 10
2 BB 13 F 2 20
3 CC 24 M null null
4 DD 21 F null null
null null null null 5 40

UNION

拼接字段相同的表

select * from student as a
union
select * from student as b

数据操纵进阶

insert

插入多行

insert into table2
select name,sex,phone,email
from table2

select … into

select * into table1 from table2

update

基于级联

update table1 set table1.c = table2.c
from table1 inner join table2
on table1.a = table2.a
where table1.c is null

带有output

-- 查询新行的属性
insert into table1(a) output inserted.a values('123')
-- 查询旧行的属性
delete into table1 output deleted.a where a = '123'
-- 返回修改后的值
update table1 set a = 'b' output inserted.a where a = '123'
-- 返回修改前的值
update table1 set a = 'b' output deleted.a wherer a = '123'

视图、索引、触发器

视图

create view 视图名
as
select语句
create view stu1
as
select top 3 * from table2
order by id
create view stu2
as
select b.score,b.name,a.name,sex,age
from student as a
inner join
score as b
on a.id = b.id
alter view 视图名
as
select语句
drop view 视图名

增删改

  1. 视图可以对基本表的数据进行查询,还可以向基本表增删改
  2. select 子句不可用聚合函数
  3. 不能包含算式表达式结果的列
  4. 视图引用多表,无法使用delete

索引

优点

  1. 通过创建唯一索引,可以保证数据记录的唯一性。
  2. 可以大大加快数据检索速度。
  3. 可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。
  4. 在使用order by和group by子句中进行检索数据时,可以显著减少查询中分组和排序的时间。
  5. 使用索引可以在检索数据的过程中使用优化隐藏,提高系统性能。

缺点

  1. 创建索引要花费时间和占用存储空间。
  2. 建立索引加快了数据检索速度,但是减慢了数据修改速度。

不应创建索引列的情况

  1. 很少或从来不在查询中引用的列,因为系统很少或从来不根据这个列的值去查找数据行。
  2. 只有两个或很少几个值的列,例如性别。
  3. 以bit、text、image数据类型定义的列。
  4. 数据行输很少的表一般也没有必要创建索引。

触发器

DML触发器

after触发器包括 insert、delete、update触发器

after insert
as
begin
SET NOCOUNT ON;
/* process */
end
go

instead of 触发器包括insert、delete、update触发器

instead of insert
as
begin
SET NOCOUNT ON;
/* process */
if @age > 25
print 'Too old!'
else
insert into score(name,age) values(@name,@age)
end
go