一、連接查詢 1、連接查詢建立在有相互關係的兩個表間,進行兩個及兩個以上的表或視圖的查詢。 2、對n張表進行查詢,至少需要n-1個連接表的條件。 二、笛卡爾積(容易造成資料庫宕機) 1、指表中每行元素與其他表的每行均組合,沒有連接條件。 2、假設有兩張表,表A有X條數據,表B有Y條數據,則笛卡爾積查 ...
一、連接查詢
1、連接查詢建立在有相互關係的兩個表間,進行兩個及兩個以上的表或視圖的查詢。
2、對n張表進行查詢,至少需要n-1個連接表的條件。
二、笛卡爾積(容易造成資料庫宕機)
1、指表中每行元素與其他表的每行均組合,沒有連接條件。
2、假設有兩張表,表A有X條數據,表B有Y條數據,則笛卡爾積查詢後,會得到一張X*Y條數據的表。
三、主鍵、外鍵
1、主鍵與外鍵用於維護關係型資料庫的完整性。
2、主鍵:非空且唯一,用於標識一張表。
3、外鍵:用於存放另一張表的主鍵,外鍵可以重覆,也可以為null。
四、等值連接、自然連接、內連接、外連接
已知兩張表:
表student為:
表student_score為:
1、等值連接、非等值連接:
非等值連接一般用於給定條件進行連接,寫在WHERE語句中,只要符合了where條件,就可以連接。
等值連接指的是where連接條件相等時的連接。
【格式:】 SELECT 欄位名1, 欄位名2,..., 欄位名n FROM 表1, 表2,... ,表n WHERE 條件 --【舉例:等值連接】 SELECT * FROM student stu, student_score sco WHERE stu.id = sco.id --【結果如下圖:】
--【舉例:非等值連接】 SELECT * FROM student stu, student_score sco WHERE stu.id > sco.id --【結果如下圖:】
2、自然連接:
是一種特殊的等值連接,要求兩表之間具有重覆的列,在等值連接的基礎上(對相同的列進行 = 比較)去掉重覆的列。
--【格式:】 SELECT 列名1, 列名2 FROM 表1 NATURAL JOIN 表2 --【舉例:】 SELECT * FROM student stu NATURAL JOIN student_score --【可以將其理解為:消除了重覆的列 ---sco.id】 SELECT stu.id, stu.name, sco.score FROM student stu, student_score sco WHERE stu.id = sco.id
3、內連接:
不能消除重覆列,可以通過SECECT挑選欄位來決定。基本與等值連接相同,使用ON來指定條件。
--【格式:】 SELECT 列名1, 列名2 FROM 表1 INNER JOIN 表2 ON (條件) --【舉例:】 SELECT * FROM student stu INNER JOIN student_score sco ON stu.id = sco.id
註:內連接與等值連接的區別:
(1)等值連接:2個表會先進行笛卡爾乘積運算,生成一個新表格,占據在電腦記憶體里,當表的數據量很大時,很耗記憶體,這種方法效率比較低,儘量不用。
(2)內連接:2個表根據共同ID進行逐條匹配,不會出現笛卡爾乘積的現象,效率比較高,優先使用這種方法。
4、外連接
不能消除重覆列,可以通過SECECT挑選欄位來決定。
分為左外連接,右外連接,全外連接。
(1)左外連接:
以第一個關係為主,在第二個關係中找到滿足條件的元素,並把他們連接起來,如果沒有對應的元素,則在相應位置上的值為null。
--【格式:】 SELECT 列名1, 列名2 FROM 表1 LEFT OUTER JOIN 表2 ON (條件) --【舉例:】 SELECT * FROM student stu LEFT OUTER JOIN student_score sco ON stu.id = sco.id AND stu.name = 'tom'
(2)右外連接
和左外連接類似,以第二個關係為主,在第一個關係中找到滿足條件的元素,並把他們連接起來,如果沒有對應的元素,則在相應位置上的值為null
--【格式:】 SELECT 列名1, 列名2 FROM 表1 RIGHT OUTER JOIN 表2 ON (條件) --【舉例:】 SELECT * FROM student stu RIGHT OUTER JOIN student_score sco ON stu.id = sco.id AND stu.name = 'tom'
(3)全外連接:
全外連接是左外連接和右外連接的組合。
註:mysql中沒有全外連接,可以使用UNION關鍵字 連接 左外連接 與 右外連接 實現。
--【格式:】 SELECT 列名1, 列名2 FROM 表1 FULL OUTER JOIN 表2 ON (條件) --【舉例:】 SELECT * FROM student stu FULL OUTER JOIN student_score sco ON stu.id = sco.id AND stu.name = 'tom'
五、子查詢
1、子查詢指的是當前查詢建立在另一個查詢的結果上。
2、分類:
(1)單行單列子查詢:返回單行單列數據。通常寫在WHERE里。
(2)多行單列子查詢:返回多行單列數據。通常寫在WHERE里。
(3)多行多列子查詢:返回多行多列數據。通常寫在FROM里,當成一個表來使用。
3、單行單列子查詢
【舉例:】 SELECT stu.name FROM student stu WHERE stu.id = ( SELECT sco.id FROM student_score sco WHERE sco.score = '98' )
4、多行單列子查詢
【舉例:】 SELECT stu.name FROM student stu WHERE stu.id IN ( SELECT sco.id FROM student_score sco WHERE sco.score IN ('98', '97', '96') )
5、多行多列子查詢
【舉例:寫在WHERE條件里】 SELECT * FROM student stu WHERE stu.id IN ( SELECT sco.id FROM student_score sco WHERE sco.score IN ('98', '97', '96') )
【舉例:寫在FROM條件里,當成表來用】 SELECT * FROM student stu, ( SELECT sco.id FROM student_score sco WHERE sco.score IN ('98', '97', '96') ) sco WHERE stu.id = sco.id
六、分頁查詢
1、 ROWNUM
ROWNUM被稱為偽列,實際上是不存在的列,用於返回標識行數據順序的數字,自1開始,每次確定數據後自動加1。
SELECT ROWNUM,name,id FROM student
2、分頁步驟(相比於mysql會略顯複雜一些)
(1)先排序。
SELECT * FROM student ORDER BY id desc
(2)再編號。
SELECT ROWNUM rw, stu.* FROM ( SELECT * FROM student ORDER BY id desc ) stu
(3)取範圍。
取範圍通用套路: 從第start條開始,到第end條結束。 即從第(page -1)*pagesize + 1條開始,到第(page*pagesize)條。 其中page表示第幾頁,pagesize表示每頁的數據。 比如第一頁,每頁三條記錄,那麼第一頁顯示為 1 至 3 條,第二頁顯示為4 至 6條, 同理…… SELECT * FROM ( SELECT ROWNUM rw, stu.* FROM ( SELECT * FROM student ORDER BY id desc ) stu ) WHERE rw BETWEEN 3 AND 5