<?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>mysql &#8211; 九创科技</title>
	<atom:link href="https://www.3code.cn/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.3code.cn</link>
	<description>Wordpress外贸企业主题, Wp企业主题, wordpress企业主题, wordpress主题定制, WORDPRESS外贸网站建设SEO</description>
	<lastBuildDate>Sat, 13 Jul 2019 01:21:27 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>数据库Mysql优化技巧常用方法</title>
		<link>https://www.3code.cn/%e6%95%b0%e6%8d%ae%e5%ba%93mysql%e4%bc%98%e5%8c%96%e6%8a%80%e5%b7%a7%e5%b8%b8%e7%94%a8%e6%96%b9%e6%b3%95/</link>
		
		<dc:creator><![CDATA[寒林]]></dc:creator>
		<pubDate>Mon, 16 May 2011 05:03:54 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[mysql]]></category>
		<guid isPermaLink="false">https://www.3code.cn/?p=2595</guid>

					<description><![CDATA[满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表，表中每个组的所有行应为连续的，然后使用该临时表来找到组并应用累积函数(如 果有)。在某些情况中，MySQL能够做得更好，通过索引访问而不用创建临时表。数据库Mysql索引优化是数据库优化技巧常用的重要方法。]]></description>
										<content:encoded><![CDATA[<p>Mysql数据库优化技巧有很多，这里摘抄了一些许多程序员常用的Mysql优化方法，供参考及备忘。</p>
<h3>1. MySQL优化WHERE子句</h3>
<p>下面以SELECT语句为例，不过DELETE和UPDATE语句中的WHERE子句优化和这里SELECT 语句的Mysql优化技巧一样，下面只列出了一部分的MYSQL 优化方法实例。</p>
<p>减少括号嵌套：</p>
<pre>WHERE ((a AND b) AND c OR (((a AND b) AND (c AND d))))
优化-&gt; WHERE (a AND b AND c) OR (a AND b AND c AND d)</pre>
<p>常量重叠，去除不必要的常量：</p>
<pre>(a&lt;b AND b=c) AND a=5 AND (5=5)
优化-&gt; b&gt;5 AND b=c AND a=5</pre>
<p>如果不使用GROUP BY或分组函数(COUNT()、MIN()……)，HAVING与WHERE合 并。所有常数的表在查询中比其它表先读出。常数表为：1. 空表或只有1行的表; 2. 与在一个PRIMARY KEY或UNIQUE索引的WHERE子句一起使用的表，这里所有的索引 部分使用常数表达式并且索引部分被定义为NOT NULL。</p>
<h3><strong><strong>2. Mysql 优化</strong></strong><strong>避免SELECT *命令</strong></h3>
<p>从表中读取越多的数据，查询会变得更慢。始终指定你需要的列，这是一个非常良好的习惯。</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT * FROM user WHERE user_id = 1&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$d = mysql_fetch_assoc($r);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>echo &#8220;Welcome {$d[&#8216;username&#8217;]}&#8221;;</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>// 优化如下:</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT username FROM user WHERE user_id = 1&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$d = mysql_fetch_assoc($r);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>echo &#8220;Welcome {$d[&#8216;username&#8217;]}&#8221;;</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>3. MySQL 如何优化DISTINCT 语句</h3>
<p>在大多数情况下，DISTINCT子句可以视为GROUP BY的特殊情况。例如，下面的两个数据库查询是等效的：</p>
<p>SELECT DISTINCT c1, c2, c3 FROM t1 WHERE c1 &gt; <em>const</em>;<br />
SELECT c1, c2, c3 FROM t1 WHERE c1 &gt; <em>const</em> GROUP BY c1, c2, c3;</p>
<p>由于这个等效性，适用于GROUP BY查询的优化技巧和方法也适用于有DISTINCT子句的查询。</p>
<h3><strong>4. 优化MySQL查询缓存</strong></h3>
<p>MySQL查询可以启用高速查询缓存。这是提高数据库性能的有效Mysql优化方法之一。当同一个查询被执行多次时，从缓存中提取数据和直接从数据库中返回数据快很多，小小的Mysql优化技巧。</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>// query cache does NOT <strong>work</strong></li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT username FROM user WHERE signup_date &gt;= CURDATE()&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>// query cache works!</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$today = <strong>date</strong>(&#8220;Y-m-d&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT username FROM user WHERE signup_date &gt;= &#8216;$today'&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>// query cache does NOT <strong>work</strong></li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT username FROM user WHERE signup_date &gt;= CURDATE()&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>// query cache works!</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$today = <strong>date</strong>(&#8220;Y-m-d&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT username FROM user WHERE signup_date &gt;= &#8216;$today'&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong><strong>5. Mysql 优化：</strong></strong><strong>用EXPLAIN优化SELECT查询</strong></h3>
<p>使用EXPLAIN关键字是另一个MySQL优化技巧，了解MySQL正在进行什么样的数据库查询操作。</p>
<p>实现一个SELECT查询（最好是比较复杂的一个，带joins方式的），在里面添加上你的关键词解释，在这里我们可以使用phpMyAdmin， 他会告诉你表中的结果。举例来说，假如当我在执行joins时，正忘记往一个数据库索引中添加列，EXPLAIN能帮助我找到问题的所在。</p>
<div>
<div>
<div>
<div>
<h3>6. MySQL如何优化ORDER BY</h3>
</div>
</div>
</div>
<p>MySQL可以使用一个索引来满足ORDER BY子句，而不需要额外的排序。下面看看ORDER BY 优化技巧和方法。</p>
<p>即使ORDER BY不确切匹配索引，只要WHERE子句中的所有未使用的索引部分和所有额外的ORDER BY 列为常数，就可以使用索引。在某些情况下，MySQL<em>不能</em>使用索引来解决ORDER BY，尽管它仍然行使用索引来找到匹配WHERE子句。如：</p>
<p>对不同的关键字使用ORDER BY：SELECT * FROM t1 ORDER BY <em>key1</em>, <em>key2；</em></p>
<p>对关键字的非连续元素使用ORDER BY：SELECT * FROM t1 WHERE <em>key2</em>=<em>constant</em> ORDER BY <em>key_part2</em>；</p>
<p>混合ASC和DESC：SELECT * FROM t1 ORDER BY <em>key_part1</em> DESC, <em>key_part2</em> ASC；</p>
<p>用于查询行的关键字与ORDER BY中所使用的不相同：SELECT * FROM t1 WHERE <em>key2</em>=<em>constant</em> ORDER BY <em>key1</em>；</p>
<p>联接许多表，并且ORDER BY中的列并不是全部来自第1个 用于搜索行的非常量表。(这是EXPLAIN输出中的没有const联 接类型的第1个表）。</p>
<p>有不同的ORDER BY和GROUP BY表达式。</p>
<p>使用的表索引的类型不能按顺序保存行。例如，对于HEAP表的HASH索 引情况即如此。</p>
<p>通过EXPLAIN SELECT …ORDER BY，可以检查MySQL是否可以使用索引来解决查询。</p>
<p>文件排序优化不仅用于记录排序关键字和行的位置，并且还记录数据库查询需要的列。这样可以避免两次读取行。</p>
</div>
<h3><strong><strong>7. Mysql 优化</strong></strong><strong>：使用LIMIT 1取得唯一行</strong></h3>
<p>有时，当你要查询一张表是，你知道自己只需要看一行。你可能会去的一条十分独特的记录，或者只是刚好检查了任何存在的记录数，他们都满足了你的 WHERE子句。增加一个LIMIT 1会令你的查询更加有效，这个方法是Mysql优化很有效的一个技巧。这样数据库引擎发现只有1后将停止扫描，而不是去扫描整个表或索引。</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT * FROM user WHERE state = &#8216;Alabama'&#8221;)</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT 1 FROM user WHERE state = &#8216;Alabama&#8217; LIMIT 1&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>8. MySQL如何优化 LIMIT</h3>
<p>使用LIMIT <em>row_count</em>而不使用HAVING时，<strong>MySQL</strong>将 以不同方式处理数据库查询。</p>
<p>如果你用LIMIT只选择一些行，当<strong>MySQL选 择</strong>做完整的表扫描时，它将在一些情况下使用索引，涉及到Mysql索引优化。</p>
<p>如果你使用LIMIT <em>row_count</em>与ORDER BY，<strong>MySQL</strong>一旦找到了排序结果的第一个<em>row_count</em>行， 将结束排序而不是排序整个表。如果使用索引，将很快。如果必须进行文件排序（filesort），必须选择所有匹配查询没有LIMIT子 句的行，并且在确定已经找到第1个<em>row_count</em>行 前，必须对它们的大部分进行排序。在任何一种情况下，一旦找到了行，则不需要再排序结果的其它部分，并且MySQL不再进行排 序。</p>
<p>当结合LIMIT <em>row_count</em>和DISTINCT时，<strong>MySQL</strong>一旦找到<em>row_count</em>个 唯一的行，它将停止。</p>
<p>在一些情况下，GROUP BY能通过顺序读取键(或在键上做排序)来解决，然后计算摘要直到关键字的值 改变。在这种情况下，LIMIT <em>row_count</em>将不计算任何不必要的GROUP BY值。</p>
<p>只要MySQL已经发送了需要的行数到客户，它将放弃查询，除非你正使用SQL_CALC_FOUND_ROWS。</p>
<p>LIMIT 0将总是快速返回一个空集合。这对检查数据库查询的有效性是有用的。当使用MySQL API时，它也可以用来得到结果列的列类型。(该mysql优化技巧在MySQL Monitor中不工作，只显示Empty set；应使用SHOW COLUMNS或DESCRIBE）。</p>
<p>当服务器使用临时表来进行查询时，使用LIMIT <em>row_count</em>子句来计算需要多少空间。</p>
<h3><strong><strong>9. Mysql 优化</strong></strong><strong>：保证连接的索引是相同的类型</strong></h3>
<p>如果应用程序中包含多个连接查询，你需要确保你链接的列在两边的数据库表上都被索引。这会影响MySQL如何优化内部联接操作。此外，加入的列，必须是同一类型。例如，你加入一个DECIMAL列，而同时加入另一个表中的int列，MySQL将无法使用其中至少一个 指标。这种方法即使字符编码必须同为字符串类型。</p>
<ul>
<li>// looking <strong>for</strong> companies in my state</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>$r = mysql_query(&#8220;<strong>SELECT</strong> company_name <strong>FROM</strong> users</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>    LEFT JOIN companies <strong>ON</strong> (users.state = companies.state)</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>    <strong>WHERE</strong> users.id = $user_id&#8221;)</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>// both state columns should be indexed</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>// and they both should be the same type and <strong>character</strong> encoding</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>// or MySQL might do <strong>full</strong> <strong>table</strong> scans</li>
</ul>
<p>&nbsp;</p>
<h3><strong><strong>10. Mysql 优化</strong></strong><strong>避免使用BY RAND()命令</strong></h3>
<p>若需要随机显示结果，MySQL可能 会为表中每一个独立的行执行数据库BY RAND()命令（这会消耗处理器的处理能力，不利于Mysql数据库优化），这种方法然后给你仅返回一行。</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT username FROM user ORDER BY RAND() LIMIT 1&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>// Mysql 优化如下:</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT count(*) FROM user&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$d = mysql_fetch_row($r);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$rand = mt_rand(0,$d[0] &#8211; 1);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>$r = mysql_query(&#8220;SELECT username FROM user LIMIT $rand, 1&#8221;);</li>
</ol>
</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>11. Mysql 优化变量类型：将IP地址存储为无符号整型</strong></h3>
<p>程序员经常在创建一个VARCHAR（15）时并没有意识到他们可以将IP地址以整数形式来存储，没有考虑到Mysql优化的问题。当你有一个 INT类型时，你只占用4个字 节的空间，这是一个固定大小的领域。确定所操作的数据库列是一个UNSIGNED INT类型的,因为IP地址将使用32位unsigned integer。</p>
<h3>12. MySQL如何优化LEFT JOIN和RIGHT JOIN</h3>
<p>在MySQL中，LEFT JOIN和STRAIGHT_JOIN强制的表读顺序可以帮助联接数据库Mysql优化器更快地工作，因为检查的表交换更少。</p>
<pre>SELECT *</pre>
<pre>    FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)</pre>
<pre>    WHERE b.key=d.key;</pre>
<p>MySQL可以进行下面方法的LEFT JOIN优化：如果对于产生的NULL行，WHERE条件总为假，LEFT JOIN变为普通联接。</p>
<p>例如，在下面的查询中如果t2.column1为NULL，WHERE 子句将为false：</p>
<pre>SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;</pre>
<p>因此，可以安全地将查询转换为普通联接：</p>
<pre>SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;</pre>
<p>这样可以更快，因为如果可以使查询更佳，MySQL可以在表t1之前使用表t2。 为了强制使用数据库表顺序，使用STRAIGHT_JOIN。</p>
<h3>13. MySQL如何优化嵌套Join</h3>
<p>在MySQL数据库中，CROSS JOIN语法上等价于INNER JOIN (它们可以彼此代替。在标准SQL中，它们不等价。INNER JOIN结合ON子句使用；CROSS JOIN 用于其它地方。</p>
<p>总的来说，在只包含内部联接操作的联接表达式中可以忽略括号。删除括号并将操作组合到左侧后，联接表达式：</p>
<pre>t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.b=t3.b OR t2.b IS NULL)</pre>
<pre>   ON t1.a=t2.a</pre>
<p>转换为表达式：</p>
<pre>(t1 LEFT JOIN t2 ON t1.a=t2.a) LEFT JOIN t3</pre>
<pre>    ON t2.b=t3.b OR t2.b IS NULL</pre>
<p>但是这两个表达式不等效。不能忽视左外联接操作的右操作数和右联接操作的左操作数中的括号。也就是不能忽视外联接操作中的内表达式中的括号。可以忽视其它 操作数中的括号(外部表的操作数)。</p>
<p>对于任何表t1、t2、t3和 属性t2.b和t3.b的任何条件P，下面的表达式：</p>
<pre>(t1,t2) LEFT JOIN t3 ON P(t2.b,t3.b)</pre>
<p>等价于表达式</p>
<pre>t1，t2 LEFT JOIN t3 ON P(t2.b,t3.b)</pre>
<p>MySQL数据库对于只包含内联接(而非外联接)的联接表达式，可以删除括号。 你可以移除括号并从左到右评估(或实际上，你可以按任何顺序评估表)。对外联接却不是这样。去除括号可能会更改结果。对外联接和内联接的结合，也不是这样。去除括号可能会更改结果。</p>
<div>
<div>
<div>
<div>
<h3>14. MySQL如何优化GROUP BY</h3>
</div>
</div>
</div>
<p>满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表，表中每个组的所有行应为连续的，然后使用该临时表来找到组并应用累积函数(如 果有)。在某些情况中，<strong>MySQL</strong>能够做得更好，通过索引访问而不用创建临时表。数据库Mysql索引优化是数据库优化技巧常用的重要方法。</p>
<p>为GROUP BY使用数据库索引的最重要的前提条件是 所有GROUP BY列引用同一索引的属性，并且索引按顺序保存其关键字(例如，这是B-树索 引，而不是HASH索引)。是否用索引访问来代替临时表的使用还取决于在查询中使用了哪部分索引、 为该部分指定的条件，以及选择的累积函数。有两种方法通过索引访问执行GROUP BY查询，组合操作结合所有范围判断式使用(如果有)。第2个方法首先执行范围扫描，然后组合结果元组。</p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SQL高手篇:精妙SQL语句介绍</title>
		<link>https://www.3code.cn/sql%e9%ab%98%e6%89%8b%e7%af%87%e7%b2%be%e5%a6%99sql%e8%af%ad%e5%8f%a5%e4%bb%8b%e7%bb%8d/</link>
		
		<dc:creator><![CDATA[寒林]]></dc:creator>
		<pubDate>Tue, 03 May 2011 08:40:05 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[mysql]]></category>
		<guid isPermaLink="false">https://www.3code.cn/?p=2547</guid>

					<description><![CDATA[SQL高手篇:精妙SQL语句介绍 ]]></description>
										<content:encoded><![CDATA[<p>说明：复制表(只复制结构,源表名：a 新表名：b)</p>
<p>SQL: select * into b from a where 1&lt;&gt;1</p>
<p>说明：拷贝表(拷贝数据,源表名：a 目标表名：b)</p>
<p>SQL: insert into b(a, b, c) select  d,e,f from b;</p>
<p>说明：显示文章、提交人和最后回复时间</p>
<p>SQL: select  a.title,a.username,b.adddate from table a,(select max(adddate) adddate from  table where table.title=a.title) b</p>
<p>说明：外连接查询(表名1：a 表名2：b)</p>
<p>SQL:  select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c</p>
<p>说明：日程安排提前五分钟提醒</p>
<p>SQL: select * from 日程安排 where  datediff(&#8216;minute&#8217;,f开始时间,getdate())&gt;5</p>
<p>说明：两张关联表，删除主表中已经在副表中没有的信息</p>
<p>SQL:</p>
<p>delete from info where not exists ( select * from infobz  where info.infid=infobz.infid )</p>
<p>说明：&#8211;</p>
<p>SQL:</p>
<p>SELECT A.NUM,  A.NAME, B.UPD_DATE, B.PREV_UPD_DATE FROM TABLE1,(SELECT X.NUM, X.UPD_DATE,  Y.UPD_DATE PREV_UPD_DATE FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND  FROM TABLE2 WHERE TO_CHAR(UPD_DATE,&#8217;YYYY/MM&#8217;) = TO_CHAR(SYSDATE, &#8216;YYYY/MM&#8217;)) X,  (SELECT NUM, UPD_DATE, STOCK_ONHAND FROM TABLE2 WHERE  TO_CHAR(UPD_DATE,&#8217;YYYY/MM&#8217;) = TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, &#8216;YYYY/MM&#8217;)  amp;brvbar;amp;brvbar; &#8216;/01&#8242;,&#8217;YYYY/MM/DD&#8217;) &#8211; 1, &#8216;YYYY/MM&#8217;) ) Y, WHERE X.NUM =  Y.NUM （+）AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) &lt;&gt; X.STOCK_ONHAND ) B  WHERE A.NUM = B.NUM</p>
<p>说明：&#8211;</p>
<p>SQL:</p>
<p>select * from studentinfo  where not exists(select * from student where studentinfo.id=student.id) and  系名称='&#8221;amp;strdepartmentnameamp;&#8221;&#8216; and 专业名称='&#8221;amp;strprofessionnameamp;&#8221;&#8216; order  by 性别,生源地,高考总成绩<br />
说明： 从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源）</p>
<p>SQL:</p>
<p>SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, &#8216;yyyy&#8217;) AS  telyear, SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;01&#8217;, a.factration)) AS JAN,  SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;02&#8217;, a.factration)) AS FRI,  SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;03&#8217;, a.factration)) AS MAR,  SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;04&#8217;, a.factration)) AS APR,  SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;05&#8217;, a.factration)) AS MAY,  SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;06&#8217;, a.factration)) AS  JUE,SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;07&#8217;, a.factration)) AS JUL,  SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;08&#8217;, a.factration)) AS AGU,  SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;09&#8217;, a.factration)) AS SEP,  SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;10&#8217;, a.factration)) AS OCT,  SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;11&#8217;, a.factration)) AS  NOV,SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8217;12&#8217;, a.factration)) AS DEC FROM  (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration FROM  TELFEESTAND a, TELFEE b WHERE a.tel = b.telfax) a GROUP BY a.userper, a.tel,  a.standfee, TO_CHAR(a.telfeedate, &#8216;yyyy&#8217;)</p>
<p>说明：四表联查问题：</p>
<p>SQL: select  * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d  on a.a=d.d where &#8230;..</p>
<p>说明：得到表中最小的未使用的ID号</p>
<p>SQL:</p>
<p>SELECT  (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN  MIN(HandleID) + 1 ELSE 1 END) as HandleID FROM Handle WHERE NOT HandleID IN  (SELECT a.HandleID &#8211; 1 FROM Handle a)</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>MySQL中文模糊检索问题</title>
		<link>https://www.3code.cn/mysql%e4%b8%ad%e6%96%87%e6%a8%a1%e7%b3%8a%e6%a3%80%e7%b4%a2%e9%97%ae%e9%a2%98/</link>
		
		<dc:creator><![CDATA[寒林]]></dc:creator>
		<pubDate>Mon, 15 Nov 2010 07:04:29 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[mysql]]></category>
		<guid isPermaLink="false">https://www.3code.cn/?p=2262</guid>

					<description><![CDATA[在 MySQL下，在进行中文模糊检索时，经常会返回一些与之不相关的记录，如查找 "%a%" 时，返回的可能有中文字符，却没有a字符存在。本人以前也曾遇到过类似问题，经详细阅读MySQL的Manual，发现可以有一种方法很方便的解决并得到满意的结果。]]></description>
										<content:encoded><![CDATA[<p>在 MySQL下，在进行中文模糊检索时，经常会返回一些与之不相关的记录，如查找 &#8220;%a%&#8221; 时，返回的可能有中文字符，却没有a字符存在。本人以前也曾遇到过类似问题，经详细阅读MySQL的Manual，发现可以有一种方法很方便的解决并得到满意的结果。<br />
例子：<br />
希望通过“标题”对新闻库进行检索，关键字可能包含是中英文，如下SQL语句：<br />
select id,title,name from achech_com.news where title like &#8216;%a%&#8217;<br />
返回的结果，某些title字段确定带了“a”关键字，而有些则只有中文，但也随之返回在检索结果中。<br />
解决方法，使用 BINARY 属性进行检索，如：<br />
QUOTE: )<br />
select id,title,name from achech_com.news where binary title like &#8216;%a%&#8217;<br />
返回的结果较之前正确，但英文字母区分大小写，故有时在检索如“Achech”及“achech”的结果是不一样的。知道了使用 BINARY 属性可以解决前面这个问题，再看看 MySQL 支持的UCASE 及 CONCAT 函数，其中 UCASE 是将英文全部转成大写，而CONCAT函数的作用是对字符进行连接，以下是我们完全解决后的SQL 语句：<br />
QUOTE: &lt;g<br />
select id,title,name from achech_com.news<br />
where binary ucase(title) like concat(&#8216;%&#8217;,ucase(&#8216;a&#8217;),&#8217;%&#8217;) &#8221;<br />
检索的步骤是先将属性指定为 BINARY ，以精确检索结果，而被 like 的 title内容存在大小写字母的可能，故先使用 ucase 函数将字段内容全部转换成大写字母，然后再进行 like 操作，而 like 的操作使用模糊方法，使用 concat的好处是传进来的可以是直接的关键字，不需要带“%”万用符，将“&#8217;a&#8217;”直接换成你的变量，在任何语言下都万事无忧了。 当然你也可以这么写：<br />
select id,title,name from achech_com.news where binary ucase(title) like ucase(&#8216;%a%&#8217;)<br />
检索的结果还算满意吧，不过速度可能会因此而慢N毫秒。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>解决mysql的utf8中文排序的方法</title>
		<link>https://www.3code.cn/mysql-utf8-gbk/</link>
		
		<dc:creator><![CDATA[寒林]]></dc:creator>
		<pubDate>Tue, 31 Aug 2010 08:52:34 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP 函数]]></category>
		<guid isPermaLink="false">https://www.3code.cn/?p=2057</guid>

					<description><![CDATA[在编译源码时加上gbk编码即可，如果已经安装好了，重新编译再安装，重新编译安装一般不会影响mysql的已有设置，包括数据都不会受到影响。]]></description>
										<content:encoded><![CDATA[<p>在mysql中使用默认字符集为utf8，结果想要把中文按拼音排序出现了问题，排出来的顺序乱七八糟，不是我们想要的结果。</p>
<p>解决办法如下：<br />
1、不想改变表定义及默认编码的情况，将字段先转换成gbk编码再排序：</p>
<p>SELECT * FROM table ORDER BY CONVERT( chinese_field USING gbk ) ;</p>
<p>前提是在安装mysql时安装了gbk字符集，不然会报错：</p>
<p>#1115 &#8211; Unknown character set: &#8216;gbk&#8217;</p>
<p>在编译源码时加上gbk编码即可，如果已经安装好了，重新编译再安装，重新编译安装一般不会影响mysql的已有设置，包括数据都不会受到影响。</p>
<p>2、直接将字段的字符集改成gbk，然后直接使用order by 排序即可。</p>
<p>mysql 5.x支持某列单独定义字符集。</p>
<p>3、网上也有人说将字段定义加上binary属性也能达到效果，未作测试，不敢评论。</p>
<p>mysql的文档中也提到字符集校对规则：</p>
<p>SELECT * FROM t1 ORDER BY a COLLATE utf8_bin;</p>
<p>但此仅仅只影响校对规则，并不影响字符的字符集本身。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>php mysql_affected_rows</title>
		<link>https://www.3code.cn/php-mysql_affected_rows/</link>
		
		<dc:creator><![CDATA[寒林]]></dc:creator>
		<pubDate>Thu, 06 May 2010 04:05:06 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[mysql]]></category>
		<guid isPermaLink="false">https://www.3code.cn/?p=1634</guid>

					<description><![CDATA[mysql_affected_rows -- 取得前一次 MySQL 操作所影响的记录行数 int mysql_affected_rows ( [resource link_identifier] ) 
取得最近一次与 link_identifier 关联的 INSERT，UPDATE 或 DELETE 查询所影响的记录行数。]]></description>
										<content:encoded><![CDATA[<p><strong>mysql_affected_rows</strong></p>
<div>(PHP 3, PHP 4, PHP 5)<br />
mysql_affected_rows &#8212; 取得前一次 MySQL 操作所影响的记录行数</div>
<div><a name="AEN95945"></a></p>
<h2>说明</h2>
<p>int <strong>mysql_affected_rows</strong> ( [resource link_identifier] )</p>
<p>取得最近一次与 <var>link_identifier</var> 关联的    INSERT，UPDATE 或 DELETE 查询所影响的记录行数。</div>
<div><a name="AEN95955"></a></p>
<h2>参数</h2>
<div>
<dl>
<dt><var> link_identifier</var></dt>
<dd>MySQL 的连接标识符。如果没有指定，默认使用最后被 <strong>mysql_connect()</strong> 打开的连接。如果没有找到该连接，函数会尝试调用 <strong>mysql_connect()</strong> 建立连接并使用它。如果发生意外，没有找到连接或无法建立连接，系统发出 <tt><strong>E_WARNING</strong></tt> 级别的警告信息。</p>
</dd>
</dl>
</div>
</div>
<div><a name="AEN95967"></a></p>
<h2>返回值</h2>
<p>执行成功则返回受影响的行的数目，如果最近一次查询失败的话，函数返回 -1。</p>
<p>如果最近一次操作是没有任何条件（WHERE）的 DELETE    查询，在表中所有的记录都会被删除，但本函数返回值在 4.1.2 版之前都为 0。</p>
<p>当使用 UPDATE 查询，MySQL 不会将原值和新值一样的列更新。这样使得    <strong>mysql_affected_rows()</strong> 函数返回值不一定就是查询条件所符合的记录数，只有真正被修改的记录数才会被返回。</p>
<p>REPLACE 语句首先删除具有相同主键的记录，然后插入一个新记录。本函数返回的是被删除的记录数加上被插入的记录数。</p></div>
<div><a name="AEN95974"></a></p>
<h2>范例</h2>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<div><a name="AEN95977"></a><strong>例子 1. <strong>mysql_affected_rows()</strong> 例子</strong></p>
<table border="0" cellpadding="5" bgcolor="#e0e0e0">
<tbody>
<tr>
<td><code><span style="color: #000000;"> <span style="color: #0000bb;">&lt;?php<br />
$link </span><span style="color: #007700;">= </span><span style="color: #0000bb;">mysql_connect</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'localhost'</span><span style="color: #007700;">, </span><span style="color: #dd0000;">'mysql_user'</span><span style="color: #007700;">, </span><span style="color: #dd0000;">'mysql_password'</span><span style="color: #007700;">);<br />
if (!</span><span style="color: #0000bb;">$link</span><span style="color: #007700;">) {<br />
die(</span><span style="color: #dd0000;">'Could not connect: ' </span><span style="color: #007700;">. </span><span style="color: #0000bb;">mysql_error</span><span style="color: #007700;">());<br />
}<br />
</span><span style="color: #0000bb;">mysql_select_db</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'mydb'</span><span style="color: #007700;">);</p>
<p></span><span style="color: #ff8000;">/* 本例返回被删除记录的准确数目 */<br />
</span><span style="color: #0000bb;">mysql_query</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'DELETE FROM mytable WHERE id &lt; 10'</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">printf</span><span style="color: #007700;">(</span><span style="color: #dd0000;">"Records deleted: %d\n"</span><span style="color: #007700;">, </span><span style="color: #0000bb;">mysql_affected_rows</span><span style="color: #007700;">());</p>
<p></span><span style="color: #ff8000;">/* 对于非真值的 WHERE 子句，应返回 0 */<br />
</span><span style="color: #0000bb;">mysql_query</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'DELETE FROM mytable WHERE 0'</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">printf</span><span style="color: #007700;">(</span><span style="color: #dd0000;">"Records deleted: %d\n"</span><span style="color: #007700;">, </span><span style="color: #0000bb;">mysql_affected_rows</span><span style="color: #007700;">());<br />
</span><span style="color: #0000bb;">?&gt;</span> </span> </code></td>
</tr>
</tbody>
</table>
<p>上例的输出类似于：</p>
<table border="0" cellpadding="5" bgcolor="#e0e0e0">
<tbody>
<tr>
<td>
<pre>Records deleted: 10
Records deleted: 0</pre>
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<div><a name="AEN95984"></a><strong>例子 2. 使用事务处理的 <strong>mysql_affected_rows()</strong> 例子</strong></p>
<table border="0" cellpadding="5" bgcolor="#e0e0e0">
<tbody>
<tr>
<td><code><span style="color: #000000;"> <span style="color: #0000bb;">&lt;?php<br />
$link </span><span style="color: #007700;">= </span><span style="color: #0000bb;">mysql_connect</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'localhost'</span><span style="color: #007700;">, </span><span style="color: #dd0000;">'mysql_user'</span><span style="color: #007700;">, </span><span style="color: #dd0000;">'mysql_password'</span><span style="color: #007700;">);<br />
if (!</span><span style="color: #0000bb;">$link</span><span style="color: #007700;">) {<br />
die(</span><span style="color: #dd0000;">'Could not connect: ' </span><span style="color: #007700;">. </span><span style="color: #0000bb;">mysql_error</span><span style="color: #007700;">());<br />
}<br />
</span><span style="color: #0000bb;">mysql_select_db</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'mydb'</span><span style="color: #007700;">);</p>
<p></span><span style="color: #ff8000;">/* Update records */<br />
</span><span style="color: #0000bb;">mysql_query</span><span style="color: #007700;">(</span><span style="color: #dd0000;">"UPDATE mytable SET used=1 WHERE id &lt; 10"</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">printf </span><span style="color: #007700;">(</span><span style="color: #dd0000;">"Updated records: %d\n"</span><span style="color: #007700;">, </span><span style="color: #0000bb;">mysql_affected_rows</span><span style="color: #007700;">());<br />
</span><span style="color: #0000bb;">mysql_query</span><span style="color: #007700;">(</span><span style="color: #dd0000;">"COMMIT"</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">?&gt;</span> </span> </code></td>
</tr>
</tbody>
</table>
<p>上例的输出类似于：</p>
<table border="0" cellpadding="5" bgcolor="#e0e0e0">
<tbody>
<tr>
<td>
<pre>Updated Records: 10</pre>
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div><a name="AEN95990"></a></p>
<h2>注释</h2>
<div>
<blockquote><p><strong>事务处理: </strong> 如果使用事务处理（transactions），需要在 INSERT，UPDATE 或 DELETE 查询后调用     <strong>mysql_affected_rows()</strong> 函数，而不是在 COMMIT 命令之后。</p></blockquote>
</div>
<div>
<blockquote><p><strong>SELECT 语句: </strong> 要获取 SELECT 所返回的行数，可以用     <strong>mysql_num_rows()</strong>。</p></blockquote>
</div>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Excel xls 导入到mysql的一种方法</title>
		<link>https://www.3code.cn/excel-xls-to-mysql/</link>
		
		<dc:creator><![CDATA[寒林]]></dc:creator>
		<pubDate>Fri, 30 Apr 2010 10:42:17 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP数据库操作]]></category>
		<guid isPermaLink="false">https://www.3code.cn/?p=1629</guid>

					<description><![CDATA[有一个xls表格很多数据，需要导入到mysql数据库中。在网上搜索了一个比较可行的方法，列出来大家看下：
1. 首先打开excel, 用EXCEL对每行记录生成SQL语句：
2. 第一行数据生成后，利用excel的向下复制的功能，向下拉出其它行的数据。]]></description>
										<content:encoded><![CDATA[<p>有一个xls表格很多数据，需要导入到mysql数据库中。在网上搜索了一个比较可行的方法，列出来大家看下：</p>
<p><strong>1. 首先打开excel, 用EXCEL对每行记录生成SQL语句：<br />
</strong><br />
语法是：=CONCATENATE(&#8220;insert into ip (a1,a2,a3) values (&#8216;&#8221;,A1,&#8221;&#8216;,'&#8221;,B1,&#8221;&#8216;,'&#8221;,C1,&#8221;&#8216;);&#8221;)<br />
选中数据列右边的一个空白单元格，在excel地址栏中输入以上语句。<br />
其中a1,a2,a3是字段名称，A1,B1,C1是从单元格中获取的数据。<br />
<strong><br />
2. 第一行数据生成后，利用excel的向下复制的功能，向下拉出其它行的数据。</p>
<p>3. 对生成的数据列复制到记事本中，或者直接复制到phpmyadmin的导入的文本框中，利用phpmyadmin导入到mysql中即可。</strong></p>
<p>以上是全部。</p>
<p>欢迎大家讨论。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
