您的位置:首页 > 数据库 > MySQL

MYSQL:视图view, 以及常用函数

2012-11-03 11:06 549 查看
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> #函数
mysql> seelct 3;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'seelct 3' at line 1
mysql> select 3;
+---+
| 3 |
+---+
| 3 |
+---+
1 row in set (0.00 sec)

mysql> select 3 - 5;
+-------+
| 3 - 5 |
+-------+
| -2 |
+-------+
1 row in set (0.00 sec)

mysql> select abs(3-5);
+----------+
| abs(3-5) |
+----------+
| 2 |
+----------+
1 row in set (0.05 sec)

mysql> #返回一个数字的二进制表示,7-> 1111
mysql> select bin(7);
+--------+
| bin(7) |
+--------+
| 111 |
+--------+
1 row in set (0.00 sec)

mysql> select hex(28);
+---------+
| hex(28) |
+---------+
| 1C |
+---------+
1 row in set (0.00 sec)

mysql> #对小数取整
mysql> #舍弃取整
mysql> select floor(3.25);
+-------------+
| floor(3.25) |
+-------------+
| 3 |
+-------------+
1 row in set (0.00 sec)

mysql> #看一看第4个栏目的商品的价格
mysql> select goods_id,goods_name,shop_price from goods where cat_id=4;
+----------+---------------------+------------+
| goods_id | goods_name | shop_price |
+----------+---------------------+------------+
| 1 | KD876 | 1388.00 |
| 14 | 诺基亚5800XM | 2625.00 |
| 18 | 夏新T5 | 2878.00 |
| 33 | 金立910浪漫镶钻手机 | 1233.00 |
+----------+---------------------+------------+
4 rows in set (0.20 sec)

mysql> #给会员打88折,请你取出第4个栏目的商品,及会员价.
mysql> select goods_id,goods_name,shop_price*0.88 from goods where cat_id=4;
+----------+---------------------+-----------------+
| goods_id | goods_name | shop_price*0.88 |
+----------+---------------------+-----------------+
| 1 | KD876 | 1221.4400 |
| 14 | 诺基亚5800XM | 2310.0000 |
| 18 | 夏新T5 | 2532.6400 |
| 33 | 金立910浪漫镶钻手机 | 1085.0400 |
+----------+---------------------+-----------------+
4 rows in set (0.00 sec)

mysql> #查88的基础上,抹掉零头
mysql> select goods_id,goods_name,floor(shop_price*0.88) from goods where cat_id=4;
+----------+---------------------+------------------------+
| goods_id | goods_name | floor(shop_price*0.88) |
+----------+---------------------+------------------------+
| 1 | KD876 | 1221 |
| 14 | 诺基亚5800XM | 2310 |
| 18 | 夏新T5 | 2532 |
| 33 | 金立910浪漫镶钻手机 | 1085 |
+----------+---------------------+------------------------+
4 rows in set (0.00 sec)

mysql> #给每一个商品生成一个5到15元之间的随机红包,购买随机赠送红包
mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.2725252316077475 |
+--------------------+
1 row in set (0.00 sec)

mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.5741129187625953 |
+--------------------+
1 row in set (0.00 sec)

mysql> select rand();
+---------------------+
| rand() |
+---------------------+
| 0.05298892972337914 |
+---------------------+
1 row in set (0.00 sec)

mysql> select rand(5);
+---------------------+
| rand(5) |
+---------------------+
| 0.40613597483014313 |
+---------------------+
1 row in set (0.00 sec)

mysql> select rand(10);
+--------------------+
| rand(10) |
+--------------------+
| 0.6570515219653505 |
+--------------------+
1 row in set (0.00 sec)

mysql> select rand()*10;
+-------------------+
| rand()*10 |
+-------------------+
| 5.426059230627547 |
+-------------------+
1 row in set (0.00 sec)

mysql> select rand()*10;
+-------------------+
| rand()*10 |
+-------------------+
| 5.540628568772812 |
+-------------------+
1 row in set (0.00 sec)

mysql> select rand()*10;
+--------------------+
| rand()*10 |
+--------------------+
| 1.4249654593178682 |
+--------------------+
1 row in set (0.00 sec)

mysql> select rand()*10;
+--------------------+
| rand()*10 |
+--------------------+
| 0.5029418976073543 |
+--------------------+
1 row in set (0.00 sec)

mysql> select floor(rand()*10+5);
+--------------------+
| floor(rand()*10+5) |
+--------------------+
| 13 |
+--------------------+
1 row in set (0.00 sec)

mysql> select floor(rand()*10+5);
+--------------------+
| floor(rand()*10+5) |
+--------------------+
| 14 |
+--------------------+
1 row in set (0.00 sec)

mysql> select floor(rand()*10+5);
+--------------------+
| floor(rand()*10+5) |
+--------------------+
| 8 |
+--------------------+
1 row in set (0.00 sec)

mysql> select floor(rand()*10+5);
+--------------------+
| floor(rand()*10+5) |
+--------------------+
| 14 |
+--------------------+
1 row in set (0.00 sec)

mysql> select floor(rand()*10+5);
+--------------------+
| floor(rand()*10+5) |
+--------------------+
| 11 |
+--------------------+
1 row in set (0.00 sec)

mysql> select floor(rand()*10+5);
+--------------------+
| floor(rand()*10+5) |
+--------------------+
| 9 |
+--------------------+
1 row in set (0.00 sec)

mysql> select floor(rand()*10+5);
+--------------------+
| floor(rand()*10+5) |
+--------------------+
| 9 |
+--------------------+
1 row in set (0.01 sec)

mysql> select goods_id,goods_name,floor(rand()*10+5) as bonus from goods;
+----------+------------------------------+-------+
| goods_id | goods_name | bonus |
+----------+------------------------------+-------+
| 1 | KD876 | 12 |
| 4 | 诺基亚N85原装充电器 | 11 |
| 3 | 诺基亚原装5800耳机 | 12 |
| 5 | 索爱原装M2卡读卡器 | 11 |
| 6 | 胜创KINGMAX内存卡 | 7 |
| 7 | 诺基亚N85原装立体声耳机HS-82 | 7 |
| 8 | 飞利浦9@9v | 11 |
| 9 | 诺基亚E66 | 9 |
| 10 | 索爱C702c | 7 |
| 11 | 索爱C702c | 5 |
| 12 | 摩托罗拉A810 | 7 |
| 13 | 诺基亚5320 XpressMusic | 6 |
| 14 | 诺基亚5800XM | 14 |
| 15 | 摩托罗拉A810 | 10 |
| 16 | 恒基伟业G101 | 10 |
| 17 | 夏新N7 | 7 |
| 18 | 夏新T5 | 12 |
| 19 | 三星SGH-F258 | 5 |
| 20 | 三星BC01 | 14 |
| 21 | 金立 A30 | 10 |
| 22 | 多普达Touch HD | 5 |
| 23 | 诺基亚N96 | 12 |
| 24 | P806 | 7 |
| 25 | 小灵通/固话50元充值卡 | 5 |
| 26 | 小灵通/固话20元充值卡 | 9 |
| 27 | 联通100元充值卡 | 6 |
| 28 | 联通50元充值卡 | 8 |
| 29 | 移动100元充值卡 | 7 |
| 30 | 移动20元充值卡 | 6 |
| 31 | 摩托罗拉E8 | 14 |
| 32 | 诺基亚N85 | 7 |
| 33 | 金立910浪漫镶钻手机 | 11 |
+----------+------------------------------+-------+
32 rows in set (0.00 sec)

mysql> select ceiling(3.23);
+---------------+
| ceiling(3.23) |
+---------------+
| 4 |
+---------------+
1 row in set (0.00 sec)

mysql> #ceiling向上取整
mysql> #想取出第4个栏目下,所有的商品的goods_id
mysql> select goods_id ,cat_id from goods where cat_id=4;
+----------+--------+
| goods_id | cat_id |
+----------+--------+
| 1 | 4 |
| 14 | 4 |
| 18 | 4 |
| 33 | 4 |
+----------+--------+
4 rows in set (0.00 sec)

mysql> #进一步,像把4栏目下的goods_id,拼接起来
mysql> select group_concat(goods_id,',') from goods where cat_id=4 group by cat_id;
+----------------------------+
| group_concat(goods_id,',') |
+----------------------------+
| 1,,14,,18,,33, |
+----------------------------+
1 row in set (0.03 sec)

mysql> #group_concat默认用,帮我们拼接
mysql> select group_concat(goods_id,'') from goods where cat_id=4 group by cat_id;
+---------------------------+
| group_concat(goods_id,'') |
+---------------------------+
| 1,14,18,33 |
+---------------------------+
1 row in set (0.00 sec)

mysql> #字符串函数,计算字符的ascii码. 例 A的ascii码是65
mysql> select ascii('A');
+------------+
| ascii('A') |
+------------+
| 65 |
+------------+
1 row in set (0.00 sec)

mysql> select ascii('a');
+------------+
| ascii('a') |
+------------+
| 97 |
+------------+
1 row in set (0.00 sec)

mysql> #length 计算字符串的字符个数
mysql> select length('中华民国');
+--------------------+
| length('中华民国') |
+--------------------+
| 8 |
+--------------------+
1 row in set (0.05 sec)

mysql> select * from a;
+------+------+
| id | num |
+------+------+
| a | 5 |
| b | 10 |
| c | 15 |
| d | 10 |
+------+------+
4 rows in set (0.14 sec)

mysql> select * from t;
+------+----------+
| tid | tname |
+------+----------+
| 1 | 国安 |
| 2 | 申花 |
| 3 | 公益联队 |
+------+----------+
3 rows in set (0.08 sec)

mysql> select *,length(tname) from t;
+------+----------+---------------+
| tid | tname | length(tname) |
+------+----------+---------------+
| 1 | 国安 | 6 |
| 2 | 申花 | 6 |
| 3 | 公益联队 | 12 |
+------+----------+---------------+
3 rows in set (0.00 sec)

mysql> #更正:length计算的字节长度
mysql> #char_length计算的字符数
mysql> select *,length(tname),char_length(tname) from t;
+------+----------+---------------+--------------------+
| tid | tname | length(tname) | char_length(tname) |
+------+----------+---------------+--------------------+
| 1 | 国安 | 6 | 2 |
| 2 | 申花 | 6 | 2 |
| 3 | 公益联队 | 12 | 4 |
+------+----------+---------------+--------------------+
3 rows in set (0.00 sec)

mysql> #反转字符串
mysql> select tid,tname,reverse(tname) from t;
+------+----------+----------------+
| tid | tname | reverse(tname) |
+------+----------+----------------+
| 1 | 国安 | 安国 |
| 2 | 申花 | 花申 |
| 3 | 公益联队 | 队联益公 |
+------+----------+----------------+
3 rows in set (0.00 sec)

mysql> select positin('@','abc@sina.com');
ERROR 1305 (42000): FUNCTION test.positin does not exist
mysql> select position('@','abc@sina.com');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''abc@sina.com')' at line 1
mysql> select position('@' in 'abc@sina.com');
+---------------------------------+
| position('@' in 'abc@sina.com') |
+---------------------------------+
| 4 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select right('abc@sina.com',8);
+-------------------------+
| right('abc@sina.com',8) |
+-------------------------+
| sina.com |
+-------------------------+
1 row in set (0.00 sec)

mysql> #真实案例:某网站有email字段,存邮件地址
mysql> #想调查163,126,qq,gmail邮箱的比例
mysql> create table member (
-> uname varchar(20),
-> email varchar(30)
-> )engine myisam charset utf8;
ERROR 1050 (42S01): Table 'member' already exists
mysql> create table test14 (
-> uname varchar(20),
-> email varchar(30)
-> )engine myisam charset utf8;
Query OK, 0 rows affected (0.17 sec)

mysql> insert into test14
-> values
-> ('张三','zhsan@163.com'),
-> ('lily','lily@126.com'),
-> ('lilei','leili@qq.com'),
-> ('mr gao','gao@eyou.com');
Query OK, 4 rows affected (0.03 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> select * from test14;
+--------+---------------+
| uname | email |
+--------+---------------+
| 张三 | zhsan@163.com |
| lily | lily@126.com |
| lilei | leili@qq.com |
| mr gao | gao@eyou.com |
+--------+---------------+
4 rows in set (0.00 sec)

mysql> #问题在于,想调查邮箱后缀,但后缀是邮件地址的一部分
mysql> #得先把后缀想办法查出出来
mysql> #提示:用字符串函数,长度,位置,right函数
mysql> select *,right(email,length-position('@' in email)) from test14;
ERROR 1054 (42S22): Unknown column 'length' in 'field list'
mysql> select *,right(email,length(email)-position('@' in email)) from test14;
+--------+---------------+---------------------------------------------------+
| uname | email | right(email,length(email)-position('@' in email)) |
+--------+---------------+---------------------------------------------------+
| 张三 | zhsan@163.com | 163.com |
| lily | lily@126.com | 126.com |
| lilei | leili@qq.com | qq.com |
| mr gao | gao@eyou.com | eyou.com |
+--------+---------------+---------------------------------------------------+
4 rows in set (0.00 sec)

mysql> #这是通过字符串函数取出后缀
mysql> #经过这次事件之后,他们的表结构修改了,变得更加高效.
mysql> #把email拆成@前后2部分,放在2个列.
mysql> #接下来看日期时间函数
mysql> #取当前时间
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2012-10-31 21:06:00 |
+---------------------+
1 row in set (0.00 sec)

mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2012-10-31 |
+------------+
1 row in set (0.00 sec)

mysql> #now返回datetime格式,curdate返回date格式
mysql> #返回时间部分
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 21:07:31 |
+-----------+
1 row in set (0.00 sec)

mysql> #查询某日是那一周的第几天
mysql> select dayofweek('2012-10-31');
+-------------------------+
| dayofweek('2012-10-31') |
+-------------------------+
| 4 |
+-------------------------+
1 row in set (0.00 sec)

mysql> #注意,周日是第一条
mysql> #计算今天是2012年的第几周
mysql> select week(curdate());
+-----------------+
| week(curdate()) |
+-----------------+
| 44 |
+-----------------+
1 row in set (0.03 sec)

mysql> #一个实际的案例
mysql> #按周统计加班时间
mysql> create table jiaban (
-> num int,
-> dt date
-> )engine myisam charset utf8;
Query OK, 0 rows affected (0.13 sec)

mysql>
mysql> insert into jiaban
-> values
-> (5,'2012-09-01'),
-> (6,'2012-09-02'),
-> (7,'2012-09-03'),
-> (8,'2012-09-04'),
-> (9,'2012-09-05'),
-> (10,'2012-09-06'),
-> (11,'2012-09-07'),
-> (12,'2012-09-08'),
-> (13,'2012-09-09'),
-> (14,'2012-09-10'),
-> (15,'2012-09-11'),
-> (16,'2012-09-12');
Query OK, 12 rows affected (0.03 sec)
Records: 12 Duplicates: 0 Warnings: 0

mysql> select * from jiaban;
+------+------------+
| num | dt |
+------+------------+
| 5 | 2012-09-01 |
| 6 | 2012-09-02 |
| 7 | 2012-09-03 |
| 8 | 2012-09-04 |
| 9 | 2012-09-05 |
| 10 | 2012-09-06 |
| 11 | 2012-09-07 |
| 12 | 2012-09-08 |
| 13 | 2012-09-09 |
| 14 | 2012-09-10 |
| 15 | 2012-09-11 |
| 16 | 2012-09-12 |
+------+------------+
12 rows in set (0.00 sec)

mysql> #难点:group 到底group by谁?
mysql> select *,week(dt) from jiaban;
+------+------------+----------+
| num | dt | week(dt) |
+------+------------+----------+
| 5 | 2012-09-01 | 35 |
| 6 | 2012-09-02 | 36 |
| 7 | 2012-09-03 | 36 |
| 8 | 2012-09-04 | 36 |
| 9 | 2012-09-05 | 36 |
| 10 | 2012-09-06 | 36 |
| 11 | 2012-09-07 | 36 |
| 12 | 2012-09-08 | 36 |
| 13 | 2012-09-09 | 37 |
| 14 | 2012-09-10 | 37 |
| 15 | 2012-09-11 | 37 |
| 16 | 2012-09-12 | 37 |
+------+------------+----------+
12 rows in set (0.00 sec)

mysql> select sum(num),week(dt) as wk from jiaban group by wk;
+----------+------+
| sum(num) | wk |
+----------+------+
| 5 | 35 |
| 63 | 36 |
| 58 | 37 |
+----------+------+
3 rows in set (0.03 sec)

mysql> #加密函数 md5为例
mysql> select md5('111111');
+----------------------------------+
| md5('111111') |
+----------------------------------+
| 96e79218965eb72c92a549dd5a330112 |
+----------------------------------+
1 row in set (0.14 sec)

mysql> #md5是不可逆的.
mysql> #控制流程函数
mysql> select * from member;
Empty set (0.02 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a |
| account |
| b |
| boy |
| c |
| category |
| class |
| girl |
| goods |
| jiaban |
| m |
| m1 |
| member |
| mian |
| minigoods |
| result |
| salary |
| stu |
| t |
| test |
| test10 |
| test11 |
| test12 |
| test13 |
| test14 |
| test2 |
| test3 |
| test4 |
| test5 |
| test6 |
| test7 |
| test8 |
| test9 |
+----------------+
33 rows in set (1.28 sec)

mysql> select * from salary;
+-------+----------+--------+
| sname | gongzi | bonus |
+-------+----------+--------+
| 张三 | -9999.99 | 0.00 |
| 李四 | 9999.99 | 0.00 |
| 王五 | NULL | 888.88 |
+-------+----------+--------+
3 rows in set (0.06 sec)

mysql> select * from stu;
+------+-------+----------+
| id | sname | yy |
+------+-------+----------+
| 16 | lily | lily678 |
| 17 | lilei | lilei111 |
| 18 | hanmm | heimm355 |
+------+-------+----------+
3 rows in set (0.05 sec)

mysql> create table test15 (
-> sname varchar(5),
-> gender tinyint
-> )engine myisam charset utf8;
Query OK, 0 rows affected (0.13 sec)

mysql> insert into test15
-> values
-> ('张三',1),
-> ('韩梅梅',0),
-> ('李宇春',2);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from test15;
+--------+--------+
| sname | gender |
+--------+--------+
| 张三 | 1 |
| 韩梅梅 | 0 |
| 李宇春 | 2 |
+--------+--------+
3 rows in set (0.00 sec)

mysql> #现在性别是数字表示,能否显示出男/女/春,这3个中文给客户看
mysql> #即 要做判断1->男,0->女,2->春
mysql> select sname,
-> case gender
-> when 1
-> then '男',
-> when 0
-> then '女',
-> else '春'
-> end
->
-> from test15;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
when 0
then '女',
else '春'
end

from test15' at line 4
mysql> select sname,
-> case gender
-> when 1
-> then '男'
-> when 0
-> then '女'
-> else '春'
-> end
->
-> from test15;
+--------+-------------------------------------------------------------+
| sname | case gender
when 1
then '男'
when 0
then '女'
else '春'
end |
+--------+-------------------------------------------------------------+
| 张三 | 男 |
| 韩梅梅 | 女 |
| 李宇春 | 春 |
+--------+-------------------------------------------------------------+
3 rows in set (0.03 sec)

mysql> select sname,
-> case gender
-> when 1
-> then '男'
-> when 0
-> then '女'
-> else '春'
-> end as xingbie
->
-> from test15;
+--------+---------+
| sname | xingbie |
+--------+---------+
| 张三 | 男 |
| 韩梅梅 | 女 |
| 李宇春 | 春 |
+--------+---------+
3 rows in set (0.00 sec)

mysql> 判断性别,让女士优先
-> \c
mysql> select sname,
-> if(gender=0,'优先','等待') as vip
-> from test15;
+--------+------+
| sname | vip |
+--------+------+
| 张三 | 等待 |
| 韩梅梅 | 优先 |
| 李宇春 | 等待 |
+--------+------+
3 rows in set (0.00 sec)

mysql> #if()相当于php中的3元运算符
mysql> #ifnull的用法,判断第1个表达是否为null,如为null,返回第2个表达式的值
mysql> #如不为null,返回自身,即表达式1
mysql> select ifnull(null,0);
+----------------+
| ifnull(null,0) |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)

mysql> select ifnull('',0);
+--------------+
| ifnull('',0) |
+--------------+
| |
+--------------+
1 row in set (0.00 sec)

mysql> select ifnull('aaa',0);
+-----------------+
| ifnull('aaa',0) |
+-----------------+
| aaa |
+-----------------+
1 row in set (0.00 sec)

mysql> #系统调试函数
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.01 sec)

mysql> #user函数返回"用户及所在主机",判断自己的身份
mysql> #database(),返回我当前正在操作的库名
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.20 |
+-----------+
1 row in set (0.00 sec)

mysql> #比如有的服务器比较古老,有些功能不支持,出于兼容性考虑,要先判断一下mysql的版本,此时可以用version函数
mysql> #视图的学习
mysql> #查询每个栏目下商品的平均价格,并取平均价前3高的栏目
mysql> select cat_id,avg(shop_price) as pj
-> from goods
-> group by cat_id
-> order by pj
-> limit 3;
+--------+-----------+
| cat_id | pj |
+--------+-----------+
| 11 | 31.000000 |
| 13 | 33.500000 |
| 14 | 54.000000 |
+--------+-----------+
3 rows in set (0.06 sec)

mysql> select cat_id,avg(shop_price) as pj
-> from goods
-> group by cat_id;
+--------+-------------+
| cat_id | pj |
+--------+-------------+
| 2 | 823.330000 |
| 3 | 1746.066667 |
| 4 | 2031.000000 |
| 5 | 3700.000000 |
| 8 | 75.333333 |
| 11 | 31.000000 |
| 13 | 33.500000 |
| 14 | 54.000000 |
| 15 | 70.000000 |
+--------+-------------+
9 rows in set (0.00 sec)

mysql> #让你取平均价格前3低的栏目
mysql> select cat_id,avg(shop_price) as pj
-> from goods
-> group by cat_id
-> order by shop_price asc;
+--------+-------------+
| cat_id | pj |
+--------+-------------+
| 11 | 31.000000 |
| 13 | 33.500000 |
| 8 | 75.333333 |
| 14 | 54.000000 |
| 15 | 70.000000 |
| 3 | 1746.066667 |
| 2 | 823.330000 |
| 4 | 2031.000000 |
| 5 | 3700.000000 |
+--------+-------------+
9 rows in set (0.00 sec)

mysql> select cat_id,avg(shop_price) as pj
-> from goods
-> group by cat_id
-> order by shop_price asc
-> limit 3;
+--------+-----------+
| cat_id | pj |
+--------+-----------+
| 11 | 31.000000 |
| 13 | 33.500000 |
| 8 | 75.333333 |
+--------+-----------+
3 rows in set (0.00 sec)

mysql> #平均价由高到低,第3到第5名的栏目
mysql> # group by cat_id,查询出每个栏目下的平均价,设为结果集A
mysql> #无论是想查前3高,还是前3低,都要用到结果集A
mysql> #结果集A频繁用到,因此,可以把结果保存一张表,下次来查这张表
mysql> #但是,如果goods表又添加了商品,A结果集就与你保存的临时表不一样了.
mysql> #这时,我们可以用视图来解决
mysql> create view stats
-> as
-> select cat_id,avg(shop_price) as pj
-> from goods
-> group by cat_id;
Query OK, 0 rows affected (0.17 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a |
| account |
| b |
| boy |
| c |
| category |
| class |
| girl |
| goods |
| jiaban |
| m |
| m1 |
| member |
| mian |
| minigoods |
| result |
| salary |
| stats |
| stu |
| t |
| test |
| test10 |
| test11 |
| test12 |
| test13 |
| test14 |
| test15 |
| test2 |
| test3 |
| test4 |
| test5 |
| test6 |
| test7 |
| test8 |
| test9 |
+----------------+
35 rows in set (0.02 sec)

mysql> #多了一张stats"表"
mysql> select * from stats;
+--------+-------------+
| cat_id | pj |
+--------+-------------+
| 2 | 823.330000 |
| 3 | 1746.066667 |
| 4 | 2031.000000 |
| 5 | 3700.000000 |
| 8 | 75.333333 |
| 11 | 31.000000 |
| 13 | 33.500000 |
| 14 | 54.000000 |
| 15 | 70.000000 |
+--------+-------------+
9 rows in set (0.02 sec)

mysql> #查栏目平均价前3高
mysql> select * from stats order by pj limit 3;
+--------+-----------+
| cat_id | pj |
+--------+-----------+
| 11 | 31.000000 |
| 13 | 33.500000 |
| 14 | 54.000000 |
+--------+-----------+
3 rows in set (0.00 sec)

mysql> #视图一旦创建完毕,就可以像表一样查询
mysql> select * from stats;
+--------+-------------+
| cat_id | pj |
+--------+-------------+
| 2 | 823.330000 |
| 3 | 1746.066667 |
| 4 | 2031.000000 |
| 5 | 3700.000000 |
| 8 | 75.333333 |
| 11 | 31.000000 |
| 13 | 33.500000 |
| 14 | 54.000000 |
| 15 | 70.000000 |
+--------+-------------+
9 rows in set (0.00 sec)

mysql> select goods_id,cat_id,shop_price from goods where cat_id=15;
+----------+--------+------------+
| goods_id | cat_id | shop_price |
+----------+--------+------------+
| 27 | 15 | 95.00 |
| 28 | 15 | 45.00 |
+----------+--------+------------+
2 rows in set (0.00 sec)

mysql> update goods set shop_price = 65 where goods_id=28;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select goods_id,cat_id,shop_price from goods where cat_id=15;
+----------+--------+------------+
| goods_id | cat_id | shop_price |
+----------+--------+------------+
| 27 | 15 | 95.00 |
| 28 | 15 | 65.00 |
+----------+--------+------------+
2 rows in set (0.00 sec)

mysql> select * from stats;
+--------+-------------+
| cat_id | pj |
+--------+-------------+
| 2 | 823.330000 |
| 3 | 1746.066667 |
| 4 | 2031.000000 |
| 5 | 3700.000000 |
| 8 | 75.333333 |
| 11 | 31.000000 |
| 13 | 33.500000 |
| 14 | 54.000000 |
| 15 | 80.000000 |
+--------+-------------+
9 rows in set (0.00 sec)

mysql> update stats set pj=90 where cat_id=15;
ERROR 1288 (HY000): The target table stats of the UPDATE is not updatable
mysql> # 创建一张简单的视图
mysql> create view gui
-> as
-> select goods_id,goods_name,shop_price
-> from goods order by shop_price desc limit 5;
Query OK, 0 rows affected (0.17 sec)

mysql> select * from gui;
+----------+----------------+------------+
| goods_id | goods_name | shop_price |
+----------+----------------+------------+
| 22 | 多普达Touch HD | 5999.00 |
| 23 | 诺基亚N96 | 3700.00 |
| 32 | 诺基亚N85 | 3010.00 |
| 18 | 夏新T5 | 2878.00 |
| 14 | 诺基亚5800XM | 2625.00 |
+----------+----------------+------------+
5 rows in set (0.00 sec)

mysql> update gui set goods_name='多达普Touch HD' where goods_id=22;
ERROR 1288 (HY000): The target table gui of the UPDATE is not updatable
mysql> desc goods;
+--------------+------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------------+------+-----+---------+----------------+
| goods_id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment |
| cat_id | smallint(5) unsigned | NO | | 0 | |
| goods_sn | varchar(60) | NO | | | |
| goods_name | varchar(120) | NO | | | |
| click_count | int(10) unsigned | NO | | 0 | |
| goods_number | smallint(5) unsigned | NO | | 0 | |
| market_price | decimal(10,2) unsigned | NO | | 0.00 | |
| shop_price | decimal(10,2) unsigned | NO | | 0.00 | |
| add_time | int(10) unsigned | NO | | 0 | |
| is_best | tinyint(1) unsigned | NO | | 0 | |
| is_new | tinyint(1) unsigned | NO | | 0 | |
| is_hot | tinyint(1) unsigned | NO | | 0 | |
+--------------+------------------------+------+-----+---------+----------------+
12 rows in set (0.08 sec)

mysql> show create table goods;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| goods | CREATE TABLE `goods` (
`goods_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`cat_id` smallint(5) unsigned NOT NULL DEFAULT '0',
`goods_sn` varchar(60) NOT NULL DEFAULT '',
`goods_name` varchar(120) NOT NULL DEFAULT '',
`click_count` int(10) unsigned NOT NULL DEFAULT '0',
`goods_number` smallint(5) unsigned NOT NULL DEFAULT '0',
`market_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
`shop_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
`add_time` int(10) unsigned NOT NULL DEFAULT '0',
`is_best` tinyint(1) unsigned NOT NULL DEFAULT '0',
`is_new` tinyint(1) unsigned NOT NULL DEFAULT '0',
`is_hot` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`goods_id`)
) ENGINE=MyISAM AUTO_INCREMENT=34 DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from gui;
+----------+----------------+------------+
| goods_id | goods_name | shop_price |
+----------+----------------+------------+
| 22 | 多普达Touch HD | 5999.00 |
| 23 | 诺基亚N96 | 3700.00 |
| 32 | 诺基亚N85 | 3010.00 |
| 18 | 夏新T5 | 2878.00 |
| 14 | 诺基亚5800XM | 2625.00 |
+----------+----------------+------------+
5 rows in set (0.02 sec)

mysql> #先删一个
mysql> delete from gui where goods_id=14;
ERROR 1288 (HY000): The target table gui of the DELETE is not updatable
mysql> insert into gui
-> values
-> (33,'精品手机',234.56);
ERROR 1471 (HY000): The target table gui of the INSERT is not insertable-into
mysql> #视图到底能否增删改呢
mysql> create view goods4
-> as
-> select * from goods where cat_id=4;
Query OK, 0 rows affected (0.13 sec)

mysql> select goods_id,shop_price ,goods_name from goods4;
+----------+------------+---------------------+
| goods_id | shop_price | goods_name |
+----------+------------+---------------------+
| 1 | 1388.00 | KD876 |
| 14 | 2625.00 | 诺基亚5800XM |
| 18 | 2878.00 | 夏新T5 |
| 33 | 1233.00 | 金立910浪漫镶钻手机 |
+----------+------------+---------------------+
4 rows in set (0.00 sec)

mysql> delete from goods4 where goods_id=1;
Query OK, 1 row affected (0.03 sec)

mysql> select goods_id,shop_price ,goods_name from goods4;
+----------+------------+---------------------+
| goods_id | shop_price | goods_name |
+----------+------------+---------------------+
| 14 | 2625.00 | 诺基亚5800XM |
| 18 | 2878.00 | 夏新T5 |
| 33 | 1233.00 | 金立910浪漫镶钻手机 |
+----------+------------+---------------------+
3 rows in set (0.00 sec)

mysql> select goods_id,shop_price ,goods_name from goods;
+----------+------------+------------------------------+
| goods_id | shop_price | goods_name |
+----------+------------+------------------------------+
| 4 | 58.00 | 诺基亚N85原装充电器 |
| 3 | 68.00 | 诺基亚原装5800耳机 |
| 5 | 20.00 | 索爱原装M2卡读卡器 |
| 6 | 42.00 | 胜创KINGMAX内存卡 |
| 7 | 100.00 | 诺基亚N85原装立体声耳机HS-82 |
| 8 | 399.00 | 飞利浦9@9v |
| 9 | 2298.00 | 诺基亚E66 |
| 10 | 1328.00 | 索爱C702c |
| 11 | 1300.00 | 索爱C702c |
| 12 | 983.00 | 摩托罗拉A810 |
| 13 | 1311.00 | 诺基亚5320 XpressMusic |
| 14 | 2625.00 | 诺基亚5800XM |
| 15 | 788.00 | 摩托罗拉A810 |
| 16 | 823.33 | 恒基伟业G101 |
| 17 | 2300.00 | 夏新N7 |
| 18 | 2878.00 | 夏新T5 |
| 19 | 858.00 | 三星SGH-F258 |
| 20 | 280.00 | 三星BC01 |
| 21 | 2000.00 | 金立 A30 |
| 22 | 5999.00 | 多普达Touch HD |
| 23 | 3700.00 | 诺基亚N96 |
| 24 | 2000.00 | P806 |
| 25 | 48.00 | 小灵通/固话50元充值卡 |
| 26 | 19.00 | 小灵通/固话20元充值卡 |
| 27 | 95.00 | 联通100元充值卡 |
| 28 | 65.00 | 联通50元充值卡 |
| 29 | 90.00 | 移动100元充值卡 |
| 30 | 18.00 | 移动20元充值卡 |
| 31 | 1337.00 | 摩托罗拉E8 |
| 32 | 3010.00 | 诺基亚N85 |
| 33 | 1233.00 | 金立910浪漫镶钻手机 |
+----------+------------+------------------------------+
31 rows in set (0.00 sec)

mysql> drop view gui;
Query OK, 0 rows affected (0.00 sec)

mysql> #刚才视图里有order by 时,也不能更新,思考一下为什么?
mysql> exit

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

一、数学函数
abs(x) 返回x的绝对值
bin(x) 返回x的二进制(oct返回八进制,hex返回十六进制)
ceiling(x) 返回大于x的最小整数值
exp(x) 返回值e(自然对数的底)的x次方
floor(x) 返回小于x的最大整数值
greatest(x1,x2,...,xn)返回集合中最大的值
least(x1,x2,...,xn) 返回集合中最小的值
ln(x) 返回x的自然对数
log(x,y)返回x的以y为底的对数
mod(x,y) 返回x/y的模(余数)
pi()返回pi的值(圆周率)
rand()返回0到1内的随机值,可以通过提供一个参数(种子)使rand()随机数生成器生成一个指定的值。
round(x,y)返回参数x的四舍五入的有y位小数的值
sign(x) 返回代表数字x的符号的值
sqrt(x) 返回一个数的平方根
truncate(x,y) 返回数字x截短为y位小数的结果

二、聚合函数(常用于group by从句的select查询中)
avg(col)返回指定列的平均值
count(col)返回指定列中非null值的个数
min(col)返回指定列的最小值
max(col)返回指定列的最大值
sum(col)返回指定列的所有值之和
group_concat(col) 返回由属于一组的列值连接组合而成的结果

三、字符串函数
ascii(char)返回字符的ascii码值
bit_length(str)返回字符串的比特长度
concat(s1,s2...,sn)将s1,s2...,sn连接成字符串
concat_ws(sep,s1,s2...,sn)将s1,s2...,sn连接成字符串,并用sep字符间隔
insert(str,x,y,instr) 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果
find_in_set(str,list)分析逗号分隔的list列表,如果发现str,返回str在list中的位置
lcase(str)或lower(str) 返回将字符串str中所有字符改变为小写后的结果
left(str,x)返回字符串str中最左边的x个字符
length(s)返回字符串str中的字符数
ltrim(str) 从字符串str中切掉开头的空格
position(substr,str) 返回子串substr在字符串str中第一次出现的位置
quote(str) 用反斜杠转义str中的单引号
repeat(str,srchstr,rplcstr)返回字符串str重复x次的结果
reverse(str) 返回颠倒字符串str的结果
right(str,x) 返回字符串str中最右边的x个字符
rtrim(str) 返回字符串str尾部的空格
strcmp(s1,s2)比较字符串s1和s2
trim(str)去除字符串首部和尾部的所有空格
ucase(str)或upper(str) 返回将字符串str中所有字符转变为大写后的结果

四、日期和时间函数
curdate()或current_date() 返回当前的日期
curtime()或current_time() 返回当前的时间
date_add(date,interval int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:selectdate_add(current_date,interval 6 month);
date_format(date,fmt) 依照指定的fmt格式格式化日期date值
date_sub(date,interval int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:selectdate_sub(current_date,interval 6 month);
dayofweek(date) 返回date所代表的一星期中的第几天(1~7)
dayofmonth(date) 返回date是一个月的第几天(1~31)
dayofyear(date) 返回date是一年的第几天(1~366)
dayname(date) 返回date的星期名,如:select dayname(current_date);
from_unixtime(ts,fmt) 根据指定的fmt格式,格式化unix时间戳ts
hour(time) 返回time的小时值(0~23)
minute(time) 返回time的分钟值(0~59)
month(date) 返回date的月份值(1~12)
monthname(date) 返回date的月份名,如:select monthname(current_date);
now() 返回当前的日期和时间
quarter(date) 返回date在一年中的季度(1~4),如select quarter(current_date);
week(date) 返回日期date为一年中第几周(0~53)
year(date) 返回日期date的年份(1000~9999)
一些示例:
获取当前系统时间:select from_unixtime(unix_timestamp());
select extract(year_month from current_date);
select extract(day_second from current_date);
select extract(hour_minute from current_date);
返回两个日期值之间的差值(月数):select period_diff(200302,199802);
在mysql中计算年龄:
select date_format(from_days(to_days(now())-to_days(birthday)),'%y')+0 as age from employee;
这样,如果brithday是未来的年月日的话,计算结果为0。
下面的sql语句计算员工的绝对年龄,即当birthday是未来的日期时,将得到负值。
select date_format(now(), '%y') - date_format(birthday, '%y') -(date_format(now(), '00-%m-%d') <date_format(birthday, '00-%m-%d')) as age from employee

五、加密函数
aes_encrypt(str,key) 返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用aes_encrypt的结果是一个二进制字符串,以blob类型存储
aes_decrypt(str,key) 返回用密钥key对字符串str利用高级加密标准算法解密后的结果
decode(str,key) 使用key作为密钥解密加密字符串str
encrypt(str,salt) 使用unixcrypt()函数,用关键词salt(一个可以惟一确定口令的字符串,就像钥匙一样)加密字符串str
encode(str,key) 使用key作为密钥加密字符串str,调用encode()的结果是一个二进制字符串,它以blob类型存储
md5() 计算字符串str的md5校验和
password(str) 返回字符串str的加密版本,这个加密过程是不可逆转的,和unix密码加密过程使用不同的算法。
sha() 计算字符串str的安全散列算法(sha)校验和
示例:
select encrypt('root','salt');
select encode('xufeng','key');
select decode(encode('xufeng','key'),'key');#加解密放在一起
select aes_encrypt('root','key');
select aes_decrypt(aes_encrypt('root','key'),'key');
select md5('123456');
select sha('123456');

六、控制流函数
mysql有4个函数是用来进行条件操作的,这些函数可以实现sql的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台。
mysql控制流函数:
case when[test1] then [result1]...else [default] end如果testn是真,则返回resultn,否则返回default
case [test] when[val1] then [result]...else [default]end 如果test和valn相等,则返回resultn,否则返回default
if(test,t,f) 如果test是真,返回t;否则返回f
ifnull(arg1,arg2) 如果arg1不是空,返回arg1,否则返回arg2
nullif(arg1,arg2) 如果arg1=arg2返回null;否则返回arg1
这些函数的第一个是ifnull(),它有两个参数,并且对第一个参数进行判断。如果第一个参数不是null,函数就会向调用者返回第一个参数;如果是null,将返回第二个参数。
如:select ifnull(1,2), ifnull(null,10),ifnull(4*null,'false');
nullif()函数将会检验提供的两个参数是否相等,如果相等,则返回null,如果不相等,就返回第一个参数。
如:select nullif(1,1),nullif('a','b'),nullif(2+3,4+1);
和许多脚本语言提供的if()函数一样,mysql的if()函数也可以建立一个简单的条件测试,这个函数有三个参数,第一个是要被判断的表达式,如果表达式为真,if()将会返回第二个参数,如果为假,if()将会返回第三个参数。
如:selectif(1<10,2,3),if(56>100,'true','false');
if()函数在只有两种可能结果时才适合使用。然而,在现实世界中,我们可能发现在条件测试中会需要多个分支。在这种情况下,mysql提供了case函数,它和php及perl语言的switch-case条件例程一样。
case函数的格式有些复杂,通常如下所示:
case [expression to be evaluated]
when [val 1] then [result 1]
when [val 2] then [result 2]
when [val 3] then [result 3]
......
when [val n] then [result n]
else [default result]
end
这里,第一个参数是要被判断的值或表达式,接下来的是一系列的when-then块,每一块的第一个参数指定要比较的值,如果为真,就返回结果。所有的when-then块将以else块结束,当end结束了所有外部的case块时,如果前面的每一个块都不匹配就会返回else块指定的默认结果。如果没有指定else块,而且所有的when-then比较都不是真,mysql将会返回null。
case函数还有另外一种句法,有时使用起来非常方便,如下:
case
when [conditional test 1] then [result 1]
when [conditional test 2] then [result 2]
else [default result]
end
这种条件下,返回的结果取决于相应的条件测试是否为真。
示例:
mysql>select case 'green'
when 'red' then 'stop'
when 'green' then 'go' end;
select case 9 when 1 then 'a' when 2 then 'b' else 'n/a' end;
select case when (2+2)=4 then 'ok' when(2+2)<>4 then 'not ok' end asstatus;
select name,if((isactive = 1),'已激活','未激活') as result fromuserlogininfo;
select fname,lname,(math+sci+lit) as total,
case when (math+sci+lit) < 50 then 'd'
when (math+sci+lit) between 50 and 150 then 'c'
when (math+sci+lit) between 151 and 250 then 'b'
else 'a' end
as grade from marks;
select if(encrypt('sue','ts')=upass,'allow','deny') as loginresultfrom users where uname = 'sue';#一个登陆验证

七、格式化函数
date_format(date,fmt) 依照字符串fmt格式化日期date值
format(x,y) 把x格式化为以逗号隔开的数字序列,y是结果的小数位数
inet_aton(ip) 返回ip地址的数字表示
inet_ntoa(num) 返回数字所代表的ip地址
time_format(time,fmt) 依照字符串fmt格式化时间time值
其中最简单的是format()函数,它可以把大的数值格式化为以逗号间隔的易读的序列。
示例:
select format(34234.34323432,3);
select date_format(now(),'%w,%d %m %y %r');
select date_format(now(),'%y-%m-%d');
select date_format(19990330,'%y-%m-%d');
select date_format(now(),'%h:%i %p');
select inet_aton('10.122.89.47');
select inet_ntoa(175790383);

八、类型转化函数
为了进行数据类型转化,mysql提供了cast()函数,它可以把一个值转化为指定的数据类型。类型有:binary,char,date,time,datetime,signed,unsigned
示例:
select cast(now() as signed integer),curdate()+0;
select 'f'=binary 'f','f'=cast('f' as binary);

九、系统信息函数
database() 返回当前数据库名
benchmark(count,expr) 将表达式expr重复运行count次
connection_id() 返回当前客户的连接id
found_rows() 返回最后一个select查询进行检索的总行数
user()或system_user() 返回当前登陆用户名
version() 返回mysql服务器的版本
示例:
select database(),version(),user();
selectbenchmark(9999999,log(rand()*pi()));#该例中,mysql计算log(rand()*pi())表达式9999999次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: