一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接
文章目錄
- 笛卡爾乘積
- 連接查詢分類
- 等值連接
- 非等值連接
- 自連接
- 外連接
- 交叉連接
連接查詢又稱為多表查詢,當查詢的字段來自于多個表時,使用連接查詢。
笛卡爾乘積
笛卡爾乘積現(xiàn)象:表1有m行,表2有n行,結(jié)果有m*n行
發(fā)生原因:沒有有效的連接條件
避免:添加有效的連接條件
SELECT `name`,`boyName` FROM `beauty`,`boys` WHERE `beauty`.`boyfriend_id`=`boys`.`id`;連接查詢分類
按年代分:92標準(①),99標準(①②中的左右③)
按照功能分類:
①內(nèi)連接:等值連接,非等值連接,自連接
②外連接:左外連接,右外連接,全外連接
③交叉連接
MySQL支持內(nèi)連接,外連接(左外和右外),交叉連接
等值連接
1、92標準
①多表等值連接的結(jié)果為多表的交集部分
②n表連接,至少需要n-1個連接條件
③多表的順序沒有要求
①一般需要為表起別名
⑤可以搭配前面介紹的所有子句
字段有歧義時,可以用表.限制,如果表面太長,可以給表起別名,而起別名后就不能用原表名了,需要使用別名。
SELECT `name`,`boyName` FROM `beauty` AS a,`boys` As o WHERE a.`boyfriend_id`=o.`id`;可以添加篩選條件。
SELECT `last_name`,`department_name`,`commission_pct` FROM `departments` AS d,`employees` AS e WHERE d.`department_id`=e.`department_id` AND `commission_pct` IS NOT NULL;組合分組查詢。
#查詢每個城市有多少個部門 SELECT COUNT(*) AS 個數(shù),`city` FROM `departments` AS d,`locations` AS l WHERE d.`location_id`=l.`location_id` GROUP BY `city`;2、99標準
SELECT `last_name`,`department_name` FROM `employees` AS e INNER JOIN `departments` AS d #inner為內(nèi)連接類型標識 ON e.`department_id`=d.`department_id`; #連接條件 #多表 SELECT `last_name`,`department_name`,`city` FROM `employees` AS e INNER JOIN `departments` AS d ON e.`department_id`=d.`department_id` INNER JOIN `locations` AS l ON d.`location_id`=l.`location_id` ORDER BY `department_name` DESC;①可以添加排序、分組、篩選等子句
②inner可以省略
③篩選條件放在where后面, 連接條件放在on后面,提高分離性,便于閱讀
④inner join連接和sq192語法中的等值連接效果是一樣的,都是查詢多表的交集
非等值連接
區(qū)別于等值連接在于連接條件不是=。
1、92標準
SELECT salary,grade_level FROM employees AS e,job_grades AS g WHERE salary BETWEEN g.lowest_sal AND g.highest_sal;也可以組合前面講到的子句。
2、99標準
SELECT `salary`,`grade_level` FROM `employees` AS e INNER JOIN `job_grades` AS j ON `salary` BETWEEN `lowest_sal` AND `highest_sal`;也可以組合前面講到的子句。
自連接
相當于是一張表里面的等值連接,即一張表里面的某兩個字段相等。
1、92標準
SELECT e.`employee_id`,e.`last_name`,m.`employee_id`,m.`last_name` FROM `employees` AS e,`employees` AS m WHERE e.`manager_id`=m.`employee_id`2、99標準
SELECT e.`last_name` AS 員工,m.`last_name` AS 領導 FROM `employees` AS e INNER JOIN `employees` AS m ON e.`manager_id`=m.`employee_id`;同樣可以組合其他子句。
外連接
應用場景:用于查詢一個表中有,另一個表沒有的記錄
特點:
①外連接的查詢結(jié)果為主表中的所有記錄
②如果從表中有和它匹配的,則顯示匹配的值
③如果從表中沒有和它匹配的,則顯示null
④外連接查詢結(jié)果=內(nèi)連接結(jié)果+主表中有而從表沒有的記錄
左外連接,left join左邊的是主表
右外連接,right join右邊的是主表
左外和右外交換兩個表的順序,可以實現(xiàn)同樣的效果
MySQL不支持全外連接
全外連接=內(nèi)連接的結(jié)果+表1中有但表2沒有的+表2中有但表1沒有的
交叉連接
SELECT be.`name`,bo.`boyName` FROM `boys` AS bo CROSS JOIN `beauty` AS be;相當于就是99標準的笛卡爾乘積
總結(jié)
以上是生活随笔為你收集整理的一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小技巧:隐藏 iPhone 桌面应用图标
- 下一篇: 逆向行驶!数据结构双向链表DoubleL