接下来我们该学习如何从一个表中检索数据信息了.
select语句用来从表中检索信息, 其一般各式为:
select what_to select from which_table
where conditions_to_satisfy;
what_to_select指出你想要看到的内容,可以是列的一个表,或*表示所有的列.
which_table指出你想要从其检索数据的表, where子句是可选项,若选择,conditions_to_satisfy指定须满足的检索条件.
最简单的形式就是检索表中所有数据:
mysql> select * from pet;
+----------+---------+-----+------------+-------+
| name | species | sex | birth | death |
+----------+---------+-----+------------+-------+
Puffball | hamster | f | 2000-07-28 | NULL |
+----------+---------+-----+------------+-------+
1 row in set <0.00 sec>
mysql>
可假如你现在发现你的记录有误,经查证,Puffball是1998年出生,而非2000年,则我们就需要使用update记录来修正错误:
mysql> update pet set birth='1998-07-28' where name='Puffball';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>
现在再次查看表中记录:
mysql> select * from pet;
+----------+---------+-----+------------+-------+
| name | species | sex | birth | death |
+----------+---------+-----+------------+-------+
Puffball | hamster | f | 1998-07-28 | NULL |
+----------+---------+-----+------------+-------+
1 row in set <0.00 sec>
mysql>
发现记录已经更改,这样根本就不需要重新装载数据库表了.
由上可知,检索整个表是很简单的,但有时候表中的记录有成千上万行,而且你需要查看的记录就那么几行几十行,在这种情况下就要对查询语句进行一些条件筛选了.
我们可以查找特定的行,我们要查找名叫 Harren的动物:
mysql> select * from pet where name='Harren';
我们可以在任何列上指定条件,如我们想指定在1998年以后出生的动物信息:
mysql> select * from pet where birth>'1998-01-01';
还有组合条件的查询,例如找出雌性的狗:
mysql> select * from pet where species='dog' and sex='f';
还有其他的一些查询方式:
mysql> select * from pet where species='snake' or species='bird';
mysql> select * from pet where (species='cat' and sex='m')
-> or (species='dog' and sex='f');
再有我们也可以只选择特定的列来显示:
mysql> select name, birth from pet;
mysql>select species from pet;
注意,上面的查询只是简单地检索符合条件的记录列, species中有一些重复的信息它会出现多次,为使输出减少,我们可以使用distinct检索输出每个唯一的输出记录(即相同的信息只会输出一次):
mysql>select distinct species from pet;
也可以这样查询:
mysql> select name,species,birth from pet
-> where species='dog' or species='cat';
再一个就是按顺序显示,使用排序语句 order by,例如按日期排序:
mysql> select name, birth from pet order by birth;
默认的排序为升序,要想以降序排列的话,就需要再后面加上 desc(降序)关键字:
mysql> select name,birth from pet order by birth desc;
注意DESC关键字仅适用于在它前面的列名(birth);不影响species列的排序顺序.
接下来是日期计算,要想确定每个动物的年龄,可以用当前日期和出生日期之差来显示:
mysql> select name,birth,curdate(),
-> (year(curdate())-year(birth))
-> - (right(curdate(),5)<right(birth,5)
-> as age from pet order by name;
在此处, year()提取日期的年的部分, right()提取日期的MM-DD(日历年)部分的右端5个字符.比较MM-DD值的表达式结果一般为1或0,若curdate()的年比birth的年早,则年份减1,使用 as age,把 age作为表达式的列名更有意义. 最后按照名字对输出进行排序,使结果容易查看.
我们可使用类似的查询来确定已死亡动物的死亡年龄. 通过检查death值是否为NULL来确定是那些动物,对于非空值,则计算出death和birth值间的差:
mysql> select name,birth, death,
-> (year(death)-year(birth))-(right(death,5)<right(birth,5))
-> as age
-> from pet where death is not NULL order by age;
想知道下个月有哪些动物过生日,怎么办呢(它们还过生日?呵呵,过个吧,都挺不容易的,给咱当了这么久的陪练,^_^)?这种计算,只需提取birth月份部分.在这里我们使用month()比较合适.
假定当前是8月,我们找9月过生日的动物(怎么说这话这么别扭啊,呵呵):
mysql> select name,birth from pet where month(birth)=9;
可要是在12月份,查询一月份的生日怎么办呢,这时我们就要用到了取模函数(mod),若当前月份是12,则"回滚"到值(0):
mysql> select name,birth from pet
-> where month(birth)=mod(month(curdate()),12)+1;
因为mond返回的值是在0到11之间,所以我们必须在后面加一个1.