Mysql教程

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锁解除。


关注微信获取最新动态