這篇文章將為大家詳細(xì)講解有關(guān)如何在MySQL中使用派生表,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、海港網(wǎng)站維護(hù)、網(wǎng)站推廣。
派生表是從select語句返回的虛擬表。派生表類似于臨時(shí)表,但是在SELECT語句中使用派生表比臨時(shí)表簡單得多,因?yàn)樗恍枰獎(jiǎng)?chuàng)建臨時(shí)表的步驟。所以當(dāng)SELECT語句的FROM子句中使用獨(dú)立子查詢時(shí),我們將其稱為派生表。廢話不多說,我們來具體的解釋:
SELECT column_list FROM * (SELECT * column_list * FROM * table_1) derived_table_name; WHERE derived_table_name.column > 1...
其中標(biāo)記星號的地方就使用了派生表。為了詳細(xì)點(diǎn),咱們來看個(gè)具體的例子。咱們接下來要從數(shù)據(jù)庫中的orders表和orderdetails表中獲得2018年銷售收入最高的前5名產(chǎn)品。先來看下表的字段:
咱們先來看下面這條sql:
SELECT productCode, ROUND(SUM(quantityOrdered * priceEach)) sales FROM orderdetails INNER JOIN orders USING (orderNumber) WHERE YEAR(shippedDate) = 2018 GROUP BY productCode ORDER BY sales DESC LIMIT 5;
這條sql是以兩張表中共有的orderNumber字段為聯(lián)合查詢的節(jié)點(diǎn),完事之后,以時(shí)間為條件,再以那個(gè)什么productCode字段為分組依據(jù),完事獲取分組字段和計(jì)算之后的別稱字段,再以sales字段為排序依據(jù),最后提取前五條結(jié)果。大概就是這么回事,完事結(jié)果集我們可以看做是一張臨時(shí)表或者別的什么。大家來看個(gè)結(jié)果集:
+-------------+--------+ | productCode | sales | +-------------+--------+ | S18_3232 | 103480 | | S10_1949 | 67985 | | S12_1108 | 59852 | | S12_3891 | 57403 | | S12_1099 | 56462 | +-------------+--------+ 5 rows in set
完事呢,既然是學(xué)習(xí)派生表,我們當(dāng)然可以使用此查詢的結(jié)果作為派生表,并將其與products表相關(guān)聯(lián)。其中,products表的結(jié)構(gòu)如下所示:
mysql> desc products; +--------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------------+---------------+------+-----+---------+-------+ | productCode | varchar(15) | NO | PRI | | | | productName | varchar(70) | NO | | NULL | | | productLine | varchar(50) | NO | MUL | NULL | | | productScale | varchar(10) | NO | | NULL | | | productVendor | varchar(50) | NO | | NULL | | | productDescription | text | NO | | NULL | | | quantityInStock | smallint(6) | NO | | NULL | | | buyPrice | decimal(10,2) | NO | | NULL | | | MSRP | decimal(10,2) | NO | | NULL | | +--------------------+---------------+------+-----+---------+-------+ 20 rows in set
表結(jié)構(gòu)既然了解完事了,我們就來看下面的sql:
SELECT productName, sales FROM # (SELECT # productCode, # ROUND(SUM(quantityOrdered * priceEach)) sales # FROM # orderdetails # INNER JOIN orders USING (orderNumber) # WHERE # YEAR(shippedDate) = 2018 # GROUP BY productCode # ORDER BY sales DESC # LIMIT 5) top5_products_2018 INNER JOIN products USING (productCode);
上面#號部分是咱們之前的那條sql,方便大家理解,我使用#標(biāo)記了出來,大家寫的時(shí)候可不能用啊。完事我們來看下這條sql是神馬意思呢?它是把我們用#標(biāo)記的部分當(dāng)做一個(gè)表,來做一個(gè)簡單的聯(lián)合查詢而已。然而這個(gè)表,我們就叫它派生表,它會(huì)在使用過后即時(shí)清除的,所以我們在簡化復(fù)雜查詢的時(shí)候可以考慮使用。廢話不多說,我們來看下結(jié)果集:
+-----------------------------+--------+ | productName | sales | +-----------------------------+--------+ | 1992 Ferrari 360 Spider red | 103480 | | 1952 Alpine Renault 1300 | 67985 | | 2001 Ferrari Enzo | 59852 | | 1969 Ford Falcon | 57403 | | 1968 Ford Mustang | 56462 | +-----------------------------+--------+ 5 rows in set
然后呢,咱們再來簡單總結(jié)下:
首先,執(zhí)行子查詢來創(chuàng)建一個(gè)結(jié)果集或派生表。
然后,在productCode列上使用products表連接top5_products_2018派生表的外部查詢。
完事呢,簡單的派生表的理解和使用就到這里了。咱們再來一個(gè)稍稍復(fù)雜的來嘗嘗味道哈,首先假設(shè)必須將2018年的客戶分為3組:鉑金,白金和白銀。 此外,需要了解每個(gè)組中的客戶數(shù)量,具體情況如下:
訂單總額大于100000的為鉑金客戶;
訂單總額為10000至100000的為黃金客戶
訂單總額為小于10000的為銀牌客戶
要構(gòu)建此查詢,首先,我們需要使用case表達(dá)式和group by子句將每個(gè)客戶放入相應(yīng)的分組中,如下所示:
SELECT customerNumber, ROUND(SUM(quantityOrdered * priceEach)) sales, (CASE WHEN SUM(quantityOrdered * priceEach) < 10000 THEN 'Silver' WHEN SUM(quantityOrdered * priceEach) BETWEEN 10000 AND 100000 THEN 'Gold' WHEN SUM(quantityOrdered * priceEach) > 100000 THEN 'Platinum' END) customerGroup FROM orderdetails INNER JOIN orders USING (orderNumber) WHERE YEAR(shippedDate) = 2018 GROUP BY customerNumber ORDER BY sales DESC;
咱們來看下結(jié)果集的實(shí)例:
+----------------+--------+---------------+ | customerNumber | sales | customerGroup | +----------------+--------+---------------+ | 141 | 189840 | Platinum | | 124 | 167783 | Platinum | | 148 | 150123 | Platinum | | 151 | 117635 | Platinum | | 320 | 93565 | Gold | | 278 | 89876 | Gold | | 161 | 89419 | Gold | | ************此處省略了many數(shù)據(jù) *********| | 219 | 4466 | Silver | | 323 | 2880 | Silver | | 381 | 2756 | Silver | +----------------+--------+---------------+
完事嘞,咱們就可以使用上面的查詢所得的表作為派生表來進(jìn)行關(guān)聯(lián)查詢并且進(jìn)行分組,獲取想要的數(shù)據(jù)了,咱們來看下面的sql感受一下:
SELECT customerGroup, COUNT(cg.customerGroup) AS groupCount FROM (SELECT customerNumber, ROUND(SUM(quantityOrdered * priceEach)) sales, (CASE WHEN SUM(quantityOrdered * priceEach) < 10000 THEN 'Silver' WHEN SUM(quantityOrdered * priceEach) BETWEEN 10000 AND 100000 THEN 'Gold' WHEN SUM(quantityOrdered * priceEach) > 100000 THEN 'Platinum' END) customerGroup FROM orderdetails INNER JOIN orders USING (orderNumber) WHERE YEAR(shippedDate) = 2018 GROUP BY customerNumber) cg GROUP BY cg.customerGroup;
具體是啥意思,相信聰明如大家肯定比我有更好的理解了,咱就不贅述了。完事來看下結(jié)果集:
+---------------+------------+ | customerGroup | groupCount | +---------------+------------+ | Gold | 61 | | Platinum | 4 | | Silver | 8 | +---------------+------------+ 3 rows in set
關(guān)于如何在mysql中使用派生表就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
當(dāng)前文章:如何在mysql中使用派生表
網(wǎng)頁網(wǎng)址:http://muchs.cn/article36/pgdcpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、云服務(wù)器、網(wǎng)站導(dǎo)航、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)