⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 manual_tutorial.html

📁 关于mysql学习的 中文教程
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<h4><a NAME="Selecting_columns" HREF="manual_toc.html#Selecting_columns">8.4.4.3 
选择特定列</a></h4>

<p>如果你不想要看到你的表的整个行,就命名你感兴趣的列,用逗号分开。例如,如果你想要知道你的动物什么时候出生的,精选<code>name</code>和<code>birth</code>列: 
</p>

<pre>mysql&gt; SELECT name, birth FROM pet;
+----------+------------+
| name     | birth      |
+----------+------------+
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
</pre>

<p>找出谁拥有宠物,使用这个查询: </p>

<pre>mysql&gt; SELECT owner FROM pet;
+--------+
| owner  |
+--------+
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+--------+
</pre>

<p><a NAME="IDX602"></a>然而,注意到查询简单地检索每个记录的<code>owner</code>字段,并且他们中的一些出现多次。为了使输出减到最少,通过增加关键词<code>DISTINCT</code>检索出每个唯一的输出记录: 
</p>

<pre>mysql&gt; SELECT DISTINCT owner FROM pet;
+--------+
| owner  |
+--------+
| Benny  |
| Diane  |
| Gwen   |
| Harold |
+--------+
</pre>

<p>你能使用一个<code>WHERE</code>子句把行选择与列选择相结合。例如,为了只得到狗和猫的出生日期,使用这个查询: 
</p>

<pre>mysql&gt; SELECT name, species, birth FROM pet
    -&gt; WHERE species = &quot;dog&quot; OR species = &quot;cat&quot;;
+--------+---------+------------+
| name   | species | birth      |
+--------+---------+------------+
| Fluffy | cat     | 1993-02-04 |
| Claws  | cat     | 1994-03-17 |
| Buffy  | dog     | 1989-05-13 |
| Fang   | dog     | 1990-08-27 |
| Bowser | dog     | 1989-08-31 |
+--------+---------+------------+</pre>

<h4><a NAME="Sorting_rows" HREF="manual_toc.html#Sorting_rows">8.4.4.4 排序行</a></h4>

<p>你可能已经注意到前面的例子中结果行没有以特定的次序被显示。然而,当行以某个有意义的方式排序,检验查询输出通常是更容易的。为了排序结果,使用一个<code>ORDER 
BY</code>子句。 </p>

<p>这里是动物生日,按日期排序: </p>

<pre>mysql&gt; SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name     | birth      |
+----------+------------+
| Buffy    | 1989-05-13 |
| Bowser   | 1989-08-31 |
| Fang     | 1990-08-27 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Slim     | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy   | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
</pre>

<p>为了以逆序排序,增加<code>DESC</code>(下降 )关键字到你正在排序的列名上: 
</p>

<pre>mysql&gt; SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name     | birth      |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Claws    | 1994-03-17 |
| Fluffy   | 1993-02-04 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Buffy    | 1989-05-13 |
+----------+------------+
</pre>

<p>你能在多个列上排序。例如,按动物的种类排序,然后按生日,首先是动物种类中最年轻的动物,使用下列查询: 
</p>

<pre>mysql&gt; SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
+----------+---------+------------+
| name     | species | birth      |
+----------+---------+------------+
| Chirpy   | bird    | 1998-09-11 |
| Whistler | bird    | 1997-12-09 |
| Claws    | cat     | 1994-03-17 |
| Fluffy   | cat     | 1993-02-04 |
| Fang     | dog     | 1990-08-27 |
| Bowser   | dog     | 1989-08-31 |
| Buffy    | dog     | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim     | snake   | 1996-04-29 |
+----------+---------+------------+
</pre>

<p>注意<code>DESC</code>关键词仅适用于紧跟在它之前的列名字(<code>birth</code>);<code>species</code>值仍然以升序被排序。 
</p>

<h4><a NAME="Date_calculations" HREF="manual_toc.html#Date_calculations">8.4.4.5 
日期计算</a></h4>

<p><strong>MySQL</strong>提供几个函数,你能用来执行在日期上的计算,例如,计算年龄或提取日期的部分。 
</p>

<p>为了决定你的每个宠物有多大,用出生日期和当前日期之间的差别计算年龄。通过变换2个日期到天数,取差值,并且用365除(在一年里的天数): 
</p>

<pre>mysql&gt; SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 FROM pet;
+----------+-------------------------------------+
| name     | (TO_DAYS(NOW())-TO_DAYS(birth))/365 |
+----------+-------------------------------------+
| Fluffy   |                                6.15 |
| Claws    |                                5.04 |
| Buffy    |                                9.88 |
| Fang     |                                8.59 |
| Bowser   |                                9.58 |
| Chirpy   |                                0.55 |
| Whistler |                                1.30 |
| Slim     |                                2.92 |
| Puffball |                                0.00 |
+----------+-------------------------------------+
</pre>

<p>尽管查询可行,关于它还有能被改进的一些事情。首先,如果行以某个次序表示,其结果能更容易被扫描。第二,年龄列的标题不是很有意义的。 
</p>

<p>第一个问题通过增加一个<code>ORDER BY name</code>子句按名字排序输出来解决。为了处理列标题,为列提供一个名字以便一个不同的标签出现在输出中(这被称为一个列别名): 
</p>

<pre>mysql&gt; SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
    -&gt; FROM pet ORDER BY name;
+----------+------+
| name     | age  |
+----------+------+
| Bowser   | 9.58 |
| Buffy    | 9.88 |
| Chirpy   | 0.55 |
| Claws    | 5.04 |
| Fang     | 8.59 |
| Fluffy   | 6.15 |
| Puffball | 0.00 |
| Slim     | 2.92 |
| Whistler | 1.30 |
+----------+------+
</pre>

<p>为了按<code>age</code>而非<code>name</code>排序输出,只要使用一个不同<code>ORDER 
BY</code>子句: </p>

<pre>mysql&gt;  SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
    -&gt;  FROM pet ORDER BY age;
+----------+------+
| name     | age  |
+----------+------+
| Puffball | 0.00 |
| Chirpy   | 0.55 |
| Whistler | 1.30 |
| Slim     | 2.92 |
| Claws    | 5.04 |
| Fluffy   | 6.15 |
| Fang     | 8.59 |
| Bowser   | 9.58 |
| Buffy    | 9.88 |
+----------+------+
</pre>

<p>一个类似的查询可以被用来确定已经死亡动物的死亡年龄。你通过检查<code>death</code>值是否是<code>NULL</code>来决定那些是哪些动物,然后,对于那些有非<code>NULL</code>值,计算在<code>death</code>和<code>birth</code>值之间的差别: 
</p>

<pre>mysql&gt;  SELECT name, birth, death, (TO_DAYS(death)-TO_DAYS(birth))/365 AS age
    -&gt;  FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name   | birth      | death      | age  |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5.91 |
+--------+------------+------------+------+
</pre>

<p>差询使用<code>death IS NOT NULL</code>而非<code>death != NULL</code>,因为<code>NULL</code>是特殊的值,这以后会解释。见<a HREF="manual_Tutorial.html#Working_with_NULL">8.4.4.6 用<code>NULL</code>值工作</a>。 
</p>

<p>如果你想要知道哪个动物下个月过生日,怎么办?对于这类计算,年和天是无关的,你简单地想要提取<code>birth</code>列的月份部分。<strong>MySQL</strong>提供几个日期部分的提取函数,例如<code>YEAR()</code>、<code>MONTH()</code>和<code>DAYOFMONTH()</code>。在这里<code>MONTH()</code>是适合的函数。为了看它怎样工作,运行一个简单的查询,显示<code>birth</code>和<code>MONTH(birth)</code>的值: 
</p>

<pre>mysql&gt; SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name     | birth      | MONTH(birth) |
+----------+------------+--------------+
| Fluffy   | 1993-02-04 |            2 |
| Claws    | 1994-03-17 |            3 |
| Buffy    | 1989-05-13 |            5 |
| Fang     | 1990-08-27 |            8 |
| Bowser   | 1989-08-31 |            8 |
| Chirpy   | 1998-09-11 |            9 |
| Whistler | 1997-12-09 |           12 |
| Slim     | 1996-04-29 |            4 |
| Puffball | 1999-03-30 |            3 |
+----------+------------+--------------+
</pre>

<p>用下个月的生日找出动物也是容易的。假定当前月是4月,那么月值是<code>4</code>并且你寻找在5月出生的动物 
(5月), 象这样: </p>

<pre>mysql&gt; SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
+-------+------------+
| name  | birth      |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+
</pre>

<p>当然如果当前月份是12月,就有点复杂了。你不是只把加1到月份数(<code>12</code>)上并且寻找在13月出生的动物,因为没有这样的月份。相反,你寻找在1月出生的动物(1月) 
。 </p>

<p>你甚至可以编写查询以便不管当前月份是什么它都能工作。这种方法你不必在查询中使用一个特定的月份数字,<code>DATE_ADD()</code>允许你把时间间隔加到一个给定的日期。如果你把一个月加到<code>NOW()</code>值上,然后用<code>MONTH()</code>提取月份部分,结果产生寻找生日的月份: 
</p>

<pre>mysql&gt; SELECT name, birth FROM pet
    -&gt; WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
</pre>

<p>完成同样任务的一个不同方法是加<code>1</code>以得出当前月份的下一个月(在使用取模函数(<code>MOD</code>)后,如果它当前是<code>12</code>,则“绕回”月份到值<code>0</code>): 
</p>

<pre>mysql&gt; SELECT name, birth FROM pet
    -&gt; WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;
</pre>

<p>注意,<code>MONTH</code>返回在1和12之间的一个数字,且<code>MOD(something,12)</code>返回在0和11之间的一个数字,因此必须在<code>MOD()</code>以后加1,否则我们将从11月( 
11 )跳到1月(1)。 </p>

<h4><a NAME="Working_with_NULL" HREF="manual_toc.html#Working_with_NULL">8.4.4.6 <code>NULL</code>值操作</a></h4>

<p><code>NULL</code>值可能很奇怪直到你习惯于它。概念上,<code>NULL</code>意味着“没有值”或“未知值”,且它被看作有点与众不同的值。为了测试<code>NULL</code>,你不能使用算术比较运算符例如<code>=</code>、<code>&lt;</code>或<code>!=</code>。为了说明它,试试下列查询: 
</p>

<pre>mysql&gt; SELECT 1 = NULL, 1 != NULL, 1 &lt; NULL, 1 &gt; NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 &lt; NULL | 1 &gt; NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+
</pre>

<p>很清楚你从这些比较中得到毫无意义的结果。相反使用<code>IS NULL</code>和<code>IS 
NOT NULL</code>操作符: </p>

<pre>mysql&gt; SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+
</pre>

<p>在<strong>MySQL</strong>中,0意味着假而1意味着真。 </p>

<p><code>NULL</code>这样特殊的处理是为什么,在前面的章节中,为了决定哪个动物不再是活着的,使用<code>death 
IS NOT NULL</code>而不是<code>death != NULL</code>是必要的。 </p>

<h4><a NAME="Pattern_matching" HREF="manual_toc.html#Pattern_matching">8.4.4.7 
模式匹配</a></h4>

<p><strong>MySQL</strong>提供标准的SQL模式匹配,以及一种基于象Unix实用程序如<code>vi</code>、<code>grep</code>和<code>sed</code>的扩展正则表达式模式匹配的格式。 
</p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -