4.2 普通查询方案
4.2.1 单字段精确查询的实现
在开发网站过程中经常遇到单字段精确查询。单字段精确查询是指根据浏览者输入或选择的条件进行精确查询,经常应用在对于查询结果要求比较精确的页面。在设计单字段精确查询时,一般通过文本框、下拉列表框或单选按钮组获取查询条件。无论查询条件是由文本框提供,下拉列表框提供,还是由单选按钮组提供,其实现的方法都是类似的。下面将以单文本框精确查询为例介绍单字段精确查询的实现。
1.方案分析
单字段精确查询就是指在一个查询中,只有一个用于输入查询条件的文本框。浏览者只能查找与输入的查询关键字完全匹配的数据。单文本框精确查询经常应用于查询某一固定信息的情况下。例如查询手机号码、车牌号码归属地或根据会员名称查询会员的订单信息等。
在实现单文本框精确查询时,首先需要确定检索词并设置查询条件,然后编写检索式,最后输出查询结果。为了使读者更好的理解单文本框精确查询,下面给出单文本框精确查询的流程图,如图4.21所示。
图4.21 单文本框精确查询的示意图
2.实施过程
实例位置:光盘\mr\04\4.2\4.2.1\01
在开发酒店管理系统时,在房间信息维护模块中,有查询房间的功能。由于房间的号码是惟一的,所以这里的查询功能就用到了单字段的精确查询。根据输入的房间号码,用户可以很快的检索出对应的信息,如图4.22和图4.23所示。

图4.22 房间查询界面

图4.23 根据查询条件查询的结果
程序实现具体步骤:
(1)新建一个网站命名为01,默认主页为Default.aspx。
(2)在Default.aspx页中添加两个TextBox控件,分别用于输入登录的用户名和密码,然后再添加一个Button控件用于登录。
(3)新建一个名为RoomManage.aspx的页,在页面中添加一个TextBox控件,用于输入查询的关键字,添加一个Button控件用于提交查询关键字,添加一个GridView控件用于显示数据。
(4)新建一个名为RoomModify.aspx的页,在页面上添加两个TextBox控件,分别用于显示房间位置和房间描述,再添加一个DropDownList控件用于显示房间类型。
(5)程序主要代码如下。
首先在Web.config文件中进行数据库连接配置,具体代码如下。
<appSettings>
<add key="dsn" value="server=.;database=db_04;uid=sa;pwd="/>
</appSettings>
在Default.aspx页中实现了用户的登录,通过输入的用户名和密码进行查询,如果数据库中存在此用户名和密码,就会允许进入系统,否则将会提示重新登录,具体代码如下。
protected void ImageButton2_Click(object sender, ImageClickEventArgs e)
{
//从文件Web.config中读取连接字符串
string strconn = ConfigurationSettings.AppSettings["dsn"];
//连接本地计算机的HMS数据库
SqlConnection cn = new SqlConnection(strconn);
cn.Open();
//构造SQL语句,该语句在Users表中检查用户名和密码是否正确
string mysql = "select * from Users where Uid='" + tbx_uid.Text + "'and UPassword='" + tbx_upassword.Text + "'";
//创建Command对象
SqlCommand cm = new SqlCommand(mysql, cn);
//执行ExecuteReader ()方法
SqlDataReader dr = cm.ExecuteReader();
if (dr.Read())
{
lbl_message.Text = "";
//保存当前用户名及用户权限
Session["uid"] = dr["uid"].ToString();
Session["upower"] = dr["upower"].ToString();
lbl_message.Text = "欢迎您!" + Session["uid"];
if (Session["upower"].ToString() == "1")
{ //进入酒店总管界面
Response.Redirect("roommanage.aspx");
}
else if (Session["upower"].ToString() == "2")
{ //进入酒店前台界面
Response.Redirect("roomlist.aspx");
}
}
else
{
lbl_message.Text = "对不起,您的用户名/密码不正确,请重新输入";
}
//关闭连接
cn.Close();
}
在RoomManage.aspx页中,当页面加载的时候会调用自定义的BindGrid方法显示所有的房间信息,具体代码如下。
protected void Page_Load(object sender, System.EventArgs e)
{
if (Session["uid"]!="")
{
if (!IsPostBack) BindGrid();
}
else
{
Page.RegisterStartupScript("", "<script>alert('请登录')</script>");
}
}
//自定义一个BindGrid方法用于显示所有的房间信息
public void BindGrid()
{ //从文件Web.config中读取连接字符串
string strconn= ConfigurationSettings.AppSettings["dsn"];
//连接本地计算机的HMS数据库
SqlConnection cn= new SqlConnection (strconn);
//创建SqlDataAdapter对象,调用存储过程
SqlDataAdapter da=new SqlDataAdapter ("guestroomlist",cn);
//创建并填充DataSet
DataSet ds=new DataSet ();
da.Fill (ds);
GridView1.DataSource = ds;
GridView1.DataKeyNames = new string[] { "RID"};
GridView1.DataBind();
cn.Close ();
}
在ID属性为tbx_rid的文本框中输入要查询的关键字,然后单击“开始”按钮进行查询。程序将文本框中输入的值赋值给varrid,然后再通过Response.Redirect ("roommodify.aspx?rid="+varrid)将文本框的值传递给查询结果显示页面roommodify.aspx,代码如下。
protected void btn_search_Click(object sender, System.EventArgs e)
{
int varrid=0;
try
{
varrid=Convert.ToInt32 (tbx_rid.Text .ToString ());
}
catch
{
Response.Write("输入房号有误,请返回!");
Response.End();
}
Response.Redirect ("roommodify.aspx?rid="+varrid);
}
如果数据很多需要分页,会通过下面的代码对分页进行数据绑定。
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
BindGrid();
}
单击“删除”按钮,程序会根据每条信息的编号进行删除,具体代码如下。
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//对GuestRoom表进行删除
//从文件Web.config中读取连接字符串
string strconn = ConfigurationSettings.AppSettings["dsn"];
//连接本地计算机的HMS数据库
SqlConnection cn = new SqlConnection(strconn);
cn.Open();
SqlCommand cm = new SqlCommand("guestroomdelete", cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add("@RID", SqlDbType.VarChar);
//从GridView中取得更新内容
cm.Parameters["@RID"].Value = GridView1.DataKeys[e.RowIndex].Value;
cm.ExecuteNonQuery();
cn.Close();
GridView1.EditIndex = -1;
BindGrid();
}
在roommodify.aspx中, 通过接收传递过来的值在数据库中进行查询,之后将查询的结果依次绑定到不同的控件上显示出来,代码如下。
protected void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{ //绑定房间类型信息下拉列表框
string strconn= ConfigurationSettings.AppSettings["dsn"];
//连接本地计算机的数据库
SqlConnection cn0= new SqlConnection (strconn);
cn0.Open ();
string mysql="select * from RoomType ";
SqlCommand cm0=new SqlCommand (mysql,cn0);
SqlDataReader dr0=cm0.ExecuteReader ();
while(dr0.Read ())
{
ddl_rtype.Items .Add (new ListItem(dr0["tname"].ToString(),dr0["tid"].ToString()) );
}
cn0.Close ();
//绑定各TextBox数据
//连接本地计算机的数据库
SqlConnection cn= new SqlConnection (strconn);
cn.Open ();
string key = Request.QueryString["rid"].ToString();
string sqlstr = "Select TID,Tname,Tprice,RID,Rtype,Rposition,Rdescribe from RoomType,GuestRoom where GuestRoom.RType=RoomType.TID AND GuestRoom.RID="+key;
SqlCommand cm=new SqlCommand (sqlstr,cn);
SqlDataReader dr=cm.ExecuteReader ();
if(dr.Read ())//存在对应项
{
lbl_rid.Text =dr["rid"].ToString ();
tbx_rposition.Text =dr["rposition"].ToString ();
tbx_rdescribe.Text =dr["rdescribe"].ToString ();
ddl_rtype.Items.FindByValue(dr["rtype"].ToString ()).Selected =true;
}
else
{
Response.Write ("对不起,没有该房间信息");
Response.End ();
}
}
}
3.补充说明
单字段精确查询的查询条件,除了可以通过文本框获取外,还可以通过单选按钮组、下拉列表框等表单元素获取。下面将介绍通过单选按钮组和下拉列表框指定查询条件的应用范围及获取查询条件的方法。
① 通过单选按钮组获取查询条件
通过单选按钮组获取查询条件,适用于查询关键字取值固定,且数目较少的情况。例如:在开发电子商务网站后台管理系统时,在商品管理板块中,通过一个单选按钮组来确定要查询的商品是否为新品,如图4.24所示。

图4.24 通过单选按钮组获取查询条件
SQL语句代码如下。
"select * from tb_goods where newGoods="+Convert.ToInt32(RadioButtonList1.SelectedValue.ToString())
② 通过下拉列表框获取查询字段
利用下拉列表框进行查询,可以动态的选择要查询的字段。例如:在开发明日博客后台管理系统时,在管理员信息板块中,通过下拉列表框获取查询的字段,然后在关键字的文本框中输入要查询的关键字,如图4.25所示。

图4.25 通过下拉列表获取查询字段
通过下拉列表获取查询字段的SQL语句如下。
"select * from user where"+ddlzd.SelectedValue.ToString()+"="+txtKeyWord.Text.Trim().ToString()
4.2.2 多字段精确查询的实现
多字段精确查询是指浏览者根据程序提供的多个字段输入或选择查询关键字进行精确查询。多字段精确查询通常包括两个或两个以上用于指定查询条件的文本框或下拉列表框。无论查询条件是由文本框提供,还是由下拉列表框提供,其实现的方法是类似的。下面将以多列表查询为例介绍多字段精确查询的实现。
1.方案分析
多列表查询是指在一个查询中,可以包含两个或两个以上的下拉列表框。浏览者不但可以根据某一个列表框的值进行查询,还可以根据多个列表框的值组合后进行查询。通常应用在查询条件是某一类固定值的情况下。
在实现多列表查询时,首先需要确定检索词并选择查询条件,然后编写检索式将用户选择的多个查询条件组合为一个查询条件,最后输出查询结果。为了使读者更好地理解多列表查询,下面以带有3个列表框的多列表查询为例给出多列表查询的示意图,如图4.26所示。
图4.26 多列表查询的示意图
2.实施过程
实例位置:光盘\mr\04\4.2\4.2.2\01
在开发明日车辆管理系统时,制作出很多功能板块。在历史用车板块中,用户可以对数据进行多字段精确查询。用户可以对“用车单位”、“车牌号码”和“驾驶员”进行选择,然后在数据库中检索出符合这三个条件的所有数据,运行效果如图4.27和4.28所示。

图4.27 “历史用车”的所有记录
在用车单位的下拉列表中选择“国际学院音乐系“,车辆号码的下拉列表中选择”云c9919**“,驾驶员的下拉列表中选择”彭*伟“,单击【查询】按钮,查询出所有与查询条件相关的数据并显示出来,如图4.28所示。

图4.28 多字段精确查询得到的记录
程序实现具体步骤:
(1)新建一个网站命名为01,默认主页为Default.aspx。
(2)在Default.aspx页中添加两个TextBox控件,分别用于输入登录的用户名和密码,然后再添加一个Button控件用于登录。
(3)新建ASPX页,命名为car_jilu.aspx,在页面中添加3个DropDownList控件,分别用于设置查询用车单位、车辆号码和驾驶员。添加一个GridView控件用于显示查询结果数据。
(4)程序主要代码如下。
首先在Web.config文件中进行数据库连接配置,具体代码如下。
<appSettings>
<add key="ConnString" value="server=(local);uid=sa;pwd=;database=db_04"></add>
</appSettings>
进入后台主界面,单击左侧导航菜单中的“历史用车”,界面转到car_jilu.aspx页面。当此页面第一次加载时,调用usecar_DataBind方法将数据库中的相应数据绑定到显示“用车单位”、“车辆号码”和“驾驶员”的三个下拉列表,具体代码如下。
private void usecar_DataBind()
{
string SqlConn=System.Configuration.ConfigurationSettings.AppSettings["ConnString"];
SqlConnection Conn=new SqlConnection(SqlConn);
Conn.Open();
string SqlStr1="select id as '编号',carcode as '车牌号码',cartype as '车辆类型',caruser as '驾驶员',carcompany as '用车单位',carstate as '状态',carxingcheng as '车辆行程',carregtime as '用车日期',carmobile as '联系方式'from [beifen] order by id DESC";
SqlCommand Comm=new SqlCommand(SqlStr1,Conn);
DataSet ds=new DataSet();
SqlDataAdapter dr=new SqlDataAdapter(SqlStr1,Conn);
dr.Fill(ds,"beifen");
GridView1.DataSource=ds.Tables["beifen"].DefaultView;
GridView1.DataBind();
string SqlStr2="select * from [bumen]";
SqlDataAdapter de=new SqlDataAdapter(SqlStr2,Conn);
de.Fill(ds,"bumen");
this.DropDownList1.DataSource=ds.Tables["bumen"].DefaultView;
this.DropDownList1.DataTextField="type";
this.DropDownList1.DataValueField="type";
this.DropDownList1.DataBind();
string SqlStr3="select car_code from [car]";
SqlDataAdapter dw=new SqlDataAdapter(SqlStr3,Conn);
dw.Fill(ds,"carcode");
this.DropDownList2.DataSource=ds.Tables["carcode"].DefaultView;
this.DropDownList2.DataTextField="car_code";
this.DropDownList2.DataValueField="car_code";
this.DropDownList2.DataBind();
string SqlStr4="select name from [user] where part='院办(车队)'";
SqlDataAdapter dq=new SqlDataAdapter(SqlStr4,Conn);
dq.Fill(ds,"user");
this.DropDownList3.DataSource=ds.Tables["user"].DefaultView;
this.DropDownList3.DataTextField="name";
this.DropDownList3.DataValueField="name";
this.DropDownList3.DataBind();
Conn.Close();
}
当数据过多而需要分页的时候,通过下面的代码进行分页的数据绑定,具体代码如下。
private void GridView1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
DataBind();
}
当选择好查询条件,然后单击“查询”按钮进行查询,然后将查询结果绑定到GridView数据控件上显示出来,具体代码如下。
protected void Button3_Click(object sender, EventArgs e)
{
string SqlConn = System.Configuration.ConfigurationSettings.AppSettings["ConnString"];
SqlConnection Conn = new SqlConnection(SqlConn);
Conn.Open();
string SqlStr = "select id as '编号',carcode as '车牌号码',cartype as '车辆类型',caruser as '驾驶员',carcompany as '用车单位',carstate as '状态',carxingcheng as '车辆行程',carregtime as '用车日期',carmobile as '联系方式'from [beifen] where caruser='" + this.DropDownList3.SelectedValue + "' and carcompany like '%" + this.DropDownList1.SelectedValue + "%' and carcode='" + this.DropDownList2.SelectedValue + "' order by id DESC";
DataSet ds = new DataSet();
SqlDataAdapter dr = new SqlDataAdapter(SqlStr, Conn);
dr.Fill(ds, "beifen");
GridView1.DataSource = ds.Tables["beifen"].DefaultView;
GridView1.DataBind();
Conn.Close();
}
3.补充说明
实现多列表查询时,最重要也是最困难的就是如何组合查询条件了。在组合查询条件前,需要了解多列表查询可能出现的条件组合方式。由于多列表查询在设置查询条件时比较灵活,即浏览者可以只选择某一个查询条件,也可以选择任意两个或多个查询条件,还可以同时选择全部查询条件,选择的查询条件越多,查询结果越精确。下面以带有4个列表框的多列表查询为例给出可能存在的条件组合方式,如图4.29所示。
图4.29 多列表查询可能出现的条件组合方式
4.2.3 简单模糊查询的实现
在进行数据查询时,经常会使用模糊查询方式。模糊查询是指根据浏览者输入的条件进行模式匹配,即将输入的查询条件按照指定的通配符与数据表中的数据进行匹配,查找符合条件的数据。模糊查询一般应用在不能准确写出查询条件的情况。在设计模糊查询时,一般通过文本框获取查询条件,这样可以例查询更为灵活。所谓简单模糊查询是指,在一个查询中,只有一个用于指定查询条件的文本框。下面将以单文本框模糊查询为例介绍简单模糊查询的实现。
1.方案分析
单文本框模糊查询是指在一个查询中,只有一个用于输入查询条件的文本框。单文本框模糊查询经常应用于根据查询关键查找部门匹配或完全匹配的情况下。例如查询新闻内容、商品信息或某一主题的博客信息等。
在实现单文本框模糊查询时,首先需要确定检索词并设置模式匹配方式,然后根据选择的匹配方式编写检索式,最后输出查询结果。为了使读者更好地理解单文本框模糊查询,下面给出单文本框模糊查询的示意图,如图4.30所示。
图4.30 单文本框模糊查询的示意图
有时用户对查询数据表中的数据了解的不全面,例如不能确定所要查询人的姓名只知道他姓李、查询某个人的联系方式只知道其电话是以“3451”结尾等,这时需要使用LIKE进行模糊查询。LIKE关键字需要使用通配符在字符串内查找指定的模式,所以读者需要了解通配符及其含义。通配符的含义如表4.4所示。
表4.4 LIKE关键字中的通配符及说明
|
通配符 |
说明 |
|
% |
由零个或更多字符组成的任意字符串 |
|
_ |
任意单个字符 |
|
[ ] |
用于指定范围,例如[A~F],表示A到F范围内的任何单个字符 |
|
[^ ] |
表示指定范围之外的,例如[ ^ A~F]范围以外的任何单个字符 |
2.实施过程
实例位置:光盘\mr\04\4.2\4.2.3\01
在开发都市网络新闻中心系统时,主页面上方提供了查询功能,此查询支持模糊查询,如图4.31所示。在“输入关键字”处输入要查询的部分关键字,单击“站内搜索”按钮,下方将显示查询结果。

图4.31 单文本框模糊查询
注意:此查询中按新闻内容进行查询,而不是新闻标题。
程序实现具体步骤:
(1)新建一个网站命名为01,默认主页为Default.aspx。
(3)再新建一个名为search.aspx的页,在页面中添加一个TextBox控件,用于输入查询的关键字。再添加一个DataList控件用于显示数据。再添加一个Button控件用于执行查询操作。
(3)程序主要代码如下
首先在Web.config文件中进行数据库连接配置,具体代码如下。
<appSettings>
<add key="conStr" value="Server=(local);database=db_04;Uid=sa;Pwd=" />
</appSettings>
自定义的BaseClass类,用于执行对数据库的各种操作,具体代码如下。
/// <summary>
/// 说明:MessageBox用来在客户端弹出对话框。
/// 参数:TxtMessage 对话框中显示的内容。
/// </summary>
public string MessageBox(string TxtMessage)
{
string str;
str = "<script language=javascript>alert('" + TxtMessage + "')</script>";
return str;
}
/// <summary>
/// 说明:ExecSQL用来执行SQL语句。
/// 返回值:操作是否成功(True\False)。
/// 参数:sQueryString SQL字符串
/// </summary>
public Boolean ExecSQL(string sQueryString)
{
SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["conStr"]);
con.Open();
SqlCommand dbCommand = new SqlCommand(sQueryString, con);
try
{
dbCommand.ExecuteNonQuery();
con.Close();
}
catch
{
con.Close();
return false;
}
return true;
}
/// <summary>
/// 说明:GetDataSet数据集,返回数据源的数据集
/// 返回值:数据集DataSet
/// 参数:sQueryString SQL字符串,TableName 数据表名称
/// </summary>
public System.Data.DataSet GetDataSet(string sQueryString, string TableName)
{
SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["conStr"]);
con.Open();
SqlDataAdapter dbAdapter = new SqlDataAdapter(sQueryString, con);
DataSet dataset = new DataSet();
dbAdapter.Fill(dataset, TableName);
con.Close();
return dataset;
}
/// <summary>
/// 说明:SubStr用来将字符串保留到指定长度,将超出部分用“...”代替。
/// 返回值:处理后的这符串。
/// 参数: sString原字符串。
/// nLeng长度。
/// </summary>
public string SubStr(string sString, int nLeng)
{
if (sString.Length <= nLeng)
{
return sString;
}
int nStrLeng = nLeng - 3;
string sNewStr = sString.Substring(0, nStrLeng);
sNewStr = sNewStr + "...";
return sNewStr;
}
/// <summary>
/// 说明:过滤危险字符
/// 返回值:处理后的这符串。
/// 参数: str原字符串。
/// </summary>
public string HtmlEncode(string str)
{
str = str.Replace("&", "&");
str = str.Replace("<", "<");
str = str.Replace(">", ">");
str = str.Replace("'", "''");
str = str.Replace("*", "");
str = str.Replace("\n", "<br/>");
str = str.Replace("\r\n", "<br/>");
//str = str.Replace("?","");
str = str.Replace("select", "");
str = str.Replace("insert", "");
str = str.Replace("update", "");
str = str.Replace("delete", "");
str = str.Replace("create", "");
str = str.Replace("drop", "");
str = str.Replace("delcare", "");
if (str.Trim().ToString() == "") { str = "无"; }
return str.Trim();
}
/// <summary>
/// 防止SQL 注入试攻击
/// </summary>
/// <param name="loginName">用户登录名称</param>
/// <param name="loginPwd">用户登录密码</param>
public int checkLogin(string loginName,string loginPwd)
{
SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["conStr"]);
SqlCommand myCommand = new SqlCommand("select count(*) from tbuser where Name=@loginName and PassWord=@loginPwd", con);
myCommand.Parameters.Add(new SqlParameter("@loginName", SqlDbType.NVarChar, 20));
myCommand.Parameters["@loginName"].Value = loginName;
myCommand.Parameters.Add(new SqlParameter("@loginPwd", SqlDbType.NVarChar, 20));
myCommand.Parameters["@loginPwd"].Value = loginPwd;
myCommand.Connection.Open();
int i=(int)myCommand.ExecuteScalar();
myCommand.Connection.Close();
return i;
}
在开发都市网络新闻中心系统时,将搜索页面放在名为menu.axcs的Web用户控件中,然后将查询条件赋值给一个Session变量,再转定向到查询显示页面search.aspx。
menu.axcs中“站内搜索”按钮下的代码如下:
protected void cmdSearch_Click(object sender, EventArgs e)
{
Session["tool"] = "都市新闻网络中心->站内查询---输入关键字为"" + TextBox1.Text + """;
Session["search"] = "select * from tbnews where Title like '%" + TextBox1.Text + "%'";
Response.Redirect("search.aspx");
}
在search.aspx页中,首先创建一个BaseClass对象,然后通过调用其GetDataSet方法将查询得到的数据绑定到DataList控件上显示出来,具体代码如下:
BaseClass bc = new BaseClass();
protected void Page_Load(object sender, EventArgs e)
{
DataList1.DataSource = bc.GetDataSet(Convert.ToString(Session["search"]), "tb_news");
DataList1.DataKeyField = "id";
DataList1.DataBind();
Label1.Text = Convert.ToString(Session["tool"]);
}
protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
string id = DataList1.DataKeys[e.Item.ItemIndex].ToString();
Response.Write("<script language=javascript>window.open('showNews.aspx?id=" + id + "','','width=520,height=260')</script>");
}
3.补充说明
通过LIKE进行模糊查询时,除了都市网络新闻中心系统使用的默认查询外,还有左匹配和右匹配查询,用到的通配符分别为:X%和%X,其中X代表关键字。所谓的左匹配就是被查询的数据是以关键字X开头的,而右匹配则是被查询的数据是以关键字X结尾的。
当然,除了以上几种通配符外,还有“_”通配符、“[ ]”通配符和“[^ ]”通配符。
① “_”通配符
“_”号表示任意单个字符,该符号只能匹配一个字符,利用“_”号可以作为通配符组成匹配模式进行查询。
例如:在student表中,查询姓“李”的并且名字只是两个字的同学信息。
在查询分析器中输入的SQL语句如下:
use student
select *
from students
where 姓名 like '李_'
“_”符号可以放在查询条件的任意位置,且只能代表一个字符。
例如:在students表,查询姓“李”的并且末尾字“葱”的同学信息。
在查询分析器中输入的SQL语句如下:
use student
select * from students
where 姓名 like '李_*'
② “[ ]”通配符
在模式查询中可以使用“[ ]”符号来查询一定范围内的数据。“[ ]”符号用于表示一定范围内的任意单个字符,它包括两端数据。
例如:在students表中,查询电话号码以'3451'结尾并且开头数字位于1~5之间的学生信息。
在查询分析器中输入的SQL语句如下:
use student
select *
from students
where 联系方式 like '[1-5]3451'
例如:在grade表中,查询学号是“MR001”~“MR003”之间的学生成绩信息。SQL语句如下:
use student
select * from grade
where 学号 like 'MR00[1-3]'
③ “[^ ]”通配符
在模式查询中可以使用“[^ ]”符号来查询不在指定范围内的数据。“[^ ]”符号用于表示不在某范围内的任意单个字符,它包括两端数据。
例如:在students表中,查询电话号码以'3451'结尾,但不以2开头的学生信息。
在查询分析器中输入的SQL语句如下:
use student
select *
from students
where 联系方式 like '[^2]3451'
4.2.4 查询排序的实现
在实际开发中可能会要求查询生成的结果按照一定的顺序表示出来。排序可以基于某个属性的值,相等时根据第二个属性的值,若还相等,可以根据第三个属性的值,以此类推,只要在select-from-where语句中加入一个子句ORDER BY就可以实现对查询结果的排序。
1.方案分析
排序的关键字是order by ,默认状态下是升序,关键字是asc。如果要实现降序排列,则可使用desc。按照某一个字段排序,排序的字段可以是数值型,也可以是字符型、日期和时间型。具体流程如图4.32所示。
图4.32 查询排序
2.实施过程
实例位置:光盘\mr\04\4.2\4.2.4\01
查询排序即是对数据按照指定的方式进行排序,例如升序或者降序等。在开发都市网络新闻中心后台管理系统时,当管理员要查询某个栏目的内容时,查询结果可以按照某个字段升序或者降序,都市网络新闻中心后台管理系统是按照ID字段升序进行排列的,运行效果如图4.33所示。

图4.33 查询结果按照升序排列
程序实现具体步骤:
(1)新建一个网站命名为01,默认主页为Default.aspx。
(3)再新建一个名为manage的文件夹,在此文件夹中新建一个名为list.aspx的页,在页面中添加一个TextBox控件,用于输入查询的关键字。再添加一个GridView控件用于显示数据。添加一个DropDownList控件,用于选择查询的范围。添加一个Button控件,用于执行查询操作。
(3)程序主要代码如下。
首先在Web.config文件中进行数据库连接配置,具体代码如下。
<appSettings>
<add key="conStr" value="Server=(local);database=db_04;Uid=sa;Pwd=" />
</appSettings>
在都市网络新闻中心的后台管理系统中,根据下拉选框的选择项来判断关键字所属的类别代码中的BaseClass为开发者定义的一个类,具体代码可参见4.2.3节。
当页面加载时将所有的新闻都绑定到GridView控件上显示出来,具体代码如下。
BaseClass bc = new BaseClass();
static string strStyle;
static int pagecount = 0;
protected void Page_Load(object sender, EventArgs e)
{
int n = Convert.ToInt16(Request.QueryString["id"]);
switch (n)
{
case 1: strStyle = "style='时政要闻'";
break;
case 2: strStyle = "style='经济动向'";
break;
case 3: strStyle = "style='世界军事'";
break;
case 4: strStyle = "style='科学教育'";
break;
case 5: strStyle = "style='法治道德'";
break;
case 6: strStyle = "style='社会现象'";
break;
case 7: strStyle = "style='体育世界'";
break;
case 8: strStyle = "style='时尚娱乐'";
break;
default: strStyle = "style like '%%'";
break;
}
GridView1.DataSource = bc.GetDataSet("select * from tbNews where " + strStyle + "order by id", "tbNews");
GridView1.DataKeyNames = new string[] { "id" };
GridView1.DataBind();
}
当设置好查询条件之后,单击“站内查询”按钮,程序会将语句"select * from tbnews where style='" + DropDownList1.Text + "' and content like '%" + TextBox1.Text + "%'"传递给自定义类BaseClass中的GetDataSet方法,具体代码如下。
protected void cmdSearch_Click(object sender, EventArgs e)
{
string strSql = "select * from tbnews where style='" + DropDownList1.Text + "' and content like '%" + TextBox1.Text + "%'";
GridView1.DataSource = bc.GetDataSet(strSql, "tbNews");
GridView1.DataKeyNames = new string[] { "id" };
GridView1.DataBind();
}
3.补充说明
当对某个表进行多级排序时,首先要明确的一点就是order by的多级排序并不是同时进行的,而是当指定的第一列相同时,才执行对指定的第二列进行排序。
order by子句会根据查询结果中的一个列或多个列对查询结果进行排序。第一个排序项是主要的排序依据,其次那些是次要的排序依据。
例如:在grade表中,按照学生的“课程成绩”升序排列,然后再按照“学期”降序排序。SQL语句如下:
use student
select * from grade order by 课程成绩,学期 desc
在order by列表中不允许使用子查询、聚合表达式或常量表达式。但是,用户可以在选择列表为聚合表达式指定的一个名称,然后在order by子句中引用这个指定的名称。
例如:在grade表中,按照学生的平均成绩排序。SQL语句如下:
use student
select 课程代号,avg(课程成绩) as 平均成绩 from grade
group by 课程代号 order by 平均成绩






