天天看點

server sql 資料庫列名price無效_SQL學習筆記(2)——查詢

本文為Datawhale 小組SQL語言學習,教程參考:

http://datawhale.club/t/topic/476

一、SQL的結構

   1.一則查詢 

    對于下面這份資料,來寫一則查詢:

server sql 資料庫列名price無效_SQL學習筆記(2)——查詢

    查詢語句如下:

SELECT product_type, COUNT(*)FROM product GROUP BY product_type   HAVING COUNT(*) = 2;
           

    結果如下:

server sql 資料庫列名price無效_SQL學習筆記(2)——查詢

    SQL文法高度口語化,即便是如上述這種相對複合型的查詢語句,也不難猜出查詢目标。我們試試根據結果倒退每一行代碼的功能(見注釋):

SELECT product_type, COUNT(*)# 選擇 product_type(列名),COUNT(*)(列名)FROM product# 從 product(表格名)中GROUP BY product_type# 按照product_type(列名)分組HAVING COUNT(*) = 2;# 基于 COUNT(*) 取 2 這一條件
           

    實際查詢目标為:“在product表中,按照product_type分組,然後從COUNT(*) = 2 的行中挑選出它們的product_type 和 COUNT(*)資料。”

    2.口語化與結構化

    SQL的口語化程度之高,以至于我們如果直接對需求進行英文翻譯,都很難找出其他表達方式 。    

server sql 資料庫列名price無效_SQL學習筆記(2)——查詢

    誠然,這可能有點拗口,讀起來像是夾雜着定語從句和不嚴格倒裝的英語長難句。其中的COUNT(*)不在原資料表已有的列名之中,它是我們臨時造出來的列,如它的名稱,它是“計數結果”。

    SQL全稱為Structured Query Language——結構化查詢語言,從語言形式上繼承了英文文法的高度結構化:即語句元素之間的嚴格司職,語句的嵌套遵循穩定的邏輯,極端有規律。這個特征,通過SQL中的“結構化查詢語句”實作。

3.結構化查詢語言

    如上例中,SELECT,FROM,GROUP BY等,具備功能性的語句,我們稱之為結構化查詢語句。正如我們看到 “For example” 一樣,結構化查詢語句引領着一部分功能的實作。

    SELECT 後面跟着我們打算在資料庫中取出的東西(某表的某列);FROM 後面跟着我們打算從哪張表中取出,顯然這兩個語句幾乎出現在所有的查詢語句中:從哪裡,取什麼。

    而諸如 WHERE,GROUP BY等語句,是用于描述抽取條件的語句。(這似乎恰恰是從句的使命)。

    文法結構清晰、每個語句都各司其職。

    關于結構化查詢語句的完整描述,參考百度百科的解釋:

server sql 資料庫列名price無效_SQL學習筆記(2)——查詢

    4.應用中的結構化 

    SQL的“Structured”是其誕生至今的顯著特點,關于其語言上的結構化,主要由結構化查詢語句實作。在應用場景中的結構化特點(主要是調用方式上),則反映了其誕生的時代背景,是通過制定一系列資料庫管理設計理念、标準來實作的。

二、練習

/*(1)編寫一條SQL語句,從product(商品)表中選取出 “登記日期(regist在2009年4月28日之後”的商品, 查詢結果要包含product name和regist_date兩列*/;SELECT * FROM product;SELECT product_name, regist_date FROM productWHERE regist_date > '2009-04-28';/*(2)請說出對product 表執行如下3條SELECT語句時的傳回結果。*/;SELECT *  FROM product WHERE purchase_price = NULL; SELECT *  FROM product WHERE purchase_price <> NULL; SELECT *  FROM product WHERE product_name > NULL; -- 三個語句都傳回全字段為NULL的行。 /*(3)代碼清單2-22(2-2節)中的SELECT語句能夠從product表中取出 “銷售單價(saleprice)比進貨單價(purchase price)高出500日元以上”的商品。 請寫出兩條可以得到相同結果的SELECT語句。執行結果如下所示。 product_name | sale_price | purchase_price -------------+------------+------------T恤衫         |   1000    | 500運動T恤       |    4000    | 2800高壓鍋        |    6800    | 5000 */;-- 方法一:排序   SELECT product_name, sale_price, purchase_price FROM productORDER BY sale_price-purchase_price   LIMIT 5,8;-- 方法二: 名字索引SELECT product_name, sale_price, purchase_price FROM productWHERE product_name = 'T恤衫'OR product_name = '運動T恤' OR product_name = '高壓鍋'; /*(4)請寫出一條SELECT語句,從product表中選取出滿足“銷售單價打九折之後利潤高于100日元的辦公用品和廚房用具”條件的記錄。查詢結果要包括product_name列、product_type列以及銷售單價打九折之後的利潤(别名設定為profit)。提示:銷售單價打九折,可以通過saleprice列的值乘以0.9獲得,利潤可以通過該值減去purchase_price列的值獲得。*/; SELECT product_name, product_type, sale_price*0.9-purchase_price AS profitFROM productWHERE sale_price*0.9-purchase_price >100;-- WHERE後面不能用SELECT 中給字段起的花名 /*(5)請指出下述SELECT語句中所有的文法錯誤。SELECT product id,SUM(product name)-- product_id 、product_name 輸入錯誤; SUM()作用于字元串類型,隻能傳回0 FROM product  GROUP BY product_type -- GROUP BY 應寫在 WHERE 之後  WHERE regist_date > '2009-09-01';*/; SELECT product_id, product_name FROM product WHERE regist_date > '2009-09-01' GROUP BY product_type ;/*(6)請編寫一條SELECT語句,求出銷售單價(sale_price列)合計值是進貨單價(purchase prilce列)合計值1.5倍的商品種類。執行結果如下所示。product_type | sum  | sum -------------+------+------衣服         | 5000 | 3300辦公用品      |  600 | 320 */;-- 方法1:子查詢 SELECT*FROM(SELECT product_type,  sum(sale_price)as sp, sum(purchase_price)as ppFROM productGROUP BY product_type) AS T2WHERE sp > pp*1.5;-- 方法2:HAVINGSELECT product_type, sum(sale_price) AS sum, sum(purchase_price) AS sumFROM productGROUP BY product_typeHAVING sum(sale_price) >= sum(purchase_price) * 1.5;/*(7)此前我們曾經使用SELECT語句選取出了product(商品)表中的全部記錄。當時我們使用了ORDERBY子句來指定排列順序,但現在已經無法記起當時如何指定的了。請根據下列執行結果,思考ORDERBY子句的内容。(執行結果略)*/;SELECT *FROM productORDER BY regist_date DESC, sale_price;