笔记09.NET补充知识

数据库补充

准备工作

把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服务器安装

原文地址:https://www.cnblogs.com/wangyinlon/p/7243425.html