1.from 字句
SELECT的查詢對象由FROM子句指定,其格式為:
www.2cto.com
FROM 表名1 [ , 表名2] …
其中,表名:
tbl_name [ [AS] 表別名 ] [{USE | ignore | force} index (key_list)] /*查詢表*/
| join_table /*連接表*/
說明:表名指出了要查詢的表或視圖。
● 表別名主要用在相關子查詢及連接查詢中。如果FROM子句指定了表別名,這條SELECT語句中的其他子句都必須使用表別名來代替原始的表名。當同一個表在SELECT語句中多次被提到的時候,就必須要使用表別名來加以區分。
● {USE | IGNORE | FORCE} INDEX:USE INDEX告知MySQL選擇一個索引來查找表中的行,IGNORE INDEX告知MySQL不要使用某些特定的索引,FORCE INDEX的作用接近USE INDEX(key_list),只有當無法使用一個給定的索引來查找表中的行時,才使用表掃描。
2.表名中可以包含一個或多個表:
www.2cto.com
● 引用一個表:
可以用兩種方式引用一個表,第一種方式是使用USE語句讓一個數據庫成為當前數據庫,在這種情況下,如果在FROM子句中指定表名,則該表應該屬於當前數據庫。第二種方式是指定的時候在表名前帶上表所屬數據庫的名字。例如,假設當前數據庫是db1,現在要顯示數據庫db2裡的表tb的內容,使用如下語句:
SELECT * FROM db2.tb;
當然,在SELECT關鍵字後指定列名的時候也可以在列名前帶上所屬數據庫和表的名字,但是一般來說,如果選擇的字段在各表中是唯一的,就沒有必要去特別指定。
● 引用多個表:
如果要在不同表中查詢數據,則必須在FROM子句中指定多個表。指定多個表時就要使用到連接。當不同列的數據組合到一個表中叫做表的連接。
3.連接的方式有以下三種。
高級查詢 (多表查詢:數據源是多個表)
做多表連接:要找到連接的條件,2個表的公共字段(屬性)
分析:1.考慮數據源 :xs:學號 姓名; xs_kc:課程號 成績
www.2cto.com
2.連接條件:兩表的學號相等 xs.學號=xs_kc.學號
當查看的列在多個表中都存在的話,必須在字段名前加上表名進行限制。
1). 全連接
連接的第一種方式是將各個表用逗號分隔,這樣就指定了全連接。FROM子句產生的中間結果是一個新表,新表是每個表的每行都與其他表中的每行交叉以產生所有可能的組合,列包含了所有表中出現的列,也就是笛卡兒積。這樣連接表潛在地產生數量非常大的行,因為可能得到的行數為每個表中行數之積。在這樣的情形下,通常要使用WHERE子句設定條件來將結果集減少為易於管理的大小,這樣的連接即為等值連接。
例: 查找XSCJ數據庫中所有學生選過的課程名和課程號。
SELECT DISTINCT KC.課程名,XS_KC.課程號
FROM KC, XS_KC WHERE KC.課程號=XS_KC.課程號;
2). JOIN連接
語法格式如下:
表名1 inner join 表名2 [join_condition]
| 表名1{ left | right } [outer]JOIN表名2 join_condition
| 表名1 natural [ {RIGHT |LEFT} [OUTER] ] JOIN表名2
| 表名1 cross join 表名2 [join_condition]
| 表名1 straight_join表名2 [ON condition_exp]
其中,join_condition 代表:
ON 連接條件 | using(column_list)
使用JOIN關鍵字的連接主要分為三種:
A.內連接(指定了inner關鍵字的連接是內連接)。
內連接是系統默認的,可以省略INNER關鍵字。使用內連接後,FROM子句中ON條件主要用來連接表,其他並不屬於連接表的條件可以使用WHERE子句來指定。
作為特例,可以將一個表與它自身進行連接,稱為自連接。若要在一個表中查找具有相同列值的行,則可以使用自連接。使用自連接時需為表指定兩個別名,且對所有列的引用均要用別名限定。
例:查找XSCJ數據庫中課程不同、成績相同的學生的學號、課程號和成績。
SELECT a.學號,a.課程號,b.課程號,a.成績
FROM XS_KC AS a JOIN XS_KC AS b
www.2cto.com
ON a.成績=b.成績 AND a.學號=b.學號 ANDa.課程號!=b.課程號;
如果要連接的表中有列名相同,並且連接的條件就是列名相等,那麼ON條件也可以換成USING子句。
USING(column_list)子句用於為一系列的列進行命名。這些列必須同時在兩個表中存在。其中column_list為兩表中相同的列名。
例: 查找KC表中所有學生選過的課程名。
SELECT 課程名 FROM KC INNER JOIN XS_KC USING (課程號);
說明:查詢的結果為XS_KC表中所有出現的課程號對應的課程名。
B.外連接(指定了OUTER關鍵字的連接為外連接。)
外連接包括:
● 左外連接(LEFT OUTER JOIN):結果表中除了匹配行外,還包括左表有的但右表中不匹配的行,對於這樣的行,從右表被選擇的列設置為NULL。
● 右外連接(RIGHT OUTERJOIN):結果表中除了匹配行外,還包括右表有的但左表中不匹配的行,對於這樣的行,從左表被選擇的列設置為NULL。
● 自然連接(NATURAL JOIN):自然連接還有自然左外連接(NATURAL LEFT OUTER JOIN)和自然右外連接(NATURALRIGHT OUTER JOIN)。NATURAL JOIN的語義定義與使用了ON條件的INNER JOIN相同。
其中的OUTER關鍵字均可省略。
例: 查找所有學生情況及他們選修的課程號,若學生未選修任何課,也要包括其情況。
SELECT XS.* , 課程號
FROM XS LEFT OUTER JOIN XS_KC ON XS.學號 =XS_KC.學號;
說明:若本例不使用LEFT OUTER JOIN,則結果中不會包含未選任何課程的學生信息。使用了左外連接後,本例結果中返回的行中有未選任何課程的學生信息,相應行的課程號字段值為NULL。
例: 使用自然連接實現例4.22中相同的結果。
SELECT DISTINCT 課程名, XS_KC.課程號
FROM KC NATURAL JOIN XS_KC;
說明:SELECT語句中只選取一個用來連接表的列時,可以使用自然連接代替內連接。用這種方法,可以用自然左外連接來替換左外連接,自然右外連接替換右外連接。(用的不多,容易出錯,因為是讓系統自動找相同的條件,找不到時會報錯)
注意:外連接只能對兩個表進行。
C.交叉連接(指定了CROSS JOIN關鍵字的連接是交叉連接。)
在不包含連接條件,交叉連接實際上是將兩個表進行笛卡兒積運算,結果表是由第一個表的每行與第二個表的每一行拼接後形成的表,因此結果表的行數等於兩個表行數之積。
在MySQL中,CROSS JOIN從語法上來說與INNER JOIN等同,兩者可以互換。
例: 列出學生所有可能的選課情況。
www.2cto.com
SELECT 學號, 姓名, 課程號, 課程名
FROM XS CROSS JOIN KC;
另外,STRAIGHT_JOIN連接用法和INNERJOIN連接基本相同。不同的是,STRAIGHT_JOIN後不可以使用USING子句替代ON條件。
例: 使用STRAIGHT_JOIN連接實現例4.22中相同的結果。
SELECT DISTINCT 課程名, XS_KC.課程號
FROM KC STRAIGHT_JOIN XS_KC
ON (KC.課程號=XS_KC.課程號);
4.幾種連接的舉例比較:
要求:查詢每個學生的姓名,專業名,課程名,成績
數據源:xs:姓名,專業名; kc:課程名 ; xs_kc :成績
連接條件:xs.學號=xs_kc.學號 and kc.課程號=xs_kc.課程號
(1) 全連接(等值連接)
例1:
select 姓名,專業名,課程名,成績 from xs,kc,xs_kc
where xs.學號=xs_kc.學號 and kc.課程號=xs_kc.課程號;
例2:
select 姓名,專業名,課程名,成績 fromxs,kc,xs_kc
where xs.學號=xs_kc.學號 and kc.課程號=xs_kc.課程號
and 課程名='計算機基礎' and 成績>=80 order by 成績 desc;
(2) 內連接
例1:
select xs.學號,姓名,課程號,成績
from xs inner join xs_kc on xs.學號=xs_kc.學號;
例2:
select 姓名,專業名,課程名,成績
from xs inner join xs_kc on xs.學號=xs_kc.學號
inner join kc on xs_kc.課程號=kc.課程號
where 課程名='計算機基礎' and 成績>=80;
5.連接多表(如果是三張表)
1).Join連接:
from 表1 inner join 表2 on 條件1
inner join 表3 on 條件2
www.2cto.com
2).全連接:
from 表1,表2,表3 where條件1 and 條件2
3).給表加別名:from 表名 as 別名
注意:如果給表加了別名,以後的使用必須用別名,不能再使用原表名
作者 tianyazaiheruan