SqlServer专题

目录

1,连接数据库

2,连接池        

1.何为连接池?

2.连接池运行原理。

3.如何查看连接池?

4.连接池注意事项。

3,一般SQL语句。

4,控制语句

1.判断语句

2.循环语句

5,视图

1.使用MSSM创建视图:

2.使用SQL脚本创建

3.调用视图。

4.视图注意事项。

6,事务

7,临时表

8,存储过程

9,类型转换

10,表格

11,账号管理


1,连接数据库

  • 普通连接字符串:
 <connectionStrings><add name="constr" connectionString="server=.;database=SMDB;uid=sa;pwd=1”/></connectionStrings>
  • 启用连接池的连接字符串:
 <connectionStrings><add name="constr" connectionString="server=.;database=SMDB;uid=sa;pwd=1;Pooling=true;Max pool size=10;Min Pool size=5"/></connectionStrings>

        --Pooling =true :表示启用连接池
        --Max Pool Size=10:表示连接池中最大允许的连接数量
        --Min Pool Size=5;表示连接池中最小的连接数量

        当第一次访问时即建立5个连接,以后根据需要自动增加连接数量,但最多不超过规定的10个连接,如果超过10个并发请求时,在连接池之外建立连接对象,在连接池以外建立的连接关闭后会释放连接

2,连接池        

1.何为连接池?

        连接池是DataProvider提供的一个机制,使得应用程序的链接保存在连接池中,从而避免每次都要完成建立/关闭物理连接的整个过程。

2.连接池运行原理。

        当使用连接池以后,执行Open()方法的时候,系统从连接池中提取一个现有的连接对象,这时打开的是一个逻辑连接如果连接池中的连接对象都被占用了,则会创建一个新的物理连接对象。当使用Close()方法关闭连接池时,系统把连接对象放回到连接池中,这时关闭的是一个逻辑连接。如果是独立创建的对象则会被GC释放。

3.如何查看连接池?

    调用存储过程:exec sp_who可以查看当前数据库连接详情

exec sp_who

4.连接池注意事项。

          在winform中,连接字符串必须一致,这样不同应用程序可以共享数据库中的连接池的连接对象,如果应用程序的连接字符串不同,则数据库会给每个连接创建一个连接池,一定要避免这种情况。
        在web应用程序中,因为连接字符串只在服务端,所以不会出现以上情况。

3,一般SQL语句。

--将结果以xml格式显示
select * from StudentInfo where Sid<30 for xml raw ('Student')--清空表格
truncate table students--查询表格
select * from tempStudent--查询前3行
select top 3 * from tb_UserInfo--查询前20%
select top 20 percent * from tb_UserInfo--模糊查询
select * from tb_UserInfo where Phone like '%张三%'
select * from tb_UserInfo where Phone like '%[2,7]'--右外连接查询
select * from tb_Course as a
right outer join tb_Category as b
on a.CateId=b.Id--查询重复
select * from tb_UserInfo where Nick in(select Nick from tb_UserInfo group by Nick  having COUNT(*)>1)order by Nick--查询空值列
select * from tb_userinfo where LogonDate is null--批量插入数据
insert into tempStudent (Sname,Sphone,Sbirthday,Semail) 
select Sname,Sphone,Sbirthday,Semail from tempStudent--向查询结果中插入常量
select *,'OK' 结果 from tb_UserInfo--删除指定的几个数据
delete from StudentInfoCopy where Sid in (10,11,14)--多列排序
select * from tb_UserInfo order by Name,Phone desc--同时执行多个sql语句时使用;进行分割insert into tb_UserInfo values('lisi4','李四',123,'122222222',0,null);insert into tb_UserInfo values('lisi5','李四',123,'122222222',0,null);insert into tb_UserInfo values('lisi6','李四',123,'122222222',0,null)--通过全局变量@@IDENTITY返回插入行生成的标识列值insert into tb_UserInfo values('lisi7','李四',123,'122222222',0,null);select @@IDENTITY--In 与 Not In使用
select StudentId,StudentName from Students  where StudentId in (select StudentId from ScoreList where SQLServerDB>60)--使用 NotIn反向查询
select StudentId,StudentName from Students  where StudentId not in (select StudentId from ScoreList where SQLServerDB>60)--Exists使用:Exists(表达式),表达式中结果个数大于0即为true ,否则为falseif (exists(select * from ScoreList  where SQLServerDB<60))print '存在未及格同学'elseprint '全部合格'--Exists反向查询 :Not Existsif(not exists(select * from ScoreList where SQLServerDB<60))print '全部合格'elseprint '存在未及格同学'

4,控制语句

1.判断语句

 declare @len intset @len=4if(@len%2=1)beginprint '奇数'endelsebeginprint '偶数'end
use SMDB
go--case条件语句应用select StudentId,SQLServerDB,
'评价'=case  
when SQLServerDB>=90 then '优秀'
when SQLServerDB between 80 and 89 then '良好'
when SQLServerDB between 60 and 79 then '合格'
else '不及格'
end
from ScoreList

2.循环语句

use SMDB
go
declare @StudentId int,@count int
set @StudentId=0
while(1=1)beginset @count=(select COUNT(*) from ScoreList where CSharp<60)if(@count=0)breakselect @StudentId=(select top 1 studentid from ScoreList where CSharp<60)update ScoreList set CSharp=60 where StudentId=@StudentId
end

5,视图

1.使用MSSM创建视图:

  • 选择视图选项,右击选择新建视图

  • 勾选需要查询的字段后保存。

2.使用SQL脚本创建

 --使用脚本创建视图if(exists(select * from sysobjects where name='My_View'))drop view My_Viewgocreate view My_Viewasselect top 100 ScoreList.StudentId,StudentName,CSharp from ScoreList join Studentson ScoreList.StudentId=Students.StudentId	order by CSharpgo

3.调用视图。

 --以查询表格的方式直接调用视图select * from My_View

4.视图注意事项。

  •  视图保存于服务端,仅用于查询,不能用于增删改。
  •  视图中可以使用多张表
  •  一个视图可以嵌套另一个视图(尽量少套用)
  •  视图中的select语句不能使用以下内容
  1. OrderBy子句,除非在Select 语句的选择列表中也有一个top子句
  2. into关键字
  3. 引用临时变量和表变量

6,事务

 --transaction事务使用--定义一个变量承接执行sql语句时可能产生的异常(通过@@Error获取实时异常代码)declare @errorSum int =0--开始事务begin tranbegindelete from Students where StudentId=100094--获取执行语句可能产生的异常代码值set @errorSum=@errorSum+@@ERRORdelete from StudentClass where ClassId=1set @errorSum=@errorSum+@@ERRORif(@errorSum>0)begin--出现异常,进行回滚rollback tranendelse--无异常,提交事务commit tranend go

7,临时表

--临时表:位于系统数据库->tempdb->临时表
--临时表,在语句调用完毕后自动删除,在管理器端使用脚本生成的临时表,重启管理软件自动删除
--使用into #临时表名,将结果插入到临时表中select StudentId,StudentName into #mylist from Students
--查询临时表select * from #mylist--手动删除临时表drop table #mylist

8,存储过程

--定义存储过程语法
--系统存储过程以sp_开头,扩张存储过程以xp_开头
CREATE PROC[EDURE] 存储过程名@参数1 数据类型=默认值 ,@参数2 数据类型=默认值 OUTPUT.......
ASSQL 语句
GO带默认值得参数使用
以存储过程名为usp_MyProc为例--带有默认参数的存储过程if(exists(select * from sysobjects where name='usp_MyProc'))drop proc usp_MyProcgocreate proc usp_MyProc--带有默认值的参数格式为 变量名 类型=默认值@Id int=100000,@name varchar(20)=''asselect * from ScoreList where StudentId=@Idselect * from Students where StudentName=@namego--调用带有默认值得存储过程--方式1 exec usp_MyProc--方式2exec usp_MyProc 100001,'张三'--方式3exec usp_MyProc default,'张三'--方式4exec usp_MyProc @name='张三'
--使用带有output声明的形参作为结果输出接口--分析学员成绩的存储过程if(exists(select * from sysobjects where name='usp_queryScore'))drop proc usp_queryScoregocreate proc usp_queryScore @className varchar(20),@total int output,@miss int output,@csharp  float output,@db float outputas--判断@classname是否为空if(LEN(@className)=0)beginselect Students.StudentId,StudentName,Gender,ClassName,PhoneNumber,CSharp,SQLServerDB from ScoreListjoin Studentson ScoreList.StudentId=Students.StudentIdjoin StudentClasson StudentClass.ClassId=Students.ClassIdselect @total=COUNT(*),@csharp=SUM(CSharp)*1.0/COUNT(*),@db=AVG(SQLServerDB) from ScoreListselect @miss=COUNT(*) from Students where StudentId not in (select StudentId from ScoreList)--缺考人员列表select StudentName from Students where StudentId not in (select StudentId from ScoreList) endelsebegin--显示列表select Students.StudentId,StudentName,Gender,ClassName,PhoneNumber,CSharp,SQLServerDB from ScoreListjoin Studentson ScoreList.StudentId=Students.StudentIdjoin StudentClasson StudentClass.ClassId=Students.ClassIdwhere ClassName=@className--该班级总参加人数--declare @className varchar(20)='软件1班'select @total=COUNT(*),@csharp=SUM(CSharp)*1.0/COUNT(*),@db=AVG(SQLServerDB) from ScoreList join Studentson ScoreList.StudentId=Students.StudentIdinner join StudentClasson Students.ClassId=StudentClass.ClassIdwhere StudentClass.ClassName=@className--该班级未参加考试人员select @miss=COUNT(*) from Students where StudentId not in (select StudentId from ScoreList) and ClassId=(select top 1 ClassId from StudentClass where ClassName=@className)--该班级缺考人员列表select StudentName,ClassId from Students where StudentId not in (select StudentId from ScoreList) and ClassId=(select top 1 ClassId from StudentClass where ClassName=@className)endgo
declare @className varchar(20)='软件2班'
declare @total int 
declare @miss int
declare @csharp float
declare @db float
exec usp_queryScore @className,@total output,@miss output,@csharp output,@db output
select 班级名= @className ,参考总人数= @total,缺考人数=@miss,Csharp平均分=@csharp,@db 数据库平均分

         C#端调用

        /// <summary>/// 执行存储过程/// </summary>/// <param name="procName">存储过程名</param>/// <param name="paras">参数</param>/// <returns>返回的数据集</returns>public static DataSet ExecutProcedure(string procName,params SqlParameter[] paras){SqlConnection con = new SqlConnection(constr);DataSet set = new DataSet();try{using (SqlCommand com=new SqlCommand()){com.Connection = con;com.CommandText = procName;com.Parameters.AddRange(paras);//指定文本类型com.CommandType = CommandType.StoredProcedure;using (SqlDataAdapter sda=new SqlDataAdapter(com)){sda.Fill(set);                       }}}finally{con.Close();}return set;}public AnalyseResult GetScoreAnalyse(string className){AnalyseResult result = new AnalyseResult();//declare @className varchar(20)//declare @total int//declare @miss int//declare @csharp float//declare @db float//定义参数SqlParameter[] paras = new SqlParameter[]{new SqlParameter("@className",className) ,new SqlParameter("@total",SqlDbType.Int) { Direction = ParameterDirection.Output } ,new SqlParameter("@miss",SqlDbType.Int) { Direction = ParameterDirection.Output } ,new SqlParameter("@csharp",SqlDbType.Float) { Direction = ParameterDirection.Output } ,new SqlParameter("@db",SqlDbType.Float) { Direction = ParameterDirection.Output }};DataSet set = SqlHelper.ExecutProcedure("usp_queryScore", paras);result.Total = Convert.ToInt32(paras[1].Value);result.Missing = Convert.ToInt32(paras[2].Value);result.CSharp = paras[3].Value is DBNull ? 0 : Convert.ToSingle(paras[3].Value);result.Db = paras[4].Value is DBNull ? 0 : Convert.ToSingle(paras[4].Value);//获取集合result.ScoreDataTable = set.Tables[0];result.MissingDataTable = set.Tables[1];return result;}

9,类型转换

--数字不能与字符串通过+直接相加所以使用convert进行转换
select CONVERT(varchar(20), @first)+@second
--获取日期部分
select CONVERT(date,getdate())
--数字转为字符串
select CAST(100 as varchar(20))

10,表格

--创建数据表
if (exists(select * from sysobjects where name='MenuList'))
drop table MenuList
go
create table MenuList
(MenuId int identity(100,1) primary key,MenuName varchar(50),MenuCode varchar(50),Tag int,ParentId int not null
)
go--清空表格
truncate table menulist--彻底删除表格
drop table menulist

11,账号管理

--创建登录账号,登录密码
use master
go
exec sp_addlogin 'lzg','1'
--创建数据库用户,指定用户可以访问哪些数据库
use SMDB
go
exec sp_grantdbaccess 'lzg'--dbo用户
--表示数据库的所有者(DB Owner),无法删除dbo用户,该用户始终出现在每个数据库中。
--abo用户默认分配给sa登录账号--删除登录账号
use master
go
exec sp_droplogin 'lzg'--删除数据库用户
use SMDB
exec sp_dropuser 'lzg'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/619408.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark 应用程序优化和调优总结

文章目录 前言调整 Spark 默认配置查看和设置 Spark 配置信息动态扩展集群负载 数据的缓存和持久化DataFrame.cache()DataFrame.persist()何时缓存和持久化何时不缓存和持久化 Spark 中的 JOINs广播连接排序合并连接 总结 前言 本文总结了 Spark 中比较重要和常用的调优手段&a…

RedisTemplate

3.3.RedisTemplate 在Sentinel集群监管下的Redis主从集群&#xff0c;其节点会因为自动故障转移而发生变化&#xff0c;Redis的客户端必须感知这种变化&#xff0c;及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。 下面&#xff0c;我们…

一二三应用开发平台使用手册——系统管理-用户-使用说明

概述 对于新系统&#xff0c;如果说初始化组织机构是第一步工作&#xff0c;那么初始化用户则是第二步工作。今天来介绍系统管理模块中的用户使用说明。 对于企业应用&#xff0c;人员是重要的基础数据。 在不少平台和系统中&#xff0c;对“人”的概念进一步细分&#xff0c;…

个人网站制作 Part 19 添加在线聊天支持 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加在线聊天支持&#x1f528;使用在线聊天工具&#x1f527;步骤 1: 选择在线聊天工具&#x1f527;步骤 2: 注册Tawk.to账户&#x1f527;步骤 3: 获取嵌入代码 &…

LeetCode 53. 最大子序和

解题思路 相关代码 class Solution {public int maxSubArray(int[] nums) {//f[i]是以nums[i]结尾的连续子数组的最大和。int f[] new int[100010];f[0] nums[0];int resnums[0];for(int i1;i<nums.length;i){f[i] Math.max(f[i-1]nums[i],nums[i]);res Math.max(res,f…

SQLite---调试提示(十九)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite Android 绑定&#xff08;十八&#xff09; 下一篇&#xff1a;从 SQLite 3.4.2 迁移到 3.5.0&#xff08;二十&#xff09; ​ 以下是 SQLite 开发人员跟踪、检查和了解 核心 SQLite 库。 这些技术旨在帮助理解 核…

【前端工程化指南】什么是版本控制系统?

什么是版本控制系统 想必大家在多人开发时一定会遇到这样的问题&#xff1a; 每次集中合并大家的代码都要通过U盘、网盘等各类传输工具集中代码&#xff0c;非常麻烦。在多人同时修改同一文件或相同部分代码时&#xff0c;可能会产生冲突&#xff0c;开发人员需要手动比较代码…

内网渗透-Earthworm的简单使用(内网穿透工具)

Earthworm的简单介绍&#xff08;一&#xff09; 文章目录 EarthWorm下载地址1. 普通网络 1.1 跳板机存在公网IP 1.1.1 网络环境1.1.2 使用方法1.1.3 流量走向 1.2 跳板机不存在公网IP&#xff0c;可出网 1.2.1 网络环境1.2.2 使用方法1.2.3 流量走向 2. 二级网络 2.1 一级跳…

「51媒体」中小初创企业如何做好媒体宣传?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 中小初创企业在做媒体宣传时&#xff0c;由于通常资源有限&#xff0c;需要更加精明地使用外部资源来提升品牌知名度和业务成长。利用专业的媒体服务商可以是一个非常有效的方法。 明确目…

C/C++基础----内存相关

malloc分配内存 用法 参数为要开辟内存的大小&#xff08;字节为单位&#xff09;返回值为void*,所以要强转一下语法&#xff1a;malloc()动态开辟20个字节的内存&#xff0c;代码&#xff1a;#include <iostream>using namespace std;int main() {int *a (int *) mal…

集合体系java

Collection:单列集合&#xff1a;每个元素只包含一个值 Collection集合存储的是地址 Collection的三种遍历方法如下 //迭代器是用来遍历集合的专用方式&#xff08;数组没有迭代器&#xff09;&#xff0c;在java中迭代器的代表是Iterator //boolean hasNext():询问当前位置…

排序算法-基数排序

基数排序是一种非比较排序算法&#xff0c;它将待排序的数字按照位数进行排序。基数排序的思想是先按照个位数进行排序&#xff0c;然后按照十位数进行排序&#xff0c;接着按照百位数进行排序&#xff0c;以此类推&#xff0c;直到最高位排序完成。 基数排序的步骤如下&#x…