数据库(学习笔记二) ------ sql查询语句(where,group by , having ,order by , limit)

查询
查询一共有5个子句,分别为:where,group by , having ,order by , limit;
如果要选择使用多个的时候,书写顺序必须是这个顺序,否则会报语法错误。



-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
where语句:
in<值1,值2 …… 值N> 表示等于值1到值N的任意一个都可以。
select good_id,cat_id,goods_name from goods where cat_id in<4,5>;

between 值1 and 值2 表示值在值1和值2之间(允许等于边界)
#取出shop_price在2000-3000之间
select goods_id ,shop_price ,goods_name from goods where shop_price between 2000 and 3000;

<  >  =  <=  >=  !=  <> 

#想买3000-5000之间的商品或者500-1000的商品
select goods_id goods_price shop_price from goods where shop_price >=3000 and shop_price <=5000 or shop_price >=500 and shop_price <=1000;
#想买3000-5000之间的商品,但是不使用between and语句;
select goods_id, goods_price, shop_price from goods where shop_price >=3000 and shop_price <=5000;

#取出不属于第4.5栏目的商品
select goods_id ,cat_id from goods where cat_id !=4 and cat_id !=5;

select goods_name from goods where cat_id not in<4,5>;  

        where后面的条件要当做是表达式看是否成立来对待

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

模糊查询:
#查找诺基亚开头的所有商品 Like->像
select goods_id ,goods_name from goods where goods_name like '诺基亚 ’;
语法是没有问题的。但是查不到结果。

% --> 通配任意字符   
‘_’ -- > 通配单个字符



select goods_id ,goods_name from goods where goods_name like ‘%诺基亚’;//可以
#取‘诺基亚NXX’系列
select goods_id ,goods_name from goods where goods_name like ‘%诺基亚N__’;//可以
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

group by:
经常用于统计;5个统计函数:max,min,sum,avg,count;也可能使用(),而不是<>;
#取出max shop_price的最大值的行
select max<shop_price> from goods;

select goods_id,goods_name,max<shop_price> from goods;
//最后的结果就是shop_price是正确的,但是goods_id和goods_name只读取第一个数据,不会跟着shop_price变化,所以结果不对;

#查询每个栏目下面最贵的商品。(相当于有很多的柜台,要每个柜台的max)
select cat_id ,max<shop_price> from goods group by cat_id;


#求所有库存商品的总和
select sum<goods_num> from goods;


#本店一共有多少个商品(表有多少行)
----分页的时候;或者读取一共注册的用户数有多少等
select count<*> from goods;


----注意sum和count的区别;无论count后面的参数是什么,都一样,因为都是查一个行数

#要把列名当成变量名来看(因此可以进行加减乘除)
#查询出每个商品比市场价低多少钱?
select good_id ,goods_name, market_price - shop_price from goods;
#查找每个栏目下面积压的货款
select cat_id , sum<shop_price>*goods_number from goods where group by cat_id;


#可以给列或者计算结果取别名
select cat_id , sum<shop_price>*goods_number as hk from goods where group by cat_id;
输出的结果就是cat_id列和hk列,(hk列包含的就是sum<>*goods_number 的结果)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

having:
#查询出本店价格比市场价低多少钱?并且把低200元以上的商品选出来
select goods_id,cat_id,market_price - shop_price as sheng from goods where cat_id = 3 where sheng >200;
如果用上面这个语句可以吗?答案是不可以。会报错。因为找不到sheng的这个列。
原因就是因为:
     where是对表起作用的,where是在select之前被执行。如果要对表的查询结果进行查询需要用到having


当我们改用having时:
select goods_id,cat_id,market_price - shop_price as sheng from goods  having sheng >200;
//成功;


#同上题,只是添加一个条件,在第三个栏目下比市场价格低于200元以上的商品。
select goods_id,cat_id,market_price - shop_price as sheng from goods where cat_id = 3 having sheng >200;




#查询积压货款超过2w元的栏目,以及该栏目的所有积压货款
select cat_id,sum<shop_price>*goods_number as hk from goods group by cat_id having hk > 20000;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
order by:
默认是升序排列的,如果想降序,用desc。显示声明升序排序可以用asc;
#order by 可以有多个字段,但是会按照顺序。
#如下:先按照cat_id来排,同cat_id下按照shop_price排序。
order by cat_id , shop_price desc;


#按照发布时间由早到晚排序
select goods_id ,goods_name,goods_num from goods order by add_time ;



-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit:
在语句的最后,起到限制条目的作用;
Limit[offset],N 
offset:偏移量    ---- 如果不选择,相当于offset=0
N:取出的条目数



#取价格最高的3个商品
select goods_id , goods_name,shop_price from goods order by shop_price Limit 3;

#取价格第四到第六的商品
select goods_id , goods_name,shop_price from goods order by shop_price Limit 3, 3;




#取每个栏目的最贵的商品
错误一: select goods_id, goods_name ,cat_id, shop_price from goods group by cat_id order by shop_price;
//结果是不成立的,不成立的原因是,goods_id 和 goods_name 和后面的shop_price不对应。就算你的shop_price是正确的,别的参数也不对。
解释:当你选择先分组的时候,那么你的goods_id和 goods_name 和shop_price记录的都是第一次出现cat_id的值,再你分好组要去排序的时候,shop_price会变,但是其他参数没有理由变。
错误二:select goods_id, goods_name ,cat_id, shop_price from goods order by shop_price group by cat_id  ;
//结果是语句会报错,根本就不会执行。因为group by必须写在order by前面。


其实这个题目,只用一个select写不出来,或者使用多个select。


那多个select如何处理这个问题呢?
我们对表中的数据进行的查询结果其实还是一张表,它存在我们的内存中。所以可以对这个缓存的结果进行处理;
select * from <select goods_id, goods_name ,cat_id, shop_price from goods  order by cat_id ,shop_price desc> as tmp group by cat_id;
----注意:第一个select后的*,有多少个列,取决于第二个select中查了多个列。
 如果外层的select要group by 列,那么他必须现有这个列的查询结果;










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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值