MySQL外鍵約束和多表聯查


 一.創建外鍵

#測試數據表
# 教師表,主表
CREATE TABLE teacher(
    id INT PRIMARY KEY AUTO_INCREMENT,
name varchar(20),
age INT
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

#測試數據:
INSERT INTO teacher values
(1,'范冰冰',22),
(2,'周傑棍',30),
(3,'雙傑倫',35),
(4,'梁朝偉',25);

--------------------------------分割線----------------------------
#學生表,子表
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
name varchar(20),
age INT,
teacher_id INT, # 外鍵要和關聯的主鍵的數據類型一致
FOREIGN KEY (teacher_id) REFERENCES teacher(id) # 添加外鍵
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;
#測試數據:
INSERT INTO student values
(1,'張三',22, 1),
(2,'李四',30,2),
(4,'王五',29,3),
(5,'韓信',61,4),
(6,'劉備',55,4),
(7,'曹操',21,2),
(8,'愛麗絲',32,1),
(9,'趙6',22,2);
 
         
--------------------------------分割線----------------------------
SELECT * FROM student INNER JOIN teacher ON student.teacher_id=teacher.id 
    

 

--------------------------------分割線----------------------------

 增加外鍵和刪除外鍵:

  增加:ALTER TABLE student ADD CONSTRAINT key_name(名字) FOREIGN KEY (teacher_id) REFERENCES teacher(id)
  刪除:ALTER TABLE student DROP FOREIGN KEY key_name
 
        

 二.InnoDB數據庫引擎的ON語句

InnoDB支持的常用方式:
  1.cascade方式:在父表上update或delete記錄時,同步update/delete掉子表的匹配記錄
  FOREIGN KEY (teacher_id) REFERENCES teacher(id) ON DELETE CASCADE # 如果父級表中的記錄刪除了,則子表中相對應的記錄也會自動刪除

  2.set null方式 在父表update或delete記錄時,將子表上的相對於的列設為null
  FOREIGN KEY (teacher_id) REFERENCES teacher(id) ON DELETE SET NULL

#外鍵約束對子表的作用:在父表中找不到選鍵,則不允許在子表上進行 insert/update
#外鍵約束對父表的作用:
在父表上進行update/delete以更新或刪除在子表中有一條或多條對應匹配行的候選鍵時,父表的行為取決於:在定義子表的外鍵時指定的on update/on delete子句

 

 三.多表連接查詢

#創建主測試表
CREATE TABLE role(
role_id int,
role_name varchar(100)
)ENGINE=InnoDB DEFAULT CHARSET=utf8
#測試數據:
INSERT INTO role VALUES (301,'戰士'),
(302,'法師'),
(303,'刺客'),
(304,'ADC');
(306,'打野')
 
         
----------------------------分割線----------------------------------
#創建子測試表
CREATE TABLE hero
( h_id INT auto_increment PRIMARY KEY NOT NULL,
h_name VARCHAR ( 50 ),
age INT,
role_id INT )ENGINE=InnoDB DEFAULT CHARSET=utf8;

#測試數據:
INSERT INTO hero(h_name,age,role_id) VALUES ('蓋倫',22,301),
('流浪法師',23,302),
('布隆',22,303),
('熔岩巨獸',25,301),
('伊澤瑞爾',24,304),
('錘石',26,305),
('琴女',28,305),
('狂戰士',27,301),
('稻草人',29,302),
('詭術妖姬',22,303);

 

  •  內連接
SELECT * FROM hero inner JOIN role on hero.role_id=role.role_id;#笛卡爾積中篩選結果

     

 

 

  •  外連接
1.左連接:在內鏈接的基礎上增加左邊有但右邊沒有的結果
 SELECT * FROM hero LEFT JOIN role on hero.role_id=role.role_id;
    

 

----------------------------分割線----------------------------------

 2.右連接:在內連接的基礎上增加右邊有但左邊沒有的結果

 SELECT * FROM hero RIGHT JOIN role on hero.role_id=role.role_id;

   

----------------------------分割線----------------------------------

 3.全外連接:在內連接的基礎上增加  左邊有右邊沒有 和 右邊有左邊沒有 的結果

  

SELECT * FROM hero RIGHT JOIN role ON hero.role_id=role.role_id
UNION
SELECT * FROM hero LEFT JOIN role ON hero.role_id=role.role_id;

   

##mysql不支持全外連接的,可以用以上的方式間接實現

 

 四:多表復合條件連接查詢

SELECT role.role_name FROM hero,role WHERE hero.age >= 29 AND role.role_id=hero.role_id # 笛卡爾積中篩選年齡大於或等於29歲的英雄的分類
SELECT role.role_name FROM hero INNER JOIN role WHERE hero.age >= 29 AND role.role_id=hero.role_id #內連接查詢

 

 五:子查詢

#子查詢是將一條完整的查詢語句嵌套在另外一條查詢語句里
#內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件
#子查詢用於為主查詢返回其所需數據,或者對檢索數據進行進一步的限制。
#子查詢可以在 SELECT、INSERT、UPDATE 和 DELETE 語句中,同 =、<、>、>=、<=、IN、BETWEEN 等運算符一起使用。
  • 子查詢必須括在圓括號中。
  • 子查詢的 SELECT 子句中只能有一個列,除非主查詢中有多個列,用於與子查詢選中的列相比較。
  • 子查詢不能使用 ORDER BY,不過主查詢可以。在子查詢中,GROUP BY 可以起到同 ORDER BY 相同的作用。
  • 返回多行數據的子查詢只能同多值操作符一起使用,比如 IN 操作符。
  • SELECT 列表中不能包含任何對 BLOB、ARRAY、CLOB 或者 NCLOB 類型值的引用。
  • 子查詢不能直接用在集合函數中。
  • BETWEEN 操作符不能同子查詢一起使用,但是 BETWEEN 操作符可以用在子查詢中。

 #SELECT * from hero WHERE hero.role_id in (SELECT role_id FROM role)

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

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



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