02_數據庫基礎之(二)sql語句入門


1.基本增刪改查操作

 1 #一。 數據類型  常用的3中
 2  # 1.字符串  例如:你的名字 我是中國人    在數據庫中要使用 ‘’引起來   '蘋果手機'
 3  # 2.整數類型  例如: 你的年齡 23 ,辦公室的人數  5 個 ,直接使用  5000
 4  # 3.時間    當着一個字符串用
 5 
 6 #二。幾乎所有的編程標點符號都要使用 英文狀態下的
 7 
 8 #三。數據庫中不區分大小寫,但是  生產上的 規范  關鍵字大寫 INSERT,其他的小寫
 9 
10 新增
11 需求:添加一條數據到產品表   產品名稱為蘋果手機   賣價為5000
12 INSERT INTO  product (product_name,sale_price) VALUES ('蘋果手機'5000)
13 
14 刪除
15 需求:刪除產品表中id=20的數據
16 DELETE FROM product WHERE id=20
17 # = >  <   >=    <=   
18 # product_name='聯想M115'
19 #  或OR  且AND  非!     兩個條件同時滿足  AND
20 需求:刪除產品表中id=20並且product_name='聯想M115'的數據
21 DELETE FROM product WHERE id=20  AND product_name='聯想M115'
22 
23 需求:刪除產品表中id=20或者product_name='聯想M115'的數據
24 DELETE FROM product WHERE id=20  OR product_name='聯想M115'
25 
26 需求:刪除產品表中product_name!='聯想M115'的數據
27 DELETE FROM product WHERE product_name !='聯想M115'
28 
29 更新
30 
31 #需求:把成本價大於100的所有商品的賣價修改為200,並且把名稱修改為特殊商品
32 UPDATE product SET sale_price=200,product_name='特殊商品'  WHERE cost_price>100
33 
34 查詢   
35 #查詢所有商品
36 SELECT * FROM product  
37 #需求:查詢id<8的數據
38                        #過濾行
39 SELECT * FROM product  WHERE id<8
40 #需求:查詢id<8的數據,只看id,產品名稱,賣價
41 SELECT id,product_name,sale_price FROM product  WHERE id<8

 

2.創建表與規范命名

    2.1.命名規則:

             a.見名知意  千萬不要使用中文拼音
             b.多個單詞使用下划線(數據庫中不區分大小寫,生產規范關鍵字大寫,其他小寫)
             c.不要使用關鍵字  #關鍵字 INSERT INTO  VALUES

     2.2.數據庫設計必備基本字段
    1.id 序號
    2.state 狀態 
    3.type  類型
    4.create_time 創建時間
    5.update_time 更新時間     

      2.3.創建用戶表案例

     

 3.表結構認識

      

   4.簡單查詢之列操作

 1 簡單查詢:
 2 語法:
 3 SELECT {*, column [alias],...}
 4 FROM       table_name;
 5 說明:
 6 SELECT  選擇查詢列表
 7 FROM      提供數據源(表、視圖或其他的數據源)
 8 如果為 * 和創建表時的順序一致。
 9 可以自己調整順序,在select后邊加上要查詢的列名。
10 需求:查詢所有貨品信息
11 需求:查詢所有貨品的id,product_name,sale_price
12 --------------------------------------------------------------
13 消除結果中重復的數據。
14 需求:查詢商品的分類編號。
15 語法:
16 SELECT    DISTINCT 列名,..
17 --------------------------------------------------------------
18 實現數學運算查詢:
19 
20 對NUMBER型數據可以使用算數操作符創建表達式(+  -  *  /21 
22 對DATE型數據可以使用部分算數操作符創建表達式 (+  -23 
24 運算符優先級:
25 
26 1、乘法和除法的優先級高於加法和減法
27 
28 2、同級運算的順序是從左到右
29 
30 3、表達式中使用"括號"可強行改變優先級的運算順序
31 
32 -----------------------------------------------------------------
33 需求:查詢所有貨品的id,名稱和每零售1個產品所賺取的錢(每零售1個產品所賺取的錢=零售價-成本價格)
34 SELECT id ,product_name,sale_price-cost_price FROM product
35 
36 需求:查詢所有貨品的id,名稱和批發價(批發價=賣價*折扣)
37 
38 需求:查詢所有貨品的id,名稱,和各進50個的成本價(成本=cost_price)
39 
42 ------------------------------------------------------------------
43 
44 設置列名的別名。
45 
46 1、改變列的標題頭;
47 
48 2、用於表示計算結果的含義;
49 
50 3、作為列的別名;
51 
52 4、如果別名中使用特殊字符,或者是強制大小寫敏感,或有空格時,都需加單引號;--->英文單詞
53 
54 需求:查詢所有貨品的id,名稱和每零售1個產品所賺取的錢(每零售1個產品所賺取的錢=零售價-成本價格),並取別名
55 
56 SELECT id ,product_name 名稱 ,sale_price-cost_price 每零售1個產品所賺取的錢 FROM product
57 
58 需求:查詢所有貨品的id,名稱,各進50個,並且每個運費1元的成本(使用別名)
59 
60 ------------------------------------------------------------------
61 
62 設置顯示格式:
63 
64 為方便用戶瀏覽查詢的結果數據,有時需要設置顯示格式,可以使用CONCAT函數來連接字符串。
65 
66 需求:查詢所有貨品名稱和每零售1個產品所賺取的錢(每零售1個產品所賺取的錢=零售價-成本價格),
67 格式為: 每零售一個XXX產品,賺取:XX元
68 SELECT CONCAT('每零售一個',product_name,'產品,賺取:',sale_price-cost_price,'') FROM product 
69 
70 需求:查詢商品的名字和零售價。
71      格式:xxx商品的零售價為:xxx
72 
73 SELECT CONCAT(productName,'商品的零售價為:',salePrice) AS productSalePrice FROM product;
74  //CONCAT('你好','','?','我很好')  你好嗎?我很好

 

 5.帶條件查詢

  1 使用WHERE子句限定返回的記錄:
  2 
  3 語法:
  4 
  5 SELECT  <selectList> 
  6 
  7 FROM        table_name
  8 
  9 WHERE    條件1 AND/OR 條件2;
 10 
 11 注意:
 12 
 13 WHERE子句在 FROM 子句后
 14 
 15 ----------------------------------------------------
 16 
 17 比較運算符               含義
 18 
 19 -------------------------------------------------
 20 
 21 =                     等於
 22 
 23 >                     大於
 24 
 25 >=                    大於或等於
 26 
 27 <                     小於
 28 
 29 <=                    小於或等於
 30 
 31 !=(<>)                不等於
 32 
 33 ---------------------------------------------------
 34 需求: 查詢貨品零售價大於119的所有貨品信息.
 35 SELECT * FROM product WHERE sale_price>119
 36 
 37 需求: 查詢貨品零售價為119的所有貨品信息.
 38 
 39 需求: 查詢貨品名為聯想G9X的所有貨品信息.
 40 
 41 需求: 查詢貨品名 不為 聯想G9X的所有貨品信息.
 42 
 43 需求: 查詢分類編號不等於2的貨品信息
 44 
 45 需求: 查詢貨品名稱,零售價小於等於200的貨品
 46 
 47 需求: 查詢id,貨品名稱,批發價大於350的貨品
 48 
 49 思考:where后面使用別名不行,總結select和where的執行順序   先執行where ,在執行select
 50 
 51 
 52 
 53 SQL的執行順序:
 54 
 55 1.先執行FROM子句:  確定查詢哪一張表
 56 
 57 2.接着執行WHERE :  過濾篩選條件
 58 
 59 3.接着做SELECT  :  確定選擇的列
 60 
 61 4.最后做ORDER BY:  對結果集按照某列排序
 62 
 63 ---------------------------------------------------
 64 
 65 注意:字符串和日期要用單引號擴起來.
 66 
 67 要讓MySQL查詢區分大小寫,可以:使用 BINARY
 68 
 69 SELECT * FROM table_name WHERE BINARY product_name='g9x'
 70 
 71 SELECT * FROM table_name WHERE BINARY product_name='G9X'
 72 
 73 -----------------------------------------------------------------
 74 
 75 邏輯運算符                含義
 76 
 77 ----------------------------------------
 78 
 79 AND              如果組合的條件都是TRUE,返回TRUE
 80 
 81 OR               如果組合的條件之一是TRUE,返回TRUE
 82 
 83 NOT(!)               如果下面的條件是FALSE,返回TRUE`
 84 
 85 -------------------------------------------------------------
 86 
 87 需求: 選擇id,貨品名稱,批發價在300-400之間的貨品
 88 
 89 需求: 選擇id,貨品名稱,分類編號為2,4的所有貨品
 90 
 91 需求: 選擇id,貨品名詞,分類編號不為2的所有商品
 92 
 93 需求: 選擇id,貨品名稱,分類編號的貨品零售價大於等於250或者是成本大於等於200
 94 
 95 -----------------------------------------------------------------------
 96 優先級            運算符
 97 ------------------------------------
 98 1                所有比較運算符
 99 2                NOT
100 3                AND
101 4                OR
102 
103 注意:括號將跨越所有優先級規則

 

    

 1 使用BETWEEN運算符顯示某一值域范圍的記錄,這個操作符最常見的使用在數字類型數據的范圍上,但對於字符類型數據和日期類型數據同樣可用。
 2 格式:
 3 SELECT <selectList>
 4 FROM table_name
 5 WHERE 列名 BETWEEN minvalue AND maxvalue:閉區間。
 6 需求: 選擇id,貨品名稱,批發價在300-400之間的貨品
 7 需求: 選擇id,貨品名稱,批發價不在300-400之間的貨品
 8 --------------------------------------------------------
 9 使用IN運算符,判斷列的值是否在指定的集合中。
10 格式: 
11 SELECT <selectList>
12 FROM table_name
13 WHERE 列名 IN (值1,值2....);
14 
15 需求:選擇id,貨品名稱,分類編號為2,4的所有貨品
16 需求:選擇id,貨品名稱,分類編號不為2,4的所有貨品
17 --------------------------------------------------------
18 IS NULL:判斷列的值是否為空。
19 格式:WHERE  列名 IS NULL;
20 需求:查詢商品名為NULL的所有商品信息。
21 --------------------------------------------------------
22 使用LIKE運算符執行通配查詢,查詢條件可包含文字字符或數字:
23 %:通配符:可表示零或多個字符。
24 _:通配符:可表示一個字符。
25 通配符:用來實現匹配部分值得特殊字符。
26 -----------------------------------------------------
27 需求: 查詢id,貨品名稱,貨品名稱匹配'%聯想M9_'
28 需求: 查詢id,貨品名稱,分類編號,零售價大於等於200並且貨品名稱匹配'%聯想M1__'

6.排序

使用ORDER BY子句將結果的記錄排序.
ASC : 升序,缺省。
DESC: 降序。
ORDER BY 子句出現在SELECT語句的最后。
格式:
SELECT <selectList> 
FROM table_name
WHERE 條件
ORDER BY 列名1 [ASC/DESC],列名2 [ASC/DESC]...;
-------------------------------------------------------
需求:選擇id,貨品名稱,分類編號,零售價並且按零售價降序排序
需求: 選擇id,貨品名稱,分類編號,零售價先按分類編號排序,再按零售價排序
需求:查詢M系列並按照批發價排序(加上別名)
需求:查詢分類為2並按照批發價排序(加上別名)
注意:別名不能使用引號括起來,否則不能排序。
--------------------------------------------------------------------------
SELECT語句執行順序:
先執行FROM--->接着執行WHERE--->再執行SELECT--->最后執行ORDER BY

 

 7.分頁

 1 分頁查詢:
 2 分頁設計:
 3   假分頁(邏輯分頁): 把數據全部查詢出來,存在於內存中,翻頁的時候,直接從內存中去截取.
 4   真分頁(物理分頁): 每次翻頁都去數據庫中去查詢數據.
 5 
 6   假分頁: 翻頁比較快,但是第一次查詢很慢,若數據過大,可能導致內存溢出.
 7   真分頁: 翻頁比較慢,若數據過大,不會導致內存溢出.
 8 ----------------------------------------------------------------------------------------
 9 規定:每頁顯示3條數據. pageSize = 3
10 第一頁:   SELECT * FROM `product` LIMIT 0, 3
11 第二頁:   SELECT * FROM `product` LIMIT 3, 3
12 第三頁:   SELECT * FROM `product` LIMIT 6, 3
13 第 N頁:   SELECT * FROM `product` LIMIT (N-1)*3, 3
14 ----------------------------------------------------------------------------------------
15 分頁查詢的SQL:
16 SELECT * FROM table_name LIMIT ?,?;
17 SELECT * FROM table_name LIMIT beginIndex,pageSize;
18 beginIndex = (currentPage-1) * pageSize;
19 第一個?: 表示本頁,開始索引(從0開始).
20 第二個?: 每頁顯示的條數

 

 8.函數

 1 什么是聚集函數:統計函數.
 2 聚集函數作用於一組數據,並對一組數據返回一個值。
 3 -------------------------------------------------------
 4 聚集函數:
 5 COUNT:統計結果記錄數  
 6 MAX:  統計計算最大值
 7 MIN:  統計計算最小值
 8 SUM:  統計計算求和
 9 AVG:  統計計算平均值
10 -------------------------------------------------------
11 需求:查詢所有商品平均零售價   
SELECT AVG(sale_price) FROM product
12 需求:查詢商品總記錄數 13 需求:查詢分類為2的商品總數 14 需求:查詢商品的最小零售價,最高零售價,以及所有商品零售價總和

 

 9.分組

 1 分組查詢:
 2 可以使用GROUP BY 子句將表中的數據分成若干組,再對分組之后的數據做統計計算,一般使用聚集函數才使用GROUP BY.
 3 語法格式:
 4 SELECT <selectList>,聚集函數
 5 FROM table_name  
 6 WHERE 條件
 7 GROUP BY 列名
 8 注意:GROUP BY 后面的列名的值要有重復性分組才有意義。
 9 
10 ----------------------------------------------------------------------
11 需求:查詢每個商品分類編號和每個商品分類各自的平均零售價
SELECT classify_id,AVG(sale_price) FROM product  GROUP BY classify_id
12 需求:查詢每個商品分類編號和每個商品分類各自的商品總數。 13 需求:查詢每個商品分類編號和每個商品分類中零售價大於100的商品總數: 14 需求:查詢零售價總和大於1500的商品分類編號以及總零售價和:

10.笛卡爾積

 1 單表查詢:從一張表中查詢數據
 2 多表查詢:從多張表中聯合查詢出數據
 3 ------------------------------------
 4 單表查詢:
 5 SELECT <selectList>
 6 FROM  table_name
 7 -----------------------------------
 8 多表查詢(最簡單的):
 9 SELECT <selectList>
10 FROM  表名A,表名B
11 ----------------------------------------------------------------------
12 笛卡爾積:
13 需求:查詢所有的貨品信息+對應的貨品分類信息
14 沒有連接條件的表關系返回的結果。
15 多表查詢會產生笛卡爾積:
16 
17 假設集合A={a,b},集合B={0,1,2},則兩個集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。
18 
19 實際運行環境下,應避免使用全笛卡爾集。
20 
21 解決方案: 在WHERE加入有效的連接條件---->等值連接
22 注意:
23 連接 n張表,至少需要 n-1個連接條件。

 

 11.內連接查詢

 1 內連接查詢:
 2 內連接查詢:是相對於外連接。
 3 內連接分為:隱式內連接、顯示內連接(推薦),其查詢效果相同,僅僅只是語法不同而已。
 4 -----------------------------------------------
 5 隱式內連接:
 6 SELECT    <selectList>
 7 FROM    A ,B  WHERE A.列 = B.列
 8 -----------------------------------------------
 9 顯示內連接(推薦寫法):.
10 SELECT    <selectList>
11 FROM    A [INNER] JOIN B ON A.列 = B.列 
12 -----------------------------------------------
13 需求:查詢所有商品的名稱和分類名稱:
14 隱式內連接: SELECT p.product_name,pc.classify_name FROM product p,product_classify  pc WHERE p.classify_id = pc.id
15 顯示內連接:  SELECT p.product_name,pc.classify_name FROM product p INNER JOIN product_classify pc ON p.classify_id = pc.id
16 顯示內連接: SELECT p.product_name,pc.classify_name FROM product p  JOIN product_classify pc ON p.classify_id = pc.id
17 -----------------------------------------------
18 在做等值連接的時候,若A表中和B表中的列名相同. 則可以簡寫:
19 SELECT    <selectList>
20 FROM    A [INNER] JOIN B USING(同名的列)
21 前提:在emp員工和dept部門表中都有deptno部門編號列. 並且是外鍵關系。
22 則: SELECT * FROM emp JOIN dept USING (deptno)
23 ---------------------------------------------------------------------
24 使用表名前綴在多個表中區分相同的列。
25 在不同表中具有相同列名的列可以用表的別名加以區分。
26 使用別名可以簡化查詢。
27 使用表名前綴可以提高執行效率。
28 如果使用了表的別名,則不能再使用表的真名
29 ---------------------------------------------------------------------
30 需求: 查詢貨品id,貨品名稱,貨品所屬分類名稱
31 需求: 查詢零售價大於200的無線鼠標
32 需求: 查詢零售價大於200的無線鼠標(使用表的別名)
33 需求: 查詢每個貨品對應的分類以及對應的庫存
34 需求: 如果庫存貨品都銷售完成,按照利潤從高到低查詢貨品名稱,零售價,貨品分類(三張表).

 

 12.外連接查詢

 1 外連接查詢:
 2   左外連接:查詢出JOIN左邊表的全部數據查詢出來,JOIN右邊的表不匹配的數據使用NULL來填充數據.
 3   右外連接:查詢出JOIN右邊表的全部數據查詢出來,JOIN左邊的表不匹配的數據使用NULL來填充數據.
 4 ----------------------------
 5 語法格式:
 6 SELECT    <selectList>
 7 FROM    A LEFT/RIGHT [OUTER] JOIN B
 8   ON (A.column_name = B.column_name)];
 9 查詢所有的商品信息和對應的分類信息.
10 左連接:
11 SELECT * FROM product p LEFT JOIN product_classify pc ON p.classify_id = pc.id
12 右連接:
13 SELECT * FROM product p RIGHT  JOIN product_classify pc ON p.classify_id = pc.id
14 ----------------------------------------------
15 在做等值連接的時候,若A表中和B表中的列名相同. 則可以簡寫:
16 SELECT    <selectList>
17 FROM    A LEFT JOIN B USING(同名的列)
18 前提:在emp員工和dept部門表中都有deptno部門編號列. 並且是外鍵關系
19 如: SELECT * FROM emp LEFT JOIN dept USING (deptno)
20 
21 思考:查詢每種商品分類的名稱和包含的的商品總數:
22 
23 SELECT pc.classify_name,COUNT(p.id)
24 
25 FROM product p RIGHT JOIN product_classify pc ON p.classify_id = pc.id
26 
27 GROUP BY pc.classify_name

13.自連接查詢

 1 自連接查詢:
 2   把一張表看成兩張來做查詢.
 3 需求: 查詢每個商品分類的名稱和父分類名稱:
 4 
 5 隱式內連接:
 6 SELECT sub.classify_name,super.classify_name
 7         FROM product_classify super,product_classify sub
 8         WHERE sub.parent_id = super.id
 9 
10 顯示內連接:
11 SELECT sub.classify_name,super.classify_name
12         FROM product_classify super JOIN product_classify sub
13 
14                 ON sub.parent_id = super.id

14.子查詢

 1 什么是子查詢(嵌套查詢):一個查詢語句中嵌套在另一個查詢語句中,內層查詢的結果可以作為外層查詢條件或者臨時表。
 2 一般的,嵌套在WHERE或者FROM字句中。
 3 為什么使用子查詢:
 4    多表連接查詢過程:
 5    1):兩張表做笛卡爾積。
 6    2):篩選匹配條件的數據記錄。
 7    若,笛卡爾積記錄數比較大,可能造成服務器崩潰。
 8 -----------------------------------------------------------------------
 9 單行單列子查詢:
10 需求: 查詢零售價比聯想MX1100更高的所有商品信息。
11 SELECT * FROM product
12 WHERE salePrice > (
13     SELECT salePrice FROM product WHERE productName = '聯想MX1100'
14 )
15 單行多列子查詢:
16 需求: 查詢分類編號和折扣與聯想M100相同的所有商品信息。
17 SELECT * FROM product
18 WHERE (dir_id,cutoff)=(
19     SELECT dir_id,cutoff FROM product WHERE productName = '聯想M100'
20 )
21 多行多列子查詢:
22 需求: 查詢各商品分類的分類編號,分類名稱,商品數量,平均零售價。
23 
24 內連接:
25 SELECT  pc.id, pc.classify_name,COUNT(p.id),AVG(p.sale_price)
26 
27 FROM product p JOIN product_classify pc ON p.classify_id = pc.id
28 
29 GROUP BY pc.id
30 
31 產生的笛卡爾積記錄:80條
32 SELECT COUNT(*) FROM product,product_classify
33 
34 子查詢:
35 SELECT pc.id,pc.classify_name,countNum,avgSalePrice
36 
37 FROM product_classify pc JOIN (
38 
39         SELECT classify_id ,COUNT(id) countNum,AVG(sale_price) avgSalePrice
40 
41         FROM product 
42 
43         GROUP BY classify_id) p 
44 
45 ON pc.id = p.classify_id

 

 15.保存之前先檢查該數據是否存在

  

      舉例:角色不能一樣

      INSERT INTO tab_pc_role (role_name,remark) SELECT 'testMast2','測試權限' FROM DUAL  WHERE NOT EXISTS (SELECT id FROM tab_pc_role WHERE role_name='testMast2')

16.考查與評估

  a.練習題

 1 1.基本增刪改查操作
 2 需求:添加一條數據到產品表   產品名稱為蘋果手機   賣價為5000
 3 需求:刪除產品表中id=20的數據
 4 需求:刪除產品表中id=20並且product_name='聯想M115'的數據
 5 需求:刪除產品表中id=20或者product_name='聯想M115'的數據
 6 需求:刪除產品表中product_name!='聯想M115'的數據
 7 需求:把成本價大於100的所有商品的賣價修改為200,並且把名稱修改為特殊商品
 8 需求:查詢所有商品
 9 需求:查詢id<8的數據
10 需求:查詢id<8的數據,只看id,產品名稱,賣價
11 
12 2.簡單查詢之列操作
13 需求:查詢所有貨品信息
14 需求:查詢所有貨品的id,product_name,sale_price
15 需求:查詢商品的分類編號。
16 需求:查詢所有貨品的id,名稱和每零售1個產品所賺取的錢(每零售1個產品所賺取的錢=零售價-成本價格)
17 需求:查詢所有貨品的id,名稱和批發價(批發價=賣價*折扣) 
18 需求:查詢所有貨品的id,名稱,和各進50個的成本價(成本=cost_price)
19 需求:查詢所有貨品的id,名稱和每零售1個產品所賺取的錢(每零售1個產品所賺取的錢=零售價-成本價格),並取別名
20 需求:查詢所有貨品的id,名稱,各進50個,並且每個運費1元的成本(使用別名)
21 需求:查詢所有貨品名稱和每零售1個產品所賺取的錢(每零售1個產品所賺取的錢=零售價-成本價格),
22 需求:查詢商品的名字和零售價。格式:xxx商品的零售價為:xxx
23 
24 3.帶條件查詢
25 需求: 查詢貨品零售價大於119的所有貨品信息.
26 需求: 查詢貨品零售價為119的所有貨品信息.
27 需求: 查詢貨品名為聯想G9X的所有貨品信息.
28 需求: 查詢貨品名 不為 聯想G9X的所有貨品信息.
29 需求: 查詢分類編號不等於2的貨品信息
30 需求: 查詢貨品名稱,零售價小於等於200的貨品
31 需求: 查詢id,貨品名稱,批發價大於350的貨品
32 需求: 選擇id,貨品名稱,批發價在300-400之間的貨品
33 需求: 選擇id,貨品名稱,分類編號為2,4的所有貨品
34 需求: 選擇id,貨品名詞,分類編號不為2的所有商品
35 需求: 選擇id,貨品名稱,分類編號的貨品零售價大於等於250或者是成本大於等於200
36 需求: 選擇id,貨品名稱,批發價在300-400之間的貨品
37 需求: 選擇id,貨品名稱,批發價不在300-400之間的貨品
38 需求: 選擇id,貨品名稱,分類編號為2,4的所有貨品
39 需求: 選擇id,貨品名稱,分類編號不為2,4的所有貨品
40 需求: 查詢商品名為NULL的所有商品信息。
41 需求: 查詢id,貨品名稱,貨品名稱匹配'%聯想M9_'
42 需求: 查詢id,貨品名稱,分類編號,零售價大於等於200並且貨品名稱匹配'%聯想M1__'
43 需求:選擇id,貨品名稱,分類編號,零售價並且按零售價降序排序
44 需求: 選擇id,貨品名稱,分類編號,零售價先按分類編號排序,再按零售價排序
45 需求:查詢M系列並按照批發價排序(加上別名)
46 需求:查詢分類為2並按照批發價排序(加上別名)
47 
48 4.函數
49 需求:查詢所有商品平均零售價   
50 需求:查詢商品總記錄數
51 需求:查詢分類為2的商品總數
52 需求:查詢商品的最小零售價,最高零售價,以及所有商品零售價總和
53 
54 5.分組
55 需求:查詢每個商品分類編號和每個商品分類各自的平均零售價
56 需求:查詢每個商品分類編號和每個商品分類各自的商品總數。
57 需求:查詢每個商品分類編號和每個商品分類中零售價大於100的商品總數:
58 需求:查詢零售價總和大於1500的商品分類編號以及總零售價和
59 
60 6.綜合查詢
61 需求:查詢所有的貨品信息+對應的貨品分類信息
62 需求:查詢所有商品的名稱和分類名稱
63 需求: 查詢貨品id,貨品名稱,貨品所屬分類名稱
64 需求: 查詢零售價大於200的無線鼠標
65 需求: 查詢零售價大於200的無線鼠標(使用表的別名)
66 需求: 查詢每個貨品對應的分類以及對應的庫存
67 需求: 如果庫存貨品都銷售完成,按照利潤從高到低查詢貨品名稱,零售價,貨品分類(三張表).
68 需求: 查詢每個商品分類的名稱和父分類名稱
69 需求: 查詢零售價比聯想MX1100更高的所有商品信息。
70 需求: 查詢分類編號和折扣與聯想M100相同的所有商品信息。
71 需求: 查詢各商品分類的分類編號,分類名稱,商品數量,平均零售價。
練習sql

 

      b.需求:以常見OA系統中的員工部門為案例完成:

  1.設計員工表

  2.設計部門表

  3.sql語句練習

  3.1查詢所有員工按照年齡排序

  3.2查詢各部門的平均工資

  3.3查詢各部門人數並按照部門人數排序

  3.4查詢研發部門的所有員工

  3.5查詢工資高於10000的員工信息

  3.6查詢工資低於平均工資的員工信息

17.練習題sql語句答案

  1 CREATE TABLE `product` (
  2   `id` int(11) NOT NULL AUTO_INCREMENT,
  3   `product_name` varchar(50) DEFAULT NULL,
  4   `classify_id` int(11) DEFAULT NULL,
  5   `sale_price` double(10,2) DEFAULT NULL,
  6   `supplier` varchar(50) DEFAULT NULL,
  7   `brand` varchar(50) DEFAULT NULL,
  8   `cutoff` double(2,2) DEFAULT NULL,
  9   `cost_price` double(10,2) DEFAULT NULL,
 10   PRIMARY KEY (`id`)
 11 ) ENGINE=MyISAM AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
 12 
 13 1.基本增刪改查操作
 14 需求:添加一條數據到產品表   產品名稱為蘋果手機   賣價為5000
 15 INSERT INTO product (product_name,sale_price) VALUES ('蘋果手機',5000);
 16 
 17 需求:刪除產品表中id=20的數據
 18 DELETE FROM product WHERE id=20;
 19 需求:刪除產品表中id=20並且product_name='聯想M115'的數據
 20 DELETE FROM product WHERE id=20 AND product_name='聯想M115';
 21 
 22 需求:刪除產品表中id=20或者product_name='聯想M115'的數據
 23 DELETE FROM product WHERE id=20 OR product_name='聯想M115';
 24 
 25 
 26 需求:刪除產品表中product_name!='聯想M115'的數據
 27 DELETE FROM product WHERE product_name='聯想M115';
 28 
 29 
 30 需求:把成本價大於100的所有商品的賣價修改為200,並且把名稱修改為特殊商品
 31 UPDATE product SET sale_price=200,product_name='特殊商品' WHERE cost_price>100
 32 
 33 
 34 需求:查詢所有商品
 35 SELECT * FROM product
 36 
 37 需求:查詢id<8的數據
 38 SELECT * FROM product WHERE id<8
 39 
 40 需求:查詢id<8的數據,只看id,產品名稱,賣價
 41 
 42 SELECT id,product_name,sale_price FROM product WHERE id<8
 43 
 44 2.簡單查詢之列操作
 45 需求:查詢所有貨品信息
 46 
 47 SELECT * FROM product
 48 
 49 需求:查詢所有貨品的id,product_name,sale_price
 50 SELECT id,product_name,sale_price FROM product 
 51 
 52 
 53 需求:查詢商品的分類編號。
 54 SELECT classify_id FROM product
 55 
 56 需求:查詢所有貨品的id,名稱和每零售1個產品所賺取的錢(每零售1個產品所賺取的錢=零售價-成本價格)
 57 
 58 SELECT id,product_name,sale_price,cost_price,(sale_price-cost_price)*1 FROM product 
 59 
 60 需求:查詢所有貨品的id,名稱和批發價(批發價=賣價*折扣) 
 61 SELECT id,product_name,sale_price,cutoff,(sale_price*cutoff) FROM product 
 62 
 63 需求:查詢所有貨品的id,名稱,和各進50個的成本價(成本=cost_price)
 64 SELECT id,product_name,cost_price,cost_price*50 FROM product 
 65 
 66 需求:查詢所有貨品的id,名稱和每零售1個產品所賺取的錢(每零售1個產品所賺取的錢=零售價-成本價格),並取別名
 67 SELECT id,product_name,sale_price,cost_price,(sale_price-cost_price)*1 每零售1個產品所賺取的錢 FROM product 
 68 
 69 
 70 需求:查詢所有貨品的id,名稱,各進50個,並且每個運費1元的成本(使用別名)
 71 SELECT id,product_name,cost_price,(cost_price+1)*50 成本 FROM product 
 72 
 73 
 74 需求:查詢所有貨品名稱和每零售1個產品所賺取的錢(每零售1個產品所賺取的錢=零售價-成本價格)
 75 SELECT product_name,sale_price,cost_price,(sale_price-cost_price) 利潤 FROM product
 76 
 77 需求:查詢商品的名字和零售價。格式:xxx商品的零售價為:xxx
 78 
 79 SELECT product_name,'商品的零售價為:',sale_price FROM product 
 80 SELECT CONCAT(product_name,'商品的零售價為:',sale_price) FROM product
 81 
 82 3.帶條件查詢
 83 需求: 查詢貨品零售價大於119的所有貨品信息.
 84 SELECT * FROM product WHERE sale_price>119
 85 
 86 需求: 查詢貨品零售價為119的所有貨品信息.
 87 SELECT * FROM product WHERE sale_price=119
 88 
 89 
 90 需求: 查詢貨品名為聯想G9X的所有貨品信息.
 91 SELECT * FROM product WHERE product_name='聯想G9X'
 92 
 93 
 94 需求: 查詢貨品名 不為 聯想G9X的所有貨品信息.
 95 SELECT * FROM product WHERE product_name !='聯想G9X'
 96 
 97 
 98 需求: 查詢分類編號不等於2的貨品信息
 99 
100 SELECT * FROM product WHERE classify_id!=2
101 
102 需求: 查詢貨品名稱,零售價小於等於200的貨品
103 
104 SELECT product_name,sale_price FROM product WHERE sale_price=200
105 
106 需求: 查詢id,貨品名稱,批發價大於350的貨品
107 
108 SELECT id, product_name,sale_price*cutoff FROM product WHERE sale_price*cutoff>350
109 
110 需求: 選擇id,貨品名稱,批發價在300-400之間的貨品
111 SELECT id, product_name,sale_price*cutoff FROM product WHERE sale_price*cutoff>300 AND sale_price*cutoff<400
112 
113 
114 需求: 選擇id,貨品名稱,分類編號為2,4的所有貨品
115 SELECT id, product_name,classify_id FROM product WHERE classify_id=2 OR  classify_id=4
116 
117 SELECT id, product_name,classify_id FROM product WHERE classify_id  IN (2,4) # (推薦使用這種)
118 
119 
120 
121 需求: 選擇id,貨品名詞,分類編號不為2的所有商品
122 SELECT id, product_name,classify_id FROM product WHERE classify_id !=2 # (推薦使用這種)
123 
124 SELECT id, product_name,classify_id FROM product WHERE classify_id NOT IN (2) 
125 
126 
127 
128 需求: 選擇id,貨品名稱,分類編號的貨品零售價大於等於250或者是成本大於等於200
129 
130 SELECT id, product_name,classify_id FROM product WHERE sale_price>=250 OR cost_price>=200
131 需求: 選擇id,貨品名稱,批發價在300-400之間的貨品
132 SELECT id, product_name,sale_price*cutoff FROM product WHERE sale_price*cutoff>300 AND sale_price*cutoff<400  #推薦這種
133 
134 
135 SELECT id, product_name,sale_price*cutoff FROM product WHERE  sale_price*cutoff BETWEEN  300 AND 400
136 
137 
138 
139 需求: 選擇id,貨品名稱,批發價不在300-400之間的貨品
140 
141 SELECT id, product_name,sale_price*cutoff FROM product WHERE sale_price*cutoff<=300 OR sale_price*cutoff>=400  #推薦這種
142 
143 SELECT id, product_name,sale_price*cutoff FROM product WHERE  sale_price*cutoff  NOT BETWEEN  300 AND 400
144 
145 
146 需求: 選擇id,貨品名稱,分類編號為2,4的所有貨品
147 SELECT id, product_name,classify_id FROM product WHERE classify_id=2 OR  classify_id=4
148 
149 SELECT id, product_name,classify_id FROM product WHERE classify_id  IN (2,4) # (推薦使用這種)
150 
151 需求: 選擇id,貨品名稱,分類編號不為2,4的所有貨品
152 SELECT id, product_name,classify_id FROM product WHERE classify_id!=2 AND  classify_id!=4
153 
154 SELECT id, product_name,classify_id FROM product WHERE classify_id NOT  IN (2,4) # (推薦使用這種)
155 
156 需求: 查詢商品名為NULL的所有商品信息。
157 SELECT * FROM product WHERE product_name IS NULL
158 
159 SELECT * FROM product WHERE product_name = NULL  (這是錯誤的寫法     必須重視,初學者很容易犯錯)
160 
161 需求: 查詢id,貨品名稱,貨品名稱匹配'%聯想M9_'
162 SELECT id, product_name FROM product WHERE product_name LIKE '%聯想M9_'
163 
164 
165 需求: 查詢id,貨品名稱,分類編號,零售價大於等於200並且貨品名稱匹配'%聯想M1__'
166 SELECT id, product_name,classify_id,sale_price FROM product WHERE product_name LIKE '%聯想M1__' AND sale_price>=200
167 
168 
169 需求:選擇id,貨品名稱,分類編號,零售價並且按零售價降序排序
170 SELECT id, product_name,classify_id,sale_price FROM product ORDER BY sale_price DESC   (默認的ASC是升序)
171 SELECT id, product_name,classify_id,sale_price FROM product ORDER BY sale_price ASC 
172 
173 需求: 選擇id,貨品名稱,分類編號,零售價先按分類編號排序,再按零售價排序
174 SELECT id, product_name,classify_id,sale_price FROM product ORDER BY classify_id ASC ,sale_price ASC 
175 
176 
177 需求:查詢M系列並按照批發價排序(加上別名)
178 
179 #ORDER BY sc   可以使用別名,因為執行select在執行order。。by..
180 SELECT id, product_name,classify_id,sale_price,cutoff,(sale_price*cutoff) sc FROM product WHERE product_name LIKE '%M%' ORDER BY sc
181 
182 需求:查詢分類為2並按照批發價排序(加上別名)
183 
184 SELECT id, product_name,classify_id,sale_price,cutoff,(sale_price*cutoff) sc FROM product WHERE classify_id=2 ORDER BY sc
185 
186 
187 4.函數
188 需求:查詢所有商品平均零售價
189 
190 SELECT AVG(sale_price) FROM product
191    
192 需求:查詢商品總記錄數
193 SELECT COUNT(1) FROM product
194 
195 需求:查詢分類為2的商品總數
196 SELECT COUNT(1) FROM product WHERE classify_id=2
197 
198 需求:查詢商品的最小零售價,最高零售價,以及所有商品零售價總和
199 
200 SELECT MIN(sale_price),MAX(sale_price),SUM(sale_price) FROM product 
201 
202 5.分組
203 需求:查詢每個商品分類編號和每個商品分類各自的平均零售價
204 
205 SELECT classify_id,AVG(sale_price) FROM product GROUP BY classify_id
206 
207 需求:查詢每個商品分類編號和每個商品分類各自的商品總數。
208 SELECT classify_id,COUNT(1) FROM product GROUP BY classify_id
209 
210 需求:查詢每個商品分類編號和每個商品分類中零售價大於100的商品總數:
211 SELECT classify_id,COUNT(1) FROM product WHERE sale_price>100 GROUP BY classify_id
212 
213 需求:查詢零售價總和大於1500的商品分類編號以及總零售價和
214 
215 SELECT classify_id,SUM(sale_price) s FROM product GROUP BY classify_id HAVING s>1500
216 
217 6.綜合查詢
218 需求:查詢所有的貨品信息+對應的貨品分類信息
219 
220 SELECT * FROM product p LEFT  JOIN product_classify pc ON (p.classify_id=pc.id)
221 
222 需求:查詢所有商品的名稱和分類名稱
223 
224 SELECT p.product_name,pc.classify_name FROM product p LEFT  JOIN product_classify pc ON (p.classify_id=pc.id)
225 
226 
227 需求: 查詢貨品id,貨品名稱,貨品所屬分類名稱
228 SELECT p.id,p.product_name,pc.classify_name FROM product p LEFT  JOIN product_classify pc ON (p.classify_id=pc.id)
229 
230 
231 需求: 查詢零售價大於200的無線鼠標
232 SELECT p.id,p.product_name,pc.classify_name,p.sale_price 
233 FROM product p LEFT  JOIN product_classify pc ON (p.classify_id=pc.id) 
234 WHERE p.sale_price>200 AND pc.classify_name='無線鼠標'
235 
236 需求: 查詢零售價大於200的無線鼠標(使用表的別名)
237 SELECT p.id,p.product_name,pc.classify_name,p.sale_price 
238 FROM product p LEFT  JOIN product_classify pc ON (p.classify_id=pc.id) 
239 WHERE p.sale_price>200 AND pc.classify_name='無線鼠標'
240 
241 需求: 查詢每個貨品對應的分類以及對應的庫存
242 SELECT * 
243 FROM product p 
244 LEFT  JOIN product_classify pc ON (p.classify_id=pc.id)
245 LEFT JOIN product_stock ps ON (ps.product_id=p.id)
246 
247 需求: 如果庫存貨品都銷售完成,按照利潤從高到低查詢貨品名稱,零售價,貨品分類(三張表).
248 SELECT p.product_name,p.sale_price,pc.classify_name,(p.sale_price-p.cost_price)*ps.store_num c
249 FROM product p 
250 LEFT  JOIN product_classify pc ON (p.classify_id=pc.id)
251 LEFT JOIN product_stock ps ON (ps.product_id=p.id)
252 ORDER BY c DESC
253 
254 需求: 查詢每個商品分類的名稱和父分類名稱
255 
256 SELECT * 
257 FROM product_classify a
258 LEFT JOIN product_classify b ON (a.parent_id=b.id)
259 
260 
261 需求: 查詢零售價比聯想MX1100更高的所有商品信息。
262 
263 SELECT sale_price FROM product WHERE product_name='聯想MX1100'   #sale_price=119
264 
265 SELECT * FROM product WHERE sale_price>119
266 
267 使用的是子查詢
268 
269 SELECT * FROM product WHERE sale_price>(SELECT sale_price FROM product WHERE product_name='聯想MX1100' )
270 
271 
272 
273 需求: 查詢分類編號和折扣與聯想M100相同的所有商品信息。
274 
275 SELECT classify_id,cutoff FROM product WHERE product_name='聯想M100'
276 
277 SELECT * FROM product WHERE (classify_id,cutoff) = (3,0.9)
278 
279 #單行多列 子查詢  
280 
281 最后:
282 SELECT * FROM product WHERE (classify_id,cutoff) = (SELECT classify_id,cutoff FROM product WHERE product_name='聯想M100')
283 
284 
285 需求: 查詢各商品分類的分類編號,分類名稱,商品數量,平均零售價。
286 
287 SELECT p.classify_id,pc.classify_name,COUNT(1),AVG(p.sale_price)
288 FROM product p
289 LEFT JOIN product_classify  pc ON (p.classify_id=pc.id)
290 GROUP BY p.classify_id
View Code

 

到此數據庫第一階段課程類容就完了,每一位學習者必須認真的把博客上的需求寫完整,然后我們做一個習題講解!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM