數據庫的應用詳解三


數據庫的應用詳解三

  承接上一篇文章:《ADO.NET實例教學二》中設計到的多條件搜索的內容,下面我們就先針對這部分的內容進行深入的講解。

                       

一、做好准備

在什么情況下會遇到多條件搜索呢?在生活中有沒有遇到類似的多條件搜索的情況。在什么地方見到過呢?

在淘寶上就有多條件搜索,還有就是像中關村在線的網站,還有就是我們去大的圖書大廈也會遇到多條件搜索。

 

二、畫好我們做多條件搜索的界面

那么當我點擊搜索的時候,怎么來拼Sql語句呢?由於用戶可能輸入某一列,也可能不輸某一列。這個組合就有很多種。如果我寫很多種的sql語句,肯定能實現這個需求,但是寫起來太麻煩。能不能有個簡單的辦法呢?

 

三、不合適的地方

這么解決這個問題,

 

四、多條件搜索以及初步解決辦法代碼

多條件搜索以及初步解決辦法代碼插入位置:

View Code
 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 }

五、多條件查詢拼接字符串的代碼

多條件查詢拼接字符串的代碼插入位置:

View Code
  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的代碼插入位置:

View Code
  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選擇器)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM