数据库系统

基础语句:

## 创建数据库:

```
create datebase stuinfo
```



## 使用数据库:

```
use stuinfo
```



## 创建表格:

```
creat table major(
	mno int,
	mname varchar(20),
	primary key(mno)
)
```



### 如果有外键:

```
在creat时加入
foreign key(mno) references major(mno)
把这里的键mno设为外键,映射major中的mno
```

```
添加一个外键:
alter table sc add constraint fk_sc foreign key(cno) references cou(cno)
更改表格sc,加入其名为fk_sc的外键cno,映射cou表格中的cno
```



## 增删改:

### 增加表中一个属性:

```
use stuinfo
//使用数据库,在开始时用一次就好
alter table stu add qq varchar(20)
//在表格stu中增加属性qq
```

### 删除表中一个属性:

```
alter table stu drop column qq
//删除qq这个列
```

### 删除一个表:

```
drop table t
```

### 插入信息:

```
insert into major(mno,mname) values(1,'计算机')
//在major表中mno和mname插入1,计算机
insert into SC(Sno, Cno, grade)
	values
	(3901170115,'2-1',98),
	(8956170523,'8-5',95),
	(0691170151,'5-6',93),
	(4521170186,'1-3',100)
//直接插入多组数据
```

### 删除信息:

```
delete from stu where sno=1
//删除表格stu中sno属性值为1的行
//如果要删除掉的是其他表中的外键。需要先把其他表中对应的属性改成null,使用更新
```

### 更新:

```
update stu set mno=null where mno=1
```



## 单表查询

### 查询表格:

```
select * from major
//展示表格major的全部
```

```
select sno,2019-age as birth_date from stu
//展示sno,2019-age两列,其中后者其名为birth_date
```

```
select distinct sno from sc
//显示结果不重复
```

```
select * from stu where sname='小时' and grade>=80
//展示结果限制:sname='小时' and grade>=80
//不等于:<>或者!=
//限制可以是between * and *或者and或者or或者in(*,*,*,*)或者not in(*,*,*,*)
//sname like '小时'如果不确定名字,可以sname like '小%'意思是第一个字是小,之后不确定有没有,有多少;
//sname like '_小%'意思是第一个字不确定,第二个字是小,之后不确定有没有,有多少
//sname like '%小%'意思是有小就行
//%和_用于模糊查询,不能有=,只能是like
//如果要查询null,必须是where grade is null
```

### 排序order by:

```/
查询结果排序:
select * from sc order by grade//默认是升序
后面加上desc是降序
select * from sc order by grade desc
```

### 聚集函数操作:

```
count(*)一个表统计有多少行
count(sno)一个表有多少sno值
select count(sno) from sc//显示sc中有多少sno,是一个数字,但无法排除重复项
select count(distinct sno) from sc//排除重复项
函数:count;avg;max;min;sum
select avg(grade) from sc where cno='2021'
聚集函数不可以出现在where后面
```

### 划分group by:

``` 
select cno,count(sno) as num from sc group by cno
//查询sc表中的cno和以cno划分的每种sno数量之和,命名为num;结果如下
//cno  num
//2020  6
//2021  7
//2023  9
select sno,avg(grade) from sc group by sno having avg(grade)>=90
//聚集函数不可以出现在where后面,所以有了having
//having也是限制条件,跟在group by之后
```

## 多表查询

### 连接查询:

#### 	等值连接:

```
select stu.*,sc.* from stu,sc where stu.sno=sc.sno
//展示两个表stu,sc的内容,一左一右,选择条件是:stu.sno=sc.sno 
select sname from stu,sc where stu.sno=sc.sno and sc.cno='20201'
//两个表stu,sc里面都有sname,不一定相同,所以连接,选择条件如上
```

#### 	左外连接:

left outer join

```

```

compute

内连接

自然连接

外连接

嵌套查询

## 视图:

一个虚标,数据库中只存放定义,不存放数据,而是存放在原基本表中,**随基本表变化**

### 查询:

```
creat view v_stul
as
select sno,sname,age from stu
//完成了视图的创建,没有名字的必须as起一个
select * from v_stul
//查询视图
```

## 存储过程(函数):

 事先经过编译并保存在数据库中的一段sql语句集合,使用时调用即可

```
//创建存储过程:
create proc p1
as
begin
	//一些进行的语句,例如:
	select * from sc where sno='2020'
end
```

```
//启动存储
exec p1
```

```
//修改存储
alter proc p1
```

```
//可以传值的存储:
alter proc p1 @sno varchar(13),@cno varchar(13)
//这里@sno和@cno要跟上数据类型,就像是函数定义
as
begin
	select sc.* from sc,cou where sno=@sno and sc.cno=@cno and sc.cno=cou.cno
end

//启动存储
exec p1 '2020','2023'
```

```
//删除存储
drop proc p1
```

## 触发器:

监视某情况,触发某种操作。当对一个表格进行增删改就有可能自动激活他。

```
create trigger t1 on stu
//创建触发器(trigger),其名为t1,在表格stu上
after
update
//在这些操作之后触发,之前则是instead of;update也可以是insert、delete
//也可以直接for update等
as
begin
	......//触发器执行的操作,可以使用if等流程控制
end
```

```
//例如使用监视insert,控制不超过17个
create trigger t1 on stu
after insert
as
begin
	if(select count(*) from stu)>17
	begin
		print 'error'
		rollback tran//制止这一次操作的进行;不制止则用commit
	end
	else
	begin
		print 'right'
	end
end
```

```
删除触发器:
drop trigger t1
```

```
禁用触发器
disable trigger t1
```

```
启动触发器
enable trigger t1
```

## 游标

用户数据缓冲区,用来操作查询的结果集。

用来遍历表格等

```
过程:
声明用到的变量
declare @mname varchar(30)
声明游标
declare my_cursor cursor for select * from sc
打开游标
open my_cursor
推进游标
fetch next from my_cursor into @mname
逐行操作
while @@FETCH_STATUS=0
	begin
		......//进行的操作
		fetch next from my_cursor into @mname
	end
删除数据
更新数据
关闭游标
close my_cursor
释放游标
deallocate my_cursor
```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值