13.9 本章实例
1. 生成3个1~100之间的随机整数
因为RAND()只能生成0~1之间的随机数,所以必须要乘以100才能使数的范围在0~100之间。而且题目还要求必须是整数,所以必须用ROUND(x)生成一个与数x最接近的整数。当然,也可以使用FLOOR(x)来生成一个小于或者等于x的最大整数。也可以使用CEILING(x)生成一个大于或者等于x的最小整数。代码如下:
SELECT ROUND(RAND()*100), FLOOR(RAND()»100), CEILING(RAND()*100);
代码的执行结果如下:
mysql> SELECT ROUND(RAND()*100), FLOOR(RAND()*100), CEILING(RAND()*100); +-------------------+-------------------+---------------------+ | ROUND(RAND()*100) | FLOOR(RAND()*100) | CEILING(RAND()*100) | +-------------------+-------------------+---------------------+ | 6 | 45 | 12 | +-------------------+-------------------+---------------------+ 1 row in set (0.02 sec)
因为为RAND()产生的随机数,所以每次执行的结果都会是不一样的。
2. 计算PI(圆周率)的余弦值和自然对数值
PI的值可以用PI()函数来获取。计算余弦值可以用COS(x)函数。计算自然对数用LOG(x)函数。代码如下:
SELECT Pl(), COS(PI()) ,LOG(PI());
代码的执行结果如下:
mysql> SELECT PI(), COS(PI()) ,LOG(PI()); +----------+-----------+-----------------+ | PI() | COS(PI()) | LOG(PI()) | +----------+-----------+-----------------+ | 3.141593 | -1 | 1.1447298858494 | +----------+-----------+-----------------+ 1 row in set (0.02 sec)
3. 按如下要求来操作表
(1)创建一张表str_date,其中包含3个字段。id是INT类型,而且 AUTO_INCREMENT类型。info是VARCHAR(20)类型的,dt也是DATETIME类型的。
(2)插入一条记录,id让其自动添加info值为china,dt为系统当前日期和时间。
(3)用用LAST_INSERT_ID()函数来査看最后的AUTO_INCREMENT值。
(4)将info字段的值换成大写字母显示。将info的值反向输出。获取info取值的前3个字母。
(5)计算出dt中的时间是这一年的第几天,是星期几。最后按照“Jan lSt 2008 1l:23:23 AM”这样的格式输出整个时间。
操作过程如下:
(1)创建str_date表。代码如下:
CREATE TABLE str_date( id INT AUTO_INCREMENT PRIMARY KEY,info VARCHAR(20), dt DATETIME );
代码执行结果如下:
mysql> CREATE TABLE str_date( id INT AUTO_INCREMENT PRIMARY KEY,info VARCHAR(20), dt DATETIME ); Query OK, 0 rows affected (0.50 sec)
(2)插入记录。id字段的值是自动增加的,赋值为null后系统会自动添加值。dt字段要插入系统当前日期和时间,可以使用NOW()函数。INSERT语句的代码如下:
INSERT INTO str_date VALUES( NULL, 'china', NOW());
INSERT语句的执行结果如下:
mysql> INSERT INTO str_date VALUES( NULL, 'china', NOW()); Query OK, 1 row affected (0.00 sec)
可以使用SELECT语句来查询。SELECT语句执行结果如下:
mysql> SELECT * FROM str_date; +----+-------+---------------------+ | id | info | dt | +----+-------+---------------------+ | 1 | china | 2009-10-28 17:15:25 | +----+-------+---------------------+ 1 row in set (0.00 sec)
(3) 用LAST_INSERT_ID()函数来查看最后的AUTO_INCREMENT值。代码执行如下
mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+ 1 row in set (0.00 sec)
因为之前只插入了一条记录,;id字段的值1。所以使用LAT_INSERT_ID()函数返回的值为1。
(4)使用UPPER函数将小写字母变成大写;使用REVERSE()函数将字符串反向输出:使用LEFT()函数来获得字符串前端的字符。SELECT语句的代码如下:
SELECT info, UPPER(info), REVERSE(info), LEFT(info,3) FROM str_date;
SELECT语句的执行结果如下:
mysql> SELECT info, UPPER(info), REVERSE(info), LEFT(info,3) FROM str_date; +-------+-------------+---------------+--------------+ | info | UPPER(info) | REVERSE(info) | LEFT(info,3) | +-------+-------------+---------------+--------------+ | china | CHINA | anihc | chi | +-------+-------------+---------------+--------------+ 1 row in set (0.01 sec)
(5)使用DAYOFYEAR()函数可以计算dt中的日期是一年中的第几天;使用DAYNAME()函数来计算是星期几。SELECT语句的代码如下:
mysql> SELECT dt, DAYOFYEAR(dt), DAYNAME(dt) FROM str_date; +---------------------+---------------+-------------+ | dt | DAYOFYEAR(dt) | DAYNAME(dt) | +---------------------+---------------+-------------+ | 2009-10-28 17:15:25 | 301 | Wednesday | +---------------------+---------------+-------------+ 1 row in set (0.02 sec)
使用DATE_FORMAT()函数来为dt中的日期和时间设定格式。SELECT语句的代码如下:
SELECT dt, DATE_FORMAT(dt, '%b %D %Y %l:%i:%s %p')FROM str_date;
SELECT语句执行结果如下:
mysql> SELECT dt, DATE_FORMAT(dt, '%b %D %Y %l:%i:%s %p')FROM str_date; +---------------------+-----------------------------------------+ | dt | DATE_FORMAT(dt, '%b %D %Y %l:%i:%s %p') | +---------------------+-----------------------------------------+ | 2009-10-28 17:15:25 | Oct 28th 2009 5:15:25 PM | +---------------------+-----------------------------------------+ 1 row in set (0.02 sec)
4.先加一个名为"mybook1"的锁,持续时间为20秒。然后再创建名为"mybook2"的锁,持续时间为30秒。然后查询这两个锁的状态。最后解除这两个锁。
先用GET_LOCK()函数分别创建'mybook1'锁和'mybook2'锁。代码执行如下:
mysql> SELECT GET_LOCK('mybook1 ',20), GET_LOCK('mybook2',20); +-------------------------+------------------------+ | GET_LOCK('mybook1 ',20) | GET_LOCK('mybook2',20) | +-------------------------+------------------------+ | 1 | 1 | +-------------------------+------------------------+ 1 row in set (0.00 sec)
返回结果都为1,说明这两个锁都已经加上了。然后使用IS_FREE_LOCK('mybook1') 来查询mybook1锁是否还存在。查询结果如下:
mysql> SELECT IS_FREE_LOCK('mybook1'); +-------------------------+ | IS_FREE_LOCK('mybook1') | +-------------------------+ | 1 | +-------------------------+ 1 row in set (0.00 sec)
返回结果为1,说明已经不存在mybook1锁了。这是因为在创建mybookl锁之后,又创建了mybook2锁。这样,mybook1锁就自动解除了。
下面使用处RELEASE()函数来解除mybookl锁和mybook2锁。执行结果如下:
mysql> SELECT RELEASE_LOCK('mybook1'), RELEASE_LOCK('mybook2'); +-------------------------+-------------------------+ | RELEASE_LOCK('mybook1') | RELEASE_LOCK('mybook2') | +-------------------------+-------------------------+ | NULL | 1 | +-------------------------+-------------------------+ 1 row in set (0.00 sec)
RELEASE_LOCK('mybook2')返回结果为1,折说明函数成功的将mybook2锁解除。