1. 計算字段
計算字段並不實際存在於數據庫表中。計算字段是運行時在SELECT語句內創建的。
字段(eld)基本上與列(column)的意思相同,經常互換使用,不過數據庫列一般稱爲列,而術語字段通常用在計算字段的連接上。
重要的是要注意到,只有數據庫知道SELECT語句中哪些列是實際的表列,哪些列是計算字段。從客戶機(如應用程序)的角度來看,計算字段的數據是以與其他列的數據相同的方式返回的。
客戶機與服務器的格式 可在SQL語句內完成的許多轉換和格式化工作都可以直接在客戶機應用程序內完成。但一般來說,在數據庫服務器上完成這些操作比在客戶機中完成要快得多,因爲DBMS是設計來快速有效地完成這種處理的。
1.1 拼接字段(concat() )
1.2 使用別名
1.3 執行算術計算
//拼接字段 concat()函數來拼接兩個列
mysql> select concat(vend_name,'(',vend_country,')') from vendors order by vend_name;
+----------------------------------------+
| concat(vend_name,'(',vend_country,')') |
+----------------------------------------+
| ACME(USA) |
| Anvils R Us(USA) |
| Furball Inc.(USA) |
| Jet Set(England) |
| Jouets Et Ours(France) |
| LT Supplies(USA) |
+----------------------------------------+
6 rows in set (0.00 sec)
//rtrim()函數刪除數據右側多餘的空格
mysql> select concat(vend_name,'(',rtrim(vend_country),')') from vendors order by vend_name;
+-----------------------------------------------+
| concat(vend_name,'(',rtrim(vend_country),')') |
+-----------------------------------------------+
| ACME(USA) |
| Anvils R Us(USA) |
| Furball Inc.(USA) |
| Jet Set(England) |
| Jouets Et Ours(France) |
| LT Supplies(USA) |
+-----------------------------------------------+
6 rows in set (0.00 sec)
//使用別名
mysql> select concat(vend_name,'(',RTrim(vend_country),')') as vend_title from vendors order by vend_name;
+------------------------+
| vend_title |
+------------------------+
| ACME(USA) |
| Anvils R Us(USA) |
| Furball Inc.(USA) |
| Jet Set(England) |
| Jouets Et Ours(France) |
| LT Supplies(USA) |
+------------------------+
6 rows in set (0.00 sec)
mysql> select * from orderitems;
+-----------+------------+---------+----------+------------+
| order_num | order_item | prod_id | quantity | item_price |
+-----------+------------+---------+----------+------------+
| 20005 | 1 | ANV01 | 10 | 5.99 |
| 20005 | 2 | ANV02 | 3 | 9.99 |
| 20005 | 3 | TNT2 | 5 | 10.00 |
| 20005 | 4 | FB | 1 | 10.00 |
| 20006 | 1 | JP2000 | 1 | 55.00 |
| 20007 | 1 | TNT2 | 100 | 10.00 |
| 20008 | 1 | FC | 50 | 2.50 |
| 20009 | 1 | FB | 1 | 10.00 |
| 20009 | 2 | OL1 | 1 | 8.99 |
| 20009 | 3 | SLING | 1 | 4.49 |
| 20009 | 4 | ANV03 | 1 | 14.99 |
+-----------+------------+---------+----------+------------+
11 rows in set (0.01 sec)
mysql> select prod_id,quantity,item_price from orderitems where order_num=20005;
+---------+----------+------------+
| prod_id | quantity | item_price |
+---------+----------+------------+
| ANV01 | 10 | 5.99 |
| ANV02 | 3 | 9.99 |
| TNT2 | 5 | 10.00 |
| FB | 1 | 10.00 |
+---------+----------+------------+
4 rows in set (0.00 sec)
//執行算術計算
mysql> select prod_id,quantity,item_price,quantity*item_price as expanded_price from orderitems where order_num=20005;
+---------+----------+------------+----------------+
| prod_id | quantity | item_price | expanded_price |
+---------+----------+------------+----------------+
| ANV01 | 10 | 5.99 | 59.90 |
| ANV02 | 3 | 9.99 | 29.97 |
| TNT2 | 5 | 10.00 | 50.00 |
| FB | 1 | 10.00 | 10.00 |
+---------+----------+------------+----------------+
4 rows in set (0.01 sec)
2. 使用數據處理函數
2.1 函數
函數沒有SQL的可移植性強
能運行在多個系統上的代碼稱爲可移植的(portable)。相對來說,多數SQL語句是可移植的,在SQL實現之間有差異時,這些差異通常不那麼難處理。而函數的可移植性卻不強。幾乎每種主要的DBMS的實現都支持其他實現不支持的函數,而且有時差異還很大。
爲了代碼的可移植,許多SQL程序員不贊成使用特殊實現的功能。雖然這樣做很有好處,但不總是利於應用程序的性能。如果不使用這些函數,編寫某些應用程序代碼會很艱難。必須利用其他方法來實現DBMS非常有效地完成的工作,如果你決定使用函數,應該保證做好代碼註釋,以便以後你(或其他人)能確切地知道所編寫SQL代碼的含義。
2.2 使用函數
大多數SQL實現支持以下類型的函數。
- 用於處理文本串(如刪除或填充值,轉換值爲大寫或小寫)的文本函數。
- 用於在數值數據上進行算術操作(如返回絕對值,進行代數運算)的數值函數。
- 用於處理日期和時間值並從這些值中提取特定成分(例如,返回兩個日期之差,檢查日期有效性等)的日期和時間函數。
- 返回DBMS正使用的特殊信息(如返回用戶登錄信息,檢查版本細節)的系統函數。
2.3 文本處理函數
常用的文本處理函數:
- Left() 返回串左邊的字符
- Length() 返回串的長度
- Locate() 找出串的一個子串
- Lower() 將串轉換爲小寫
- LTrim() 去掉串左邊的空格
- Right() 返回串右邊的字符
- RTrim() 去掉串右邊的空格
- Soundex() 返回串的SOUNDEX值
- SubString() 返回子串的字符
- Upper() 將串轉換爲大寫
2.4 日期和時間處理函數
- Date() 返回日期時間的日期部分
- Day() 返回一個日期的天數部分
- Month() 返回一個日期的月份部分
- Now() 返回當前日期和時間
- Year() 返回一個日期的年份部分
-
//文本處理函數 mysql> select vend_name,upper(vend_name) as vend_name_upcase from vendors order by vend_name; +----------------+------------------+ | vend_name | vend_name_upcase | +----------------+------------------+ | ACME | ACME | | Anvils R Us | ANVILS R US | | Furball Inc. | FURBALL INC. | | Jet Set | JET SET | | Jouets Et Ours | JOUETS ET OURS | | LT Supplies | LT SUPPLIES | +----------------+------------------+ 6 rows in set (0.00 sec) mysql> select * from orders; +-----------+---------------------+---------+ | order_num | order_date | cust_id | +-----------+---------------------+---------+ | 20005 | 2005-09-01 00:00:00 | 10001 | | 20006 | 2005-09-12 00:00:00 | 10003 | | 20007 | 2005-09-30 00:00:00 | 10004 | | 20008 | 2005-10-03 00:00:00 | 10005 | | 20009 | 2005-10-08 00:00:00 | 10001 | +-----------+---------------------+---------+ 5 rows in set (0.01 sec) //時間日期處理函數 mysql> select cust_id,order_num from orders where order_date='2005-09-01'; +---------+-----------+ | cust_id | order_num | +---------+-----------+ | 10001 | 20005 | +---------+-----------+ 1 row in set (0.00 sec) mysql> select cust_id,order_num from orders where date(order_date)='2005-09-01'; +---------+-----------+ | cust_id | order_num | +---------+-----------+ | 10001 | 20005 | +---------+-----------+ 1 row in set (0.01 sec) mysql> select cust_id,order_num from orders where date(order_date) between '2005-09-01' and '2005-09-30'; +---------+-----------+ | cust_id | order_num | +---------+-----------+ | 10001 | 20005 | | 10003 | 20006 | | 10004 | 20007 | +---------+-----------+ 3 rows in set (0.01 sec) mysql> select cust_id,order_num from orders where year(order_date)=2005 and month(order_date)=9; +---------+-----------+ | cust_id | order_num | +---------+-----------+ | 10001 | 20005 | | 10003 | 20006 | | 10004 | 20007 | +---------+-----------+ 3 rows in set (0.00 sec)
2.5 數值處理函數
常用數值處理函數
- Abs() 返回一個數的絕對值
- Cos() 返回一個角度的餘弦
- Exp() 返回一個數的指數值
- Mod() 返回除操作的餘數
- Pi() 返回圓周率
- Rand() 返回一個隨機數
- Sin() 返回一個角度的正弦
- Sqrt() 返回一個數的平方根
- Tan() 返回一個角度的正切
3. 彙總數據
3.1 聚集函數
聚集函數 運行在行組上,計算和返回單個值的函數
sql 聚集函數
- AVG()返回某列的平均值
- COUNT()返回某列的行數
- MAX()返回某列的最大值
- MIN()返回某列的最小值
- SUM()返回某列值之和
COUNT()函數有兩種使用方式。
- 使用COUNT(*)對錶中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值。
- 使用COUNT(column)對特定列中具有值的行進行計數,忽略NULL值。
對非數值數據使用MAX()
雖然MAX()一般用來找出最大的數值或日期值,但MySQL允許將它用來返回任意列中的最大值,包括返回文本列中的最大值。在用於文本數據時,如果數據按相應的列排序,則MAX()返回最後一行。
對非數值數據使用MIN()
MIN()函數與MAX()函數類似,MySQL允許將它用來返回任意列中的最小值,包括返回文本列中的最小值。在用於文本數據時,如果數據按相應的列排序,則MIN()返回最前面的行。
NULL值 MAX(),MIN()函數忽略列值爲NULL的行。
//avg() 函數
mysql> select avg(prod_price) from products;
+-----------------+
| avg(prod_price) |
+-----------------+
| 16.133571 |
+-----------------+
1 row in set (0.01 sec)
mysql> select avg(prod_price) from products where vend_id=1003;
+-----------------+
| avg(prod_price) |
+-----------------+
| 13.212857 |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from customers;
+---------+----------------+---------------------+-----------+------------+----------+--------------+--------------+---------------------+
| cust_id | cust_name | cust_address | cust_city | cust_state | cust_zip | cust_country | cust_contact | cust_email |
+---------+----------------+---------------------+-----------+------------+----------+--------------+--------------+---------------------+
| 10001 | Coyote Inc. | 200 Maple Lane | Detroit | MI | 44444 | USA | Y Lee | [email protected] |
| 10002 | Mouse House | 333 Fromage Lane | Columbus | OH | 43333 | USA | Jerry Mouse | NULL |
| 10003 | Wascals | 1 Sunny Place | Muncie | IN | 42222 | USA | Jim Jones | [email protected] |
| 10004 | Yosemite Place | 829 Riverside Drive | Phoenix | AZ | 88888 | USA | Y Sam | [email protected] |
| 10005 | E Fudd | 4545 53rd Street | Chicago | IL | 54545 | USA | E Fudd | NULL |
+---------+----------------+---------------------+-----------+------------+----------+--------------+--------------+---------------------+
5 rows in set (0.01 sec)
//使用COUNT(*)對錶中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值。
mysql> select count(*) as num_cust from customers;
+----------+
| num_cust |
+----------+
| 5 |
+----------+
1 row in set (0.00 sec)
//使用COUNT(column)對特定列中具有值的行進行計數,忽略NULL值。
mysql> select count(cust_email) as num_cust from customers;
+----------+
| num_cust |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
mysql> select max(prod_price) as max_price from products;
+-----------+
| max_price |
+-----------+
| 55.00 |
+-----------+
1 row in set (0.00 sec)
mysql> select max(cust_city) as max from customers;
+---------+
| max |
+---------+
| Phoenix |
+---------+
1 row in set (0.00 sec)
mysql> select sum(quantity) from orderitems where order_num=20005;
+---------------+
| sum(quantity) |
+---------------+
| 19 |
+---------------+
1 row in set (0.00 sec)
mysql> select sum(quantity*item_price) as total_price from orderitems where order_num=20005;
+-------------+
| total_price |
+-------------+
| 149.87 |
+-------------+
1 row in set (0.00 sec)
//聚集不同值 distinct
mysql> select avg(distinct prod_price) as avg_price from products where vend_id=1003;
+-----------+
| avg_price |
+-----------+
| 15.998000 |
+-----------+
1 row in set (0.01 sec)
mysql> select avg(prod_price) as avg_price from products where vend_id=1003;
+-----------+
| avg_price |
+-----------+
| 13.212857 |
+-----------+
1 row in set (0.00 sec)
//組合聚集函數
mysql> select count(*) as num_items,min(prod_price) as min_price,max(prod_price) as max_price,avg(prod_price) as avg_price from products;
+-----------+-----------+-----------+-----------+
| num_items | min_price | max_price | avg_price |
+-----------+-----------+-----------+-----------+
| 14 | 2.50 | 55.00 | 16.133571 |
+-----------+-----------+-----------+-----------+
1 row in set (0.00 sec)
4. 分組數據
4.1 數據分組
SQL聚集函數可用來彙總數據。這使我們能夠對行進行計數,計算和與平均數,獲得最大和最小值而不用檢索所有數據。
分組允許把數據分爲多個邏輯組,以便能對每個組進行聚集計算。
4.2 創建分組(group by)
在具體使用GROUPBY子句前,需要知道一些重要的規定。
- GROUP BY子句可以包含任意數目的列。這使得能對分組進行嵌套,爲數據分組提供更細緻的控制。
- 如果在GROUPBY子句中嵌套了分組,數據將在最後規定的分組上進行彙總。換句話說,在建立分組時,指定的所有列都一起計算(所以不能從個別的列取回數據)。
- GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數)。如果在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用別名。
- 除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
- 如果分組列中具有NULL值,則NULL將作爲一個分組返回。如果列中有多行NULL值,它們將分爲一組。
- GROUP BY子句必須田現在WHERE子句之後,ORDER BY子句之前。
使用ROLLUP 使用WITH ROLLUP關鍵字,可以得到每個分組以及每個分組彙總級別(針對每個分組)的值。
//group by 指示MySQL按vend_id排序並分組數據,然後對每個組進行聚集
mysql> select vend_id,count(*) as num_prods from products group by vend_id;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1001 | 3 |
| 1002 | 2 |
| 1003 | 7 |
| 1005 | 2 |
+---------+-----------+
4 rows in set (0.00 sec)
mysql> select vend_id,count(*) as num_prods from products group by vend_id with rollup;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1001 | 3 |
| 1002 | 2 |
| 1003 | 7 |
| 1005 | 2 |
| NULL | 14 |
+---------+-----------+
5 rows in set (0.00 sec)
4.3 過濾分組(having)
HAVING和WHERE的差別 WHERE在數據分組前進行過濾,HAVING在數據分組後進行過濾。這是一個重要的區別,WHERE排除的行不包括在分組中。這可能會改變計算值,從而影響HAVING子句中基於這些值過濾掉的分組。
//過濾基於分組聚集值而不是特定行值
mysql> select cust_id,count(*) as orders from orders group by cust_id having count(*)>=2;
+---------+--------+
| cust_id | orders |
+---------+--------+
| 10001 | 2 |
+---------+--------+
1 row in set (0.01 sec)
mysql> select cust_id,count(*) as orders from orders group by cust_id having count(*)=1;
+---------+--------+
| cust_id | orders |
+---------+--------+
| 10003 | 1 |
| 10004 | 1 |
| 10005 | 1 |
+---------+--------+
3 rows in set (0.00 sec)
mysql> select vend_id,count(*) as num_prods from products where prod_price>=10 group by vend_id having count(*)>=2;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1003 | 4 |
| 1005 | 2 |
+---------+-----------+
2 rows in set (0.00 sec)
mysql> select vend_id,count(*) as num_prods from products group by vend_id having count(*)>=2;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1001 | 3 |
| 1002 | 2 |
| 1003 | 7 |
| 1005 | 2 |
+---------+-----------+
4 rows in set (0.00 sec)
4.4 分組和排序
order by和group by區別
order by | group by |
排序產生的輸出 | 分組行。但輸出可能不是分組的順序 |
任意列都可以使用(甚至非選擇的列也可以使用) | 只可能使用選擇列或表達式列,而且必須使用每個選擇列表達式 |
不一定需要 | 如果與聚集函數一起使用列(或表達式),則必須使用 |
ORDER BY 一般在使用GROUPBY子句時,應該也給出ORDER BY子句,這是保證數據正確排序的唯一方法。千萬不要僅依賴GROUP BY排序數據。
mysql> select order_num,sum(quantity*item_price) as ordertotal from orderitems group by order_num having sum(quantity*item_price)>=50;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
| 20005 | 149.87 |
| 20006 | 55.00 |
| 20007 | 1000.00 |
| 20008 | 125.00 |
+-----------+------------+
4 rows in set (0.00 sec)
mysql> select order_num,sum(quantity*item_price) as ordertotal from orderitems group by order_num having sum(quantity*item_price)>=50 order by ordertotal;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
| 20006 | 55.00 |
| 20008 | 125.00 |
| 20005 | 149.87 |
| 20007 | 1000.00 |
+-----------+------------+
4 rows in set (0.00 sec)
4.5 select 子句順序
子句 | 說明 | 是否必須使用 |
---|---|---|
select | 要返回的列或表達式 | 是 |
from | 從中檢索數據的表 | 僅在從表選擇數據時使用 |
where | 行級過濾 | 否 |
group by | 分組說明 | 僅在按組計算聚集時使用 |
having | 組級過濾 | 否 |
order by | 輸出排序順序 | 否 |
limit | 要檢索的行數 | 否 |
5. 使用子查詢
6. 聯結表
6.1 聯結
SOL最強大的功能之一就是能在數據檢索查詢的執行中聯結(join)表。聯結是利用SQL的SELECT能執行的最重要的操作。
外鍵(foreign key)外鍵爲某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關係。
關係數據可以有效地存儲和方便地處理。因此,關係數據庫的可伸縮性遠比非關係數據庫要好。
可伸縮性(scale)能夠適應不斷增加的工作量而不失敗。設計良好的數據庫或應用程序稱之爲可伸縮性好(scale well)。
爲什麼要使用聯結
正如所述,分解數據爲多個表能更有效地存儲,更方便地處理,並且具有更大的可伸縮性。但這些好處是有代價的。
如果數據存儲在多個表中,怎樣用單條SELECT語句檢索出數據?答案是使用聯結。簡單地說,聯結是一種機制,用來在一條SELECT語句中關聯表,因此稱之爲聯結。使用特殊的語法,可以聯結多個表返回一組輸出,聯結在運行時關聯表中正確的行。
維護引用完整性 重要的是,要理解聯結不是物理實體。換句話說,它在實際的數據庫表中不存在,聯結由MySQL根據需要建立,它存在於查詢的執行當中。
在使用關係表時,僅在關係列中插入合法的數據非常重要。回到這裏的例子,如果在products表中插入擁有非法供應商ID
(即沒有在vendors表中出現)的供應商生產的產品,則這些產品是不可訪問的,因爲它們沒有關聯到某個供應商。
爲防止這種情況發生,可指示MySQL只允許在products表的供應商ID列中出現合法值(即出現在vendors表中的供應商)。
這就是維護引用完整性,它是通過在表的定義中指定主鍵和外健來實現的。
6.2 創建聯結
mysql> select vend_name,prod_name,prod_price from vendors,products where vendors.vend_id=products.vend_id order by vend_name,prod_name;
+-------------+----------------+------------+
| vend_name | prod_name | prod_price |
+-------------+----------------+------------+
| ACME | Bird seed | 10.00 |
| ACME | Carrots | 2.50 |
| ACME | Detonator | 13.00 |
| ACME | Safe | 50.00 |
| ACME | Sling | 4.49 |
| ACME | TNT (1 stick) | 2.50 |
| ACME | TNT (5 sticks) | 10.00 |
| Anvils R Us | .5 ton anvil | 5.99 |
| Anvils R Us | 1 ton anvil | 9.99 |
| Anvils R Us | 2 ton anvil | 14.99 |
| Jet Set | JetPack 1000 | 35.00 |
| Jet Set | JetPack 2000 | 55.00 |
| LT Supplies | Fuses | 3.42 |
| LT Supplies | Oil can | 8.99 |
+-------------+----------------+------------+
14 rows in set (0.01 sec)
//笛卡爾積
mysql> select vend_name,prod_name,prod_price from vendors,products order by vend_name,prod_name;
+----------------+----------------+------------+
| vend_name | prod_name | prod_price |
+----------------+----------------+------------+
| ACME | .5 ton anvil | 5.99 |
| ACME | 1 ton anvil | 9.99 |
| ACME | 2 ton anvil | 14.99 |
| ACME | Bird seed | 10.00 |
| ACME | Carrots | 2.50 |
| ACME | Detonator | 13.00 |
| ACME | Fuses | 3.42 |
| ACME | JetPack 1000 | 35.00 |
| ACME | JetPack 2000 | 55.00 |
| ACME | Oil can | 8.99 |
| ACME | Safe | 50.00 |
| ACME | Sling | 4.49 |
| ACME | TNT (1 stick) | 2.50 |
| ACME | TNT (5 sticks) | 10.00 |
| Anvils R Us | .5 ton anvil | 5.99 |
| Anvils R Us | 1 ton anvil | 9.99 |
| Anvils R Us | 2 ton anvil | 14.99 |
| Anvils R Us | Bird seed | 10.00 |
| Anvils R Us | Carrots | 2.50 |
| Anvils R Us | Detonator | 13.00 |
| Anvils R Us | Fuses | 3.42 |
| Anvils R Us | JetPack 1000 | 35.00 |
| Anvils R Us | JetPack 2000 | 55.00 |
| Anvils R Us | Oil can | 8.99 |
| Anvils R Us | Safe | 50.00 |
| Anvils R Us | Sling | 4.49 |
| Anvils R Us | TNT (1 stick) | 2.50 |
| Anvils R Us | TNT (5 sticks) | 10.00 |
| Furball Inc. | .5 ton anvil | 5.99 |
| Furball Inc. | 1 ton anvil | 9.99 |
| Furball Inc. | 2 ton anvil | 14.99 |
| Furball Inc. | Bird seed | 10.00 |
| Furball Inc. | Carrots | 2.50 |
| Furball Inc. | Detonator | 13.00 |
| Furball Inc. | Fuses | 3.42 |
| Furball Inc. | JetPack 1000 | 35.00 |
| Furball Inc. | JetPack 2000 | 55.00 |
| Furball Inc. | Oil can | 8.99 |
| Furball Inc. | Safe | 50.00 |
| Furball Inc. | Sling | 4.49 |
| Furball Inc. | TNT (1 stick) | 2.50 |
| Furball Inc. | TNT (5 sticks) | 10.00 |
| Jet Set | .5 ton anvil | 5.99 |
| Jet Set | 1 ton anvil | 9.99 |
| Jet Set | 2 ton anvil | 14.99 |
| Jet Set | Bird seed | 10.00 |
| Jet Set | Carrots | 2.50 |
| Jet Set | Detonator | 13.00 |
| Jet Set | Fuses | 3.42 |
| Jet Set | JetPack 1000 | 35.00 |
| Jet Set | JetPack 2000 | 55.00 |
| Jet Set | Oil can | 8.99 |
| Jet Set | Safe | 50.00 |
| Jet Set | Sling | 4.49 |
| Jet Set | TNT (1 stick) | 2.50 |
| Jet Set | TNT (5 sticks) | 10.00 |
| Jouets Et Ours | .5 ton anvil | 5.99 |
| Jouets Et Ours | 1 ton anvil | 9.99 |
| Jouets Et Ours | 2 ton anvil | 14.99 |
| Jouets Et Ours | Bird seed | 10.00 |
| Jouets Et Ours | Carrots | 2.50 |
| Jouets Et Ours | Detonator | 13.00 |
| Jouets Et Ours | Fuses | 3.42 |
| Jouets Et Ours | JetPack 1000 | 35.00 |
| Jouets Et Ours | JetPack 2000 | 55.00 |
| Jouets Et Ours | Oil can | 8.99 |
| Jouets Et Ours | Safe | 50.00 |
| Jouets Et Ours | Sling | 4.49 |
| Jouets Et Ours | TNT (1 stick) | 2.50 |
| Jouets Et Ours | TNT (5 sticks) | 10.00 |
| LT Supplies | .5 ton anvil | 5.99 |
| LT Supplies | 1 ton anvil | 9.99 |
| LT Supplies | 2 ton anvil | 14.99 |
| LT Supplies | Bird seed | 10.00 |
| LT Supplies | Carrots | 2.50 |
| LT Supplies | Detonator | 13.00 |
| LT Supplies | Fuses | 3.42 |
| LT Supplies | JetPack 1000 | 35.00 |
| LT Supplies | JetPack 2000 | 55.00 |
| LT Supplies | Oil can | 8.99 |
| LT Supplies | Safe | 50.00 |
| LT Supplies | Sling | 4.49 |
| LT Supplies | TNT (1 stick) | 2.50 |
| LT Supplies | TNT (5 sticks) | 10.00 |
+----------------+----------------+------------+
84 rows in set (0.01 sec)
笛卡爾積 由沒有聯結條件的表關係返回的結果爲笛卡爾積,檢索出的行的數目是第一個表中的行數乘以第二個表中的行數。
6.3 內部聯結(等值聯結)
mysql> select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id=products.vend_id;
+-------------+----------------+------------+
| vend_name | prod_name | prod_price |
+-------------+----------------+------------+
| Anvils R Us | .5 ton anvil | 5.99 |
| Anvils R Us | 1 ton anvil | 9.99 |
| Anvils R Us | 2 ton anvil | 14.99 |
| LT Supplies | Fuses | 3.42 |
| LT Supplies | Oil can | 8.99 |
| ACME | Detonator | 13.00 |
| ACME | Bird seed | 10.00 |
| ACME | Carrots | 2.50 |
| ACME | Safe | 50.00 |
| ACME | Sling | 4.49 |
| ACME | TNT (1 stick) | 2.50 |
| ACME | TNT (5 sticks) | 10.00 |
| Jet Set | JetPack 1000 | 35.00 |
| Jet Set | JetPack 2000 | 55.00 |
+-------------+----------------+------------+
14 rows in set (0.00 sec)
//聯結多個表
mysql> select prod_name,vend_name,prod_price,quantity
-> from products,orderitems,vendors
-> where products.vend_id=vendors.vend_id
-> and orderitems.prod_id=products.prod_id
-> and order_num=20005;
+----------------+-------------+------------+----------+
| prod_name | vend_name | prod_price | quantity |
+----------------+-------------+------------+----------+
| .5 ton anvil | Anvils R Us | 5.99 | 10 |
| 1 ton anvil | Anvils R Us | 9.99 | 3 |
| TNT (5 sticks) | ACME | 10.00 | 5 |
| Bird seed | ACME | 10.00 | 1 |
+----------------+-------------+------------+----------+
4 rows in set (0.00 sec)
性能考慮 mysql在運行時關聯指定的每個表以處理聯結。這種處理可能是非常耗費資源的,不要連接不必要的表,聯結的表越多,性能下降的越厲害。