mysql的多表關係

mysql的多表關係

一對多:部門和員工,滷肉店和肉,訂單和商品
用戶和訂單 -- 建立用戶表 create table user( id int primary key auto_increment, username varchar(20) );mysql

-- 建立訂單表
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);sql

添加了外鍵約束以後有以下特色: 1.主表中不能刪除從表中已引用的數據 2.從表中不能添加主表中不存在的數據spa

處理一對多: 在多表中添加一個外鍵,名稱通常爲主表的名稱_id,字段類型通常和主表的主鍵的類型保持一致, 爲了保證數據的有效性和完整性,在多表的外鍵上添加外鍵約束便可.code

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

-- 建立中間表
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);

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

多表查詢io

技術分析: 內鏈接 外鏈接 子查詢 ///////////////////////////// 笛卡爾積: 多張表無條件的聯合查詢.沒有任何意思 select a.,b. from a,b;table

內鏈接: 格式1:顯式的內鏈接 select a.,b. from a [inner] join b on ab的鏈接條件 格式2:隱式的內鏈接 select a.,b. from a,b where ab的鏈接條件class

外鏈接: 左外鏈接: select a.,b. from a left [outer] join b on 鏈接條件; 意思: 先展現join左邊的(a)表的全部數據,根據條件關聯查詢 join右邊的表(b),符合條件則展現出來,不符合以null值展現. 右外鏈接: select a.,b. from b right [outer] join a on 鏈接條件; 意思: 先展現jion右邊的表(a)表的全部數據,根據條件關聯查詢join左邊的表(b),符合條件則展現出來,不符合以null值展現.select

子查詢: 一個查詢依賴另外一個查詢.

多表查詢實例:

-- 用戶表(user) create table user (
id int auto_increment primary key,
username varchar(50) -- 用戶姓名
);

-- 訂單表(orders)
   create table `orders` (                                                  
		  `id` int  auto_increment primary key,                                  
		  `price` double,                                           
		  `user_id` int                                       
		);
-- 給訂單表添加外鍵約束
alter table orders add constraint user_fk foreign key (user_id) references user(id); 
 
-- 向user表中添加數據
		insert into user values(3,'張三');
		insert into user values(4,'李四');
		insert into user values(5,'王五');
		insert into user 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);

查詢用戶的訂單,沒有訂單的用戶不顯示
    隱式內鏈接:
        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 在右
        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] 別名
相關文章
相關標籤/搜索