刘道成 mysql笔记_刘道成 mysql 学习笔记2

仿ecshop建库

create database mugua charset utf8;

use mugua;

create table goods(

goods_id int primary key auto_increment,

cat_id smallint not null default 0,

goods_sn char(15) not null default '',

goods_name varchar(30) not null default '',

click_count mediumint unsigned not null default 0,

brand_id smallint not null default 0,

goods_number smallint not null default 0,

marcket_price decimal(7,2) not null default 0.00,

shop_price decimal(7,2) not null default 0.00,

add_time int unsigned not null default 0

)charset utf8;

从一个数据库导数据到另一个数据库的方法

会碰到中文出现乱码 先运行这个语句 set names gbk

insert into mugua.goods

select

goods_id,cat_id,goods_sn,goods_name,click_count,

brand_id,goods_number,market_price,shop_price,add_time

from shop.goods;

create table category(

cat_id smallint primary key auto_increment,

cat_name varchar(30) not null default '',

parent_id smallint not null default 0

)charset utf8;

insert into mugua.category

select

cat_id,cat_name,parent_id

from shop.category;

create table brand(

brand_id smallint primary key auto_increment,

brand_name varchar(30) not null default''

)charset utf8;

insert into mugua.brand

select

brand_id,brand_name

from shop.brand;

(一)where 表达式在哪一(几)行成立 就把那一(几)行取出来

select * from goods where cat_id=3;

select * from goods where cat_id !=3;

等价于

select * from goods where cat_id <>3;

select * from goods where cat_id>3;

select * from goods where cat_id<3;

select * from goods where cat_id>=3;

select * from goods where cat_id<=3;

select * from goods where cat_id in(3,4);

select * from goods where cat_id between 3 and 5;

select * from goods where cat_id >3 or cat_id <=2;

select * from goods where cat_id>=3 and cat_id<=6;

(二)group by 分组查询

group by 与max min sum avg count连用

1 查出最贵商品价格

select max(shop_price) from goods;

2 查出最便宜商品价格

select min(shop_price) from goods;

3 查出商品总量

select sum(goods_number) from goods;

4 查出所有商品平均价格

select avg(shop_price) from goods;

5,查出所有商品总类

select count(goods_id) from goods;

#查询每个栏目下 要用到group by

1 查出最贵商品价格

select cat_id,max(shop_price) from goods group by cat_id;

2 查出最便宜商品价格

select cat_id,min(shop_price) from goods group by cat_id;

3 查出商品总量

select cat_id,sum(goods_number) from goods group by cat_id;

4 查出所有商品平均价格

select cat_id,avg(shop_price) from goods group by cat_id;

5,查出所有商品总类

select cat_id,count(goods_id) from goods group by cat_id;

#把列名当变量就可以进行运算了 可以写出更加高效的sql语句

#查询每个栏目下积压的货款

select cat_id,sum(shop_price*goods_number) from goods group by cat_id;

#查询出每个商品比市场价低多少

select goods_id,goods_name,marcket_price-shop_price as cha from goods;

(三)having查询

where 发挥作用的时间在查表结果之前

having 是筛选 是对查询结果的进一步选择

1,查询比市场价省200元以上得物品价格以及所省的钱

select goods_name,goods_id,marcket_price-shop_price as sheng from goods having sheng>200;

如果写成

select goods_name,goods_id,marcket_price-shop_price as sheng from goods where sheng>200;

是错误的

当然也可以写成

select goods_name,goods_id,marcket_price-shop_price as sheng from goods where marcket_price-shop_price>200;

只不错计算了两次 不如having 好

2,查询积压货款超过 20000元货款的栏目 以及该货款

select cat_id,sum(shop_price*goods_number) as jiya from goods group by cat_id having jiya>20000;

更多资源 http://www.taobtbw.com/

(四)order by 和limit查询

1,按价格由高到低排序

select goods_name,goods_id,shop_price from goods order by shop_price desc;

2,按发布时间由早到晚排序

select goods_id,goods_name,add_time from goods order by add_time;

3,按栏目由低到高排序,栏目内部按价格由高到低排序

select goods_id,goods_name,cat_id,shop_price from goods order by cat_id asc,shop_price desc;

limit 的用法 limit在语句的最后 起到限制的作用

limit[offset]N

offset :偏移量

N;去处的条目数量

offset不写则相当于 limit 0,N

是从0 开始算的 而不是1

4,取出价格最高的前三名商品

select goods_id,goods_name,shop_price from goods order by shop_price desc limit 0,3;

5,取出点击量前三名到前5名的商品

select goods_id,goods_name,click_count from goods order by click_count desc limit 2,3;

思考题 :取出每个栏目下最贵的商品

错误1:select goods_id,goods_name,cat_id,max(shop_price) from goods group by cat_id 错误原因是用了聚合函数 而其他栏目以第一次遇到的为准

错误2: select goods_id,goods_name,cat_id,shop_price from goods group by cat_id order by shop_price desc;这只是对分组后的排序 而不是对每一个栏目的排序

错误3:select goods_id,goods_name,cat_id,shop_price from goods order by shop_price desc group by cat_id ; 语法错误 因为查询字句是有顺序性的

顺序如下 where , group by, having , order by ,limit

正确:select * from (select goods_id,goods_name,cat_id,shop_price from goods order by cat_id asc,shop_price desc ) as temp group by cat_id;

(四)

(1)where from exists 子查询

1查询出最新商品(以最大编号为准)

select goods_name,goods_id from goods where goods_id=(select max(goods_id) from goods);

2,查询出编号为19的商品的栏目名称(待定)

3,用where子查询出每个栏目下的最新产品(以id号最大为准)

select goods_name,goods_id,cat_id from goods where goods_id in (select max(goods_id) from goods group by cat_id ); 这里后面不能再加其他字段 否则会出错

4,用from子查询查出每个栏目下最新的产品(以id号最大为准)

select * from (select goods_name,goods_id,cat_id from goods order by cat_id asc,goods_id desc) as temp group by cat_id;

5,exists 子查询 在category表中查询有商品的栏目 (先从category表中找出cat_id 然后与goods逐行比较)

select cat_id,cat_name from category where exists (select * from goods where category.cat_id=goods.cat_id);

注意几个问题

1:from 子查询是把from后的查询结果当成一张临时表 一定要为临时表创建一个名字 用as + 名字 表示

2;from子查询中的* 指的是from表中的字段 而不是原表的字段。

3.where 子查询是把内层查询的结果当外层查询的比较条件

4.exists 查询是把外层的查询结果拿到内层,看内层是否成立

更多资源请访问

http://www.17xuexiba.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值