sql
查詢是業務開發中的基礎技術,在日常的開發中,單表的簡單查詢往往無法實現常規的業務需求,將所有的資訊都放在一張表裏儲存也是不現實的,也不符合保證表中的每一列都和主鍵列直接相關,而不是間接相關的要求。
假設現在有一個使用者表和一個訂單表,訂單表中可以存在關聯使用者表資訊的欄位,但是不能在訂單表中建立有關使用者的其他資訊。如果想要查詢訂單和使用者的資訊,就可以使用連表查詢來實現。
準備工作
建立一個使用者表,包含使用者名稱和密碼欄位
CREATE TABLE `user` ( `id` int(11) NOT NULL, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
建立一個訂單表,包含訂單的資訊和使用者的id
CREATE TABLE `order_info` ( `id` int(11) NOT NULL COMMENT '唯一id', `order_no` varchar(255) DEFAULT NULL COMMENT '訂單編號', `order_time` datetime DEFAULT NULL COMMENT '訂單時間', `price` decimal(10,2) DEFAULT NULL COMMENT '訂單金額', `user_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `使用者id` (`user_id`), CONSTRAINT `使用者id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
將使用者表的id
設為主鍵,並將其設定為訂單表的外來鍵,完成訂單表與使用者表的關聯,形成使用者表與訂單表一對多的關係
提示
之所以要設定主鍵,是爲了確保資料唯一和建立表的索引。因為索引使用一種樹結構,可以提高資料查詢、新增和刪除的效率。
內連線
這種連線查詢方式,只會返回多個表中符合連線條件的資料,如果有一個表不符合連線條件,就都不返回。
比如上面的兩張表資料,使用內連線查詢,會查詢出訂單表中的兩條資料及關聯的user_id == 1001
的使用者資訊。
select * from order_info o inner join user u on u.id = o.user_id;
執行這條sql
語句返回的資料如下
總結
內連線查詢,返回多個表的滿足連線條件的資料,上面的語句中on u.id = o.user_id
就是兩張表的查詢條件
外連線
外連線又分為左外連線和右外連線,兩者的區別在於左外連線的主表在左,右外連線的主表在右,即使多張表的聯合查詢不符合連線條件,也會返回主表全部的資料。還是以上面的使用者表和訂單表為例,還是和上面相同的表資料。
左外連線
select * from order_info o left join user u on u.id = o.user_id;
將inner
關鍵字修改爲left
即為左外連線
因為order_info
表是左表(主表),所以所有的資料都可以查出來,又因為使用者表中id == 1001
的資料是符合連線條件的,所以使用者id == 1001
的資料也被成功返回。現在將left join
修改爲right join
再看下查詢結果
右外連線
select * from order_info o right join user u on u.id = o.user_id;
這次因為是以右表也就是user
表為主表,所以使用者表的資料都返回,然後因為從表也就是訂單表中符合連線條件的只有user_id == 1001
的資料,所以使用者id
為1002
的訂單資料不會被查出來,相關的列直接顯示為NULL
。
總結
內連線只會返回多個表中符合連線條件的資料,如果只需要查詢多張表中符合關聯關係的資料就選擇內連線
左外連線會返回左表中所有的資料和從表中符合連表條件的資料,所以如果需要左表中所有的資料時,選擇使用左連線的查詢方式
右外連線會返回右表中所有的資料和從表中符合連表條件的資料,所以如果需要右表中所有的資料時,選擇使用右連線的查詢方式