天天看點

Day13JavaWeb【Mybatis之sql複習】多表查詢(項目中最重要)

多表的查詢介紹

  • (1)初始化資料
  • (2)實際項目中,資料儲存于多個表,如果需要的資料來自多個表,就要使用多表查詢
  • (3)查詢的分類

    》1:交叉連接配接查詢(了解)

    》2:内連接配接查詢

    隐式内連接配接,顯式内連接配接***

    》3:外連接配接查詢

    左外連接配接, 右外連接配接

    》4:子查詢

# 初始化資料
create database day13_3;
use database day13_3;

create table category (
  cid int primary key ,
  cname varchar(50)
);
create table products(
  pid int primary key ,
  pname varchar(50),
  price int,
  flag varchar(2),        #是否上架标記為:1表示上架、0表示下架
  category_id int,
  constraint products_fk foreign key (category_id) references category (cid)
);


#分類
insert into category(cid,cname) values('1','家電');
insert into category(cid,cname) values('2','服飾');
insert into category(cid,cname) values('3','化妝品');
#商品
insert into products(pid, pname,price,flag,category_id) values('1','聯想',5000,'1',1);
insert into products(pid, pname,price,flag,category_id) values('2','海爾',3000,'1',1);
insert into products(pid, pname,price,flag,category_id) values('3','雷神',5000,'1',1);

insert into products (pid, pname,price,flag,category_id) values('4','傑克瓊斯',800,'1',2);
insert into products (pid, pname,price,flag,category_id) values('5','真維斯',200,'1',2);
insert into products (pid, pname,price,flag,category_id) values('6','花花公子',440,'1',2);

insert into products (pid, pname,price,flag,category_id) values('7','勁霸',2000,'1',2);
insert into products (pid, pname,price,flag,category_id) values('8','香奈兒',800,'1',2);
insert into products (pid, pname,price,flag,category_id) values('9','相宜本草',200,'1',2);      

多表的查詢-交叉連接配接查詢

(1)什麼交叉連接配接查詢

交叉連接配接查詢是将兩張表相乘: A和B —> A * B

(2)什麼是笛卡爾集

兩張表相乘的結果,不論資料是否正确

Day13JavaWeb【Mybatis之sql複習】多表查詢(項目中最重要)

(3)多表查詢的本質

多表查詢可以了解成在笛卡爾集的基礎上進行條件篩選

(4)案例:查詢每個分類以及該分類的所有商品

select * from category,products;      

多表的查詢-内連接配接

  • (1)什麼是内連接配接查詢?

    求的是多張表的交集

    本質就是在笛卡爾集上加條件

  • (2)分類

    隐式内連接配接:select * from A,B where 條件;

    顯式内連接配接:select * from Ainner joinBon條件;(效率更高)

    (3)差別

    》使用關鍵字 inner join

    》前者在笛卡爾集的基礎上篩選,後者在原始表上篩選

    (4)練習:省市

select * from A,B where 條件;

select * from category c,products p where c.cid = p.category_id;

顯式内連接配接:select * from A inner join B on 條件;(效率更高)

select * from category c inner  join products p on c.cid = p.category_id;      
select * from province,city;
select * from province p inner join city c on p.pid = c.pid_fk;      

多表的查詢-外連接配接

  • (1)什麼是外連接配接查詢?

    兩個表中選一個表将資料全部輸出,另一個表沒有對應資料則輸出NULL

  • (2)分類

    左外連接配接

    ​​

    ​select * from A left outer join B on 條件;​

    ​​ 以左表為主,左表中的資料全部輸出,右表中如果沒有同等的資料則補NULL

    右外連接配接

    ​select * from A right outer join B on 條件;​

    ​ 以右表為主,右表中的資料全部輸出,左表中如果沒有同等的資料則補NULL
  • Day13JavaWeb【Mybatis之sql複習】多表查詢(項目中最重要)
# 外連接配接

select * from province p inner join city c on p.pid = c.pid_fk;
# 左外連接配接
select * from province p left outer join city c on p.pid = c.pid_fk;

# 右外連接配接
select * from province p right outer join city c on p.pid = c.pid_fk;      

子查詢

  • (1)什麼叫子查詢?

    select的嵌套:一個select的查詢結果作為另一個select查詢文法的一部分

  • (2)案例

    在商品表中查詢屬于電子分類的商品

select *from product where cid = 1
select cid from category where cname='電子'

select *from product where cid = (select cid from category where cname='電子')