MySQL之高級查詢
一,concat 拼接欄位
-- 將姓名和成績之間使用'-'將多個欄位拼接在一起顯示 SELECT CONCAT(name,"-",python_score,"-",sql_score,"-",test_score) from score;
二,執行數學運算
-- 將兩個值進行相加運算 SELECT name, python_score,sql_score, python_score+sql_score as 總成績 FROM score
-- 總成績大於250 的前3名 SELECT name,python_score,sql_score,test_score, python_score+sql_score+test_score as 總成績 from score -- 總成績大於等於250 WHERE python_score+sql_score+test_score >= 250 -- 進行排序 ORDER BY 總成績 DESC -- 取前3個值 LIMIT 3
三,聚合函數
-- python成績最高是多少 SELECT max(python_score) FROM score;
SELECT sum(python_score) as Python總成績, MAX(python_score) as Python最高得分, MIN(python_score) as Python最低得分, AVG(python_score) as Python平均分, COUNT(python_score) as 參加Python考試的總人數 FROM score;
四,數據分組
-- python成績及格或者sql成績及格的學員總數 SELECT COUNT(name) FROM score WHERE python_score >= 60 OR sql_score >= 60
五,聚合函數靈活應用
我們著重練習一個第三個問題,第二高的成績,三種方法
SELECT max(product_price) from orders WHERE product_price < ( -- 先計算最大值 SELECT max(product_price) from orders )
SELECT DISTINCT product_price FROM orders ORDER BY product_price DESC LIMIT 1,1
SELECT DISTINCT product_price FROM orders ORDER BY product_price DESC LIMIT 1 OFFSET 1
六,分組,group by
-- 查詢2020-11-05 的訂單 SELECT * from orders WHERE order_time LIKE "2020-11-05%"
我們從結果中可以看到,出來的結果中有不同的品牌,假設我要統計莫個品牌的資訊
-- 查詢2020-11-05 的 xiaomi 相關訂單 SELECT * from orders WHERE order_time LIKE "2020-11-05%" AND product_name = "xiaomi"
統計小米當天的訂單總數
-- 查詢2020-11-05 xaimi 品牌的訂單總數 SELECT count(*) from orders WHERE order_time LIKE "2020-11-05%" AND product_name = "xiaomi"
每天都有大量的訂單,如果我要統計每天的數據呢?
-- 查看品牌以及品牌對應記錄條數,以及銷售出去的每個品牌的總個數 SELECT product_name, COUNT(product_name) ,sum(product_order_num) FROM orders GROUP BY product_name
-- 查看2020-11-05 這一天每個品牌以及這個品牌對應記錄條數,和銷售出去的每個品牌的總個數 SELECT product_name, COUNT(product_name) ,sum(product_order_num) FROM orders WHERE order_time like "2020-11-05%" GROUP BY product_name;
-- 查看2020-11-05 這一天每個品牌以及這個品牌對應記錄條數,和銷售出去的每個品牌的總個數 -- 顯示 出貨量大於80 SELECT product_name as 品牌, COUNT(product_name) as 訂單記錄 ,sum(product_order_num) as 出貨量 FROM orders -- 限定日期 WHERE order_time like "2020-11-05%" -- 根據名稱分組 GROUP BY product_name -- GROUP BY 的條件從句 主要可以使用聚集函數 HAVING sum(product_order_num) > 80
having 使用方法
SELECT product_name as 品牌, COUNT(product_name) as 訂單記錄 ,sum(product_order_num) as 出貨量 FROM orders -- 限定日期 WHERE order_time like "2020-11-05%" -- 根據名稱分組 GROUP BY product_name -- GROUP BY 的條件從句 主要可以使用聚集函數 HAVING sum(product_order_num) > 80 And COUNT(product_name) BETWEEN 18 and 20
也可以和order by limint一起使用
SELECT product_name as 品牌, SUM(product_order_num*product_price) as 銷售總額 FROM orders WHERE order_time LIKE "2020-11-05%" GROUP BY product_name ORDER BY SUM(product_order_num*product_price) DESC LIMIT 1
七,子查詢
(一個查詢結果作為另外一個查詢語句中的條件存在)
-- 查詢單價最高的商品的銷量數據 -- 顯示出 此商品品牌的總營業額 -- 1. 先找到最大價格 SELECT max(product_price) from orders; -- 2. 根據最大價格找到商品品牌 SELECT product_name FROM orders WHERE product_price = ( -- 子查詢,執行的時候先運行子查詢中的語句,結果作為 外層sql的查詢條件。 SELECT max(product_price) from orders ); -- 3.根據商品品牌找到對應此品牌中的總銷售額 SELECT sum(product_price*product_order_num) from orders -- 商品品牌可能有多個 WHERE product_name in ( -- 子查詢 查詢出品牌名稱 SELECT product_name FROM orders WHERE product_price = ( -- 子查詢,執行的時候先運行子查詢中的語句,結果作為 外層sql的查詢條件。 SELECT max(product_price) from orders ) );
-- 查詢非單價最高的商品的銷量數據(除了商品單價最高的哪個品牌) -- 顯示出 此商品品牌的總營業額 SELECT product_name as 品牌, sum(product_price*product_order_num) as 總營銷額 from orders -- 商品品牌可能有多個 WHERE not product_name in ( -- 子查詢 查詢出品牌名稱 SELECT product_name FROM orders WHERE product_price = ( -- 子查詢,執行的時候先運行子查詢中的語句,結果作為 外層sql的查詢條件。 SELECT max(product_price) from orders ) ) group by product_name ORDER BY 總營銷額
-- 查詢非單價最高的商品的銷量數據(除了商品單價最高的哪個品牌) -- 顯示出 此商品品牌的總營業額 SELECT product_name as 品牌, sum(product_price*product_order_num) as 總營銷額 from orders -- 商品品牌可能有多個 WHERE not product_name in ( -- 子查詢 查詢出品牌名稱 SELECT product_name FROM orders WHERE product_price = ( -- 子查詢,執行的時候先運行子查詢中的語句,結果作為 外層sql的查詢條件。 SELECT max(product_price) from orders ) ) group by product_name ORDER BY 總營銷額