首页 > phper

SELECT查询的应用

比如我们要从很多文章的标题中找到所有包含"MySQL"这个字眼的文章。这就应该在 WHERE 子句中用到 "LIKE",就是模糊查询。
 
  首先交待一下SQL语言中的统配符,统配符就是用一个字符统一匹配任何字符,SQL中,一个字符"_"匹配单个的任何字符;一个字符"%"匹配任何零个到多个字符。举例来说,"A_" 可以匹配诸如 "AA"、"AB"、"A2"、"A$"……等等;而 "A%" 可以匹配 "ABCD"、"A"、"AG$Bng0"、"An apple is just an apple."……等等。
 
  怎么用呢?还是举个实际的例子:工厂仓库里的东东,很多、很杂,要分成几大类来管理:比如A类代表机配件,B类代表工具,C类代表包装材料……等等,每一类下面的东东再分别编号,如"A0001"、"A1065"、"B1014"等。在管理这个数据库的时候,编号作为一个字段,这个字段不仅作为该物品的代号,同时也表明了它的类别。当你要查询所有的工具时,可以这样:
SELECT * FROM goods WHERE code LIKE 'B%' ORDER BY code'
这样就是查询code这个字段(就是编号)为字母B打头的所有记录。注意这里'B%'表示字母B是出现在字段的开头,与下一个例子不同:查找文章标题中含有"MySQL"这个字眼的所有文章,因为要查找的目标"MySQL"不一定出现在文章标题的什么位置上,所以应该:
SELECT * FROM articles WHERE title LIKE '%MySQL%'
'%MySQL%'的意思是"MySQL"这个字眼出现在标题中,它的前面可能有文字,后面也可能有文字。
 
  既然查"MySQL"可以,查别的字眼未尝不可以。可以让浏览者自己输入他要搜索的关键字,就是这样:
<!--input.php:-->
<form method="get" action="search.php">
关键字:<input type="text" size=10 name="key"> <input type="submit" value="查询">
</form>
<!--search.php:-->
<?
...
$query="select * from article where title like '%$key%'";
$result=$mysql_query($query,$db);
...
?>
  注意在使用模糊查询时,有一种情况应该小心,就是当一个字段是类似 '2,13,25,33' 这样的值时,若要查询它其中是否包含'2'这一项,就不能简单的用 '%2%' 来查询。因为如果这样,一个这样的值也会被查询到:'1,6,21,27'。这并不是我们所希望的。所以在处理这样的问题时,应该将该字段存为 '.2.13.25.33.' 的形式。这样当需要查询包含'2'这一项的记录,就可以放心的用 '%.2.%' 了。
 

  时间仓促,草草成稿;如有不确,务请指正。

阅读全文

特殊数据(SQL)

特殊数据包括不能用前面所述的二进制、字符、Unicode、日期和时间、数字和货币数据类型表示的数据。
Microsoft&reg; SQL Server&#8482; 2000 包含四种特殊数据类型:
timestamp
用于表示 SQL Server 在一行上的活动顺序,按二进制格式以递增的数字来表示。当表中的行发生变动时,用从 @@DBTS 函数获得的当前数据库的时间戮值来更新时间戮。timestamp 数据与插入或修改数据的日期和时间无关。若要自动记录表中数据更改的时间,使用 datetime 或 smalldatetime 数据类型记录事件或触发器。
说明 在 SQL Serve 中 rowversion 是 timestamp 的同义词。
bit
bit 数据类型只能包括 0 或 1。可以用 bit 数据类型代表 TRUE 或 FALSE、YES 或 NO。例如,询问客户是否为初次访问的问题可存储在 bit 列中。
uniqueidentifier
以一个 16 位的十六进制数表示全局唯一标识符 (GUID)。当需要在多行中唯一标识某一行时可使用 GUID。例如,可使用 unique_ identifier 数据类型定义一个客户标识代码列,以编辑公司来自多个国家/地区的总的客户名录。
sql_variant
一种存储 SQL Server 所支持的各种数据类型(text、ntext、timestamp 和 sql_variant 除外)值的数据类型。
table
一种特殊的数据类型,存储供以后处理的结果集。table 数据类型只能用于定义 table 类型的局部变量或用户定义函数的返回值。
用户定义
允许使用用户定义数据类型,例如,product_code 可设计为基于 char 数据类型的两个大写字母后跟 5 位供应商号码的格式。

阅读全文

如何修护MYSQL数据表

如果数据表有问题,可以利用--recover --quick参数做修补的工作:
linux#myisamchk --recover --quick tbl_name
linux#isamchk --recover --quick tbl_name
如果上面的方法不能解决问题,可以将--quick参数去掉:
linux#myisamchk --recover tbl_name
linux#isamchk --recover tbl_name
如果还是不能解决问题,可以再试着改用--safe_recover参数:
linux#myisamchk --safe_recover --quick tbl_name
linux#isamchk --safe_recover --quick tbl_name

阅读全文

怎样获得SQL Server的优化性能?

为了最大程度优化SQL Server的性能, 首先您必须确定几个方面。当这几个方面得到优化时,可以最大程度的提高整个系统性能。然后您可以针对这几个方面进行分析。否则,您可能事倍功半。
经验证明,SQL Server的性能提高主要取决于逻辑数据库设计,索引设计和查询设计。
 反之,最大的性能问题也往往源于这几个方面的设计缺陷。
 如果数据库性能是一个关注焦点,您应该首先着眼这几个方面,因为在此的很小的投资可以带来很大的利益。
而其它系统级的性能问题, 例如内存、高速缓存、 硬件等, 的确值得研究。经验证明系统在这些方面容量越大,性能越高。
 SQL Server对现有硬件资源采用自动方式管理,从而减少系统级的手工调整。

阅读全文

收集SQL Server统计信息

问:我需要在运行SQL Server的机器上定期收集诸如每秒处理事务数(tps)之类的统计信息。为此,我大量使用了Performance Monitor(性能监视器),但却不能得到DBA所需的SQL Server性能指标。请问是否存在能够轻松收集这类统计信息的实用工具?
答:针对SQL Server的Performance Monitor计数器之一便能收集tps,因此,使用Performance Monitor是捕获这项指标最便捷的方式。您可以通过Microsoft Windows&reg; NT Server 4.0 Resource Kit或Microsoft Windows 2000 Server Resource Kit以服务的形式安装Performance Monitor。此外,我建议您阅读Steve Adrien DeLuca等人所著的《Microsoft SQL Server 7.0 Performance Tuning Technical Reference》以学习关于测试有用SQL Server性能数据的内容。
——Microsoft项目经理,Richard Waymire

阅读全文

如何锁定MYSQL数据表

在进行数据表检查或修补时,可以先将数据表锁定,可确保数据表的安全:
mysql>LOCK TABLE tbl_name READ;
mysql>FLUSH TABLES;
将数据表锁定后再进行检查或修补的工作。完成后再解除锁定:
mysql>UNLOCK TABLES;
//LOCK TABLE tbl_name READ表示要锁定成只读状态,在这个状态下用户只能读取数据表,不能写入。
LOCK TABLE tbl_name WRITE则是更严格的锁定,用户不能读取也不能写入。

阅读全文

SQL Server如何解决加密问题?

Microsoft SQL Server的6.0和6.5版本中,16位和32位客户软件在使用多协议网络库时设置加密选项可以进行数据在线加密。
 SQL Server依靠Microsoft Windows NT RPC 应用程序接口来完成网络数据加密。
 Windows NT RPC使用40位RC4加密方法。这种方法允许出口,所以美国和国际版的这种加密方法没有区别。

阅读全文

事务日志被填满的原因是什么?

SQL Server事务日志可能会被填满,这会阻止之后的数据库操作,包括UPDATE, DELETE, INSERT 和CHECKPOINT。
事务日志填满会导致1105错误:
Can't allocate space for object syslogs in database dbname because
the logsegment is full。
 If you ran out of space in syslogs, dump
the transaction log。
 Otherwise use ALTER DATABASE or
sp_extendsegment to increase the size of the segment。
这种现象可能出现于任何一个数据库中,包括Master和TempDB。一些难以预见的因素可能消耗日志空间。
 例如:
一个大型事务, 尤其像批量数据更新、插入或删除。
一个未提交的事务。
检查点处理程序截除时所需的带宽过大。
截除时超过阈值
上述各种条件互相作用的结果。
用于发布的标记事务没有被日志读取程序读走

阅读全文

如何在应用程序中避免死锁问题?

任何基于锁的并发系统的一个不可避免的特点是在某些条件下系统可能阻塞。当一个连接占有一个锁而另一个连接试图改变锁的状态时,第二个连接要么等待第一个连接释放锁,要么因此而被阻塞。
为了获得最好的可扩展性,性能和并发能力,在设计应用程序和查询语句时,应该注意尽量缩短事务的长度, 并且减少占有锁的时间。大多数并发问题往往出现在应用程序和数据库的设计阶段,因此,设计阶段如果充分考虑这个因素至关重要。
 否则,应用程序就会存在潜在的潜能缺陷, 而且一般要到应用程序扩展性测试时才被发现。

阅读全文

MySQL中文模糊检索问题的解决方法

在 MySQL 下,在进行中文模糊检索时,经常会返回一些与之不相关的
记录,如查找 "%a%" 时,返回的可能有中文字符,却没有 a 字符存在。
本人以前也曾遇到过类似问题,经详细阅读 MySQL 的 Manual ,发现可以
有一种方法很方便的解决并得到满意的结果。
例子:
·希望通过“标题”对新闻库进行检索,关键字可能包含是中英文,如
下 SQL 语句:
select id,title,name from achech_com.news where title like '%a%'
返回的结果,某些 title 字段确定带了“a”关键字,而有些则只有中文,
但也随之返回在检索结果中。
解决方法,使用 BINARY 属性进行检索,如:
select id,title,name from achech_com.news where binary title like '%a%'
返回的结果较之前正确,但英文字母区分大小写,故有时在检索如“Achech”
及“achech”的结果是不一样的。
知道了使用 BINARY 属性可以解决前面这个问题,再看看 MySQL 支持的
UCASE 及 CONCAT 函数,其中 UCASE 是将英文全部转成大写,而 CONCAT 函
数的作用是对字符进行连接,以下是我们完全解决后的 SQL 语句:
select id,title,name from achech_com.news where binary ucase(title) like concat('%',ucase('a'),'%')
检索的步骤是先将属性指定为 BINARY ,以精确检索结果,而被 like 的 title
内容存在大小写字母的可能,故先使用 ucase 函数将字段内容全部转换成大
写字母,然后再进行 like 操作,而 like 的操作使用模糊方法,使用 concat
的好处是传进来的可以是直接的关键字,不需要带“%”万用符,将“'a'”直接
换成你的变量,在任何语言下都万事无忧了。
当然你也可以这么写:
select id,title,name from achech_com.news where binary ucase(title) like ucase('%a%')
检索的结果还算满意吧,不过速度可能会因此而慢N毫秒喔。
作者:林兴陆·Linxinglu@ihw.com.cn
相关资料:
Relate:
20.16 Case Sensitivity in Searches
By default, MySQL searches are case-insensitive (although there are some character sets that are never case insensitive, such as czech). That means that if you search with col_name LIKE 'a%', you will get all column values that start with A or a. If you want to make this search case-sensitive, use something like INDEX(col_name, "A")=0 to check a prefix. Or use STRCMP(col_name, "A") = 0 if the column value must be exactly "A".

阅读全文

ms sql删除重复的记录

: 我在ms sql中建了一个表,可由于种种原因有些记录重复了
: 记录完全的一模一样。
: 现在我想把重复的都删掉,只保留重复记录中的第一条。
: 我在database好象看到有介绍oracle的,
select distinct * into #table_name from table_name
delete from table_name
select * into table_name from #table_name
drop table #table_name
与此相关的是“select into”选项,可以在数据库属性
对话框中,勾起来此项,或者在Query Analyzer中执行
execute sp_dboption 'db_name','select into','true'
开启。默认值是关闭的。

阅读全文

在ACCESS 中调用后台存储过程

ACCESS是一个Client/Server的优秀前端开发工具,具有易学易用,界面友好,开发简单,和其他数据库接口灵活。但是,它要对大量数据处理时,速度比较慢。深圳供电局现有60万用户,下面有6个营业所,通过64K DDN 和局相连,如果有一个营业所要对1万用户进行处理的话,要花2~3小时,严重影响其他业务的开展。所以,当有大量数据需要处理时,不能在Client端处理,而必须在Server端处理。
 但ACCESS和Server端之间多数通过ODBC来连接,这样就增加了调用后台存储过程的难度。笔者通过在实际工作中长期的摸索,根据不同的业务需要,可以用下面三种方法去调用后台存储过程。
  一、 Access 向后台提交作业,这一个个作业对应一个个的存储过程。在SQL Server 6.5中,通过Task Manager 来建立相应的Task; 而在Oracle 8.0中,通过Managing Job Queue 来建立相应的Job。在Access中,在job_list表中插入一个作业,这些作业一般每天晚上运行一次。这些作业对应的业务一般是需要处理非常大量数据,而实时性又是较低的,在我们的业务中比较典型的例子是每天晚上大量的电费计算。
  二、 在Server端建立一些触发器(Trigger),在Access中激活这些触发器。在SQL Server 6.5 和Oracle 8.0中,都是通过Create Trigger 来实现。在Access中,根据不同的业务,通过插入、修改、删除记录来激活不同触发器。在我们的业务中一个例子是,当业务人员修改用户的电表读数后,激活计算电费的触发器,能立即重新计算该用户的电费。这样子,既可以和批量计算电费共享同一程序,不用在Access端重新开发,有可以加快前端的响应速度。
  三、 以上二种方法,只可以说是间接调用后台存储过程,Access还提供一种直接调用的方法,可以用Access 传递查询直接将命令发送到数据库服务器。
  建立Access 传递查询步骤如下:
  (1) 在数据库窗口中单击“查询”选项卡,然后单击“新建”按钮。
  (2) 在“新建查询”对话框中单击“设计视图”选项,然后单击“确定”按钮。
  (3) 在“显示表”对话框内单击“关闭”按钮。
  (4) 在“查询”菜单上,指到“SQL 语句条件”,然后单击“传递”命令。
  (5) 在工具栏上,请单击“属性”按钮 以显示查询属性表。
  (6) 在查询属性表中,请设置“ODBC 连接字符串”属性来指定要连接的数据库信息。可以输入连接信息: ”ODBC;DSN=ntserver0;UID=sa;PWD=;DATABASE=BMS”,或用“生成器”按钮生成。

阅读全文