數據庫學習之多表操作(三)
阿新 • • 發佈:2019-02-14
同步 eat con varchar 字段 har 外連接 分享 技術
數據庫學習之多表操作
目錄
外鍵
——什麽是外鍵
——增加與刪除外鍵
INNODB支持的ON語句
多表查詢之連接查詢
——內連接:inner join
——外連接:left join與rihgt join
——全連接:full join
多表查詢之復合條件連接查詢
多表查詢之子查詢
以下內容為擴展和演示:http://www.cnblogs.com/yuanchenqi/articles/6357507.html
外鍵
什麽是外鍵
外鍵是用來關聯兩張表的。 切記:作為外鍵一定要和關聯主鍵的數據類型保持一致。 關聯外鍵的格式:[ADD CONSTRAINT charger_fk_stu]FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)
--外鍵約束對子表的含義: 如果在父表中找不到候選鍵,則不允許在子表上進行insert/update --外鍵約束對父表的含義: 在父表上進行update/delete以更新或刪除在子表中有一條或多條對 -- 應匹配行的候選鍵時,父表的行為取決於:在定義子表的外鍵時指定的 -- on update/on delete子句
每一個班主任會對應多個學生 , 而每個學生只能對應一個班主任 先準備兩張表:
父表: CREATE TABLE ClassCharger( id TINYINT PRIMARY KEY auto_increment, name VARCHAR (20), age INT , is_marriged boolean ); INSERT INTO ClassCharger (name,age,is_marriged) VALUES ("冰冰",29,0), ("丹丹",30,0), ("歪歪",27,0), ("姍姍",20,0), ("小雨",21,0); 子表: CREATE TABLE Student( id INT PRIMARY KEY auto_increment, name VARCHAR (20), charger_id TINYINT, --切記:作為外鍵一定要和關聯主鍵的數據類型保持一致 FOREIGN KEY (charger_id) REFERENCES ClassCharger(id) ) ENGINE=INNODB; INSERT INTO Student(name,charger_id) VALUES ("alvin1",2), ("alvin2",4), ("alvin3",1), ("alvin4",3), ("alvin5",1), ("alvin6",3), ("alvin7",2);
現在我們有5位老師,7位同學。
如果我們現在對老師的表進行操作,比如刪除某位老師,按道理來說,如果這位老師有管理的學生,就不能直接刪除,除非將他的學生刪除或者劃到其他老師管理下。
如果你沒有關聯的話,就沒有約束的對老師表做任何操作。
但是現在我們把老師表的id和學生表的charger_id關聯起來,你的操作就會受到限制。
增加外鍵和刪除外鍵
ALTER TABLE student ADD CONSTRAINT abc FOREIGN KEY(charger_id) REFERENCES classcharger(id); ALTER TABLE student DROP FOREIGN KEY abc;
INNODB支持的ON語句
-----------------innodb支持的四種方式--------------------------------------- -----cascade方式 在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄 -----外鍵的級聯刪除:如果父表中的記錄被刪除,則子表中對應的記錄自動被刪除-------- FOREIGN KEY (charger_id) REFERENCES ClassCharger(id) ON DELETE CASCADE ------set null方式 在父表上update/delete記錄時,將子表上匹配記錄的列設為null -- 要註意子表的外鍵列不能為not null FOREIGN KEY (charger_id) REFERENCES ClassCharger(id) ON DELETE SET NULL ------Restrict方式 :拒絕對父表進行刪除更新操作(了解) ------No action方式 在mysql中同Restrict,如果子表中有匹配的記錄,則不允許對父表對應候選鍵 -- 進行update/delete操作(了解)
多表查詢之連接查詢
-- 準備兩張表 -- company.employee -- company.department create table employee( emp_id int auto_increment primary key not null, emp_name varchar(50), age int, dept_id int ); insert into employee(emp_name,age,dept_id) values (‘A‘,19,200), (‘B‘,26,201), (‘C‘,30,201), (‘D‘,24,202), (‘E‘,20,200), (‘F‘,38,204); create table department( dept_id int, dept_name varchar(100) ); insert into department values (200,‘人事部‘), (201,‘技術部‘), (202,‘銷售部‘), (203,‘財政部‘);
內連接:inner join
查詢兩張表中都有的關聯數據,相當於利用條件從笛卡爾積結果中篩選出了正確的結果。
外連接:left join與rihgt join
(1)左外連接:在內連接的基礎上增加左邊有右邊沒有的結果 select * from employee left join department on employee.dept_id = department.dept_id; (2)右外連接:在內連接的基礎上增加右邊有左邊沒有的結果 select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id; (3)全外連接:在內連接的基礎上增加左邊有右邊沒有的和右邊有左邊沒有的結果 -- mysql不支持全外連接 full JOIN -- mysql可以使用此種方式間接實現全外連接 select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id UNION select * from employee LEFT JOIN department on employee.dept_id = department.dept_id;
全連接:full join(笛卡爾積查詢)
多表查詢之復合條件連接查詢
查詢員工年齡大於等於25歲的部門 SELECT DISTINCT department.dept_name FROM employee,department WHERE employee.dept_id = department.dept_id AND age>25; 以內連接的方式查詢employee和department表,並且以age字段的升序方式顯示 select employee.emp_id,employee.emp_name,employee.age,department.dept_name from employee,department where employee.dept_id = department.dept_id order by age asc;
多表查詢之子查詢
子查詢是將一個查詢語句嵌套在另一個查詢語句中。 內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件。 子查詢中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字 還可以包含比較運算符:= 、 !=、> 、<等
1. 帶IN關鍵字的子查詢 查詢employee表,但dept_id必須在department表中出現過 select * from employee where dept_id IN (select dept_id from department);
2. 帶比較運算符的子查詢 =、!=、>、>=、<、<=、<> 查詢員工年齡大於等於25歲的部門 select dept_id,dept_name from department where dept_id IN (select DISTINCT dept_id from employee where age>=25);
3. 帶EXISTS關鍵字的子查詢 EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。 而是返回一個真假值。Ture或False 當返回Ture時,外層查詢語句將進行查詢;當返回值為False時,外層查詢語句不進行查詢 select * from employee WHERE EXISTS (SELECT dept_name from department where dept_id=203); department表中存在dept_id=203,Ture select * from employee WHERE EXISTS (SELECT dept_name from department where dept_id=205); -- Empty set (0.00 sec) ps: create table t1(select * from t2);
數據庫學習之多表操作(三)