JavaWeb筆記002 sql表關係

本文是個人自學過程中總結的SQL表關係方面的基本知識

外鍵約束:一對多

用戶和訂單	
-- 創建用戶表
create  table user(
	id int primary key auto_increment,
	username varchar(20)
);

-- 創建訂單表
create  table orders(
	id int primary key auto_increment,
	totalprice double,
	user_id int
);

爲了保證數據的有效性和完整性,添加約束(外鍵約束).
	在多表的一方添加外鍵約束
		格式:
			alter table 多表名稱 add foreign key(外鍵名稱) references 一表名稱(主鍵);
		例如:
			alter table orders add foreign key(user_id) references user(id);
添加了外鍵約束之後有如下特點:★
	1.主表中不能刪除從表中已引用的數據
	2.從表中不能添加主表中不存在的數據
開發中處理一對多:★
	在多表中添加一個外鍵,名稱一般爲主表的名稱_id,字段類型一般和主表的主鍵的類型保持一致,
	爲了保證數據的有效性和完整性,在多表的外鍵上添加外鍵約束即可.

多對多

例子:商品和訂單
	-- 創建商品表
create table product(
	id int primary key auto_increment,
	name varchar(20),
	price double
);

-- 創建中間表
create table orderitem(
	oid int,
	pid int
);
	
-- 添加外鍵約束
alter table orderitem add foreign key(oid) references orders(id);
alter table orderitem add foreign key(pid) references product(id);

開發中處理多對多:★
	引入一張中間表,存放兩張表的主鍵,一般會將這兩個字段設置爲聯合主鍵,這樣就可以將多對多的關係拆分
	成兩個一對多了
	爲了保證數據的有效性和完整性
		需要在中間表上添加兩個外鍵約束即可.

多表查詢

笛卡爾積:查詢出來的數量是a中的數據數量乘以b中的數據數量
	多張表無條件的聯合查詢.沒有任何意思
		select a.*,b.* from a,b;
		
內連接:★
	格式1:顯式的內連接
		select a.*,b.* from a [inner] join b on ab的連接條件
	格式2:隱式的內連接
		select a.*,b.* from a,b where ab的連接條件
外連接:★
	左外連接:★
		select a.*,b.* from a left [outer] join b on 連接條件;
		意思:
			先展示join左邊的(a)表的所有數據,根據條件關聯查詢 join右邊的表(b),符合條件則展示出來,不符合以null值展示.
			★★★★★即a所有的數據都會展示,b中滿足條件的和在展示。參考下面的例子
	右外連接:
		select a.*,b.* from b right [outer] join a on 連接條件;
		意思:
			先展示jion右邊的表(a)表的所有數據,根據條件關聯查詢join左邊的表(b),符合條件則展示出來,不符合以null值展示.
子查詢:★
	一個查詢依賴另一個查詢.
	
例子:
	查詢用戶的訂單,沒有訂單的用戶不顯示
		隱式內連接:
			select user.*,orders.* from user ,orders where user.id=orders.user_id;
		顯示內連接
			select user.*,orders.* from user join orders on user.id=orders.user_id;
	查詢所有用戶的訂單詳情
		左外連接: user在左
			select user.*,orders.* from user left join orders on user.id=orders.user_id;
			★★★★
			如果orders有3個訂單:{_id=1 totalprice=1314 user_id=3}  {_id=2 totalprice=1315 user_id=3}  {_id=3 totalprice=1316 user_id=4}
			user有3個用戶{_id=2 name=王五} {_id=3 name=李四} {_id=4 name=張三}
			上面查出來3個用戶(所有用戶都會列出來),總共有3個訂單符合條件,一個用戶沒訂單,爲null
			如果是
			select user.*,orders.* from user left join orders on user._id=orders.user_id and orders.totalprice=1314;
			查出來的是3個用戶(還是所有用戶),滿足條件的有一個訂單,另外2個用戶沒訂單
			
			在通俗一點,就是:笛卡爾積附加上條件查出來的結果+left外鏈接中不滿足條件的所有值(對應於用戶表中沒訂單的用戶)
			★★★★
	查詢所有訂單的用戶詳情
		右外連接:orders 在右
			select orders.*,user.* from user right join orders on user.id=orders.user_id;
			
			
子查詢例子:
	查看用戶爲張三的訂單詳情
		1.先查詢張三的id
			select id from User where username = '張三';// 3
		2.select * from orders where user_id = ?;
		
		兩個合二爲一
			select * from orders where user_id = (select id from User where username = '張三');
	查詢出訂單的價格大於300的所有用戶信息。
		1.先查詢出訂單價格>300的用戶的id
			select user_id from orders where price >300;//(3,3,5,null)
		2.select * from user where id in(3,3,5,null);
		
		兩個合二爲一:
			select * from user where id in(select user_id from orders where price >300);
	查詢訂單價格大於300的訂單信息及相關用戶的信息。
		內連接:
			select orders.*,user.* from orders,user where user.id=orders.user_id  and orders.price>300 ;
		
		子查詢:	是將一個查詢的結果作爲一張臨時表		
			select user.*,tmp.* from user,(select * from orders where price>300) as tmp where user.id=tmp.user_id;
	
	給表起別名
		格式: 表 [as] 別名

字典表

使用情景:不能隨便填寫,有固定的選項的內容,例如性別,
性別字典表

id  description 
1   男
2   女

還可以添加一些別的輔助字段,例如:排序、是否停用、備註等...

理論上每個字典最好單獨建一張表,也可以合併,例如性別和省份,但是需要增加字段加以區別


id  type    description
1   001     男
2   001     女
3   002     北京
4   002     上海

type用來區別不同的類別,001表示性別字典,002表示省份字典
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章