基础语句:
## 创建数据库: ``` 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 ```