# 在给商品打八八折的基础上抹掉零头
select goods_id,goods_name,floor(shop_price*0.88) 
from goods where cat_id=4;
# 给每一个商品生成一个5到15元之间的随机红包,购买随机赠送红包
select floor(rand()*10+5);
 select goods_id,goods_name,floor(rand()*10+5.99999) as bonus 
  from goods;
  # 因为加5的话,返回15的概率很小,需要再调整一下。
  select goods_id,goods_name,ceiling(rand()*10+5.99999) as bonus 
   from goods;
   # ceiling 向上取整。
# 想取出第四个栏目下,所有商品的goods_id
select goods_id,cat_id from goods where cat_id=4;

# 进一步,想把4栏目下的goods_id拼接起来。
select group_concat(goods_id,',') 
from goods where cat_id=4 group by cat_id;

mysql 价格次高 mysql表中价格打八折_mysql 价格次高


mysql 价格次高 mysql表中价格打八折_字符串函数_02

有两个逗号的原因:group_contact 默认用逗号进行拼接

select group_concat(goods_id,'') 
from goods where cat_id=4 group by cat_id;

mysql 价格次高 mysql表中价格打八折_字符串函数_03

# 字符串函数,计算字符的ASCII码
select ascii('a'); 
# 返回值为97;

length计算的是字节长度,char_length计算的是字符数。

create table test(
    name varchar(10),
    em varchar(20)
)engine myisam charset utf8;

insert into test values 
('张三','zhsan@163.com'),
('lily','lily@126.com'),
('李雷','lilei@qq.com'),
('mr gao','gao@eyou.com');
# 如何调查作为邮件地址一部分的邮箱后缀?——通过字符串函数取
# 整体长度减去@ 所在位置,取右侧就是邮箱
select *,right(ema,length(ema)-position('@' in ema)) from test;

now返回datetime格式,curdate返回date格式:

mysql 价格次高 mysql表中价格打八折_字符串函数_04

mysql 价格次高 mysql表中价格打八折_加密结果_05

mysql 价格次高 mysql表中价格打八折_mysql 价格次高_06


dayofweek:查看某一日是一周里的第几天:

mysql 价格次高 mysql表中价格打八折_字符串函数_07


注意:周日才是一周里的第一天。

create table jiaban(
    num int,
    dt date
)engine myisam charset utf8;

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');
# 按周统计加班时间:
# 难点:group by谁?
select *,week(dt) from jiaban;

mysql 价格次高 mysql表中价格打八折_mysql 价格次高_08

select sum(num),week(dt) as wk from jiaban group by wk;

mysql 价格次高 mysql表中价格打八折_mysql_09

# 加密函数:md5为例
select md5('111111');

mysql 价格次高 mysql表中价格打八折_mysql_10


md5 是不可逆的。

良好的加密:

1.不可逆 2.碰撞性低(不同的源码加密结果重复的可能性小)

create table test(
    name varchar(5),
    gender tinyint
)engine myisam charset utf8;

insert into test 
values 
('张三',1),
('韩梅梅',0),
('nira',2);

现在性别是数字表示,能否显示出男/女/ni,这三个字符给客户看?
即:要做判断 1->男,0->女,2->ni
—— case 值 when 某种可能 then 返回值
when 另一种可能 then 返回值
else 默认值 end 新列名

select name,case gender 
when 1 then '男' 
when 0 then '女' 
else 'ni' 
end 'gender'  
from test;

mysql 价格次高 mysql表中价格打八折_mysql 价格次高_11


最好加上那个end 后面的 ‘gender’!!否则就会出现这样的情况:

mysql 价格次高 mysql表中价格打八折_数据库_12


if 的语法:if(表达式1,表达式2,表达式3)

若表达式1为真,则返回表达式2,否则返回表达式3:

# 判断性别,让女士优先:
select name,
if(gender=0,'优先','等待') as vip 
from test;

mysql 价格次高 mysql表中价格打八折_数据库_13


ifnull 的用法:判断第一个表达式是否为null ,如为null,则返回第二个表达式的值;如不为null,返回自身,即表达式1.

select ifnull('aaa',0);

mysql 价格次高 mysql表中价格打八折_数据库_14


mysql 价格次高 mysql表中价格打八折_mysql 价格次高_15


user 函数返回“用户及所在主机”,判断自己的身份判断服务器版本:

mysql 价格次高 mysql表中价格打八折_mysql 价格次高_16


在where 条件中,对某列使用了函数,由此列的索引不发挥作用。