zoukankan      html  css  js  c++  java
  • 笔记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服务器安装

  • 相关阅读:
    npm的使用
    js 数组去重
    js实现对象或者数组深拷贝
    js简单排序
    js判断类型
    鼠标移入移出事件
    jq中的attr和prop属性
    移动端底部被输入法顶起的解决办法
    vue中的number
    javascript要点(上)
  • 原文地址:https://www.cnblogs.com/wangyinlon/p/7243425.html
Copyright © 2011-2022 走看看