天天看點

資料庫(學習筆記二) ------ 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 列,那麼他必須現有這個列的查詢結果;