mysql多表查询

多表查询:一次查询两张以上的表,叫多表查询

1.交叉连接查询:很少使用,有错误数据(笛卡尔集,笛卡尔积)
格式:
select * from 表A,表B;

一次性的查询出分类表和商品表的所有数据
SELECT * FROM category,products;

 

2.内连接查询:在交叉连接查询的基础上,使用外键约束作为查询条件
a.隐式内连接:不使用关键字 [inner] join on
格式:
select * from 表A,表B where 表A.主键 = 表B.外键;
b.显示内连接:使用关键字 [inner] join on
格式:
select * from 表A [inner] join 表B on 表A.主键 = 表B.外键;

-- a.隐式内连接
SELECT * FROM category,products WHERE category.cid = products.category_cid;

-- 使用给表起别名,简化sql语句
SELECT * FROM category c,products p WHERE c.cid = p.category_cid;

-- b.显示内连接
SELECT * FROM category c INNER JOIN products p ON c.cid = p.category_cid;

-- 查询哪些分类的商品已经上架
-- 隐式内连接:多个查询的条件可以使用逻辑运算符连接
SELECT * FROM category c,products p WHERE c.cid = p.category_cid AND p.flag = '1';

-- 显示内连接:on的后边可以继续写where添加其他查询条件
SELECT * FROM category c INNER JOIN products p ON c.cid = p.category_cid WHERE p.flag = '1';
-- 显示内连接:多个查询的条件可以使用逻辑运算符连接
SELECT * FROM category c INNER JOIN products p ON c.cid = p.category_cid AND p.flag = '1';

 

3.外连接查询:在交叉连接查询的基础上,使用外键约束作为查询条件
a.左外连接查询:使用关键字left [outer] join on
格式:
select * from 表A left [outer] join 表B on 表A.主键 = 表B.外键;
注意:
左外连接查询以左边的表为主
左边有的数据,右边没有使用null代替
左边没有的数据,右边也不能出现
b.右外连接查询:使用关键字right [outer] join on
格式:
select * from 表A right[outer] join 表B on 表A.主键 = 表B.外键;
注意:
右外连接查询以右边的表为主
右边有的数据,左边没有使用null代替
右边没有的数据,左边也不能出现

 

-- a.左外连接查询
SELECT * FROM category c LEFT OUTER JOIN products p ON c.cid = p.category_cid;

-- b.右外连接查询
SELECT * FROM category c RIGHT OUTER JOIN products p ON c.cid = p.category_cid;

把左外连接中两张表调换位置,相对于右外连接
SELECT * FROM products p LEFT OUTER JOIN category c ON c.cid = p.category_cid;

 

4.子查询(sql语句的嵌套)
a.一条sql语句的查询结果,作为另外一条sql语句的查询条件
格式:
select * from 表B where 字段 = (select 字段 from 表A [where 条件]);
b.一条sql语句的查询结果,作为另外一条sql语句的另一张表(隐式内连接查询,先过滤数据)
格式:
select * from (select * from 表A [where 条件]),表B where 表A.主键 = 表B.外键

-- 查询商品表,只显示化妆品的信息
SELECT * FROM products WHERE category_cid = 'c003';

-- a.一条sql语句的查询结果,作为另外一条sql语句的查询条件
SELECT * FROM products WHERE category_cid = (
SELECT cid FROM category WHERE cname = '化妆品'
);

-- b.一条sql语句的查询结果,作为另外一条sql语句的另一张表
SELECT * FROM (SELECT * FROM category WHERE cname = '化妆品') c,products p WHERE c.cid = p.category_cid;

-- 查询“化妆品”和“家电”两个分类上架商品详情
SELECT * FROM (SELECT * FROM category WHERE cname = '化妆品' OR cname = '家电') c,products p
WHERE c.cid = p.category_cid;

SELECT * FROM products WHERE category_cid IN (
SELECT cid FROM category WHERE cname IN ('化妆品','家电')
);

 

转载于:https://www.cnblogs.com/xiaomingVVV/p/11331671.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值