一對多
- 在多的一方設(shè)置外鍵, 來建立兩張表的聯(lián)系
一對一
- 看成特殊的一對多, 在任意一張表中設(shè)置外鍵
多對多
- 建立中間表, 同時設(shè)置兩張表的外鍵
注意
- 外鍵一般設(shè)置邏輯外鍵, 不再采用物理外鍵, 方便數(shù)據(jù)的處理
- 以上多對多, 一對多, 一對一都只是兩張表之間的聯(lián)系, 表示的是各表中數(shù)據(jù)的對應(yīng), 而不是表的數(shù)量
多表查詢
- 在單表查詢的基礎(chǔ)上, 直接在加上另一張表即可
select * from tb_emp,tb_dept;
//直接這寫會得到所有笛卡爾積的數(shù)據(jù), 會有很多不符合要求的數(shù)據(jù)產(chǎn)生
//所以一般我們要加上查詢條件, 去掉不需要的數(shù)據(jù)
select * from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;
多表查詢-連接查詢
內(nèi)連接
- 顯式內(nèi)連接的inner可以省略
- on后面跟連接條件, where后面跟查詢條件
eg:
//隱式內(nèi)連接
select tb_emp.name '姓名',tb_dept.name '部門名稱' from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;
//顯式內(nèi)連接
select tb_emp.name '姓名',tb_dept.name '部門名稱' from tb_emp inner join tb_dept on tb_emp.dept_id = tb_dept.id;
外連接
- outer可以省略
eg:
//左外連接
//左外連接將返回左表中的所有記錄烈疚,同時返回與右表匹配的記錄留瞳。如果右表中沒有匹配的記錄,則將返回NULL。
select tb_emp.name '姓名',tb_dept.name '部門名稱' from tb_emp left join tb_dept on tb_emp.dept_id = tb_dept.id;
//右外連接
//右外連接將返回右表中的所有記錄,同時返回與左表匹配的記錄。如果左表中沒有匹配的記錄,則將返回NULL彩匕。
select tb_emp.name '姓名',tb_dept.name '部門名稱' from tb_emp right join tb_dept on tb_emp.dept_id = tb_dept.id;
子查詢
eg:
//標(biāo)量子查詢
select name from tb_emp where dept_id = (select id from tb_dept where name = '教研部');
select * from tb_emp where entrydate > (select entrydate from tb_emp where name = '方東白');
//列子查詢
//返回結(jié)果一列多行
select * from tb_emp where dept_id in(select id from tb_dept where name in('教研部','咨詢部'));
//行子查詢
//返回結(jié)果一行多列
select * from tb_emp where (entrydate,job) = (select entrydate,job from tb_emp where name = '韋一笑');
//表子查詢
//返回結(jié)果多行多列,子表
select e.*,tb_dept.name from (select * from tb_emp where entrydate > '2006-01-01') e, tb_dept where e.dept_id = tb_dept.id;