查詢
查詢一共有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 列,那麼他必須現有這個列的查詢結果;