day06 多表查詢
案例2-創建多表,可以描述出表於表之間的關系
常見關系:
一對多. 多對多. 一對一.
ER圖可以描述實體於實體之間的關系
實體用矩形表示 屬性用橢圓表示 關系用菱形表示
一對多: 用戶和訂單 create table userinfoinfo( uid int primary key auto_increment, userinfoname varchar(20) ); create table orders( oid int primary key auto_increment, price double, userinfoinfo_idint );
為了保證數據的有效性和完整性,在多表的一方添加外鍵約束
格式:
alter table 多表名稱 add foreign key(外鍵名稱) references 一表名稱(主鍵);
例如: alter table orders add foreign key (userinfoinfo_id) references userinfoinfo(uid);
添加了外鍵約束之後有如下特點:★
1.主表中不能刪除從表中已引用的數據
2.從表中不能添加主表中不存在的數據
開發中處理一對多:★
在多表中添加一個外鍵,名稱一般為主表的名稱_id,字段類型一般和主表的主鍵的類型保持一致,
為了保證數據的有效性和完整性,在多表的外鍵上添加外鍵約束即可.
////////////////////////////////////////////////
多對多 例子:商品和訂單 -- 創建商品表 create table product( pid int primary key auto_increment, pname varchar(20), price double ); -- 創建中間表 create table orderitem( orders_id int, product_id int ); -- 添加外鍵約束 alter table orderitem add foreign key(orders_id) references orders(oid); alter tableView Codeorderitem add foreign key(product_id) references product(pid);
開發中處理多對多:★
引入一張中間表,存放兩張表的主鍵,一般會將這兩個字段設置為聯合主鍵,這樣就可以將多對多的關系拆分
成兩個一對多了
為了保證數據的有效性和完整性,需要在中間表上添加兩個外鍵約束即可.
///////////////////////////////////////////////////
案例3-多表查詢
笛卡爾積:了解
多張表無條件的聯合查詢.沒有任何意思
select a.*,b.* from a,b;
內連接:★
格式1:顯式的內連接(推薦)
select a.*,b.* from a join b on ab的連接條件
格式2:隱式的內連接
select a.*,b.* from a,b where ab的連接條件
外連接:★(記住一個就行了)
左外連接:★
select a.*,b.* from a left join b on 連接條件;
意思:
先展示join左邊的(a)表的所有數據,根據條件關聯查詢
join右邊的表(b),符合條件則展示出來,不符合以null值展示.
右外連接:
select a.*,b.* from b right [outer] join a on 連接條件;
意思:
先展示jion右邊的表(a)表的所有數據,根據條件關聯查詢join左邊的表(b),
符合條件則展示出來,不符合以null值展示.
子查詢:★
一個查詢依賴另一個查詢.
練習:
查詢用戶的訂單,沒有訂單的用戶不顯示
隱式內連接:
select userinfo.*,orders.* from userinfo ,orders where userinfo.id=orders.userinfo_id;
顯示內連接
select userinfo.*,orders.* from userinfo join orders on userinfo.id=orders.userinfo_id;
查詢所有用戶的訂單詳情
左外連接: userinfo在左
select userinfo.*,orders.* from userinfo left join orders on userinfo.id=orders.userinfo_id;
查詢所有訂單的用戶詳情
右外連接:orders 在右
select orders.*,userinfo.* from userinfo right join orders on userinfo.id=orders.userinfo_id;
練習:
查看用戶為張三的訂單詳情
1.先查詢張三的id
select id from userinfo where username = ‘張三‘;// 3
2.select * from orders where userinfo_id = ?;
兩個合二為一
select * from orders where userinfo_id = (select id from userinfo where username = ‘張三‘);
查詢出訂單的價格大於300的所有用戶信息。
1.先查詢出訂單價格>300的用戶的id
select userinfo_id from orders where price >300;//(3,3,5,null)
2.select * from userinfo where id in(3,3,5,null);
兩個合二為一:
select * from userinfo where id in(select userinfo_id from orders where price >300);
查詢訂單價格大於300的訂單信息及相關用戶的信息。
內連接:
select orders.*,userinfo.* from orders,userinfo where userinfo.id=orders.userinfo_id and orders.price>300 ;
子查詢: 是將一個查詢的結果作為一張臨時表
select userinfo.*,tmp.* from userinfo,(select * from orders where price>300) as tmp where userinfo.id=tmp.userinfo_id;
給表起別名
格式: 表 [as] 別名
//////////////////////////////////////////////////////////
-- 向userinfo表中添加數據
insert into userinfo values(3,‘張三‘);
insert into userinfo values(4,‘李四‘);
insert into userinfo values(5,‘王五‘);
insert into userinfo values(6,‘趙六‘);
-- 向orders 表中插入數據
insert into orders values(1,1314,3);
insert into orders values(2,1314,3);
insert into orders values(3,15,4);
insert into orders values(4,315,5);
insert into orders values(5,1014,null);
day06 多表查詢