<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>最优良人 &#187; mysql</title>
	<atom:link href="http://www.zui88.com/view-tag/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://www.zui88.com/blog</link>
	<description>中山php&#124;最优网络</description>
	<lastBuildDate>Mon, 13 May 2013 04:56:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>mysql STRICT_TRANS_TABLES严格模式下提示Field &#039;id&#039; doesn&#039;t have a default value</title>
		<link>http://www.zui88.com/blog/view-411.html</link>
		<comments>http://www.zui88.com/blog/view-411.html#comments</comments>
		<pubDate>Wed, 26 Sep 2012 03:42:48 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[STRICT_TRANS_TABLES]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=411</guid>
		<description><![CDATA[在别的服务器运行我的网站程序的时候，出现了Field 'id' doesn't have a default value 的提示，意思是这个值我没有提交数据，并且数据库结构没有设置默认值，由于对方的mysql服务器开启了STRICT_TRANS_TABLES严格模式，所以报错了 解决方法是： 如果自己的服务器，有权限修改my.ini的话，打开my.ini，查找 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 修改为 sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 然后重启MYSQL 在别人的虚拟空间上当然不可能实现，所以根本的解决方法还是修改自己的数据结构，把非空的字段加上默认值，以后设计数据库要注意这一点，方便程序的移植]]></description>
			<content:encoded><![CDATA[<p>在别的服务器运行我的网站程序的时候，出现了Field 'id' doesn't have a default value 的提示，意思是这个值我没有提交数据，并且数据库结构没有设置默认值，由于对方的mysql服务器开启了STRICT_TRANS_TABLES严格模式，所以报错了</p>
<p>解决方法是：</p>
<p>如果自己的服务器，有权限修改my.ini的话，打开my.ini，查找<br />
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"</p>
<p>修改为</p>
<p>sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"</p>
<p>然后重启MYSQL</p>
<p>在别人的虚拟空间上当然不可能实现，所以根本的解决方法还是修改自己的数据结构，把非空的字段加上默认值，以后设计数据库要注意这一点，方便程序的移植</p>
<h2 class="title content-title"></h2>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-411.html/feed</wfw:commentRss>
		<slash:comments>431</slash:comments>
		</item>
		<item>
		<title>mysql所有数据库引擎用法MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE</title>
		<link>http://www.zui88.com/blog/view-277.html</link>
		<comments>http://www.zui88.com/blog/view-277.html#comments</comments>
		<pubDate>Wed, 21 Sep 2011 06:50:37 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[后端程序]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=277</guid>
		<description><![CDATA[MySQL有多种存储引擎，每种存储引擎有各自的优缺点，大家可以择优选择使用： MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。 MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎： · MyISAM管理非事务表。它提供高速存储和检索，以及全文搜索能力。MyISAM在所有MySQL配置里被支持，它是默认的存储引擎，除非你配置MySQL默认使用另外一个引擎。 · MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样，MEMORY和MERGE存储引擎处理非事务表，这两个引擎也都被默认包含在MySQL中。 注释：MEMORY存储引擎正式地被确定为HEAP引擎。 · InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里，你可以按照喜好通过配置MySQL来允许或禁止任一引擎。 · EXAMPLE存储引擎是一个“存根”引擎，它不做什么。你可以用这个引擎创建表，但没有数据被存储于其中或从其中检索。这个引擎的目的是服务，在 MySQL源代码中的一个例子，它演示说明如何开始编写新存储引擎。同样，它的主要兴趣是对开发者。 · NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中，我们想要添加其它平台对这个引擎的支持，包括Windows。 · ARCHIVE存储引擎被用来无索引地，非常小地覆盖存储的大量数据。 · CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。 · BLACKHOLE存储引擎接受但不存储数据，并且检索总是返回一个空集。 · FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中，它只和MySQL一起工作，使用MySQL C Client API。在未来的分发版中，我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。 当你创建一个新表的时候，你可以通过添加一个ENGINE 或TYPE 选项到CREATE TABLE语句来告诉MySQL你要创建什么类型的表： CREATE TABLE t (i INT) ENGINE = INNODB; CREATE TABLE t (i INT) TYPE [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL有多种存储引擎，每种存储引擎有各自的优缺点，大家可以择优选择使用：</p>
<p>MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。</p>
<p>MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎：</p>
<p>· MyISAM管理非事务表。它提供高速存储和检索，以及全文搜索能力。MyISAM在所有MySQL配置里被支持，它是默认的存储引擎，除非你配置MySQL默认使用另外一个引擎。</p>
<p>· MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样，MEMORY和MERGE存储引擎处理非事务表，这两个引擎也都被默认包含在MySQL中。</p>
<p>注释：MEMORY存储引擎正式地被确定为HEAP引擎。</p>
<p>· InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里，你可以按照喜好通过配置MySQL来允许或禁止任一引擎。<br />
· EXAMPLE存储引擎是一个“存根”引擎，它不做什么。你可以用这个引擎创建表，但没有数据被存储于其中或从其中检索。这个引擎的目的是服务，在 MySQL源代码中的一个例子，它演示说明如何开始编写新存储引擎。同样，它的主要兴趣是对开发者。</p>
<p>· NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中，我们想要添加其它平台对这个引擎的支持，包括Windows。</p>
<p>· ARCHIVE存储引擎被用来无索引地，非常小地覆盖存储的大量数据。</p>
<p>· CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。</p>
<p>· BLACKHOLE存储引擎接受但不存储数据，并且检索总是返回一个空集。</p>
<p>· FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中，它只和MySQL一起工作，使用MySQL C Client API。在未来的分发版中，我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。</p>
<p>当你创建一个新表的时候，你可以通过添加一个ENGINE 或TYPE 选项到CREATE TABLE语句来告诉MySQL你要创建什么类型的表：</p>
<p>CREATE TABLE t (i INT) ENGINE = INNODB;</p>
<p>CREATE TABLE t (i INT) TYPE = MEMORY;</p>
<p>虽然TYPE仍然在MySQL 5.1中被支持，现在ENGINE是首选的术语。</p>
<p>如何选择最适合你的存储引擎呢？</p>
<p>下述存储引擎是最常用的：</p>
<p>· MyISAM：默认的MySQL插件式存储引擎，它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意，通过更改STORAGE_ENGINE配置变量，能够方便地更改MySQL服务器的默认存储引擎。</p>
<p>· InnoDB：用于事务处理应用程序，具有众多特性，包括ACID事务支持。</p>
<p>· BDB：可替代InnoDB的事务引擎，支持COMMIT、ROLLBACK和其他事务特性。</p>
<p>· Memory：将所有数据保存在RAM中，在需要快速查找引用和其他类似数据的环境下，可提供极快的访问。</p>
<p>· Merge：允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起，并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。</p>
<p>· Archive：为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。</p>
<p>· Federated：能够将多个分离的MySQL服务器链接起来，从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。</p>
<p>· Cluster/NDB：MySQL的簇式数据库引擎，尤其适合于具有高性能查找要求的应用程序，这类查找需求还要求具有最高的正常工作时间和可用性。</p>
<p>· Other：其他存储引擎包括CSV（引用由逗号隔开的用作数据库表的文件），Blackhole（用于临时禁止对数据库的应用程序输入），以及Example引擎（可为快速创建定制的插件式存储引擎提供帮助）。</p>
<p>记住，对于整个服务器或方案，你并不一定要使用相同的存储引擎，你可以为方案中的每个表使用不同的存储引擎，这点很重要。</p>
<p>mysql&gt; show engines;<br />
+——————–+————+———————————————–———————-—————————–+<br />
| Engine                    | Support    | Comment |<br />
+——————–+————+———————————————————–———————-——————+<br />
| MyISAM               | DEFAULT | Default engine as of MySQL 3.23 with great performance              |<br />
| MEMORY             | YES              | Hash based, stored in memory, useful for temporary tables       |<br />
| InnoDB                 | YES              | Supports transactions, row-level locking, and foreign keys         |<br />
| BerkeleyDB         | NO                | Supports transactions and page-level locking                                    |<br />
| BLACKHOLE       | NO                | /dev/null storage engine (anything you write to it disappears) |<br />
| EXAMPLE            | NO                | Example storage engine                                                                                |<br />
| ARCHIVE             | NO               | Archive storage engine                                                                                  |<br />
| CSV                         | NO               | CSV storage engine                                                                                          |<br />
| ndbcluster           | NO               | Clustered, fault-tolerant, memory-based tables                                |<br />
| FEDERATED        | NO               | Federated MySQL storage engine                                                             |<br />
| MRG_MYISAM  | YES             | Collection of identical MyISAM tables                                                   |<br />
| ISAM                      | NO               | Obsolete storage engine                                                                                |<br />
+————+———+—————————————————————————————-+</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-277.html/feed</wfw:commentRss>
		<slash:comments>94</slash:comments>
		</item>
		<item>
		<title>mysql数据库引擎HEAP（MEMORY）的使用，内存表，临时表的用法</title>
		<link>http://www.zui88.com/blog/view-275.html</link>
		<comments>http://www.zui88.com/blog/view-275.html#comments</comments>
		<pubDate>Wed, 21 Sep 2011 06:47:44 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[后端程序]]></category>
		<category><![CDATA[heap]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=275</guid>
		<description><![CDATA[HEAP表是访问数据速度最快的MySQL表，他使用保存在内存中的散列索引。但如果MySQL或者服务器重新启动，表中数据将会丢失. 用法：如论坛的在线人数统计，这种表的数据应该是无关紧要的,就几个简单的字段,数据也不多,记录数怎么也不会超过1000吧,但是操作是最频繁的(基本用户的每次动作都要更新这个表). 如何创建内存表？ 创建内存表非常的简单，只需注明 ENGINE= MEMORY 即可: CREATE TABLE `tablename` ( `columnName` varchar(256) NOT NUL) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=100000000; 注意： 当内存表中的数据大于max_heap_table_size设定的容量大小时，mysql会转换超出的数据存储到磁盘上，因此这是性能就大打折扣了，所 以我们还需要根据我们的实际情况调整max_heap_table_size，例如在.cnf文件中[mysqld]的下面加入： max_heap_table_size = 2048M 另外在建表语句中还可以通过MAX_ROWS来控制表的记录数。 内存表使用哈希散列索引把数据保存在内存中，因此具有极快的速度，适合缓存中小型数据库，但是使用上受到一些限制。 1、heap对所有用户的连接是可见的，这使得它非常适合做缓存。 2、仅适合使用的场合。heap不允许使用xxxTEXT和xxxBLOB数据类型；只允许使用=和&#38;lt;=&#38;gt;操作符来搜索记录 （不允许&#38;lt;、&#38;gt;、&#38;lt;=或&#38;gt;=）；不支持auto_increment；只允许对非空数据列进行 索引（not null）。 注：操作符 “&#38;lt;=&#38;gt;” 说明：NULL-safe equal.这个操作符和“=”操作符执行相同的比较操作，不过在两个操作码均为NULL时，其所得值为1而不为NULL，而当一个操作码为NULL时，其所得值为0而不为NULL。 3、一旦服务器重启，所有heap表数据丢失，但是heap表结构仍然存在，因为heap表结构是存放在实际数据库路径下的，不会自动删除。重启之后，heap将被清空，这时候对heap的查询结果都是空的。 4、如果heap是复制的某数据表，则复制之后所有主键、索引、自增等格式将不复存在，需要重新添加主键和索引，如果需要的话。 5、对于重启造成的数据丢失，有以下的解决办法： a、在任何查询之前，执行一次简单的查询，判断heap表是否存在数据，如果不存在，则把数据重新写入，或者DROP表重新复制某张表。这需要多做一次查询。不过可以写成include文件，在需要用该heap表的页面随时调用，比较方便。 b、对于需要该heap表的页面，在该页面第一次且仅在第一次查询该表时，对数据集结果进行判断，如果结果为空，则需要重新写入数据。这样可以节省一次查询。 c、更好的办法是在mysql每次重新启动时自动写入数据到heap，但是需要配置服务器，过程比较复杂，通用性受到限制。 6、一些预期可能用到的sql语句 //如果表存在，则删除 DROP TABLE IF EXISTS `abc`; //复制整张表xyz为heap表abc（包含所有数据） CREATE TABLE `abc` type=heap select [...]]]></description>
			<content:encoded><![CDATA[<p>HEAP表是访问数据速度最快的MySQL表，他使用保存在内存中的散列索引。但如果MySQL或者服务器重新启动，表中数据将会丢失.<br />
用法：如论坛的在线人数统计，这种表的数据应该是无关紧要的,就几个简单的字段,数据也不多,记录数怎么也不会超过1000吧,但是操作是最频繁的(基本用户的每次动作都要更新这个表).</p>
<p>如何创建内存表？<br />
创建内存表非常的简单，只需注明 ENGINE= MEMORY 即可:<br />
CREATE TABLE  `tablename` ( `columnName` varchar(256) NOT NUL) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=100000000;</p>
<p>注意：<br />
当内存表中的数据大于max_heap_table_size设定的容量大小时，mysql会转换超出的数据存储到磁盘上，因此这是性能就大打折扣了，所 以我们还需要根据我们的实际情况调整max_heap_table_size，例如在.cnf文件中[mysqld]的下面加入：<br />
max_heap_table_size = 2048M<br />
另外在建表语句中还可以通过MAX_ROWS来控制表的记录数。</p>
<p>内存表使用哈希散列索引把数据保存在内存中，因此具有极快的速度，适合缓存中小型数据库，但是使用上受到一些限制。</p>
<p>1、heap对所有用户的连接是可见的，这使得它非常适合做缓存。</p>
<p>2、仅适合使用的场合。heap不允许使用xxxTEXT和xxxBLOB数据类型；只允许使用=和&amp;lt;=&amp;gt;操作符来搜索记录 （不允许&amp;lt;、&amp;gt;、&amp;lt;=或&amp;gt;=）；不支持auto_increment；只允许对非空数据列进行 索引（not null）。<br />
注：操作符 “&amp;lt;=&amp;gt;” 说明：NULL-safe equal.这个操作符和“=”操作符执行相同的比较操作，不过在两个操作码均为NULL时，其所得值为1而不为NULL，而当一个操作码为NULL时，其所得值为0而不为NULL。</p>
<p>3、一旦服务器重启，所有heap表数据丢失，但是heap表结构仍然存在，因为heap表结构是存放在实际数据库路径下的，不会自动删除。重启之后，heap将被清空，这时候对heap的查询结果都是空的。</p>
<p>4、如果heap是复制的某数据表，则复制之后所有主键、索引、自增等格式将不复存在，需要重新添加主键和索引，如果需要的话。</p>
<p>5、对于重启造成的数据丢失，有以下的解决办法：<br />
a、在任何查询之前，执行一次简单的查询，判断heap表是否存在数据，如果不存在，则把数据重新写入，或者DROP表重新复制某张表。这需要多做一次查询。不过可以写成include文件，在需要用该heap表的页面随时调用，比较方便。<br />
b、对于需要该heap表的页面，在该页面第一次且仅在第一次查询该表时，对数据集结果进行判断，如果结果为空，则需要重新写入数据。这样可以节省一次查询。<br />
c、更好的办法是在mysql每次重新启动时自动写入数据到heap，但是需要配置服务器，过程比较复杂，通用性受到限制。</p>
<p>6、一些预期可能用到的sql语句</p>
<p>//如果表存在，则删除<br />
DROP TABLE IF EXISTS `abc`;<br />
//复制整张表xyz为heap表abc（包含所有数据）<br />
CREATE TABLE `abc` type=heap select * from `xyz`;<br />
//添加主键id<br />
ALTER TABLE `abc` ADD PRIMARY KEY (`id`);<br />
//添加索引username<br />
ALTER TABLE `abc` ADD INDEX `abc` (`username`);</p>
<p>其它参考：<br />
官方文档：As indicated by the name, MEMORY tables are stored in memory. They  use hash indexes by default, which makes them very fast, and very useful  for creating temporary tables. However, when the server shuts down, all  rows stored in MEMORY tables are lost. The tables themselves continue  to exist because their definitions are stored in .frm files on disk, but  they are empty when the server restarts.</p>
<p>可以看出来MEMORY确实是very fast，and very useful for creating temporary tables  .把临时表和内存表放在一起使用确实会快不少：create table tmp2(id int not null) engine memory;<br />
内存表的建立还有一些限制条件：<br />
MEMORY tables cannot contain BLOB or TEXT columns. HEAP不支持BLOB/TEXT列。<br />
The server needs sufficient memory to maintain all MEMORY tables that are in use at the same time. 在同一时间需要足够的内存.<br />
To free memory used by a MEMORY table when you no longer require its  contents, you should execute DELETE or TRUNCATE TABLE, or remove the  table altogether using DROP TABLE.为了释放内存，你应该执行DELETE FROM  heap_table或DROP TABLE heap_table。</p>
<p>几个关键参数</p>
<p>max_heap_table_size<br />
mysql HEAP MEMORY tables 提高行数支持的方法<br />
别人问到的 记一下<br />
mysql MEMORY tables 如果目前支持的行数到上限还不够用 可以把 my.conf 配置里面<br />
max_heap_table_size = 256M<br />
改大<br />
设置 MAX_ROWS<br />
在跑着 可以 ALTER TABLE tbl_name MAX_ROWS=<br />
MAX_ROWS 依赖于 max_heap_table_size 设置</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-275.html/feed</wfw:commentRss>
		<slash:comments>407</slash:comments>
		</item>
		<item>
		<title>mysql字符串替换函数replace</title>
		<link>http://www.zui88.com/blog/view-230.html</link>
		<comments>http://www.zui88.com/blog/view-230.html#comments</comments>
		<pubDate>Sat, 27 Aug 2011 15:07:47 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=230</guid>
		<description><![CDATA[mysql替换字符串函数replace可以实现把某字段的某些字符串替换成其他字符串，例如 update dede_addonarticle set body=replace(body,'news/uploads/allimg/c110826','news/uploads/blank.gif?') 可以把dedecms的文章内容表所有的图片链接替换成空白图片，这样就可以去把已经上传的大量图片删除以节省空间了，在对采集回来的数据尤其有用。]]></description>
			<content:encoded><![CDATA[<p>mysql替换字符串函数replace可以实现把某字段的某些字符串替换成其他字符串，例如</p>
<p>update dede_addonarticle set body=replace(body,'news/uploads/allimg/c110826','news/uploads/blank.gif?')</p>
<p>可以把dedecms的文章内容表所有的图片链接替换成空白图片，这样就可以去把已经上传的大量图片删除以节省空间了，在对采集回来的数据尤其有用。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-230.html/feed</wfw:commentRss>
		<slash:comments>323</slash:comments>
		</item>
		<item>
		<title>phpmyadmin 默认数据库引擎修改为myisam</title>
		<link>http://www.zui88.com/blog/view-181.html</link>
		<comments>http://www.zui88.com/blog/view-181.html#comments</comments>
		<pubDate>Thu, 25 Aug 2011 04:24:42 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=181</guid>
		<description><![CDATA[phpmyadmin 默认创建的数据库默认的数据库引擎为innodb，如果希望修改为灵活性更高的myisam 在my.ini找到default-storage-engine=innodb，修改为myisam]]></description>
			<content:encoded><![CDATA[<div id="content">
<div>phpmyadmin 默认创建的数据库默认的数据库引擎为innodb，如果希望修改为灵活性更高的myisam</div>
<div>在my.ini找到default-storage-engine=innodb，修改为myisam</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-181.html/feed</wfw:commentRss>
		<slash:comments>356</slash:comments>
		</item>
		<item>
		<title>Mysql查询数据表中某字段重复出现的次数，并按照次数排序</title>
		<link>http://www.zui88.com/blog/view-90.html</link>
		<comments>http://www.zui88.com/blog/view-90.html#comments</comments>
		<pubDate>Sat, 13 Aug 2011 18:29:55 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[count(*)]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=90</guid>
		<description><![CDATA[利用Mysql中的 的聚合函数 count(*) 可以实现这个功能，例如需要查询data表中name出现次数最多的记录，可以先按照group by name分组，用count算出分组里的条数，再按照count排序： select name,count(*) from data group by name order by count(*) DESC limit 1 不加limit限制将返回按照name重复次数排列的数据]]></description>
			<content:encoded><![CDATA[<div style="line-height: 25px;">
<p>利用Mysql中的 的聚合函数 count(*) 可以实现这个功能，例如需要查询data表中name出现次数最多的记录，可以先按照group by name分组，用count算出分组里的条数，再按照count排序：</p>
<p>select name,count(*) from data group by name order by count(*) DESC limit 1</p>
<p>不加limit限制将返回按照name重复次数排列的数据</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-90.html/feed</wfw:commentRss>
		<slash:comments>419</slash:comments>
		</item>
		<item>
		<title>Mysql Having的用法：对group by之后的分组加限制条件</title>
		<link>http://www.zui88.com/blog/view-88.html</link>
		<comments>http://www.zui88.com/blog/view-88.html#comments</comments>
		<pubDate>Sat, 13 Aug 2011 18:27:50 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[group by]]></category>
		<category><![CDATA[having]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=88</guid>
		<description><![CDATA[在使用聚合函数之前，我们可以通过where对查询加限制条件，那么如果在group by之后我们要对分组里面的数据再加限制条件怎么办呢？答案是having。 HAVING子句可以让我们筛选成组后的各组数据． WHERE子句在聚合前先筛选记录．也就是说作用在GROUP BY 子句和HAVING子句前． 而 HAVING子句在聚合后对组记录进行筛选。 having子句出现的数据必须在group by 之后，order by 之后 例如在上一篇中对name按照出现次数排序之后，我们还想只查出名字里面含有lin的数据，可以这样写： select name ,count(*) from data group by name having name like '%lin%' order by couny(*) DESC]]></description>
			<content:encoded><![CDATA[<div style="line-height: 25px;">
<p>在使用聚合函数之前，我们可以通过where对查询加限制条件，那么如果在group by之后我们要对分组里面的数据再加限制条件怎么办呢？答案是having。</p>
<p>HAVING子句可以让我们筛选成组后的各组数据．<br />
WHERE子句在聚合前先筛选记录．也就是说作用在GROUP BY 子句和HAVING子句前．<br />
而 HAVING子句在聚合后对组记录进行筛选。</p>
<p>having子句出现的数据必须在group by 之后，order by 之后</p>
<p>例如在上一篇中对name按照出现次数排序之后，我们还想只查出名字里面含有lin的数据，可以这样写：</p>
<p>select name ,count(*)  from data group by name having name like '%lin%' order by couny(*) DESC</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-88.html/feed</wfw:commentRss>
		<slash:comments>683</slash:comments>
		</item>
		<item>
		<title>Mysql 子查询的用法</title>
		<link>http://www.zui88.com/blog/view-69.html</link>
		<comments>http://www.zui88.com/blog/view-69.html#comments</comments>
		<pubDate>Sat, 13 Aug 2011 17:00:34 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[子查询]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=69</guid>
		<description><![CDATA[一，子选择基本用法 1，子选择的定义 子迭择允许把一个查询嵌套在另一个查询当中。比如说：一个考试记分项目把考试事件分为考试（T）和测验（Q）两种情形。下面这个查询就能只找出学生们的考试成绩 select * from score where event_id in (select event_id from event where type='T'); 2，子选择的用法（3种）  用子选择来生成一个参考值 在这种情况下，用内层的查询语句来检索出一个数据值，然后把这个数据值用在外层查询语句的比较操作中。比如说，如果要查询表中学生们在某一天的测验成绩，就应该使用一个内层查询先找到这一天的测验的事件号，然后在外层查询语句中用这个事件号在成绩表里面找到学生们的分数记录。具体语句为： select * from score where id=(select event_id from event where date='2002-03-21' and type='Q'); 需要注意的是：在应用这种内层查询的结果主要是用来进行比较操作的分法时，内层查询应该只有一个输出结果才对。看例子，如果想知道哪个美国总统的生日最小，构造下列查询 select * from president where birth=min(birth) 这个查询是错的！因为MySQL不允许在子句里面使用统计函数！min()函数应该有一个确定的参数才能工作!所以我们改用子选择: select * from president where birht=(select min(birth) from presidnet);  exists 和 not exists [...]]]></description>
			<content:encoded><![CDATA[<p>一，子选择基本用法<br />
1，子选择的定义<br />
子迭择允许把一个查询嵌套在另一个查询当中。比如说：一个考试记分项目把考试事件分为考试（T）和测验（Q）两种情形。下面这个查询就能只找出学生们的考试成绩<br />
select * from score where event_id in (select event_id from event where type='T');<br />
2，子选择的用法（3种）<br />
 用子选择来生成一个参考值<br />
在这种情况下，用内层的查询语句来检索出一个数据值，然后把这个数据值用在外层查询语句的比较操作中。比如说，如果要查询表中学生们在某一天的测验成绩，就应该使用一个内层查询先找到这一天的测验的事件号，然后在外层查询语句中用这个事件号在成绩表里面找到学生们的分数记录。具体语句为：<br />
select * from score where<br />
id=(select event_id from event where date='2002-03-21' and type='Q');<br />
需要注意的是：在应用这种内层查询的结果主要是用来进行比较操作的分法时，内层查询应该只有一个输出结果才对。看例子，如果想知道哪个美国总统的生日最小，构造下列查询<br />
select * from president where birth=min(birth)<br />
这个查询是错的！因为MySQL不允许在子句里面使用统计函数！min()函数应该有一个确定的参数才能工作!所以我们改用子选择:<br />
select * from president where birht=(select min(birth) from presidnet);<br />
 exists 和 not exists 子选择<br />
上一种用法是把查间结果由内层传向外层、本类用法则相反，把外层查询的结果传递给内层。看外部查询的结果是否满足内部查间的匹配径件。这种"由外到内"的子迭择用法非常适合用来检索某个数据表在另外一个数据表里面有设有匹配的记录</p>
<p>数据表t1 数据表t2<br />
I1 C1 I2 C2<br />
1<br />
2<br />
3 A</p>
<p>C 2<br />
3<br />
4 C</p>
<p>A<br />
先找两个表内都存在的数据<br />
select i1 from t1 where exists(select * from t2 where t1.i1=t2.i2);<br />
再找t1表内存在,t2表内不存在的数据<br />
select i1 form t1 where not exists(select * from t2 where t1.i1=t2.i2);</p>
<p>需要注意：在这两种形式的子选择里，内层查询中的星号代表的是外层查询的输出结果。内层查询没有必要列出有关数据列的名字，田为内层查询关心的是外层查询的结果有多少行。希望大家能够理解这一点<br />
 in 和not in 子选择<br />
在这种子选择里面，内层查询语句应该仅仅返回一个数据列，这个数据列里的值将由外层查询语句中的比较操作来进行求值。还是以上题为例<br />
先找两个表内都存在的数据<br />
select i1 from t1 where i1 in (select i2 from t2);<br />
再找t1表内存在,t2表内不存在的数据<br />
select i1 form t1 where i1 not in (select i2 from t2);<br />
好象这种语句更容易让人理解，再来个例子<br />
比如你想找到所有居住在A和B的学生。<br />
select * from student where state in('A','B')<br />
二， 把子选择查询改写为关联查询的方法。<br />
1，匹配型子选择查询的改写<br />
下例从score数据表里面把学生们在考试事件（T）中的成绩（不包括测验成绩！）查询出来。<br />
Select * from score where event_id in (select event_id from event where type='T');<br />
可见，内层查询找出所有的考试事件，外层查询再利用这些考试事件搞到学生们的成绩。<br />
这个子查询可以被改写为一个简单的关联查询：<br />
Select score.* from score, event where score.event_id=event.event_id and event.event_id='T';<br />
下例可以用来找出所有女学生的成绩。<br />
Select * from score where student_id in (select student_id form student where sex = 'f');<br />
可以把它转换成一个如下所示的关联查询：<br />
Select * from score<br />
Where student _id =student.student_id and student.sex ='f';<br />
把匹配型子选择查询改写为一个关联查询是有规律可循的。下面这种形式的子选择查询：<br />
Select * from tablel<br />
Where column1 in (select column2a from table2 where column2b = value);<br />
可以转换为一个如下所示的关联查询：<br />
Select tablel. * from tablel,table2<br />
Where table.column1 = table2.column2a and table2.column2b = value;<br />
(2)非匹配(即缺失)型子选择查询的改写<br />
子选择查询的另一种常见用途是查找在某个数据表里有、但在另一个数据表里却没有的东西。正如前面看到的那样，这种"在某个数据表里有、在另一个数据表里没有"的说法通常都暗示着可以用一个left join 来解决这个问题。请看下面这个子选择查询，它可以把没有出现在absence数据表里的学生(也就是那些从未缺过勤的学生)给查出来：<br />
Select * from student<br />
Where student_id not in (select student_id from absence);<br />
这个子选择查询可以改写如下所示的left join 查询：<br />
Select student. *<br />
From student left join absence on student.student_id =absence.student_id<br />
Where absence.student_id is null;<br />
把非匹配型子选择查询改写为关联查询是有规律可循的。下面这种形式的子选择查询：<br />
Select * from tablel<br />
Where column1 not in (select column2 from table2);<br />
可以转换为一个如下所示的关联查询：<br />
Select tablel . *<br />
From tablel left join table2 on tablel.column1=table2.column2<br />
Where table2.column2 is null;<br />
注意：这种改写要求数据列table2.column2声明为not null。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-69.html/feed</wfw:commentRss>
		<slash:comments>337</slash:comments>
		</item>
		<item>
		<title>mysql操作符in between</title>
		<link>http://www.zui88.com/blog/view-65.html</link>
		<comments>http://www.zui88.com/blog/view-65.html#comments</comments>
		<pubDate>Sat, 13 Aug 2011 16:57:30 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[操作符]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=65</guid>
		<description><![CDATA[以下三条sql语句的效果是等效的： SELECT * FROM `logs` WHERE id = 1 or id = 2 or id = 3 SELECT * FROM `logs` WHERE id between 1 and 3 SELECT * FROM `logs` WHERE id in (1,2,3) 经过测试性能也是差不多，如果id是一个大数组那么最后一条书写会简单很多，可以利用php的 string implode ( string $glue , array $pieces ) 函数把数组组合成(implode(',',$array))也就是(1,2,3)这样的格式]]></description>
			<content:encoded><![CDATA[<div style="line-height: 25px;">
<p>以下三条sql语句的效果是等效的：</p>
<p>SELECT * FROM `logs` WHERE id = 1 or id = 2 or id = 3</p>
<p>SELECT * FROM `logs` WHERE id between 1 and 3</p>
<p>SELECT * FROM `logs` WHERE id in (1,2,3)</p>
<p>经过测试性能也是差不多，如果id是一个大数组那么最后一条书写会简单很多，可以利用php的</p>
<div class="methodsynopsis dc-description"><span class="type">string</span> <span class="methodname"><strong>implode</strong></span> ( <span class="methodparam"><span class="type">string</span> <tt class="parameter"><span style="font-family: Courier New; font-size: small;">$glue</span></tt></span> , <span class="methodparam"><span class="type">array</span> <tt class="parameter"><span style="font-family: Courier New; font-size: small;">$pieces</span></tt></span> )</div>
<p>函数把数组组合成(implode(',',$array))也就是(1,2,3)这样的格式</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-65.html/feed</wfw:commentRss>
		<slash:comments>331</slash:comments>
		</item>
		<item>
		<title>常用的Mysql语句</title>
		<link>http://www.zui88.com/blog/view-63.html</link>
		<comments>http://www.zui88.com/blog/view-63.html#comments</comments>
		<pubDate>Sat, 13 Aug 2011 16:53:05 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=63</guid>
		<description><![CDATA[1 登陆mysql服务器 mysql -uroot -ppassword 2 进入数据库 use haxinbbs; 3 插入一条记录 insert into user(username,password) values('harryzyp','harryzyp'); sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) 4 查看一个记录或多个 select password,sex(或*) from user where username='harryzyp';（等于 = 不等于 &#60;&#62; 小于 &#60; 大于 &#62; 小于或等于 &#60;= 大于或等于 &#62;=） sql="select * from 数据表 where 字段名 in ( 值1 , 值2 , 值3 [...]]]></description>
			<content:encoded><![CDATA[<div style="line-height: 25px;">
<p>1 登陆mysql服务器</p>
<p>mysql -uroot -ppassword</p>
<p>2 进入数据库</p>
<p>use haxinbbs;</p>
<p>3 插入一条记录</p>
<p>insert into user(username,password) values('harryzyp','harryzyp');</p>
<p>sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)</p>
<p>4 查看一个记录或多个</p>
<p>select password,sex(或*) from user where username='harryzyp';（等于 = 不等于 &lt;&gt; 小于 &lt; 大于 &gt; 小于或等于 &lt;= 大于或等于 &gt;=）</p>
<p>sql="select * from 数据表 where 字段名 in ( 值1 , 值2 , 值3 )"<br />
sql="select * from 数据表 where 字段名 between 值1 and 值2"</p>
<p>模糊查询</p>
<p>SQL的模式匹配允许你使用"_"匹配任何单个字符，而"%"匹配任意数目字符(包括零个字符)。</p>
<p>为了找出包含一个"w"的名字：<br />
mysql&gt; SELECT * FROM pet WHERE name LIKE "%w%";</p>
<p>select * from qq where id like '%8%';</p>
<p>限制以Publishing结尾，使用LIKE '%Publishing'<br />
限制以A开头：LIKE '[A]%'<br />
限制以A开头外：LIKE '[^A]%'</p>
<p>-求工资最高的员工姓名</p>
<p>use pangu</p>
<p>select e_name</p>
<p>from employee</p>
<p>where e_wage =</p>
<p>(select max(e_wage)</p>
<p>from employee)</p>
<p>  用户可以使用逻辑连接符AND，OR和NOT。</p>
<p>SELECT * FROM EMPLOYEES<br />
　　WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';</p>
<p>SELECT * FROM EMPLOYEES<br />
　　WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';</p>
<p>SELECT * FROM EMPLOYEES<br />
　　WHERE NOT(BRANCH_OFFICE = 'Boston');</p>
<p>SELECT * FROM EMPLOYEES<br />
　　WHERE (LAST_NAME = 'Jones'<br />
　　AND FIRST_NAME = 'Indiana')<br />
　　OR (LAST_NAME = 'Smith'<br />
　　AND FIRST_NAME = 'Bessie');</p>
<p>断言中进行NULL判断</p>
<p>SELECT * FROM EMPLOYEES<br />
　　WHERE SALARY IS NULL;</p>
<p>SELECT * FROM EMPLOYEES<br />
　　WHERE SALARY IS NOT NULL;</p>
<p>要消除结果中的重复行，只要在SELECT语句中加上DISTINCT子句：</p>
<p>SELECT DISTINCT BRANCH_OFFICE FROM EMPLOYEES;</p>
<p>使用ORDER BY子句就可以按照升序或降序来排列结果：(如果你希望以降序排列，那么可以用关键字DESC)</p>
<p>　　SELECT DISTINCT BRANCH_OFFICE</p>
<p>　　FROM EMPLOYEES</p>
<p>ORDER BY BRANCH_OFFICE ASC;</p>
<p>按照字符串长度排序</p>
<p>order by length($str) DESC</p>
<p>第一个技巧：利用连接符连接多个字段。</p>
<p>　　如在员工基本信息表中，有员工姓名、员工职位、出身日期等等。如果现在视图中这三个字段显示在同一个字段中，并且中间有分割符。如我现在想显示的结果为"经理Victor出身于1976年5月3日"。这该如何处理呢?其实，这是比较简单的，我们可以在Select查询语句中，利用连接符把这些字段连接起来。</p>
<p>　　如可以这么写查询语句：</p>
<p>　　SELECT员工职位 ||' ' ||员工姓名||'出身于'||出身日期 as 员工出身信息 FROM 员工基本信息表;</p>
<p>　　通过这条语句就可以实现如上的需求。也就是说，我们在平时查询中，可以利用||连接符把一些相关的字段连接起来。这在报表视图中非常的有用。如笔者以前在设计图书馆管理系统的时候，在书的基本信息处有图书的出版社、出版序列号等等内容。但是，有时会在打印报表的时候，需要把这些字段合并成一个字段打印。为此，就需要利用这个连接符把这些字段连接起来。而且，利用连接符还可以在字段中间加入一些说明性的文字，以方便大家阅读。如上面我在员工职位与员工姓名之间加入了空格;并且在员工姓名与出身日期之间加入了出身于几个注释性的文字。这些功能看起来比较小，但是却可以大大的提高内容的可读性。这也是我们在数据库设计过程中需要关注的一个内容。</p>
<p>　　总之，令后采用连接符，可以提高我们报表的可读性于灵活性。</p>
<p>5 修改字段</p>
<p>update user set password='harryzyp' where username='xiaohe';</p>
<p>sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"</p>
<p>6 删除一个字段</p>
<p>delete from user where username='xiaohe';</p>
<p>7 创建一个表</p>
<p>create table books(id varchar(8) primary key,name varchar(24));</p>
<p>8 查看一个表中的所有字段名</p>
<p>desc person;</p>
<p>9 查看所有数据库或表</p>
<p>show databases或show tables;</p>
<p>有两个表student和elective，建立SQL脚本如下:</p>
<p>create table student(id int(10) not null primary key,name varchar(20) not null);</p>
<p>create table elective(id int(10) auto_increment primary key,stu_id int(10) not null,class_name varchar(20));</p>
<p>插入数据略!!</p>
<p>10 查询第二个字符为"a"的学生(student)</p>
<p>select * from student where name like '_a%';</p>
<p>11 查询已经选过课的选课信息</p>
<p>select * from elective as e inner join student as s where e.stu_id=s.id;</p>
<p>附: (1)inner可省略 (2)where可用on代替</p>
<p>12 查询所有学生的选课信息</p>
<p>select * from student as s left join elective as e on s.id=e.stu_id;</p>
<p>附: (1)on不能用where代替</p>
<p>13 同11</p>
<p>select * from student as s right join elective as e on s.id=e.stu_id;</p>
<p>14 字查询举例</p>
<p>select * from student s where 2&lt;=(select count(*) from elective e where e.stu_id=s.id);</p>
<p>15 把某列的内容复制到另外一列</p>
<p>update   authors   set   au_lname= authors.job_desc</p>
<p>070917添加</p>
<p>1 MSSQL取出表中前10条数据</p>
<p>select top 10 * from tableName;</p>
<p>2 MSSQL取出表中前10%的数据</p>
<p>select top 10 percent * from tableName;</p>
<p>3 MySQL取出表中前10条数据</p>
<p>select * from tableName limit 10;</p>
<p>4MySQL取出表中4—9的数据</p>
<p>select * from tableName limit 3,6;</p>
<p>limit a,b   a表示取a-1条，b表示取多少条</p>
<p>4查看当天发布的帖子</p>
<p>select * from article where posttime like 'yyyy-MM-dd%'</p>
<p>5设置mysql默认字符编码命令</p>
<p>set names gbk;</p>
<p>6数据记录统计函数：<br />
AVG(字段名) 得出一个表格栏平均值<br />
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计<br />
MAX(字段名) 取得一个表格栏最大的值<br />
MIN(字段名) 取得一个表格栏最小的值<br />
SUM(字段名) 把数据栏的值相加<br />
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"<br />
set rs=conn.excute(sql)<br />
用 rs("别名") 获取统的计值，其它函数运用同上。</p>
<p>文章出处：<a href="http://www.diybl.com/course/3_program/java/javajs/2007104/75907.html">http://www.diybl.com/course/3_program/java/javajs/2007104/75907.html</a></p>
<p>模糊查询</p>
<p>SQL的模式匹配允许你使用"_"匹配任何单个字符，而"%"匹配任意数目字符(包括零个字符)。</p>
<p>在 MySQL中，SQL的模式缺省是忽略大小写的。下面显示一些例子。注意在你使用SQL模式时，你不</p>
<p>能使用=或!=；而使用LIKE或NOT LIKE比较操作符。</p>
<p>为了找出以"b"开头的名字：<br />
mysql&gt; SELECT * FROM pet WHERE name LIKE "b%";</p>
<p>为了找出以"fy"结尾的名字：<br />
mysql&gt; SELECT * FROM pet WHERE name LIKE "%fy";</p>
<p>为了找出包含一个"w"的名字：<br />
mysql&gt; SELECT * FROM pet WHERE name LIKE "%w%";</p>
<p>为了找出包含正好5个字符的名字，使用"_"模式字符：<br />
mysql&gt; SELECT * FROM pet WHERE name LIKE "_____";</p>
<p>由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时，使用</p>
<p>REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE，它们是同义词)。</p>
<p>扩展正则表达式的一些字符是：</p>
<p>"."匹配任何单个的字符。<br />
一个字符类"[...]"匹配在方括号内的任何字符。例如，"[abc]"匹配"a"、"b"或"c"。<br />
为了命名字符的一个范围，使用一个"-"。"[a-z]"匹配任何小写字母，而"[0-9]"匹配任<br />
何数字。<br />
" * "匹配零个或多个在它前面的东西。例如，"x*"匹配任何数量的"x"字符，"[0-9]*"<br />
匹配的任何数量的数字，而".*"匹配任何数量的任何东西。<br />
正则表达式是区分大小写的，但是如果你希望，你能使用一个字符类匹配两种写法。例如，<br />
"[aA]"匹配小写或大写的"a"而"[a-zA-Z]"匹配两种写法的任何字母。<br />
如果它出现在被测试值的任何地方，模式就匹配(只要他们匹配整个值，SQL模式匹配)。<br />
为了定位一个模式以便它必须匹配被测试值的开始或结尾，在模式开始处使用"^"或在模式的<br />
结尾用"$"。<br />
为了说明扩展正则表达式如何工作，上面所示的LIKE查询在下面使用REGEXP重写：</p>
<p>为了找出以"b"开头的名字，使用"^"匹配名字的开始并且"[bB]"匹配小写或大写的"b"：<br />
mysql&gt; SELECT * FROM pet WHERE name REGEXP "^[bB]";</p>
<p>为了找出以"fy"结尾的名字，使用"$"匹配名字的结尾：<br />
mysql&gt; SELECT * FROM pet WHERE name REGEXP "fy$";</p>
<p>为了找出包含一个"w"的名字，使用"[wW]"匹配小写或大写的"w"：<br />
mysql&gt; SELECT * FROM pet WHERE name REGEXP "[wW]";</p>
<p>既然如果一个正规表达式出现在值的任何地方，其模式匹配了，就不必再先前的查询中在模式的两<br />
方面放置一个通配符以使得它匹配整个值，就像如果你使用了一个SQL模式那样。<br />
为了找出包含正好5个字符的名字，使用"^"和"$"匹配名字的开始和结尾，和5个"."实例在<br />
两者之间：<br />
mysql&gt; SELECT * FROM pet WHERE name REGEXP "^.....$";</p>
<p>你也可以使用"{n}""重复n次"操作符重写先前的查询：<br />
mysql&gt; SELECT * FROM pet WHERE name REGEXP "^.{5}$";</p>
<p>查找数字和其他的模糊查询语句<br />
Select * from pet where name REGEXP "[^a-zA-Z].";</p>
<p>简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句<br />
<strong>一、 简单查询</strong><br />
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。<br />
例如，下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段。</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT nickname,emailFROM testtable</p>
<p>WHERE name='张三'</td>
</tr>
</tbody>
</table>
<p><strong>(一) 选择列表</strong><br />
选择列表(select_list)指出所查询列，它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。<br />
1、选择所有列<br />
例如，下面语句显示testtable表中所有列的数据:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT *FROM testtable</td>
</tr>
</tbody>
</table>
<p>2、选择部分列并指定它们的显示次序<br />
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。<br />
例如:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT nickname,emailFROM testtable</td>
</tr>
</tbody>
</table>
<p>3、更改列标题<br />
在选择列表中，可重新指定列标题。定义格式为:<br />
列标题=列名<br />
列名 列标题<br />
如果指定的列标题不是标准的标识符格式时，应使用引号定界符，例如，下列语句使用汉字显示列标题:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT 昵称=nickname,电子邮件=emailFROM testtable</td>
</tr>
</tbody>
</table>
<p>4、删除重复行<br />
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行，默认为ALL。使用DISTINCT选项时，对于所有重复的数据行在SELECT返回的结果集合中只保留一行。<br />
5、限制返回的行数<br />
使用TOP n [PERCENT]选项限制返回的数据行数，TOP n说明返回n行，而TOP n PERCENT时，说明n是表示一百分数，指定返回的行数等于总行数的百分之几。<br />
例如:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT TOP 2 *FROM testtable SELECT TOP 20 PERCENT * FROM testtable</td>
</tr>
</tbody>
</table>
<p><strong>(二)FROM子句</strong>FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图，它们之间用逗号分隔。<br />
在FROM子句同时指定多个表或视图时，如果选择列表中存在同名列，这时应使用<a href="javascript:;" target="_self"><strong>对象</strong></a>名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列，在查询两个表中的cityid时应使用下面语句格式加以限定:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT username,citytable.cityidFROM usertable,citytable</p>
<p>WHERE usertable.cityid=citytable.cityid</td>
</tr>
</tbody>
</table>
<p>在FROM子句中可用以下两种格式为表或视图指定别名:<br />
表名 as 别名<br />
表名 别名<br />
例如上面语句可用表的别名格式表示为:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT username,b.cityidFROM usertable a,citytable b</p>
<p>WHERE a.cityid=b.cityid</td>
</tr>
</tbody>
</table>
<p>SELECT不仅能从表或视图中检索数据，它还能够从其它查询语句所返回的结果集合中查询数据。<br />
例如:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT a.au_fname+a.au_lnameFROM authors a,titleauthor ta</p>
<p>(SELECT title_id,title</p>
<p>FROM titles</p>
<p>WHERE ytd_sales&gt;10000</p>
<p>) AS t</p>
<p>WHERE a.au_id=ta.au_id</p>
<p>AND ta.title_id=t.title_id</td>
</tr>
</tbody>
</table>
<p>此例中，将SELECT返回的结果集合给予一别名t，然后再从中检索数据。<br />
<strong>(三) 使用WHERE子句设置查询条件</strong><br />
WHERE子句设置查询条件，过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT *FROM usertable</p>
<p>WHERE age&gt;20</td>
</tr>
</tbody>
</table>
<p>WHERE子句可包括各种条件运算符:<br />
比较运算符(大小比较):&gt;、&gt;=、=、&lt;、&lt;=、&lt;&gt;、!&gt;、!&lt;<br />
范围运算符(表达式值是否在指定的范围):BETWEEN…AND…<br />
NOT BETWEEN…AND…<br />
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)<br />
NOT IN (项1,项2……)<br />
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE<br />
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL<br />
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR<br />
1、范围运算符例:age BETWEEN 10 AND 30相当于age&gt;=10 AND age&lt;=30<br />
2、列表运算符例:country IN ('Germany','China')<br />
3、模式匹配符例:常用于模糊查找，它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。<br />
可使用以下通配字符:<br />
百分号%:可匹配任意类型和长度的字符，如果是中文，请使用两个百分号即%%。<br />
下划线_:匹配单个任意字符，它常用来限制表达式的字符长度。<br />
方括号[]:指定一个字符、字符串或范围，要求所匹配对象为它们中的任一个。[^]:其取值也[] 相同，但它要求所匹配对象为指定字符以外的任一个字符。<br />
例如:<br />
限制以Publishing结尾，使用LIKE '%Publishing'<br />
限制以A开头:LIKE '[A]%'<br />
限制以A开头外:LIKE '[^A]%'<br />
4、空值判断符例WHERE age IS NULL<br />
5、逻辑运算符:优先级为NOT、AND、OR<br />
<strong>(四)查询结果排序</strong><br />
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:<br />
ORDER BY {column_name [ASC|DESC]} [,…n]<br />
其中ASC表示升序，为默认值，DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排序。<br />
例如:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT *FROM usertable</p>
<p>ORDER BY age desc,userid ASC</td>
</tr>
</tbody>
</table>
<p>另外，可以根据表达式进行排序。<br />
<strong>二、 联合查询</strong><br />
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示，即执行联合查询。UNION的语法格式为:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>select_statementUNION [ALL] selectstatement</p>
<p>[UNION [ALL] selectstatement][…n]</td>
</tr>
</tbody>
</table>
<p>其中selectstatement为待联合的SELECT查询语句。<br />
ALL选项表示将所有行合并到结果集合中。不指定该项时，被联合查询结果集合中的重复行将只保留一行。<br />
联合查询时，查询结果的列标题为第一个查询语句的列标题。因此，要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时，也必须使用第一查询语句中的列名、列标题或者列序号。<br />
在使用UNION 运算符时，应保证每个联合查询语句的选择列表中有相同数量的表达式，并且每个查询选择表达式应具有相同的数据类型，或是可以自动将它们转换为相同的数据类型。在自动转换时，对于数值类型，系统将低精度的数据类型转换为高精度的数据类型。<br />
在包括多个查询的UNION语句中，其执行顺序是自左至右，使用括号可以改变这一执行顺序。例如:<br />
查询1 UNION (查询2 UNION 查询3)<br />
<strong>三、连接查询</strong><br />
通过连接运算符可以实现多个表查询。连接是关系<a href="javascript:;" target="_self"><strong>数据库</strong></a>模型的主要特点，也是它区别于其它类型数据库管理系统的一个标志。<br />
在关系数据库管理系统中，表建立时各数据之间的关系不必确定，常把一个实体的所有信息存放在一个表中。当检索数据时，通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性，他们可以在任何时候增加新的数据类型。为不同实体创建新的表，尔后通过连接进行查询。<br />
连接可以在SELECT 语句的FROM子句或WHERE子句中建立，似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以，在Transact-SQL中推荐使用这种<a href="javascript:;" target="_self"><strong>方法</strong></a>。<br />
SQL-92标准所定义的FROM子句的连接语法格式为:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>FROM join_table join_type join_table[ON (join_condition)]</td>
</tr>
</tbody>
</table>
<p>其中join_table指出参与连接操作的表名，连接可以对同一个表操作，也可以对多表操作，对同一个表操作的连接又称做自连接。<br />
join_type 指出连接类型，可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作，并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同，内连接又分为等值连接、自然连接和不等连接三种。外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是，外连接不只列出与连接条件相匹配的行，而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。<br />
交叉连接(CROSS JOIN)没有WHERE 子句，它返回连接表中所有数据行的笛卡尔积，其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。<br />
连接操作中的ON (join_condition) 子句指出连接条件，它由被连接表中的列和比较运算符、逻辑运算符等构成。<br />
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接，但可以对这三种列进行间接连接。例如:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT p1.pub_id,p2.pub_id,p1.pr_infoFROM pub_info AS p1 INNER JOIN pub_info AS p2</p>
<p>ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)</td>
</tr>
</tbody>
</table>
<p><strong>(一)内连接</strong>内连接查询操作列出与连接条件匹配的数据行，它使用比较运算符比较被连接列的列值。内连接分三种:<br />
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值，其查询结果中列出被连接表中的所有列，包括其中的重复列。<br />
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括&gt;、&gt;=、&lt;=、&lt;、!&gt;、!&lt;和&lt;&gt;。<br />
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值，但它使用选择列表指出查询结果集合中所包括的列，并删除连接表中的重复列。<br />
例，下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT *FROM authors AS a INNER JOIN publishers AS p</p>
<p>ON a.city=p.city</td>
</tr>
</tbody>
</table>
<p>又如使用自然连接，在选择列表中删除authors 和publishers 表中重复列(city和state):</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT a.*,p.pub_id,p.pub_name,p.countryFROM authors AS a INNER JOIN publishers AS p</p>
<p>ON a.city=p.city</td>
</tr>
</tbody>
</table>
<p><strong>(二)外连接</strong><br />
内连接时，返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时，它返回到查询结果集合中的不仅包含符合连接条件的行，而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT a.*,b.* FROM luntan LEFT JOIN usertable as bON a.username=b.username</td>
</tr>
</tbody>
</table>
<p>下面使用全外连接将city表中的所有作者以及user表中的所有作者，以及他们所在的城市:</p>
<table border="1" cellpadding="0" width="447">
<tbody>
<tr>
<td>SELECT a.*,b.*FROM city as a FULL OUTER JOIN user as b</p>
<p>ON a.username=b.username</td>
</tr>
</tbody>
</table>
<p><strong>(三)交叉连接</strong><br />
交叉连接不带WHERE 子句，它返回被连接的两个表所有数据行的笛卡尔积，返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例，titles表中有6类图书，而publishers表中有8家出版社，则下列交叉连接检索到的记录数将等<br />
于6*8=48行。 SELECT type,pub_name</p>
<p>FROM titles CROSS JOIN publishers</p>
<p>ORDER BY type</p>
<p>[Post=0][/Post]</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-63.html/feed</wfw:commentRss>
		<slash:comments>492</slash:comments>
		</item>
	</channel>
</rss>
