12、日期计算
YEAR( )、MONTH( )和DAYOFMONTH( )、CURDATE()、RIGHT()
1>mysql> SELECT name, birth, CURDATE(),
-> (YEAR(CURDATE())-YEAR(birth))
-> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
-> AS age
-> FROM pet;注释: YEAR()提取日期的年份,RIGHT()提取日期的MM-DD部分的最右边5个字符。 比较MM-DD值的表达式部分的值一般为1或0,如果CURDATE()的年比birth的年早,则年份应减去1。 整个表达式有些难懂,使用alias (age)来使输出的列标记更有意义
2>尽管查询可行,如果以某个顺序排列行,则能更容易地浏览结果。添加ORDER BY name子句按照名字对输出进行排序则能够实现。如下:
mysql> SELECT name, birth, CURDATE(),
-> (YEAR(CURDATE())-YEAR(birth))
-> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
-> AS age
-> FROM pet ORDER BY name;3>可以使用一个类似的查询来确定已经死亡动物的死亡年龄。你通过检查death值是否是NULL来确定是哪些动物,然后,对于那些非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;4>如果你想要知道哪个动物下个月过生日,怎么办?对于这类计算,年和天是无关的,你只需要提取birth列的月份部分。MySQL提供几个日期部分的提取函数,例如YEAR( )、MONTH( )和DAYOFMONTH( )。在这里MONTH()是适合的函数。为了看它怎样工作,运行一个简单的查询,显示birth和MONTH(birth)的值.如下:mysql> SELECT name, birth, MONTH(birth) FROM pet;5>找出下个月生日的动物也是容易的。假定当前月是4月,那么月值是4,你可以找在5月出生的动物 (5月),方法是:
mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;6>如果当前月份是12月,就有点复杂了。你不能只把1加到月份数(12)上并寻找在13月出生的动物,因为没有这样的月份。相反,你应寻找在1月出生的动物(1月) 。
你甚至可以编写查询,不管当前月份是什么它都能工作。采用这种方法不必在查询中使用一个特定的月份,DATE_ADD( )允许在一个给定的日期上加上时间间隔。如果在NOW( )值上加上一个月,然后用MONTH()提取月份,结果产生生日所在月份:
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
完成该任务的另一个方法是加1以得出当前月份的下一个月(在使用取模函数(MOD)后,如果月份当前值是12,则“回滚”到值0):
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
注意,MONTH返回在1和12之间的一个数字,且MOD(something,12)返回在0和11之间的一个数字,因此必须在MOD( )以后加1,否则我们将从11月( 11 )跳到1月(1)。 13、NULL值操作使用:IS NULL和IS NOT NULL操作符:而不能使用算术比较 操作符
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+ 0或者NULL:假other:真 。布尔运算的默认真值是1。因此完全可以在定义为NOT NULL的列内插入0或空字符串,实际是NOT NULL 14、模式匹配MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grep和sed的扩展正则表达式模式匹配的格式。在 MySQL中,SQL的模式默认是忽略大小写的"_"匹配任何单个字符"%"任意数目字符(包括零字符)
下面给出一些例子。注意使用SQL模式时,不能使用=或!=;而应使用LIKE或NOT LIKE比较操作符。
1>要想找出以“b”开头的名字:
mysql> SELECT * FROM pet WHERE name LIKE 'b%';
2>要想找出以“fy”结尾的名字:
mysql> SELECT * FROM pet WHERE name LIKE '%fy'; 3>要想找出包含“w”的名字:
mysql> SELECT * FROM pet WHERE name LIKE '%w%';
4>要想找出正好包含5个字符的名字,使用“_”模式字符:
mysql> SELECT * FROM pet WHERE name LIKE '_____'; 拓展:匹配N个字符,就写N个"_"
由MySQL提供的模式匹配的其它类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。
扩展正则表达式的一些字符是:
· ‘.’匹配任何单个的字符。
· 字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
· “ * ”匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。
- 如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。
- 为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。
为了说明扩展正则表达式如何工作,下面使用REGEXP重写上面所示的LIKE查询:
为了找出以“b”开头的名字,使用“^”匹配名字的开始:
1>mysql> SELECT * FROM pet WHERE name REGEXP '^b';
如果你想强制使REGEXP比较区分大小写,使用BINARY关键字使其中一个字符串变为二进制字符串。该查询只匹配名称首字母的小写‘b’。如下:
mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';
2、为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:
mysql> SELECT * FROM pet WHERE name REGEXP 'fy$';
3、为了找出包含一个“w”的名字,使用以下查询:、
mysql>SELECT * FROM pet WHERE name REGEXP 'w';
既然如果一个正则表达式出现在值的任何地方,其模式匹配了,就不必在先前的查询中在模式的两侧放置一个通配符以使得它匹配整个值,就像你使用了一个SQL模式那样。
4、为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.”实例在两者之间:
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
你也可以使用“{n}”“重复n次”操作符重写前面的查询。如下: mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';注:附录G:MySQL正则表达式 提供了关于正则表达式的句法的详细信息。 15、计数行COUNT(*) GROUP BY1》计算宠物的数目mysql> SELECT COUNT(*) FROM pet;2》在前面,你检索了拥有宠物的人的名字。如果你想要知道每个主人有多少宠物,你可以使用COUNT( )函数:(使用GROUP BY对每个owner的所有记录分组)mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;3》COUNT( )和GROUP BY以各种方式分类你的数据。下列例子显示出进行动物普查操作的不同方式。每种动物的数量:
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;4》每种性别的动物数量:mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;#(在这个输出中,NULL表示“未知性别”。)5》按种类和性别组合的动物数量: mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;6》若使用COUNT( ),你不必检索整个表。例如, 前面的查询,当只对狗和猫进行时,应为:
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE species = 'dog' OR species = 'cat'(检索整个表的情况是 此外为空 。因为是只对 dog和cat查询,此行可以省略大多性能 )
-> GROUP BY species, sex;
或,如果你仅需要知道已知性别的按性别的动物数目:
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE sex IS NOT NULL
-> GROUP BY species, sex;
16、使用1个以上的表17、获取数据库和表的信息 show databases;# 如果未选中,则返回NULL show tables ;#如果不存在,则返回empty desc tablename;#查询数据表的结构18、在批处理模式下使用mysql19、常用的查询19.1列的最大值
SELECT MAX(article) AS article FROM shop;#article为字段19.2、拥有某个列的最大值的行(任务:找出最贵物品的编号、销售商和价格。这很容易用一个子查询做到:)
SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop);
19.3、另一个解决方案是按价格降序排序所有行并用MySQL特定LIMIT子句只得到第一行:
SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1;
注:如果有多项最贵的物品( 例如每个的价格为19.95),LIMIT解决方案仅仅显示其中一个!
19.4、列的最大值:按组任务:每项物品的的最高价格是多少?
SELECT article, MAX(price) AS price FROM shop GROUP BY article
19.5