一.創建外鍵
#測試數據表
# 教師表,主表
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)