1. 程式人生 > >day06 多表查詢

day06 多表查詢

hid use double 拆分 展示 one ref splay cnblogs

案例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_id 
int );

為了保證數據的有效性和完整性,在多表的一方添加外鍵約束
格式:
  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 table
orderitem add foreign key(product_id) references product(pid);
View Code


開發中處理多對多:★
引入一張中間表,存放兩張表的主鍵,一般會將這兩個字段設置為聯合主鍵,這樣就可以將多對多的關系拆分
成兩個一對多了
為了保證數據的有效性和完整性,需要在中間表上添加兩個外鍵約束即可.
///////////////////////////////////////////////////
案例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 多表查詢