1. 使用表別名
在賽罕等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營銷型網(wǎng)站,成都外貿(mào)網(wǎng)站制作,賽罕網(wǎng)站建設(shè)費用合理。
別名除了用于列名和計算字段外, SQL還允許給表名起別名。這樣做有兩個主要理由:
縮短SQL語句;
允許在單條SELECT語句中多次使用相同的表。
MySQL> SELECT cust_name, cust_contact FROM customers AS c, orders AS o, orderitems AS oi WHERE c.cust_id=o.cust_id AND oi.order_num=o.order_num AND prod_id='TNT2'; +----------------+--------------+ | cust_name | cust_contact | +----------------+--------------+ | Coyote Inc. | Y Lee | | Yosemite Place | Y Sam | +----------------+--------------+
分析:可以看到, FROM
子句中3個表全都具有別名。 customers AS c
建立c作為customers
的別名,等等。這使得能使用省寫的c
而不是全名customers
。在此例子中,表別名只用于WHERE子句。但是,表別名不僅能用于WHERE
子句,它還可以用于SELECT
的列表、 ORDER BY
子句以及語句的其他部分。
2. 使用不同類型的聯(lián)結(jié)
2.1 自聯(lián)結(jié)
mysql> SELECT p1.prod_id, p1.prod_name FROM products AS p1, products AS p2 WHERE p1.vend_id=p2.vend_id AND p2.prod_id='DTNTR' -> ; +---------+----------------+ | prod_id | prod_name | +---------+----------------+ | DTNTR | Detonator | | FB | Bird seed | | FC | Carrots | | SAFE | Safe | | SLING | Sling | | TNT1 | TNT (1 stick) | | TNT2 | TNT (5 sticks) | +---------+----------------+
分析:此查詢中需要的兩個表實際上是相同的表,因此products
表在FROM
子句中出現(xiàn)了兩次。雖然這是完全合法的,但對products
的引用具有二義性,因為MySQL
不知道你引用的是products
表中的哪個實例。
用自聯(lián)結(jié)而不用子查詢:自聯(lián)結(jié)通常作為外部語句用來替代從相同表中檢索數(shù)據(jù)時使用的子查詢語句。雖然最終的結(jié)果是相同的,但有時候處理聯(lián)結(jié)遠比處理子查詢快得多
2.2 自然聯(lián)結(jié)
自然聯(lián)結(jié)排除多次出現(xiàn),使每個列只返回一次。
mysql> SELECT c.*, o.order_num, o.order_date, oi.prod_id, oi.quantity, oi.item_price FROM customers AS c, orders AS o,orderitems AS oi WHERE c.cust_id = o.cust_id AND oi.order_num = o.order_num AND prod_id = 'FB'; +---------+-------------+----------------+-----------+------------+----------+--------------+--------------+-----------------+-----------+---------------------+---------+----------+------------+ | cust_id | cust_name | cust_address | cust_city | cust_state | cust_zip | cust_country | cust_contact | cust_email | order_num | order_date | prod_id | quantity | item_price | +---------+-------------+----------------+-----------+------------+----------+--------------+--------------+-----------------+-----------+---------------------+---------+----------+------------+ | 10001 | Coyote Inc. | 200 Maple Lane | Detroit | MI | 44444 | USA | Y Lee | ylee@coyote.com | 20005 | 2005-09-01 00:00:00 | FB | 1 | 10.00 | | 10001 | Coyote Inc. | 200 Maple Lane | Detroit | MI | 44444 | USA | Y Lee | ylee@coyote.com | 20009 | 2005-10-08 00:00:00 | FB | 1 | 10.00 | +---------+-------------+----------------+-----------+------------+----------+--------------+--------------+-----------------+-----------+---------------------+---------+----------+------------
+
分析:在這個例子中,通配符只對第一個表使用。所有其他列明確列出,所以沒有重復(fù)的列被檢索出來。
2.3 外部聯(lián)結(jié)
許多聯(lián)結(jié)將一個表中的行與另一個表中的行相關(guān)聯(lián)。但有時候會需要包含沒有關(guān)聯(lián)行的那些行。
為了檢索所有客戶,包括那些沒有訂單的客戶,可如下進行:
mysql> SELECT customers.cust_id, orders.order_num FROM customers LEFT OUTER JOIN orders ON omers.cust_id = orders.cust_id; +---------+-----------+ | cust_id | order_num | +---------+-----------+ | 10001 | 20005 | | 10001 | 20009 | | 10002 | NULL | | 10003 | 20006 | | 10004 | 20007 | | 10005 | 20008 | +---------+-----------+
分析:類似于上一章中所看到的內(nèi)部聯(lián)結(jié),這條SELECT語句使用了關(guān)鍵字OUTER JOIN來指定聯(lián)結(jié)的類型(而不是在WHERE子句中指定)。但是,與內(nèi)部聯(lián)結(jié)關(guān)聯(lián)兩個表中的行不同的是,外部聯(lián)結(jié)還包括沒有關(guān)聯(lián)行的行。在使用OUTER JOIN語法時,必須使用RIGHT或LEFT關(guān)鍵字指定包括其所有行的表( RIGHT指出的是OUTER JOIN右邊的表,而LEFT指出的是OUTER JOIN左邊的表)。 上面的例子使用LEFT OUTER JOIN從FROM子句的左邊表(customers表)中選擇所有行。
3 使用帶聚集函數(shù)的聯(lián)結(jié)
如果要檢索所有客戶及每個客戶所下的訂單數(shù),下面使用了COUNT()函數(shù)的代碼可完成此工作:
mysql> SELECT customers.cust_name, customers.cust_id, COUNT(orders.order_num) AS num_ord FROM customers INNER JOIN orders ON customers.cust_id = orders.cust_id GROUP BY customers.cust_id; +----------------+---------+---------+ | cust_name | cust_id | num_ord | +----------------+---------+---------+ | Coyote Inc. | 10001 | 2 | | Wascals | 10003 | 1 | | Yosemite Place | 10004 | 1 | | E Fudd | 10005 | 1 | +----------------+---------+---------+
分析:此SELECT語句使用INNER JOIN將customers和orders表互相關(guān)聯(lián)。GROUP BY 子 句 按 客 戶 分 組 數(shù) 據(jù) , 因 此 , 函 數(shù) 調(diào) 用COUNT(orders.order_num)對每個客戶的訂單計數(shù),將它作為num_ord返回。
mysql> SELECT customers.cust_name, customers.cust_id, COUNT(orders.order_num) AS num_ord FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id GROUP BY customers.cust_id; +----------------+---------+---------+ | cust_name | cust_id | num_ord | +----------------+---------+---------+ | Coyote Inc. | 10001 | 2 | | Mouse House | 10002 | 0 | | Wascals | 10003 | 1 | | Yosemite Place | 10004 | 1 | | E Fudd | 10005 | 1 | +----------------+---------+---------+
分析:這個例子使用左外部聯(lián)結(jié)來包含所有客戶,甚至包含那些沒有任何下訂單的客戶。結(jié)果顯示也包含了客戶Mouse House,它有0個訂單。
以上就是MySQL必知必會:創(chuàng)建高級聯(lián)結(jié)的詳細內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!
本文標題:MySQL創(chuàng)建高級聯(lián)結(jié)的方法
URL地址:http://m.rwnh.cn/article48/jcggep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、定制網(wǎng)站、云服務(wù)器、軟件開發(fā)、App設(shè)計、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)