1. 程式人生 > 其它 >聯表查詢JOIN ON ★★★

聯表查詢JOIN ON ★★★

聯表查詢JOIN ON ★★★

1、MySQL七種 join 理論


2、七種 join 理論練習

  • 聯表查詢練習專用表SQL程式碼

    -- 建表
    CREATE TABLE tbl_dep(
    id INT(11) NOT NULL AUTO_INCREMENT,
    deptName VARCHAR(22) DEFAULT NULL,
    addr VARCHAR(22) DEFAULT NULL,
    PRIMARY KEY(id)
    )ENGINE = INNODB DEFAULT CHARSET=utf8;
    
    CREATE TABLE tbl_emp(
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(22) DEFAULT NULL,
    `deptId` VARCHAR(22) DEFAULT NULL,
    PRIMARY KEY (`id`)
    #constraint `fk_deptId` foreign key (`deptId`) references tbl_dep(id);
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    -- 插入資料
    INSERT INTO tbl_dep(deptName,addr) VALUES('hr','111');
    INSERT INTO tbl_dep(deptName,addr) VALUES('bd','112');
    INSERT INTO tbl_dep(deptName,addr) VALUES('vb','113');
    INSERT INTO tbl_dep(deptName,addr) VALUES('sd','114');
    INSERT INTO tbl_dep(deptName,addr) VALUES('yy','115');
    
    INSERT INTO tbl_emp(name,deptId) VALUES('k8',1); 
    INSERT INTO tbl_emp(name,deptId) VALUES('k6',2); 
    INSERT INTO tbl_emp(name,deptId) VALUES('k4',3); 
    INSERT INTO tbl_emp(name,deptId) VALUES('k4',11); 
    
    • tbl_dep 表

    • btl_emp 表

  • 內連線練習(兩表的共有部分)

    內連線語法為

    SELECT 欄位名 FROM 表名 [AS] 表別名 INNER JOIN 表名 [AS] 表別名 ON條件

    -- 內連線練習(兩表共有部分)
    SELECT * FROM tbl_dep d INNER JOIN tbl_emp e ON d.id=e.deptId;
    
  • 左連線練習(左表的全部,右表不滿足部分補NULL

    左連線語法為

    SELECT 欄位名 FROM 表名 [AS] 表別名 LEFT JOIN 表名 [AS] 表別名 ON條件

    -- 左連線練習(左表的全部,右表不滿足補NULL)
    SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId;
    
  • 右連線(右表的全部,左表不滿足部分補NULL

    右連線語法為

    SELECT 欄位名 FROM 表名 [AS] 表別名 RIGHT JOIN 表名 [AS] 表別名 ON條件

    -- 右連線(右表的全部,左表不滿足的補NULL)
    SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId;
    
  • 特殊的左連線(顯示為左表的獨有的資料)

    • 說明:查詢 tbl_dep 表中跟 tbl_emp 表無關聯關係的資料,即 tbl_dep 獨佔,且 tbl_emp 表的顯示列補NULL;

    • 特殊左連線語法為

      SELECT 欄位名 FROM 表名 [AS] 表別名 LEFT JOIN 表名 [AS] 表別名 ON條件 WHERE條件

    -- 特殊的左連線,(顯示為左表的獨有的資料)
    -- 說明:查詢 tbl_dep 表中跟 tbl_emp 表無關聯關係的資料,即 tbl_dep 獨佔,且 tbl_emp 表的顯示列補NULL;
    SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId WHERE e.deptId IS NULL;
    
  • 特殊的右連線(顯示為右表的獨有的資料 )

    • 說明:查詢 tbl_emp 表中跟 tbl_dep 表無關聯關係的資料,即 tbl_emp 獨佔,且 tbl_dep 表的顯示列補NULL;

    • 特殊右連線語法為

      SELECT 欄位名 FROM 表名 [AS] 表別名 RIGHT JOIN 表名 [AS] 表別名 ON條件 WHERE條件

    -- 特殊的右連線(顯示為右表的獨有的資料 )
    -- 說明:查詢 tbl_emp 表中跟 tbl_dep 表無關聯關係的資料,即 tbl_emp 獨佔,且 tbl_dep 表的顯示列補NULL;
    SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId WHERE d.id IS NULL;
    
  • 全連線(顯示全部資料)(mysql 不支援 full outer join)

    全連線其實就是左右連線的合併形式

    可以通過union去重

    全連線依舊會像左右連線一樣自動補null

    -- 全連線(顯示全部資料)(mysql 不支援 full outer join)
    -- UNION :有去重的功能。
    SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId UNION
    SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId;
    

    mysql 不支援 full outer join

  • 顯示兩表的獨有的資料

    顯示兩表獨有資料其實就是特殊左右連線的合併

    可以通過union去重

    自動補null

    -- 顯示兩表的獨有的資料
    SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId WHERE e.deptId IS NULL UNION
    SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId WHERE d.id IS NULL;
    

3、自連線(瞭解即可)

所謂的自連線就是和自己的表連線

核心:一張表拆分為兩張一樣的表

自連線其實就是將一張表視為兩張表,然後再建立父子關係

其精髓就在這裡:

FROM `category` AS a,`category` AS b
  • 自連線專用資料庫表sql

    CREATE TABLE `school1`.`category`(
    `categoryid` INT(3) NOT NULL COMMENT 'id',
    `pid` INT(3) NOT NULL COMMENT '父id 沒有父則為1', 
    `categoryname` VARCHAR(10) NOT NULL COMMENT '種類名字', 
    PRIMARY KEY (`categoryid`) 
    )ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci; 
    
    INSERT INTO `school1`.`category` (`categoryid`, `pid`, `categoryname`) VALUES ('2', '1', '資訊科技');
    insert into `school1`.`CATEGOrY` (`categoryid`, `pid`, `categoryname`) values ('3', '1', '軟體開發');
    insert into `school1`.`category` (`categoryid`, `PId`, `categoryname`) values ('5', '1', '美術設計');
    insert iNTO `School1`.`category` (`categoryid`, `pid`, `categorynamE`) VAlUES ('4', '3', '資料庫'); 
    insert into `school1`.`category` (`CATEgoryid`, `pid`, `categoryname`) values ('8', '2', '辦公資訊');
    insert into `school1`.`category` (`categoryid`, `pid`, `CAtegoryname`) values ('6', '3', 'web開發'); 
    inserT INTO `SCHool1`.`category` (`categoryid`, `pid`, `categoryname`) valueS ('7', '5', 'ps技術');
    
  • 父類表

    categoryid categoryname
    2 資訊科技
    3 軟體開發
    5 美術設計
  • 子類表

    pid categoryid categoryname
    3 4 資料庫
    3 6 web開發
    5 7 ps技術
    2 8 辦公資訊
  • 查詢父類對應的子類關係

    父類 子類
    資訊科技 辦公資訊
    軟體開發 資料庫
    軟體開發 web開發
    美術設計 ps技術

上邊這三個表先看懂,然後我們用 sql 語句去實現查詢父子資訊

  • sql 語句實現查詢父子資訊

    -- 查詢父子關係
    SELECT a.`categoryname` AS '父類',b.`categoryname` AS '子類'
    FROM `category` AS a,`category` AS b
    WHERE a.`categoryid`=b.`pid`;
    

4、聯表查詢練習

1.查詢學員所屬年級(學號,姓名,年級名稱)

-- 1.查詢學員所屬年級(學號,姓名,年級名稱)
SELECT `studentno`,`studentname`,`gradename`
FROM `student` s
INNER JOIN `grade` g
ON s.`gradeid`=g.`gradeid`;

2.查詢科目所屬年級(科目編號,科目名稱,所屬年級名稱)

-- 2.查詢科目所屬年級(科目編號,科目名稱,所屬年級名稱)
SELECT `subjectno`,`subjectname`,`gradename`
FROM `subject` s
INNER JOIN `grade` g
ON s.`gradeid`=g.`gradeid`;

3.查詢參加 '資料庫結構-1' 考試同學的資訊:學號,學生姓名,科目名,分數

-- 3.查詢參加 '資料庫結構-1' 考試同學的資訊:學號,學生姓名,科目名,分數
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno`
WHERE subjectname='資料庫結構-1';