mysql 交叉連接_MySQL教程77-CROSS JOIN 交叉連接

之間所講的查詢語句都是針對一個表的,但是在關系型數據庫中,表與表之間是有聯系的,所以在實際應用中,經常使用多表查詢。多表查詢就是同時查詢兩個或兩個以上的表。

在 MySQL 中,多表查詢主要有交叉連接、內連接和外連接。由于篇幅有限,這里主要講解交叉連接查詢。內連接和外連接將在接下來的教程中講解。

交叉連接(CROSS JOIN)一般用來返回連接表的笛卡爾積。

笛卡爾積

笛卡爾積(Cartesian product)是指兩個集合 X 和 Y 的乘積。

例如,有 A 和 B 兩個集合,它們的值如下:

A = {1,2}

B= {3,4,5}

集合 A×B 和 B×A 的結果集分別表示為:

A×B={(1,3), (1,4), (1,5), (2,3), (2,4), (2,5) };

B×A={(3,1), (3,2), (4,1), (4,2), (5,1), (5,2) };

以上 A×B 和 B×A 的結果就分別叫做兩個集合的笛卡爾積。

并且,從以上結果我們可以看出:

兩個集合相乘,不滿足交換率,即 A×B≠B×A。

A 集合和 B 集合的笛卡爾積是 A 集合的元素個數?× B 集合的元素個數

多表查詢遵循的算法就是以上提到的笛卡爾積,表與表之間的連接可以看成是在做乘法運算。在實際應用中,應避免使用笛卡爾積,因為笛卡爾積中容易存在大量的不合理數據,簡單來說就是容易導致查詢結果重復、混亂。

交叉連接的語法格式如下:

SELECT FROM CROSS JOIN [WHERE子句]

SELECT FROM , [WHERE子句]

語法說明如下:

字段名:需要查詢的字段名稱。

:需要交叉連接的表名。

WHERE 子句:用來設置交叉連接的查詢條件。

注意:多個表交叉連接時,在 FROM 后連續使用 CROSS JOIN 或,即可。以上兩種語法的返回結果是相同的,但是第一種語法才是官方建議的標準寫法。

當連接的表之間沒有關系時,我們會省略掉 WHERE 子句,這時返回結果就是兩個表的笛卡爾積,返回結果數量就是兩個表的數據行相乘。需要注意的是,如果每個表有 1000 行,那么返回結果的數量就有 1000×1000 = 1000000 行,數據量是非常巨大的。

交叉連接可以查詢兩個或兩個以上的表,為了更好的理解,下面先講解兩個表的交叉連接查詢。

例 1

查詢學生信息表和科目信息表,并得到一個笛卡爾積。

為了方便觀察學生信息表和科目表交叉連接后的運行結果,我們先分別查詢出這兩個表的數據,再進行交叉連接查詢。

1)查詢 tb_students_info 表中的數據,SQL 語句和運行結果如下:

mysql> SELECT * FROMtb_students_info;+----+--------+------+------+--------+-----------+

| id | name | age | sex | height | course_id |

+----+--------+------+------+--------+-----------+

| 1 | Dany | 25 | 男 | 160 | 1 |

| 2 | Green | 23 | 男 | 158 | 2 |

| 3 | Henry | 23 | 女 | 185 | 1 |

| 4 | Jane | 22 | 男 | 162 | 3 |

| 5 | Jim | 24 | 女 | 175 | 2 |

| 6 | John | 21 | 女 | 172 | 4 |

| 7 | Lily | 22 | 男 | 165 | 4 |

| 8 | Susan | 23 | 男 | 170 | 5 |

| 9 | Thomas | 22 | 女 | 178 | 5 |

| 10 | Tom | 23 | 女 | 165 | 5 |

+----+--------+------+------+--------+-----------+

10 rows in set (0.00 sec)

2)查詢 tb_course 表中的數據,SQL 語句和運行結果如下:

mysql> SELECT * FROMtb_course;+----+-------------+

| id | course_name |

+----+-------------+

| 1 | Java |

| 2 | MySQL |

| 3 | Python |

| 4 | Go |

| 5 | C++ |

+----+-------------+

5 rows in set (0.00 sec)

3)使用 CROSS JOIN 查詢出兩張表中的笛卡爾積,SQL 語句和運行結果如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

mysql> SELECT * FROM tb_course CROSS JOINtb_students_info;+----+-------------+----+--------+------+------+--------+-----------+

| id | course_name | id | name | age | sex | height | course_id |

+----+-------------+----+--------+------+------+--------+-----------+

| 1 | Java | 1 | Dany | 25 | 男 | 160 | 1 |

| 2 | MySQL | 1 | Dany | 25 | 男 | 160 | 1 |

| 3 | Python | 1 | Dany | 25 | 男 | 160 | 1 |

| 4 | Go | 1 | Dany | 25 | 男 | 160 | 1 |

| 5 | C++ | 1 | Dany | 25 | 男 | 160 | 1 |

| 1 | Java | 2 | Green | 23 | 男 | 158 | 2 |

| 2 | MySQL | 2 | Green | 23 | 男 | 158 | 2 |

| 3 | Python | 2 | Green | 23 | 男 | 158 | 2 |

| 4 | Go | 2 | Green | 23 | 男 | 158 | 2 |

| 5 | C++ | 2 | Green | 23 | 男 | 158 | 2 |

| 1 | Java | 3 | Henry | 23 | 女 | 185 | 1 |

| 2 | MySQL | 3 | Henry | 23 | 女 | 185 | 1 |

| 3 | Python | 3 | Henry | 23 | 女 | 185 | 1 |

| 4 | Go | 3 | Henry | 23 | 女 | 185 | 1 |

| 5 | C++ | 3 | Henry | 23 | 女 | 185 | 1 |

| 1 | Java | 4 | Jane | 22 | 男 | 162 | 3 |

| 2 | MySQL | 4 | Jane | 22 | 男 | 162 | 3 |

| 3 | Python | 4 | Jane | 22 | 男 | 162 | 3 |

| 4 | Go | 4 | Jane | 22 | 男 | 162 | 3 |

| 5 | C++ | 4 | Jane | 22 | 男 | 162 | 3 |

| 1 | Java | 5 | Jim | 24 | 女 | 175 | 2 |

| 2 | MySQL | 5 | Jim | 24 | 女 | 175 | 2 |

| 3 | Python | 5 | Jim | 24 | 女 | 175 | 2 |

| 4 | Go | 5 | Jim | 24 | 女 | 175 | 2 |

| 5 | C++ | 5 | Jim | 24 | 女 | 175 | 2 |

| 1 | Java | 6 | John | 21 | 女 | 172 | 4 |

| 2 | MySQL | 6 | John | 21 | 女 | 172 | 4 |

| 3 | Python | 6 | John | 21 | 女 | 172 | 4 |

| 4 | Go | 6 | John | 21 | 女 | 172 | 4 |

| 5 | C++ | 6 | John | 21 | 女 | 172 | 4 |

| 1 | Java | 7 | Lily | 22 | 男 | 165 | 4 |

| 2 | MySQL | 7 | Lily | 22 | 男 | 165 | 4 |

| 3 | Python | 7 | Lily | 22 | 男 | 165 | 4 |

| 4 | Go | 7 | Lily | 22 | 男 | 165 | 4 |

| 5 | C++ | 7 | Lily | 22 | 男 | 165 | 4 |

| 1 | Java | 8 | Susan | 23 | 男 | 170 | 5 |

| 2 | MySQL | 8 | Susan | 23 | 男 | 170 | 5 |

| 3 | Python | 8 | Susan | 23 | 男 | 170 | 5 |

| 4 | Go | 8 | Susan | 23 | 男 | 170 | 5 |

| 5 | C++ | 8 | Susan | 23 | 男 | 170 | 5 |

| 1 | Java | 9 | Thomas | 22 | 女 | 178 | 5 |

| 2 | MySQL | 9 | Thomas | 22 | 女 | 178 | 5 |

| 3 | Python | 9 | Thomas | 22 | 女 | 178 | 5 |

| 4 | Go | 9 | Thomas | 22 | 女 | 178 | 5 |

| 5 | C++ | 9 | Thomas | 22 | 女 | 178 | 5 |

| 1 | Java | 10 | Tom | 23 | 女 | 165 | 5 |

| 2 | MySQL | 10 | Tom | 23 | 女 | 165 | 5 |

| 3 | Python | 10 | Tom | 23 | 女 | 165 | 5 |

| 4 | Go | 10 | Tom | 23 | 女 | 165 | 5 |

| 5 | C++ | 10 | Tom | 23 | 女 | 165 | 5 |

+----+-------------+----+--------+------+------+--------+-----------+

50 rows in set (0.00 sec)

View Code

由運行結果可以看出,tb_course 和 tb_students_info 表交叉連接查詢后,返回了 50 條記錄。可以想象,當表中的數據較多時,得到的運行結果會非常長,而且得到的運行結果也沒太大的意義。所以,通過交叉連接的方式進行多表查詢的這種方法并不常用,我們應該盡量避免這種查詢。

例 2

查詢 tb_course 表中的 id 字段和 tb_students_info 表中的 course_id 字段相等的內容, SQL 語句和運行結果如下:

mysql> SELECT * FROM tb_course CROSS JOINtb_students_info-> WHERE tb_students_info.course_id =tb_course.id;+----+-------------+----+--------+------+------+--------+-----------+

| id | course_name | id | name | age | sex | height | course_id |

+----+-------------+----+--------+------+------+--------+-----------+

| 1 | Java | 1 | Dany | 25 | 男 | 160 | 1 |

| 2 | MySQL | 2 | Green | 23 | 男 | 158 | 2 |

| 1 | Java | 3 | Henry | 23 | 女 | 185 | 1 |

| 3 | Python | 4 | Jane | 22 | 男 | 162 | 3 |

| 2 | MySQL | 5 | Jim | 24 | 女 | 175 | 2 |

| 4 | Go | 6 | John | 21 | 女 | 172 | 4 |

| 4 | Go | 7 | Lily | 22 | 男 | 165 | 4 |

| 5 | C++ | 8 | Susan | 23 | 男 | 170 | 5 |

| 5 | C++ | 9 | Thomas | 22 | 女 | 178 | 5 |

| 5 | C++ | 10 | Tom | 23 | 女 | 165 | 5 |

+----+-------------+----+--------+------+------+--------+-----------+

10 rows in set (0.01 sec)

如果在交叉連接時使用 WHERE 子句,MySQL 會先生成兩個表的笛卡爾積,然后再選擇滿足 WHERE 條件的記錄。因此,表的數量較多時,交叉連接會非常非常慢。一般情況下不建議使用交叉連接。

在 MySQL 中,多表查詢一般使用內連接和外連接,它們的效率要高于交叉連接。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/270663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/270663.shtml
英文地址,請注明出處:http://en.pswp.cn/news/270663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python web django base skill

web框架本質 socket 業務邏輯框架實現socket tonado node.js 使用WSGI實現socket django flask 自己實現框架思路 wsgiref socket 路由系統 自己寫邏輯(views) jinja2 模板引擎(templates) 實現動態頁面,修改返回給瀏覽器的字符串 去…

電腦常見的VGA、DVI、PS/2、USB等接口知識筆記

我們經常見到電腦和網絡設備上都少不了VGA、DVI、PS/2、USB等常用接口,那些接口里面有多個針腳,他們每個針腳都有自己的用途,今天電腦學習小編就帶大家一起看看這些接口神秘用途。 現在很多朋友們可能會遇到VGA線或HDMI線不夠長,或…

mysql kill_Mysql使用kill命令解決死鎖問題(殺死某條正在執行的sql語句)

在使用mysql運行某些語句時,會因數據量太大而導致死鎖,沒有反映。這個時候,就需要kill掉某個正在消耗資源的query語句即可, KILL命令的語法格式如下:KILL [CONNECTION | QUERY] thread_id每個與mysqld的連接都在一個獨…

數據庫:MySQL、HBase、ElasticSearch三者對比

1、概念介紹 MySQL:關系型數據庫,主要面向OLTP,支持事務,支持二級索引,支持sql,支持主從、Group Replication架構模型(本文全部以Innodb為例,不涉及別的存儲引擎)。 HBas…

mysql 附加數據庫文件_mysql附加數據庫文件

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云數據庫專家保駕護航,為用戶…

SpringBoot集成Mybatis用法筆記

今天給大家整理SpringBoot集成Mybatis用法筆記。希望對大家能有所幫助&#xff01;搭建一個SpringBoot基礎項目。具體可以參考SpringBoot:搭建第一個Web程序引入相關依賴<dependencies><dependency><groupId>org.springframework.boot</groupId><ar…

wifi-mac

//18:a6:f7:12:0b:8b //18:a6:f7:1e:a9:57 //18:a6:f7:1f:8e:69 //18:a6:f7:12:0b:9c //18:a6:f7:1f:cd:d4 //18:a6:f7:1c:94:35 轉載于:https://www.cnblogs.com/mayidudu/p/5991781.html

網絡知識:交換機中的半雙工與全雙工知識筆記

今天小編給大家分享一下交換機中半雙工與全雙工相關知識&#xff0c;希望對大家能有所幫助&#xff01; 早期的網絡設備HUB&#xff08;集線器&#xff09;就是半雙工&#xff0c;目前基本沒有人用了&#xff0c;而現在用的SWITCH&#xff08;交換機&#xff09;就是全雙工。 a…

yum 安裝mysql 啟動_linux(centos6.9)下使用yum安裝mysql,及啟動MySQL等

查看系統自帶的mysql版本&#xff1a;rpm -qa | grep mysql卸載mysql&#xff1a;rpm -e mysql-libs-5.1.73-8.el6_8.x86_64 --nodeps1. 安裝mysql 服務器端&#xff1a;yum -y install mysql-server mysql-devel2. 安裝mysql客戶端&#xff1a;yum install mysql3. 啟動mysql服…

硬件知識:U盤插入電腦沒反應相關解決辦法整理

目錄 一、U盤可能被隱藏 二、USB端口被BIOS禁用 三、電腦的USB驅動可能有問題 今天小編給大家介紹一下U盤插入電腦沒反應相應的解決方案&#xff0c;希望對大家能有所幫助&#xff01; 一、U盤可能被隱藏 首先換臺電腦看看是不是U盤損壞的問題&#xff0c;如果不是&#xff0c;…

分享9個實用的電腦維修技巧,趕緊收藏吧

目錄 01、電腦不能上網 02、電腦藍屏 03、沒有聲音 04、沒有畫面 05、軟件無法啟動 06、顯示器畫面不能滿屏顯示 07、使用過程中自動關機 08、電腦不能開機 09、電腦花屏 今天給大家分享9個實用的電腦維修技巧&#xff0c;趕緊收藏吧&#xff01; 01、電腦不能上網 常見原因1&a…

自媒體資源:分享8個免版權視頻素材網站

目錄 01. 知魚素材 2、 gaiamount 3、 lifeofvids 4、Coverr 5、stock footage 6、vidsplay 7、Pixabay 8、Pexels 今天小編就給大家分享一些免版權的視頻素材網站&#xff0c;有需要的小伙伴趕緊歡迎收藏&#xff01; 01. 知魚素材 https://sucai.zhiyu.art/video 共享協議可免…

win7 mysql msi_windows下的Mysql安裝與基本使用(msi)

本文針對mysql5.6與5.5一、其他版本與安裝方式1.msi(mysql5.7及以上版本參考&#xff1a;https://www.cnblogs.com/zjiacun/p/6653891.html)這里我們用msi吧&#xff0c;只是單純練習的話&#xff0c;簡單很多二、msi安裝(5.5-5.6)1.點擊安裝文件&#xff0c;在出現的安裝向導上…

java中split以“.“ 、“\“、“|”分隔

今天項目里遇到以"." 、"\"、“|”分割字符串&#xff0c;直接用"." 、"\"、“|”無法分割&#xff0c;因為"." 、"\"、“|”是特殊字符&#xff0c;需要轉義&#xff0c;"\\." 、"\\\"、“\…

推薦這11款免費好用的 Mac 軟件

目錄 1、IINA —— 全能視頻播放器 02、大拍檔剪輯助手 03、Dozer 04、Cheatsheet 05、Spectacle 06、Amphetamine 07、Macs Fan Control 08、AdGuard 09、Keka 10、騰訊檸檬清理 11、Cold Turkey Blocker 1、IINA —— 全能視頻播放器 對于Mac OS來說&#xff0c;IINA可以說是…

三角形

源代碼&#xff1a;#include<cstdio> #include<map> #define LL long long#define INF 1000000000 using namespace std; map <double,LL> i; //這個STL差不多就是一個反類型數組。 double f[100001]; LL n,Num(0); LL C(LL N,LL M) //排列組合。 {if (N<…

物理機存放mysql實例原則_MySQL優化筆記(四)--表的設計與優化(單表、多表)...

前面講了SQL優化以及索引的使用、設計優化了&#xff0c;那么接下來就到表的設計與優化啦&#xff01;&#xff01;&#xff01;真實地去設計優化單表結構以及講述多表設計基本原則(結合真實的生產環境的取舍來講述)。文章結構&#xff1a;(1)單表設計與優化&#xff1b;(2)基于…