日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接

發布時間:2023/12/2 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 笛卡爾乘積
    • 連接查詢分類
    • 等值連接
    • 非等值連接
    • 自連接
    • 外連接
    • 交叉連接


連接查詢又稱為多表查詢,當查詢的字段來自于多個表時,使用連接查詢。


笛卡爾乘積

笛卡爾乘積現象:表1有m行,表2有n行,結果有m*n行

發生原因:沒有有效的連接條件

避免:添加有效的連接條件

SELECT `name`,`boyName` FROM `beauty`,`boys` WHERE `beauty`.`boyfriend_id`=`boys`.`id`;


連接查詢分類

按年代分:92標準(①),99標準(①②中的左右③)

按照功能分類:

①內連接:等值連接,非等值連接,自連接

②外連接:左外連接,右外連接,全外連接

③交叉連接

MySQL支持內連接,外連接(左外和右外),交叉連接


等值連接

1、92標準

①多表等值連接的結果為多表的交集部分
②n表連接,至少需要n-1個連接條件
③多表的順序沒有要求
①一般需要為表起別名
⑤可以搭配前面介紹的所有子句

SELECT1中字段,2中字段 FROM1,2 (表順序可以換) WHERE1.依據的字段=2.依據的字段; (連接條件) SELECT `name`,`boyName` FROM `beauty`,`boys` WHERE `beauty`.`boyfriend_id`=`boys`.`id`;

字段有歧義時,可以用表.限制,如果表面太長,可以給表起別名,而起別名后就不能用原表名了,需要使用別名。

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 個數,`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為內連接類型標識 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語法中的等值連接效果是一樣的,都是查詢多表的交集


非等值連接

區別于等值連接在于連接條件不是=。

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`;

同樣可以組合其他子句。


外連接

應用場景:用于查詢一個表中有,另一個表沒有的記錄

特點:
①外連接的查詢結果為主表中的所有記錄
②如果從表中有和它匹配的,則顯示匹配的值
③如果從表中沒有和它匹配的,則顯示null
④外連接查詢結果=內連接結果+主表中有而從表沒有的記錄

左外連接,left join左邊的是主表
右外連接,right join右邊的是主表
左外和右外交換兩個表的順序,可以實現同樣的效果

#左外連接 SELECT be.`name`,bo.`boyName` FROM `beauty` AS be LEFT JOIN `boys` AS bo ON be.`boyfriend_id`=bo.`id`; #右外連接 SELECT be.`name`,bo.`boyName` FROM `boys` AS bo RIGHT JOIN `beauty` AS be ON be.`boyfriend_id`=bo.`id`;

MySQL不支持全外連接
全外連接=內連接的結果+表1中有但表2沒有的+表2中有但表1沒有的


交叉連接

SELECT be.`name`,bo.`boyName` FROM `boys` AS bo CROSS JOIN `beauty` AS be;

相當于就是99標準的笛卡爾乘積

總結

以上是生活随笔為你收集整理的一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。