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

歡迎訪問 生活随笔!

生活随笔

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

数据库

二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)

發布時間:2024/7/5 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL連接查詢(多表連接查詢:內連接,外連接,交叉連接詳解)

6:多表連接查詢

笛卡爾乘積:如果連接條件省略或無效則會出現 解決辦法:添加上連接條件

連接查詢的分類:

1.按年代分類:1)sql 92標準:僅僅支持內連接2)sql 99標準 **(推薦使用)** :支持內連接、外連接(左外 和 右外)、交叉連接 2.按功能分類:1)內連接:等值連接非等值連接自連接2)外連接:左外連接右外連接全外連接3)交叉連接

一、傳統模式下的連接 :等值連接——非等值連接

1.等值連接的結果 = 多個表的交集 2.n表連接,至少需要n-1個連接條件 3.多個表不分主次,沒有順序要求 4.一般為表起別名,提高閱讀性和性能

二、sql99語法:通過join關鍵字實現連接

含義:1999年推出的sql語法 支持: 等值連接、非等值連接 (內連接) 外連接 交叉連接語法:

select 字段,…
from 表1
【inner|left outer|right outer|cross】join 表2 on 連接條件
【inner|left outer|right outer|cross】join 表3 on 連接條件
【where 篩選條件】
【group by 分組字段】
【having 分組后的篩選條件】
【order by 排序的字段或表達式】

好處:語句上,連接條件和篩選條件實現了分離,簡潔明了!

三、自連接

案例:查詢員工名和直接上級的名稱

sql99

SELECT e.last_name,m.last_name FROM employees e JOIN employees m ON e.`manager_id`=m.`employee_id`;

sql92

SELECT e.last_name,m.last_name FROM employees e,employees m WHERE e.`manager_id`=m.`employee_id`;

一、等值連接
1)多表等值連接的結果實際上為多個表的交集部分
2)n張表進行連接,則至少需要 n-1 個連接條件
3)多表的順序沒有要求
4) 一般需要為表起別名,因為可能同一個字段名,會在多張查詢的表中存在。即可以為表取別名,區分多個重名的字段。為表使用別名后,只能使用別名去"select"!
5) 等值連接可以搭配排序(order by)、分組(group by)、篩選(where/and/like)來使用

# sql 92 # 可以實現三表連接 # 查詢員工名、部門名、和所在的城市 SELECT last_name,department_name,city FROM employees e, departments d,locations l WHERE e.department_id = d.department_id AND d.location_id = l.location_id AND city LIKE 's%' ORDER BY department_name DESC;# 加分組條件 # 查詢每個城市的部門個數 SELECT COUNT(*) 個數 , city FROM departments d , locations l WHERE d.location_id = l.location_id GROUP BY city; # sql 99# 1.等值連接 # 查詢員工名、部門名 SELECT last_name,department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;# 查詢名字中包含e的員工名和工種名 SELECT last_name , job_title,j.job_id FROM employees e INNER JOIN jobs j on e.job_id = j.job_id WHERE e.last_name LIKE '%e%';# 查詢部門個數>3的城市名和部門個數,(添加分組+篩選) SELECT city,COUNT(*) 部門個數 FROM locations l INNER JOIN departments d ON l.location_id = d.location_id GROUP BY city HAVING 部門個數>3;# 查詢部分的員工個數>3的部門名和員工個數,并按員工個數降序排序SELECT COUNT(*) 個數,department_name FROM departments d INNER JOIN employees e ON e.department_id = d.department_id GROUP BY department_name HAVING COUNT(*) > 3 ORDER BY COUNT(*) DESC;# 查詢員工名、部門名、工種名,并按部門名降序排列(三表連接) SELECT last_name,department_name,job_title FROM employees e INNER JOIN jobs j ON e.job_id = j.job_id INNER JOIN departments d ON e.department_id = d.department_id ORDER BY department_name DESC; sql 99 特點: 1、也可添加排序、分組、篩選 2、inner 可以省略 3、 篩選條件放在where后面,連接條件放在on后面,提高分離性,便于閱讀 4、inner join連接 和sql92語法中的等值連接效果相同,都是查詢多表的交集

二、非等值連接
表與表之間沒有相同項(或有相同但是不能用),但是表之間某個或某些項直接存在著一定的關系。

比如說員工信息表,里面包含員工工資,另外一張工資等級表將工資進行等級劃分,而員工的工資就可以根據工資等級表來劃分為某個等級。
where 列名 BETWEEN … AND …

# sql 92 # 非等值連接 # 查詢員工的工資和工資級別 SELECT salary , grade_level FROM employees e, job_grades g WHERE salary BETWEEN g.lowest_sal AND highest_sal ORDER BY g.grade_level; # AND g.grade_level = 'A'; # sql 99 # 非等值連接# 查詢員工的工資級別 SELECT salary , grade_level FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;# 查詢每個工資級別的員工個數>20的個數,并按工資級別降序排列 SELECT salary , grade_level , COUNT(*) FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal GROUP BY grade_level HAVING count(*) > 20 ORDER BY grade_level DESC;

三、自連接 :自己連接自己
自連接相當于等值連接,不同的是等值連接的項在不同的表單當中,而自連接的連接項在同一個表單中。單一表單中某項和另外一項存在著關聯關系。

比如說員工信息表中,普通員工A的領導是B,而B本身也是員工,因此也包含著員工信息表中。所以A的manager_id就是B的employee_id

# sql 92 # 自連接 # 查詢員工名 和 上級的名稱 SELECT e.employee_id , e.last_name , m.employee_id , m.last_name FROM employees e ,employees m WHERE e.manager_id = m.employee_id; # sql 99 # 自連接# 查詢員工的名字、上級的名字 SELECT e.last_name , m.last_name FROM employees e INNER JOIN employees m ON e.employee_id = m.manager_id;# 查詢包含字符k的員工名字、上級的名字 SELECT e.last_name , m.last_name FROM employees e INNER JOIN employees m ON e.employee_id = m.manager_id WHERE e.last_name LIKE '%k%';

二、外連接

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

特點:
1)外連接的查詢結果為主表中的所有記錄。如果從表中有和它匹配的(也就是連接條件成立),則顯示匹配的值。如果從表中沒有和它匹配的,則顯示null。
外連接查詢的結果 = 內連接查詢的結果 + 主表中有而從表中沒有的記錄
2)左外連接,left join 左邊的是主表
右外連接,right join 右邊的是主表

# sql 99 # 外連接# 查詢男朋友 不在男神表中的 女神名 USE girls; SELECT * FROM boys;# 左外連接 SELECT b.name , bo.* FROM beauty b LEFT OUTER JOIN boys bo ON b.boyfriend_id = bo.id WHERE bo.id IS NULL;# 右外連接 SELECT b.name , bo.* FROM boys bo RIGHT OUTER JOIN beauty b ON b.boyfriend_id = bo.id WHERE bo.id IS NULL; # 查詢哪個部門沒有員工 # 左外 USE myemployees SELECT d.* , e.employee_id FROM departments d LEFT OUTER JOIN employees e ON d.department_id = e.department_id WHERE e.employee_id IS NULL;# 右外 SELECT d.* , e.employee_id FROM employees e RIGHT OUTER JOIN departments d ON d.department_id = e.department_id WHERE e.employee_id IS NULL;

3)左外和右外交換兩個表的順序時,可以實現同樣的效果
4) 全外連接 = 內連接的結果 + 表1中有但表2中沒有的結果 + 表2中有但表1中沒有的結果

# 全外 use girls SELECT b.* ,BOTH.* FROM beauty b FULL OUTER JOIN boys bo ON b.boyfirend_id = bo.id;

5)交叉連接(笛卡爾積)

# 交叉連接(笛卡爾積) USE girls SELECT b.* ,bo.* FROM beauty b CROSS JOIN boys bo;

常見連接類型總結:

總結

以上是生活随笔為你收集整理的二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)的全部內容,希望文章能夠幫你解決所遇到的問題。

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