一、基本操作

1、将数据绑定到DataGridVirw控件上显示的数据列标题将会是数据库中的字段名称,可以在使用select语句时使用AS关键字将转化为列名的别名

select name AS 姓名 from tb_Student;

 使用空格也行的

select name  姓名 from tb_Student;

2、在列上进行计算

select stu_id as 学号,stu_math as 数学,stu_english as 英语,stu_chinese as 语文,stu_math+stu_english+stu_chinese as 总成绩  from Students;

3、查询空数据is null

select * from Student where stu_birthday IS NULL;

4、利用变量查询日期型数据,方便查错

string sqlStr=string.Format("select stu_name,stu_age,stu_birthday from students where stu_age={0}",age);

 5、查询第10名到第20名的数据top

select top 10 * from
         (select top 20 * from Students order by 总分 DESC)  
as 中等名次 order by 总分 ASC ;

6、根据随机生成数查询记录rand

select * from Students where stu_id=20101810+Floor(Rand()*10);
--Rand()函数用于产生0-1之间的随机数,Floor()函数用于对小数数值向下取整

7、根据查询数值的符号显示具体的文本 case

select myValue as 数值,
        case when sign(myValue)=1 then '正数' else
        case when sign(myVaule)=-1 then '负数' else
        '' end
end
as 判断数值
from Students;
select stu_name, stu_math,
case when stu_math>=60 then '通过'
     when stu_math=60 then '刚及格'
     else '不及格'
end
as 及格否
from Students;

8、实现字符串大小的转换lower  upper

select friendNmae as 字符串,
         Lower(friendName) as 转换为小写,
         Upper(friendName) as 转换为大写
from Students;

9、返回字符在字符串中出现的次数Len

select stu_name,len(stu_name) as 字符数量 from students;

10、返回字符串中的子串substring

select 学生姓名,所在学院,substring(所在学院,3,2) as 所在学院的子串 from Students;--substring(所在学院,3,2)索引从1开始,截取从第3个字符开始的长度为2字符串

11、删除字符串中的子串stuff

select stuff(所在学院,2,3,'') as 删除后的字符串 from Students;

12、获取指定字符所在的索引charindex

select 所在学院,charindex('学院',所在学院) as 索引位置 from Students;

13、替换字符串replace

select 所在学院,replace(所在学院,'学院','xueyuan') as 替换后的信息 from Students;

14、比较两个字符串

select 性别 ,case when 性别='' then '男同学'  else '女同学' end as 性别 from Students;

15、使用In引入子查询限定查询范围,还有Not in

select 学生姓名,性别,年龄 from tb_Student where 学生编号 not in (select 学生编号 from tb_Grade where 总分>500 and 总分<690);

16、交叉表查询:直观、方便的显示了数据之间的关系

Transform SUM(数量) as 库存数量 
select 语言类别 from 图书排行 where 语言类别 in ('C','Java','VB') group by 语言类别 pivot 分析时间 ;

17、在查询语句中使用格式化函数

select 员工姓名,出生时间,format(出生时间,'yyyy年mm月dd日') as 格式化后的出生日期 from 员工生日表 ;

 

select 员工姓名,format(出生日期,'yyyy年mm月dd日') as 出生日期,datediff('yyyy',出生日期,Date()) as 年龄 from 员工表 ;

18、索引:  用的好的话能够大幅度提高查询效率
        数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

索引是对数据库表中一个或多个列(例如,employee 表的姓氏 (lname) 列)的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),在索引中查找,但索引是经过某种算法优化过的,查找次数要少的多的多。可见,索引是用来定位的。
索引分为聚簇索引非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。
select * from Students where stu_id=001;

这条查询语句这样执行,遍历整个数据表,直到找到stu_id=001的这行数据,接下来采用使用索引的方式查询该条数据

create unique index index_Stu_id on Students(stu_id);

建立多重索引

create index myIndex  on Students(stu_id,stu_name);

删除索引

drop index Students.index_Students_stu_name;

创建聚簇索引:聚簇索引可以按照物理磁盘相近的位置索引数据记录,而且在一个数据表中只允许有一个聚簇索引

create clustered index index_Student on Students(学生编号);

优缺点:

建立索引的目的是加快对表中记录的查找排序。
为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。 

19、存储过程:这个很好用,需要灵活运用,提高执行效率

数据库中的存储过程是一种已经编译好的程序,存储过程可以由一系列的代码组成,并实现指定的功能。

存储过程的优点:

存储过程具有一定的安全性,当存储过程被创建后,只有具有了权限的用户才可以使用它;存储过程可以提高数据查询速度,一般的查询语句每执行一次则需要编译一次,存储过程只有在创建时才进行编译,以后再次执行时则不需要编译。

create proc proc_GetStudent--创建存储过程
as
select st.Stu_id,st.Stu_name,st.Stu_age,gr.Stu_score
from Students as st
inner join Grade as gr
on st.Stu_id=gr.Stu_id;--设置数据表连接规则

 修改存储过程名称:exec sp_rename 'proc_Select','proc_SelectAll'--前面一个是原存储过程名,后面一个是newProcName

use testDB--创建存储过程
go 
create procedure pro_Student
as
select distinct Students.stu_id as 学号,Students.stu_name as 姓名,Students.stu_age as 年龄 from Students
where Students.stu_address like'%郑州%';
go

exec pro_Student--调用存储过程
go

 

use testDB
go

if exists (select name from sysobjects where name='pro_Student' and type='P')--判断该存储过程是否存在,所以我们该注意命名规范的问题
     drop procedure pro_Student
go

create procedure pro_Students
as
select Students.stu_address as 地址 from Students inner join  Score on Students.stu_id=Score.stu_id
go

exec pro_Students
go

SQL Server基本操作积累

声明带参数的存储过程

use testDB;
go
create procedure proc_InsertStudents
@stu_name varchar(20),
@stu_sex bit,
@stu_age int,
@stu_birthday date,
@stu_address varchar(50)
as
insert into Students(stu_name,stu_sex,stu_age,stu_birthday,stu_address)
values(@stu_name,@stu_sex,@stu_age,@stu_birthday,@stu_address);
go

调用该存储过程

execute proc_InsertStudents '张三09',1,22,'1990-09-09','江苏省昆山市';
execute proc_InsertStudents @stu_name='你好哦',@stu_sex=0,@stu_age=21,@stu_birthday='1989-08-09',@stu_address='河北省济源市';
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace ProcedureInsert
{
    public partial class Frm_Main : Form
    {
        public Frm_Main()
        {
            InitializeComponent();
        }

        private void Frm_Main_Load(object sender, EventArgs e)
        {
            dgv_Message.DataSource = GetMessage();//设置数据源
        }

        private void btn_Add_Click(object sender, EventArgs e)
        {
            CreateProcedure();//创建存储过程并查询
        }


        /// <summary>
        /// 创建存储过程添加数据记录并查询
        /// </summary>
        private void CreateProcedure()
        {
            string P_Str_ConnectionStr = string.Format(//创建数据库连接字符串
                @"server=WIN-GI7E47AND9R\LS;database=db_TomeTwo;uid=sa;pwd=");
            string P_Str_SqlStr = string.Format(//创建SQL查询字符串
                @"SELECT CASE WHEN EXISTS
(SELECT * FROM sysobjects WHERE id=object_id('dbo.proc_InsertStudent') 
AND XTYPE='p')
THEN '存在' 
ELSE '不存在' 
END");
            using (SqlConnection sc = //创建数据库连接对象
                new SqlConnection(P_Str_ConnectionStr))
            {
                sc.Open();//打开数据库连接
                SqlCommand P_cmd =//创建数据库命令对象
                    new SqlCommand(P_Str_SqlStr, sc);
                SqlDataReader sdr =//得到数据读取器
                    P_cmd.ExecuteReader();
                sdr.Read();//读取一条记录
                if (sdr[0].ToString() == "存在")//判断存储过程是否存在
                {
                    sdr.Close();//关闭数据读取器
                    P_cmd.CommandType = CommandType.StoredProcedure;//设置命令类型
                    P_cmd.CommandText = "proc_InsertStudent";//设置存储过程
                    P_cmd.CommandType = CommandType.StoredProcedure;//设置命令类型
                    P_cmd.Parameters.Add("学生编号", SqlDbType.Int).Value =//添加参数
                        int.Parse(txt_Id.Text);
                    P_cmd.Parameters.Add("学生姓名", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_Name.Text;
                    P_cmd.Parameters.Add("性别", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_Sex.Text;
                    P_cmd.Parameters.Add("出生年月", SqlDbType.SmallDateTime).Value =//添加参数
                        txt_BirthDay.Text;
                    P_cmd.Parameters.Add("年龄", SqlDbType.Int).Value =//添加参数
                        int.Parse(txt_Age.Text);
                    P_cmd.Parameters.Add("所在学院", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_School.Text;
                    P_cmd.Parameters.Add("所学专业", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_Subject.Text;
                    P_cmd.Parameters.Add("家庭住址", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_Address.Text;
                    P_cmd.Parameters.Add("统招否", SqlDbType.Bit).Value =//添加参数
                        txt_Yes.Text == "" ? 1 : 0;
                    P_cmd.Parameters.Add("备注信息", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_Message.Text;
                    P_cmd.ExecuteNonQuery();//添加数据
                    dgv_Message.DataSource = GetMessage();//设置数据源
                }
                else
                {
                    sdr.Close();//关闭数据读取器
                    string P_Str_Cmd = string.Format(//创建SQL字符串
       @"CREATE PROC proc_InsertStudent
@学生编号    int,
@学生姓名    nvarchar(50),
@性别    nvarchar(50),
@出生年月    smalldatetime,
@年龄    int,
@所在学院    nvarchar(50),
@所学专业    nvarchar(50),
@家庭住址    nvarchar(50),
@统招否    bit,
@备注信息    nvarchar(50)
AS
INSERT INTO tb_Student(学生编号,学生姓名,性别,出生年月,年龄,所在学院,所学专业,家庭住址,统招否,备注信息)
values(@学生编号,@学生姓名,@性别,@出生年月,@年龄,@所在学院,@所学专业,@家庭住址,@统招否,@备注信息)");
                    P_cmd.CommandText = P_Str_Cmd;//设置执行的SQL语句
                    P_cmd.ExecuteNonQuery();//添加存储过程
                    P_cmd.CommandType = CommandType.StoredProcedure;//设置命令类型
                    P_cmd.CommandText = "proc_InsertStudent";//设置存储过程
                    P_cmd.CommandType = CommandType.StoredProcedure;//设置命令类型
                    P_cmd.Parameters.Add("学生编号", SqlDbType.Int).Value =//添加参数
                        int.Parse(txt_Id.Text);
                    P_cmd.Parameters.Add("学生姓名", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_Name.Text;
                    P_cmd.Parameters.Add("性别", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_Sex.Text;
                    P_cmd.Parameters.Add("出生年月", SqlDbType.SmallDateTime).Value =//添加参数
                        txt_BirthDay.Text;
                    P_cmd.Parameters.Add("年龄", SqlDbType.Int).Value =//添加参数
                        int.Parse(txt_Age.Text);
                    P_cmd.Parameters.Add("所在学院", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_School.Text;
                    P_cmd.Parameters.Add("所学专业", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_Subject.Text;
                    P_cmd.Parameters.Add("家庭住址", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_Address.Text;
                    P_cmd.Parameters.Add("统招否", SqlDbType.Bit).Value =//添加参数
                        txt_Yes.Text == "" ? 1 : 0;
                    P_cmd.Parameters.Add("备注信息", SqlDbType.NVarChar, 50).Value =//添加参数
                        txt_Message.Text;
                    P_cmd.ExecuteNonQuery();//添加数据
                    dgv_Message.DataSource = GetMessage();//设置数据源
                }
            }
        }

        private void btn_Remove_Click(object sender, EventArgs e)
        {
            string P_Str_ConnectionStr = string.Format(//创建数据库连接字符串
@"server=WIN-GI7E47AND9R\LS;database=db_TomeTwo;uid=sa;pwd=");
            string P_Str_SqlStr = string.Format(//创建SQL字符串
                @"SELECT CASE WHEN EXISTS
(SELECT * FROM sysobjects WHERE id=object_id('dbo.proc_InsertStudent') 
AND XTYPE='p')
THEN '存在' 
ELSE '不存在' 
END");
            using (SqlConnection sc =//创建数据库连接对象
                new SqlConnection(P_Str_ConnectionStr))
            {
                sc.Open();//打开数据库连接
                SqlCommand P_cmd =//创建数据库命令对象
                    new SqlCommand(P_Str_SqlStr, sc);
                SqlDataReader sdr =//得到数据读取器
                    P_cmd.ExecuteReader();
                sdr.Read();//读取一条记录
                if (sdr[0].ToString() == "存在")
                {
                    sdr.Close();//关闭数据读取器
                    P_cmd.CommandText =//设置执行的SQL语句
                        "drop proc proc_InsertStudent";
                    P_cmd.ExecuteNonQuery();//删除存储过程
                }
            }
        }

        /// <summary>
        /// 查询数据库信息
        /// </summary>
        /// <returns>方法返回DataTable对象</returns>
        private DataTable GetMessage()
        {
            string P_Str_ConnectionStr = string.Format(//创建数据库连接字符串
                @"server=WIN-GI7E47AND9R\LS;database=db_TomeTwo;uid=sa;pwd=");
            string P_Str_SqlStr = string.Format(//创建SQL查询字符串
                @"SELECT * FROM tb_Student");
            SqlDataAdapter P_SqlDataAdapter = new SqlDataAdapter(//创建数据适配器
                P_Str_SqlStr, P_Str_ConnectionStr);
            DataTable P_dt = new DataTable();//创建数据表
            P_SqlDataAdapter.Fill(P_dt);//填充数据表
            return P_dt;//返回数据表
        }
    }
}
View Code

相关文章:

  • 2022-01-06
  • 2021-11-14
  • 2022-12-23
  • 2021-11-28
  • 2021-07-22
  • 2021-12-25
  • 2021-05-24
  • 2021-08-14
猜你喜欢
  • 2021-09-25
  • 2022-12-23
  • 2022-12-23
  • 2021-08-05
  • 2021-12-03
  • 2021-06-28
  • 2022-12-23
相关资源
相似解决方案