数据库的应用详解三
承接上一篇文章:《ADO.NET实例教学二》中设计到的多条件搜索的内容,下面我们就先针对这部分的内容进行深入的讲解。
一、做好准备
在什么情况下会遇到多条件搜索呢?在生活中有没有遇到类似的多条件搜索的情况。在什么地方见到过呢?
在淘宝上就有多条件搜索,还有就是像中关村在线的网站,还有就是我们去大的图书大厦也会遇到多条件搜索。
二、画好我们做多条件搜索的界面
那么当我点击搜索的时候,怎么来拼Sql语句呢?由于用户可能输入某一列,也可能不输某一列。这个组合就有很多种。如果我写很多种的sql语句,肯定能实现这个需求,但是写起来太麻烦。能不能有个简单的办法呢?
三、不合适的地方
这么解决这个问题,
四、多条件搜索以及初步解决办法代码
多条件搜索以及初步解决办法代码插入位置:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace _9._7多条件搜索 11 { 12 public partial class Form1 : Form 13 { 14 public Form1() 15 { 16 InitializeComponent(); 17 } 18 19 private void button1_Click(object sender, EventArgs e) 20 { 21 //作者 书名 出版社 类别 22 23 //列名:author作者 、bookName 书名、 Publish出版社、Category分类 24 25 //1.假设我的sql语句放在StringBuilder里面。 26 StringBuilder sbSql = new StringBuilder(); 27 //2.从哪张表里面查询 28 //解决2增加where,如果用户什么都不输,写个空where也不合适。 29 //where1=1这个条件永远成立,如果查询所有的条件加跟不加一样的。如果后面有子查询,后面用and拼就行了。 30 sbSql.Append("select*from Books where 1=1 "); 31 //3.判断用户是否输入 32 if (txtAuthor.Text.Length>0) 33 { 34 //解决1,把第一个换成and,where什么时候增加呢? 35 sbSql.Append(" and author like '%" + txtAuthor.Text.Trim() + "%'"); 36 } 37 //这不能用else if 38 if (txtBookName.Text.Length>0) 39 { 40 sbSql.Append(" and bookname like '%" + txtBookName.Text.Trim() + "%'"); 41 } 42 if (txtPublish.Text.Trim().Length>0) 43 { 44 sbSql.Append(" and publish like '%" + txtPublish.Text.Trim() + "%'"); 45 } 46 if (txtCategory.Text.Trim().Length>0) 47 { 48 //大家思考一下由于这个类别,图书表中引用类别id,类别id不是模糊查询。 49 sbSql.Append(" and categoryId=" + txtCategory.Text.Trim() + ""); 50 } 51 MessageBox.Show(sbSql.ToString()); 52 } 53 } 54 }
五、多条件查询拼接字符串的代码
多条件查询拼接字符串的代码插入位置:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace _9._7多条件搜索 11 { 12 public partial class Form1 : Form 13 { 14 public Form1() 15 { 16 InitializeComponent(); 17 } 18 19 private void button1_Click(object sender, EventArgs e) 20 { 21 //作者 书名 出版社 类别 22 23 //列名:author作者 、bookName 书名、 Publish出版社、Category分类 24 #region 解决办法1 25 ////1.假设我的sql语句放在StringBuilder里面。 26 //StringBuilder sbSql = new StringBuilder(); 27 ////2.从哪张表里面查询 28 ////解决2增加where,如果用户什么都不输,写个空where也不合适。 29 ////where1=1这个条件永远成立,如果查询所有的条件加跟不加一样的。如果后面有子查询,后面用and拼就行了。 30 //sbSql.Append("select*from Books where 1=1 "); 31 ////3.判断用户是否输入 32 //if (txtAuthor.Text.Length>0) 33 //{ 34 // //解决1,把第一个换成and,where什么时候增加呢? 35 // sbSql.Append(" and author like '%" + txtAuthor.Text.Trim() + "%'"); 36 //} 37 ////这不能用else if 38 //if (txtBookName.Text.Length>0) 39 //{ 40 // sbSql.Append(" and bookname like '%" + txtBookName.Text.Trim() + "%'"); 41 //} 42 //if (txtPublish.Text.Trim().Length>0) 43 //{ 44 // sbSql.Append(" and publish like '%" + txtPublish.Text.Trim() + "%'"); 45 //} 46 //if (txtCategory.Text.Trim().Length>0) 47 //{ 48 // //大家思考一下由于这个类别,图书表中引用类别id,类别id不是模糊查询。 49 // sbSql.Append(" and categoryId=" + txtCategory.Text.Trim() + ""); 50 //} 51 //MessageBox.Show(sbSql.ToString()); 52 #endregion 53 54 #region 解决办法2 55 //解决办法,前面声明个list集合, 56 List<string> listWheres = new List<string>(); 57 //1.假设我的sql语句放在StringBuilder里面。 58 StringBuilder sbSql = new StringBuilder(); 59 //2.从哪张表里面查询 60 //解决办法,前面不加where1=1,就是个查询 61 sbSql.Append("select*from Books"); 62 //3.判断用户是否输入 63 if (txtAuthor.Text.Length > 0) 64 { 65 //把条件加到list集合里面了。 66 listWheres.Add(" author like '%" + txtAuthor.Text.Trim() + "%'"); 67 } 68 //这不能用else if 69 if (txtBookName.Text.Length > 0) 70 { 71 listWheres.Add(" bookname like '%" + txtBookName.Text.Trim() + "%'"); 72 } 73 if (txtPublish.Text.Trim().Length > 0) 74 { 75 listWheres.Add(" publish like '%" + txtPublish.Text.Trim() + "%'"); 76 } 77 if (txtCategory.Text.Trim().Length > 0) 78 { 79 //大家思考一下由于这个类别,图书表中引用类别id,类别id不是模糊查询。 80 listWheres.Add(" categoryId=" + txtCategory.Text.Trim() + ""); 81 } 82 //如果list的count>0,证明里面有条件,count<0,证明没有条件 83 if (listWheres.Count>0) 84 { 85 //如果有查询条件就让sql语句,append 86 //where后面还得增加其它的条件,这是个字符串的list集合,如果把集合中的每一个元素用and连起来就行了。 87 //但是每个元素用and连起来,我们想到了string.join了。 88 sbSql.Append(" where "); 89 //把后面变成字符串数组。返回值是条件 90 string where=string.Join(" and " ,listWheres.ToArray()); 91 //然后再加上where 92 sbSql.Append(where); 93 MessageBox.Show(sbSql.ToString()); 94 } 95 else 96 { 97 MessageBox.Show(sbSql.ToString()); 98 } 99 100 #endregion 101 } 102 } 103 }
六、带参数的Sql语句怎么写?如何调用SqlHelper?
七、解决模糊查询怎么写,如何调用SqlHelper。
解决模糊查询怎么写,如何调用SqlHelper的代码插入位置:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using _9._7复习内容; 10 using System.Data.SqlClient; 11 12 namespace _9._7多条件搜索 13 { 14 public partial class Form1 : Form 15 { 16 public Form1() 17 { 18 InitializeComponent(); 19 } 20 21 private void button1_Click(object sender, EventArgs e) 22 { 23 //作者 书名 出版社 类别 24 25 //列名:author作者 、bookName 书名、 Publish出版社、Category分类 26 #region 解决办法1 27 ////1.假设我的sql语句放在StringBuilder里面。 28 //StringBuilder sbSql = new StringBuilder(); 29 ////2.从哪张表里面查询 30 ////解决2增加where,如果用户什么都不输,写个空where也不合适。 31 ////where1=1这个条件永远成立,如果查询所有的条件加跟不加一样的。如果后面有子查询,后面用and拼就行了。 32 //sbSql.Append("select*from Books where 1=1 "); 33 ////3.判断用户是否输入 34 //if (txtAuthor.Text.Length>0) 35 //{ 36 // //解决1,把第一个换成and,where什么时候增加呢? 37 // sbSql.Append(" and author like '%" + txtAuthor.Text.Trim() + "%'"); 38 //} 39 ////这不能用else if 40 //if (txtBookName.Text.Length>0) 41 //{ 42 // sbSql.Append(" and bookname like '%" + txtBookName.Text.Trim() + "%'"); 43 //} 44 //if (txtPublish.Text.Trim().Length>0) 45 //{ 46 // sbSql.Append(" and publish like '%" + txtPublish.Text.Trim() + "%'"); 47 //} 48 //if (txtCategory.Text.Trim().Length>0) 49 //{ 50 // //大家思考一下由于这个类别,图书表中引用类别id,类别id不是模糊查询。 51 // sbSql.Append(" and categoryId=" + txtCategory.Text.Trim() + ""); 52 //} 53 //MessageBox.Show(sbSql.ToString()); 54 #endregion 55 56 #region 解决办法2 57 //解决办法,前面声明个list集合, 58 List<string> listWheres = new List<string>(); 59 //一开始写了一个list集合,存的是字符串,再存个东西 60 //存参数对象 61 List<SqlParameter> listParams=new List<SqlParameter>(); 62 //1.假设我的sql语句放在StringBuilder里面。 63 StringBuilder sbSql = new StringBuilder(); 64 //2.从哪张表里面查询 65 //解决办法,前面不加where1=1,就是个查询 66 sbSql.Append("select*from Books"); 67 //3.判断用户是否输入 68 if (txtAuthor.Text.Length > 0) 69 { 70 //把条件加到list集合里面了。无论是模查询,还是用普通查询,直接写参数就可以了。模糊查询的话,变下面。 71 listWheres.Add(" author like @author"); 72 //只要加了个参数,向参数集合里面也加一个 73 //这样的话最后,我让这个集合.toarray就参数数组了 74 listParams.Add(new SqlParameter("@author","%"+txtAuthor.Text.Trim()+"%")); 75 } 76 //这不能用else if 77 if (txtBookName.Text.Length > 0) 78 { 79 listWheres.Add(" bookname like @bkName"); 80 listParams.Add(new SqlParameter("@bkName","%"+txtBookName.Text.Trim()+"%")); 81 } 82 if (txtPublish.Text.Trim().Length > 0) 83 { 84 listWheres.Add(" publish like @pubName"); 85 listParams.Add(new SqlParameter("@pubName","%"+txtPublish.Text.Trim()+"%")); 86 } 87 if (txtCategory.Text.Trim().Length > 0) 88 { 89 //大家思考一下由于这个类别,图书表中引用类别id,类别id不是模糊查询。 90 listWheres.Add(" categoryId=@cid"); 91 listParams.Add(new SqlParameter("@cid",txtCategory.Text.Trim())); 92 } 93 //如果list的count>0,证明里面有条件,count<0,证明没有条件 94 if (listWheres.Count>0) 95 { 96 //如果有查询条件就让sql语句,append 97 //where后面还得增加其它的条件,这是个字符串的list集合,如果把集合中的每一个元素用and连起来就行了。 98 //但是每个元素用and连起来,我们想到了string.join了。 99 sbSql.Append(" where "); 100 //把后面变成字符串数组。返回值是条件 101 string where=string.Join(" and " ,listWheres.ToArray()); 102 //然后再加上where 103 sbSql.Append(where); 104 MessageBox.Show(sbSql.ToString()); 105 } 106 else 107 { 108 MessageBox.Show(sbSql.ToString()); 109 } 110 //当使用带参数的Sql语句时 111 //问题1:模糊查询怎么写? 112 //如何调用SqlHelper?最后把参数数组传进来 113 SqlHelper.ExecuteDataTable(sbSql.ToString(), listParams.ToArray()); 114 #endregion 115 } 116 } 117 }
关于ADO.net我们先告个小段落,下面我们看下CASE函数的用法:
等值判断,相当于switch case
八、case的最常用的写法
九、case常规写法
十、case的另外一种写法
需要注意的地方,then后面的值的数据类型必须都得一样。
接下来我们做这么几个练习,用下订单表。
在订单表中,统计每个销售员的总销售金额(按销售员来分组),列出销售员名、总销售金额、称号(>6000金牌,>5500银牌,>4500铜牌,否则普通)
十一、练习1答案
十二、练习2
十三、练习2思路
接下来我们说下索引:
大家知道有这么个东西,它是干什么用的就行了。
索引就是方便我们查找的,为了提高查找效率的。就相当于字典的目录。
索引分两种,一种是聚集索引,一种是非聚集索引。
聚集索引,索引的存储顺序跟实际物理顺序一样。
非聚集索引,索引的存储顺序跟实际物理顺序不一样。
一个表中可以建几个聚集索引呢?一个。
非聚集索引可以有多个。
按照某列建完索引以后,按照这列进行排序。
请看下面这幅图:
十四、需要我们看的图
编号就是聚集索引,请从这张表中查询出年龄大于17岁的有谁?一个一个进行比对,效率会很低。
十五、再看一张表
看这张表就能快很多,计算机不是用线来识别的,一下子就定位到了。
这就是一建索引就要排序的原因。
按年龄建的索引叫非聚集索引。
索引里面有个概念叫:填充因子。
索引本身也要占一定得存储空间,也是按页来存储的。
十六、填充因子图示
为什么不存在一页上,要空出来一部分呢?要是插入进一个1.1,就能快速插进去了。填充因子,就是填充百分之多少,预留百分之多少。
索引的缺点就是降低了,插入、更新、修改。
在面试的时候,怎么样提高数据库的查询效率,就是建索引。但是是建完索引以后,速度就一定快了么?也不一定。比如说:按年龄建的索引,但是现在找出xyz开头的人,索引没用上。查询的时候,根据建的索引来查。
(*)即使创建了索引,仍然有可能全表扫描,比如like、函数、类型转换等。
十七、索引的代码写法
--删除索引
drop index T8.IX_T8_tage
T8.IX表名
_T8_tage索引名
其实关于索引还有很多的东西,但是我们程序员理解到这里就足够用了。
接下来我们看下子查询:
什么叫子查询呢?就是这个查询的数据来自上个查询,或者说这个查询中要用到另外个查询的结果。
子查询基本分类:
独立子查询
-子查询可以独立运行
相关子查询
-子查询中引用了父查询中的结果
下面我们看这么一个例子:
十八、独立子查询
还记得我们之前做过个查询最高分,最低分,平均分那个么?
我们用Union all把三个结果放在一起了,这个也叫做一个子查询。
接下来我们看下这个问题,
十九、需要用到的两张表
请查询出高一三班的学生的信息
二十、用子查询帮我们来完成
请查询出所有高一三班和高二一班的同学。
二十一、等于号不能同时等于两个值
二十二、查询结果
要是除了高一三班和高二一班呢?
二十三、除了高一三班和高二一班
二十四、这只能写一列
现在我想查询秦叔宝,关羽,黄忠的考试成绩
二十五、这三个人得成绩
不仅查询的时候能用,删除的时候也能用。
还是上面的问题,我们也可以改成相关子查询来做。
二十六、where条件的执行过程
二十七、用exists来验证
二十八、更进一步证明exists
二十九、看我们画的图去解释这段代码
三十、相关子查询代码
那么所有的查询,所有的子查询包括咱们后面一篇文章里面讲解的连接都可以用相关子查询来做。用普通子查询也能做,相关子查询也可以。
接下来我们说下分页的问题:
现在假如有这么一张表,
三十一、表中有六万条记录
假如现在我们要在一个界面上显示这些数据,是不是一次性的把这六万条数据都查询出来呢?
第一是太大,第二是显示出来,用户一下子也看不了六万条。用户看个五条,十条就够了。所以说,当数据量特别大的时候,给用户显示一次只显示一部分就行了。不要一次显示那么大。
分页怎么做呢?
我们可以把数据都查询出来,然后平均分配。这样做效率太低了。
真正分页的时候是要哪页的数据就查哪页的数据。
题目:假设每页5条。
当前我要查看
第一页:
三十二、查询前五条数据
第三页:
三十三、查询第三页数据
第五页:查询第五页数据的方法跟查询第三页数据一样。
三十四、这么写比较的麻烦
假设自动编号没有问题的情况下,这么做的前提是stuId是连续的并且是不出错的。
三十五、编号没问题的写法
如果自动编号不连续这样做就不合理了。
这时我们按照这个思路,自己加一列,就是把所有查出来的数据从头到尾编个号。
数据库中有500条,只查出来20条,它会把你查出来的20条从头到尾编个号。
如果把数据库中的数据都查出来,它会把表中所有的数据从头到尾编号。
三十六、通过子查询实现分页
之后我们学了存储过程,可以用存储过程封装一个查询分页。
作者近期文章列表:
C#中级进阶教程(完全免费,献给代码爱好者的最好礼物。注:本作者分享自己精心整理的C#中级进阶教程,无任何商业目的。希望与更多的代码爱好者交流心得,也请高手多多指点!!!) | |
ASP.net项目 | 图书商城项目总论 |
三层及其它内容 | 递归 |
三层(一) | |
三层相关案例(及常见的错误) | |
三层实例(内涵Sql CRUD) | |
手写代码生成器 | |
SQL数据库 ADO.net | 数据库的应用图解一 |
数据库的应用详解二 | |
ADO.NET(内涵效率问题) | |
ADO.NET实例教学一 | |
ADO.NET实例教学二 | |
ADO.NET(内含存储过程讲解) | |
面向过程,面向对象中高级 | 面向过程,面向对象的深入理解一 |
面向过程,面向对象的深入理解二 | |
面向对象的深入理解三 | |
无处不在的XML | |
winform基础 | Winform基础 |
winform中常用的控件 | |
面向过程 | 三种循环的比较 |
C#中的方法(上) | |
我们常见的数组 | |
面向对象 | 思想的转变 |
C#中超级好用的类 | |
C#中析构函数和命名空间的妙用 | |
C#中超级好用的字符串 | |
C#中如何快速处理字符串 | |
值类型和引用类型及其它 | |
ArrayList和HashTable妙用一 | |
ArrayList和HashTable妙用二 | |
文件管理File类 | |
多态 | |
C#中其它一些问题的小节 | |
GDI+ | 这些年我收集的GDI+代码 |
这些年我收集的GDI+代码2 | |
HTML概述以及CSS | 你不能忽视的HTML语言 |
你不能忽视的HTML语言2精编篇 | |
你不能忽视的HTML语言3 | |
html-综合篇 | |
CSS基本相关内容--中秋特别奉献 | |
CSS基本相关内容2 | |
JavaScript基础 | JavaScript基础一 |
javascript基础二JavaScript DOM编程 | |
jQuery | jQuery(内涵: jquery选择器) |