日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

实战派mysql高阶应用指南_MySQL高阶SQL语句(学会这些,让你对于数据库游刃有余)_Gengchenchen的博客-CSDN博客...

發(fā)布時間:2025/4/17 数据库 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实战派mysql高阶应用指南_MySQL高阶SQL语句(学会这些,让你对于数据库游刃有余)_Gengchenchen的博客-CSDN博客... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

------GROUP BY------對GROUP BY后面的欄位的查詢結(jié)果進行匯總分組,通常是結(jié)合聚合函數(shù)一起使用的

GROUP BY 有一個原則,就是 SELECT 后面的所有列中,沒有使用聚合函數(shù)的列,必須出現(xiàn)在GROUPBY后面。

語法: SELECT "欄位1",SUM("欄位2") FROM "表名" GROUP BY "欄位1";

SELECT Store_Name,SUM(Sales) FROM Store_Info GROUP BY Store_Name ORDER BY sales desc;

------- HAVING ----用來過濾由 GROUP BY 語句返回的記錄集,通常與 GROUP BY 語句聯(lián)合使用

HAVING 語句的存在彌補了 WHERE 關(guān)鍵字不能與聚合函數(shù)聯(lián)合使用的不足。如果被 SELECT 的只有函數(shù)欄,那就不需要GROUP BY子句。

語法: SELECT "欄位1",SUM("欄位2") FROM "表名" GROUP BY "欄位1" HAVING (函數(shù)條件);

SELECT Store_Name,SUM(Sales) FROM Store_Info GROUP BY Store_Name HAVING SUM(Sales) > 1500;

---- ----別名---------欄位別名 表格別名

語法: SELECT "表格別名"."欄位1" [AS] "欄位別名" FROM "表格名" [AS] "表格別名";

SELECT A.Store_Name Store,SUM(A.Sales) "Total Sales" FROM Store_Info A GROUP BY A.Store_Name;

---------子查詢--------連接表格,在WHERE子句或HAVING 子句中插入另一個SQL語句

語法: SELECT "欄位1" FROM "表格1" WHERE "欄位2” [比較運算符] #外查詢

(SELECT "欄位1" FROM "表格2" WHERE "條件"); #內(nèi)查詢

#可以是符號的運算符,例如=、>、=、<= ;也可以是文字的運算符,例如 LIKE、IN、BETWEEN

SELECT SUM(Sales) FROM Store_Info WHERE Store_Name IN

(SELECT Store_Name FROM location WHERE Region = 'West');

SELECT SUM(A.Sales) FROM Store_Info A WHERE A.Store_Name IN

(SELECT Store_Name FROM location B WHERE B.Store_Name = A.Store_Name);

SELECT Store_Name,SUM(Sales),COUNT(Sales) FROM Store_Info GROUP BY Store_Name ORDER BY Sales;

+-------------+------------+--------------+

| Store_Name | SUM(Sales) | COUNT(Sales) |

+-------------+------------+--------------+

| Houston | 250 | 1 |

| Boston | 700 | 1 |

| Los Angeles | 1800 | 2 |

+-------------+------------+--------------+

3 rows in set (0.01 sec)

------- EXISTS ------用來測試內(nèi)查詢有沒有產(chǎn)生任何結(jié)果,類似布爾值是否為真

#如果有的話,系統(tǒng)就會執(zhí)行外查詢中的SQL語句。若是沒有的話,那整個SQL語句就不會產(chǎn)生任何結(jié)果。

語法: SELECT "欄位1" FROM "表格1" WHERE EXISTS (SELECT * FROM "表格2" WHERE "條件");

SELECT SUM(Sales) FROM Store_Info WHERE EXISTS (SELECT * FROM location WHERE Region = 'West');

SELECT SUM(Sales) FROM Store_Info WHERE Store_Name IN ('Los Angeles','Houston');

+------------+

| SUM(Sales) |

+------------+

| 2050 |

+------------+

1 row in set (0.00 sec)

--------------連接查詢----------------

location 表格如下:

+--------+-------------+

| Region | Store_Name |

+--------+-------------+

| East | Boston |

| East | New York |

| West | Los Angeles |

| West | Houston |

+--------+-------------+

4 rows in set (0.00 sec)

UPDATE Store_Info SET store_name='Washington' WHERE sales=300;

Store_Info 表格如下:

mysql> select * from Store_Info;

+-------------+-------+------------+

| Store_Name | Sales | Date |

+-------------+-------+------------+

| Los Angeles | 1500 | 2020-12-05 |

| Houston | 250 | 2020-12-07 |

| Washington | 300 | 2020-12-08 |

| Boston | 700 | 2020-12-08 |

+-------------+-------+------------+

4 rows in set (0.00 sec)

inner join(等值相連): 只返回兩個表中聯(lián)結(jié)字段相等的行

left join(左聯(lián)接): 返回包括左表中的所有記錄和右表中聯(lián)結(jié)字段相等的記錄

right join(右聯(lián)接): 返回包括右表中的所有記錄和左表中聯(lián)結(jié)字段相等的記錄

SELECT * FROM location A INNER JOIN Store_Info B on A.Store_Name = B.Store_Name;

SELECT * FROM location A RIGHT JOIN Store_Info B on A.Store_Name = B.Store_Name;

SELECT * FROM location A,Store_Info B WHERE A.Store_Name = B.Store_Name;

SELECT A.Region REGION,SUM(B.Sales) SALES FROM location A,Store_Info B WHERE A.Store_Name = B.Store_Name GROUP BY REGION;

-------------CREATE VIEW---------視圖,可以被當(dāng)作是虛擬表或存儲查詢

視圖跟表格的不同是,表格中有實際儲存資料,而視圖是建立在表格之上的一個架構(gòu),它本身并不實際儲存資料。

臨時表在用戶退出或同數(shù)據(jù)庫的連接斷開后就自動消失了,而視圖不會消失。

視圖不含有數(shù)據(jù),只存儲它的定義,它的用途一般可以簡化復(fù)雜的查詢。比如你要對幾個表進行連接查詢,而且還要進行統(tǒng)計排序等操作,寫的SQL語句會很麻煩的,用視圖將幾個表聯(lián)結(jié)起來,然后對這個視圖進行查詢操作,就和對一個表查詢一樣,很方便。

語法: CREATE VIEW "視圖表名" AS "SELECT 語句";

CREATE VIEW V_REGION_SALES AS SELECT A.Region REGION,SUM(B.Sales) SALES FROM location A INNER JOIN Store_Info B ON A.Store_Name = B.Store_Name GROUP BY REGION;

SELECT * FROM V_REGION_SALES;

DROP VIEW V_REGION_SALES; #刪除視圖

------------UNION-------聯(lián)集,將兩個SQL語句的結(jié)果合并起來,兩個SQL語句所產(chǎn)生的欄位需要是同樣的資料種類

UNION: 生成結(jié)果的資料值將沒有重復(fù),且按照字段的順序進行排序

語法: [SELECT 語句1] UNION [SELECT 語句2];

UNION ALL: 將生成結(jié)果的資料值都列出來,無論有無重復(fù)

語法: [SELECT 語句1] UNION ALL [SELECT 語句2];

SELECT Store_Name FROM location UNION SELECT Store_Name FROM Store_Info;

SELECT Store_Name FROM location UNION ALL SELECT Store_Name FROM Store_Info;

-------------交集值------- 取兩個SQL語句結(jié)果的交集

SELECT A.Store_Name FROM location A INNER JOIN Store_Info B ON A.Store_Name = B.Store_Name;

SELECT A.Store_Name FROM location A INNER JOIN Store_Info B USING(Store_Name);

SELECT A.Store_Name FROM

(SELECT Store_Name FROM location UNION ALL SELECT Store_Name FROM Store_Info) A

GROUP BY A.Store_Name HAVING COUNT(*) > 1;

#取兩個SQL語句結(jié)果的交集,且沒有重復(fù)

SELECT A.Store_Name FROM (SELECT A.Store_Name FROM location A INNER JOIN Store_Info B ON A.Store_Name = B.Store_Name) A

GROUP BY A.Store_Name HAVING COUNT(*) >= 1;

SELECT DISTINCT A.Store_Name FROM location A INNER JOIN Store_Info B USING(Store_Name); _Name);

--------------無交集值-------顯示第一個SQL語句的結(jié)果,且與第二個SQL語句沒有交集的結(jié)果,且沒有重復(fù)

SELECT DISTINCT Store_Name FROM location WHERE (Store_Name) NOT IN (SELECT Store_Name FROM Store_Info);

SELECT DISTINCT A.Store_Name FROM location A

LEFT JOIN Store_Info B USING(Store_Name) WHERE B.Store_Name IS NULL;

----------- CASE --------是SQL用來做為 IF-THEN-ELSE 之類邏輯的關(guān)鍵字

語法:

SELECT CASE ("欄位名")

WHEN "條件1" THEN "結(jié)果1"

WHEN "條件2" THEN "結(jié)果2"

......

[ELSE "結(jié)果N"]

END

FROM "表名";

#"條件"可以是一個數(shù)值或是公式。ELSE 子句則并不是必須的。

SELECT Store_Name,CASE Store_Name

WHEN 'Los Angeles' THEN Sales * 2

WHEN 'Boston' THEN Sales * 1.5

ELSE Sales

END

"New Sales", Date

FROM Store_Info;

#"New sales" 是用于 CASE 那個欄位的欄位名

#創(chuàng)建一個新表:

CREATE TABLE Total_Sales (Name char(10),Sales int(5));

INSERT INTO Total_Sales VALUES ('zhangsan',10);

INSERT INTO Total_Sales VALUES ('lisi',15);

INSERT INTO Total_Sales VALUES ('wangwu',20);

INSERT INTO Total_Sales VALUES ('zhaoliu',40);

INSERT INTO Total_Sales VALUES ('sunqi',50);

INSERT INTO Total_Sales VALUES ('zhouba',20);

INSERT INTO Total_Sales VALUES ('wujiu',30);

Total_Sales 表格如下:

mysql> select * from Total_Sales;

+----------+-------+

| Name | Sales |

+----------+-------+

| zhangsan | 10 |

| lisi | 15 |

| wangwu | 20 |

| zhaoliu | 40 |

| sunqi | 50 |

| zhouba | 20 |

| wujiu | 30 |

+----------+-------+

7 rows in set (0.00 sec)

-------算排名 ------表格自我連結(jié) (self Join),然后將結(jié)果依序列出,算出每一行之前(包含那一行本身)有多少行數(shù)

SELECT A1.Name,A1.Sales,COUNT(A2.Sales) Rank FROM Total_Sales A1,Total_Sales A2

WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales AND A1.Name = A2.Name)

GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC;

#統(tǒng)計sales欄位的值是比自已本身的值小的以及sales欄位和Name欄位都相同的數(shù)量,比如zhangsan為5+1=6

----------算中位數(shù) ------------

SELECT Sales Middle FROM (SELECT A1.Name,A1.Sales,COUNT(A2.Sales) Rank FROM Total_Sales A1,Total_Sales A2

WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales AND A1.Name <= A2.Name)

GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC) A3

WHERE A3.Rank = (SELECT (COUNT(*)+1) DIV 2 FROM Total_Sales);

#每個派生表必須有自己的別名,所以別名 A3 必須要有

#DIV 是在MySQL中算出商的方式

-------- 算累積總計-------表格自我連結(jié)(Self Join), 然后將結(jié)果依序列出,算出每一行之前(包含那一行本身)的總合

SELECT A1.Name,A1.Sales,SUM(A2.Sales) Sum_Total FROM Total_Sales A1,Total_Sales A2

WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales AND A1.Name = A2.Name)

GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC;

---------算總合百分比--------------

SELECT A1.Name,A1.Sales,A1.Sales/(SELECT SUM(Sales) FROM Total_Sales) Per_Total

FROM Total_Sales A1,Total_Sales A2

WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales AND A1.Name = A2.Name)

GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC;

#SELECT SUM(Sales) FROM Total_sales 這一段子查詢是用來算出總合

#總合算出后,我們就能夠?qū)⒚恳恍幸灰怀钥偤蟻砬蟪雒恳恍械目偤习俜直?/p>

--------算累積總合百分比--------------

SELECT A1.Name,A1.Sales,SUM(A2.Sales)/(SELECT SUM(Sales) FROM Total_Sales) Per_Total

FROM Total_Sales A1,Total_Sales A2

WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales and A1.Name = A2.Name)

GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC;

#用累積總計SUM(a2.sales) 除以總合來求出每一行的累積總合百分比.

SELECT A1.Name,A1.sales,TRUNCATE(ROUND(SUM(A2.Sales)/(SELECT SUM(Sales) FROM Total_Sales),4)*100,2) || '%' Per_Total

FROM Total_Sales A1,Total_Sales A2

WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales and A1.Name = A2.Name)

GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC;

總結(jié)

以上是生活随笔為你收集整理的实战派mysql高阶应用指南_MySQL高阶SQL语句(学会这些,让你对于数据库游刃有余)_Gengchenchen的博客-CSDN博客...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。