MySQL:兩表取交集、並集、差集


創建兩個表:

CREATE TABLE a_student(
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵',
  sno VARCHAR(20) NOT NULL COMMENT '學號',
  sname VARCHAR(20) NOT NULL COMMENT '性名',
  sex TINYINT NOT NULL COMMENT '性別 1:男,2:女',
  sage int COMMENT '年齡',
  CREATE_time datetime DEFAULT NULL COMMENT '創建時間',
  test_time datetime COMMENT '測試時間',
  UPDATE_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間'
);

CREATE TABLE b_student(
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵',
  sno VARCHAR(20) NOT NULL COMMENT '學號',
  sname VARCHAR(20) NOT NULL COMMENT '性名',
  sex TINYINT NOT NULL COMMENT '性別 1:男,2:女'

);

 添加數據:

a_student:

 b_student:

 

查詢並集UNION ALL

例1:兩表字段相同

SELECT sno,sname FROM a_student
UNION ALL
SELECT sno,sname FROM b_student

例2:兩表字段不同

SELECT sno,sname FROM a_student
UNION ALL
SELECT sno,sex FROM b_student

 

例3:兩表字段數量不一樣

SELECT * FROM a_student  UNION ALL
SELECT sno,sname FROM b_student

 例4:兩表字段數量不一樣

SELECT sno,sname FROM a_stunt
UNION ALL
SELECT sno FROM b_student

 查詢並集UNION 

 例1:兩表字段不同

SELECT sno,sname FROM a_student
UNION
SELECT sno,sex FROM b_student

結果不明顯,新增數據:

a_student:

 例2:兩表字段相同,且有重復數據(UNION ALL)

SELECT sno,sname FROM a_student
UNION ALL
SELECT sno,sname FROM b_student

 

  例3:兩表字段相同,且有重復數據(UNION)

SELECT sno,sname FROM a_student
UNION
SELECT sno,sex FROM b_student

 

 總結:去重去的是完全相同的數據,指查詢的兩個字段值都相同

 

交集INNER JOIN

-- INNER JOIN (等值連接) 只返回兩個表中聯結字段相等的行
-- inner join並不以誰為基礎,它只顯示符合條件的記錄.

例1:以a表為主表

SELECT a.*
FROM a_student a
INNER JOIN b_student b
ON a.id=b.id AND a.sname=b.sname;

 例2:以b表為主表

-- USING(id,name) 等價於 on后面的條件
SELECT b.* FROM a_student a
INNER JOIN b_student b USING(id,sname)

 

差集:

例1:a-b

SELECT a.*
FROM
a_student a
LEFT JOIN b_student b
ON a.id=b.id AND a.sname=b.sname
WHERE b.id IS NULL

 

 例2:b-a

SELECT b.*
FROM
a_student a
RIGHT JOIN b_student b
ON a.id=b.id AND a.sname=b.sname
WHERE a.id IS NULL

 

補充:

單純的外連接

例1:右外連接

 

SELECT *
FROM
a_student a
RIGHT JOIN b_student b
ON a.id=b.id AND a.sname=b.sname

 

例2:左外連接

 

SELECT *
FROM
a_student a
LEFT JOIN b_student b
ON a.id=b.id AND a.sname=b.sname

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM