1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| order by
order by:排序功能,按一个或多个字段对查询结果进行排序,可以是升序排序,也可以是降序排序,默认是升序排序。 select goods_id, cat_id, goods_name, shop_price from goods where cat_id=3
order by shop_price; 这条语句查询显示的结果是按照shop_price的值由小到大排序的(默认升序),如果我们想查询结果由降序排序,要怎么做呢?可以在后面加上字段名desc。 desc:按降序排序; asc:按升序排序(默认也是升序排序,所以可以不加) select goods_id, cat_id, goods_name, shop_price from goods where cat_id=3 order by shop_price desc;
//查询栏目号从低到高,而且栏目内的商品价格从高到低的排序结果 select goods_id, cat_id, goods_name, shop_price from goods where goods_id<50 order by cat_id, shop_price desc; //先按cat_id排序,再在栏目内
按shop_price从高到低排序
//按发布时间从早到晚排序(发布时间add_time是用时间戳来存储的) select goods_id, goods_name, add_time from goods order by add_time; 我们可以看到add_time的值是int型的,表示1970-01-01 00:00:00 到当前的秒数。
我们可以按字段排序,查询显示的结果是符合条件所有行的数据。如果我们只是想要显示排序之后的某几行,又要怎么做呢?limit语句可以帮我们实现。 limit [offset] [n] offset:偏移量,offset如果不写,则相当于0,即limit 0, n。所以,是从第offset+1个开始。如limit 3,2 表示偏移前3个,从第4个开始选择2个,即4、5 n:取出的条目 //取出商品价格最贵的3个商品的信息 select goods_id, cat_id, goods_name,shop_price from goods order by shop_price desc limit 3; //取出最新发布的商品 select goods_id, cat_id, goods_name, add_time, shop_price from goods order by add_time desc limit 1;
//取出每个栏目下最贵的商品
错误一: select goods_id, cat_id, goods_name, max(shop_price) from goods; 这种做法查出来的是的确是shop_price最大的商品,不过shop_price不一定是和前面的goods_id, cat_id, goods_name是对应的。
错误二: select goods_id, cat_id, goods_name, shop_price from goods group by cat_id order by shop_price desc; 这种做法也能查出每个栏目下的一个商品来,不过这个商品不一定是每个栏目下最贵的商品,这个商品只是每个栏目下的第一个商品。仔细观察我们可以发现查询结果中shop_price列的价格是按照从大到小来排序的,这就说明了,这条语句查询的结果是把每个栏目下的第一个商品拿出来,后面的order by shop_price desc实现的是对拿出来的每个栏目下的第一个商品按照shop_price从大到小排序。
错误三: 根据上面的做法,有的同学就会想到:如果我先实现 order by shop_price desc 再来实现group by不就行了吗。 select goods_id, cat_id, goods_name, shop_price from goods order by
shop_price desc group by cai_id; 这种做法也一样是不正确的,因为: select的5种子句:where、group by、having、order by、limit是按照顺序来使用的,不能把后面的子句放到前面来先使用。
错误四: 有的同学可能会想,我先构造一张表goods1,表里面的数据是按照order by cat_id asc,shop_price desc顺序排列的,然后,再调用group by来取出每个栏目下的第一个商品不就行了吗。 //创建表goods1 create lzs.goods1 like goods; //将表goods的数据按照order by cat_id,shop_price desc顺序保存到goods1 insert into goods1 select * from goods order by cat_id, shop_price desc; //最后,用group by取出每个栏目下的第一个商品就可以了 select goods_id, cat_id, goods_name, shop_price from goods1 group by cat_id; 这种做法也是错误的,因为在将表goods的数据按照order by cat_id asc,
shop_price desc顺序存进goods1的时候,保存进goods1的数据根本就没有按照想要的顺序排序,而是按照goods原来的顺序保存进来的。所以,最后group by取出来的数据还是不对的。
其实,我们不用创建一张新表,因为查询的结果本来就可以在内存中当作表来使用,所以我们可以这样实现: select * from (selcet goods_id, cat_id, goods_name, shop_price from goods order by cat_id asc, shop_price desc) as goods1 group by cat_id; 这种做法是from型子查询,但是,如果要求只用一个select,又要怎么去实现呢?
|