数据库补充
准备工作
把MySQL安装成系统服务:使用管理员权限打开cmd,在cmd中切换目录到MySQL的bin目录下,执行mysqld-install
把bin目录添加到操作系统path环境变量(方便执行MySQL提供的程序)
多表查询
#查询学生表的姓名和该学生的课程号为005的课程的成绩 SELECT studentName,score FROM student,grade WHERE student.studentId=grade.studentId and courseId='005'; #左外连接查询的作用,保留左边表的所有数据,如果右边表连接失败了,使用null填充 SELECT studentName,score FROM student LEFT OUTER JOIN grade ON student.studentId=grade.studentId AND courseId='005'; #用where不会出现null SELECT studentName,score FROM student LEFT OUTER JOIN grade ON student.studentId=grade.studentId WHERE courseId='005'; #右外连接查询的作用,保留右边表的所有数据,如果左边表连接失败了,使用null填充 SELECT studentName,score FROM student RIGHT OUTER JOIN grade ON student.studentId=grade.studentId AND courseId='005'; #内连接,和最上面的效果一样 SELECT studentName,score FROM student INNER JOIN grade ON student.studentId=grade.studentId AND courseId='005';
嵌套查询
SELECT studentName,age FROM student WHERE age > (SELECT age FROM student WHERE studentName='蛋蛋1' ); SELECT studentName,age FROM student WHERE age > ALL(SELECT age FROM student WHERE studentName='蛋蛋1' OR studentName='蛋蛋2'); SELECT studentName,age FROM student WHERE age IN(SELECT age FROM student WHERE studentName='蛋蛋1' OR studentName='蛋蛋2'); SELECT studentName,age FROM student WHERE age >ANY(SELECT age FROM student WHERE studentName='蛋蛋1' OR studentName='蛋蛋2'); SELECT studentName,age FROM student WHERE age >SOME(SELECT age FROM student WHERE studentName='蛋蛋1' OR studentName='蛋蛋2'); SELECT studentName,age FROM student WHERE EXISTS(SELECT age FROM student WHERE studentName='蛋蛋1' OR studentName='蛋蛋2');
存储过程和触发器
=>存储过程---就像数据库中运行方法(函数)
=>由存储过程名/存储过程参数组成/可以有返回结果
=>if else/while/变量/insert/select等,都可以在存储过程中使用
=>优点
执行速度更快 - 在数据库中保存的存储过程语句都是编译过的,允许模块化程序设计-类似方法的复用
减少网络流通量-只要传输存储过程的名称
=>系统存储过程
由系统定义,存放在master数据库中(master/可编辑性/存储过程)
名称以"sp_"开头或"xp_"开头,自定义的存储过程可以以usp_开头
=>自定义存储过程
由用户在自己的数据库中创建的存储过程usp
系统存储过程
2创建存储过程
======定义存储过程的语法
CREATE PROC[EDURE] 存储过程名
@参数1 数据类型=默认值 OUTPUT,
@参数n 数据类型=默认值 OUTPUT
AS
SQL语句
======参数说明:
参数可选,参数分为输入参数,输出参数,输入参数允许有默认值
======
EXEC 过程名 [参数]
======
--------------------------- --系统的存储过程 sp_databases sp_tables sp_helptext sp_tables --自定义存储过程 create proc AddTwoNumber @num1 int, @num2 int as begin select @num1+@num2 end declare @n1 int =10,@n2 int=20 --第一种调用存储过程的方式 --exec AddTwoNumber @num1=@n1,@num2=@n2 --第二种调用存储过程的方式 --exec AddTwoNumber @n1,@n2 --第三种调用存储过程的方式 exec AddTwoNumber 10,20 --带返回值的存储过程 create proc AddNumber @num1 int, @num2 int, @sum int output as begin set @sum=@num1+@num2 end --调用该存储过程 declare @n1 int =100,@n2 int=20,@sm int --如果是存储过程中,需要传出来的值 用output进行修饰,外面调用的时候也需要加上putput关键字--注意的问题 exec AddNumber @n1,@n2,@sm output select @sm
--根据名字和年龄查询 班级中的学生的信息 并且 把 有多个学生显示出来 --通过存储过程实现 create proc usp_selectstudent @name nvarchar, @age int, @count int output --传出来有多少个学生 as begin set @count=(select COUNT(*) from T_Students where Name like '%' +@name +'%' and age <@age) select * from T_Students where Name like '%'+@name+'%' and age<@age end declare @ct int exec usp_selectstudent '张',30,@ct output select @ct
--分页的存储过程 --分页 sql select * from T_Students select * from (select *,编号=ROW_NUMBER()over(order by Id) from T_Students) as stu where stu.编号 between (3-1)*4+1 and 3*4 --每页 4条数据 第三页的 create proc usp_studentPage @page int,--页数 @count int,--每页多少条 @sumPage int output --获取一共能有多少页 as begin set @sumPage=(ceiling((select COUNT(*) from T_Students)*1.0/@count)); select * from (select *,编号=ROW_NUMBER()over(order by Id) from T_Students) as stu where stu.编号 between (@page-1)*@count+1 and @page*@count end declare @sp int=0 exec usp_studentPage 2,2,@sp output select @sp
-----------提分案例--------- create proc usp_mysetScore --及格的分数线 @passline int, @score int, --每次提多少分 @count int output --提分提了多少次 as begin set @count=0--设置默认提分的次数为0 declare @perSum int= (select COUNT(*) from tblscore);--获取总人数 declare @loser int=(select COUNT(*) from tblscore where tsmath<@passline) while(@loser>@perSum/2) begin update tblscore set tsmath=tsmath+@score--每次提分 set @loser=(select COUNT(*) from tblscore where tsmath<@passline) set @count=@count+1 end end select *from tblscore declare @ct int=0 exec usp_mysetScore 200,2,@ct output select @ct
C#调用存储过程
create proc usp_updateStu---创建存储过程 alter proc usp_updateStu---修改存储过程 @id int, @name nvarchar(50), @age int as begin update T_Students set Name=@name,Age=@age where ID=@id end
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { //通过c#代码调用存储过程 //根据学生的id 更新学生的 姓名和年龄 //拼接 连接字符串 string str = "Data Source=自己写自己的;Initial Catalog=test;Integrated Security=True"; string name = "黄圣依"; int age = 28; int id = 4; int num = 0; SqlParameter[] ps = { new SqlParameter("@name",name), new SqlParameter("@age",age) , new SqlParameter("@id",id) }; //连接数据库 using (SqlConnection con = new SqlConnection(str)) { //直接写存储过程的名字 using (SqlCommand cmd = new SqlCommand("usp_updateStu", con)) { con.Open(); cmd.Parameters.AddRange(ps); cmd.CommandType = System.Data.CommandType.StoredProcedure;//执行的是存储过程 num = cmd.ExecuteNonQuery(); } } if (num > 0) { Console.WriteLine("true"); } else { Console.WriteLine("false"); } Console.ReadKey(); } } }
触发器
==>>触发器的作用
自动化操作,减少了手动操作以及出错的几率
==>>触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程,[在SQL内部把触发器看做是存储过程但是不能传递参数]
==>>一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过事件进行触发而被执行
==>>触发器是一个功能强大的工具,在表中数据发生变化时自动强制执行.触发器可以用于SQL Server约束,默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能
==>>那究竟何为触发器?在 SQL Server里面也就是对一个表的一定的操作,触发某种条件,从而执行的一段程序,触发器是一个特殊的存储过程
After触发器和instead of 触发器
After触发器
在语句执行完毕之后触发
按语句触发,而不是所影响的行数,无论所影响为多少行,只触发一次
只能建立在常规表上,不能建立在视图和临时表上
可以递归触发,最高可达32级
update(列),在update语句触发时,判断某列是否被更新,返回布尔值
介绍如何编写after触发器
instead of 触发器
用来替换原本的操作
不会递归触发
可以在约束被检查之前触发
可以建在表和视图上
介绍如何编写instead of 触发器
--学生表--删除操作 --删除该条数据的时候--已经删除的数据 存放到一个新表中 --先创建一个和 学生表结构一样的新表 select top 0 * into newstu from T_Students --触发器 create trigger tr_deletestus on T_Students after delete as begin --把delete表中的数据 添加到新的表中 insert into newstu select *from deleted end delete from T_Students where ID=3
SVN
1.SVN服务器安装