SQL查询(多表查询)

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

目标:

 多表查询到现在,掌握的不是很深,今晚就在写一遍。(小感慨)

 多表查询分为:交叉连接查询,内连接查询,外连接查询,子查询。

首先数据准备:

​
# 分类表
CREATE TABLE category (
  cid VARCHAR(32) PRIMARY KEY ,
  cname VARCHAR(50)
);

#商品表
CREATE TABLE products(
  pid VARCHAR(32) PRIMARY KEY ,
  pname VARCHAR(50),
  price INT,
  flag VARCHAR(2), #是否上架标记为:1表示上架、0表示下架
  category_id VARCHAR(32),
  CONSTRAINT products_fk FOREIGN KEY (category_id) REFERENCES category (cid)
);

#分类
INSERT INTO category(cid,cname) VALUES('c001','家电');
INSERT INTO category(cid,cname) VALUES('c002','服饰');
INSERT INTO category(cid,cname) VALUES('c003','化妆品');

INSERT INTO category(cid,cname) VALUES('c004','奢侈品');
#商品
INSERT INTO products(pid, pname,price,flag,category_id) VALUES('p001','联想',5000,'1','c001');
INSERT INTO products(pid, pname,price,flag,category_id) VALUES('p002','海尔',3000,'1','c001');
INSERT INTO products(pid, pname,price,flag,category_id) VALUES('p003','雷神',5000,'1','c001');

INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p004','JACK JONES',800,'1','c002');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p005','真维斯',200,'1','c002');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p006','花花公子',440,'1','c002');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p007','劲霸',2000,'1','c002');

INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p008','香奈儿',800,'1','c003');
INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p009','相宜本草',200,'1','c003');

​

多表查询:

交叉连接查询:

     注意:交叉连接查询,会出现笛卡尔积这种情况。

     语法:select * from A,B;

     问题:

SELECT * FROM products,category;

内连接查询:

 内连接查询分为左外连接,右外连接。

隐式内连接:`select * from A,B where 条件;`
显示内连接:`select * from A inner join B on 条件;

问题:查询哪些分类的商品已经上架?

代码:

#隐式内连接
SELECT * FROM products p,category c WHERE c.cid=p.category_id AND p.flag='1';
#内连接
SELECT * FROM products p INNER JOIN category c ON c.cid=p.category_id WHERE p.flag='1';

外连接查询:

外连接分为左外连接查询和右外连接查询

左外连接:left outer join
右外连接:right outer join

问题:查询每个分类所有商品的个数?

代码:

#左外连接
SELECT c.cname,COUNT(p.category_id) FROM category c LEFT OUTER JOIN products p ON c.cid=p.category_id GROUP BY c.cname;

#右外连接
SELECT c.cname,COUNT(p.category_id) FROM products p RIGHT OUTER JOIN category c ON c.cid=p.category_id GROUP BY c.cname;

子查询:

一条select语句结果作为另一条select语法一部分(查询条件,查询结果,表等)。
语法:

    select ....查询字段 ... from ... 表.. where ... 查询条件

问题:查询“化妆品”分类上架商品详情

代码:


#隐式内连接
SELECT * FROM products p,category c WHERE c.cid=p.category_id AND cname='化妆品';

##作为查询条件
SELECT *FROM products p WHERE p.category_id=(SELECT cid FROM category WHERE cname='化妆品');

##作为另一张表
SELECT *FROM products p ,(SELECT cid FROM category WHERE cname='化妆品') cc WHERE p.category_id=cc.cid;

猜你喜欢

转载自blog.csdn.net/longyanchen/article/details/93257044