多表查询
- 使用外连接
语法:
select 字段 from 表一 left join 表二 on 连接条件
也可也把left换成right,就变成以表二为基本表,如果表二中有的数据表一没有,也会出现。谁为基本表谁的全部记录就会显示
比如目前有两个表分别是goods和type:
goods表
type表
现要查询商品名称和对应的类型,SQL语句如下:
SELECT goods.Name '商品名称',type.Name '类别' FROM goods LEFT JOIN `type` ON goods.TypeId=type.TypeId
查询结果:
从SQL语句中可以看出基准表是goods,所以goods表中的商品名称都显示出来了,虽然商品飞机没有定义类型。
- 直接在fome后面加上要查询的全部表
SQL语句如下:
SELECT goods.Name '商品名称',type.Name '类别' FROM goods,`type` WHERE goods.TypeId=type.TypeId
查询结果:
这种查询方式不会显示没有匹配的记录。
同表查询
还是通过goods表和type表来演示
要求查询商品名称和对应的类型以及类型的上级类型
从type表中可以发现上级类型还是要在type表中查询。
这时我们可以把type表看成是两张表,给type表取两个别名,再结合多表查询的方法进行查询。
SQL语句如下:
SELECT goods.Name,type1.Name TypeName,Type2.Name AS UpTypeName
FROM Goods,`type` type1 ,`type` type2
WHERE Goods.TypeId=type1.TypeId AND type1.UpId=type2.TypeId
练习
添加一个order,订单表。
- 查询库存量大于0,并且商品名称以“新品”开头的所有商品名称、类别、上级类别、和库存量,并按照商品类别和商品名称顺序排序
SQL:
SELECT goods.Name '商品名称',type1.Name '类别',Type2.Name AS '上级类别',Goods.Stock '库存量'
FROM Goods,`type` type1 ,`type` type2
WHERE Stock>0 AND Goods.Name LIKE '新品%' AND Goods.TypeId=type1.TypeId AND type1.UpId=type2.TypeId
ORDER BY type1.Name AND Goods.Name
结果:
- 查询类别名称为“化妆品”的商品名称以及剩下的商品库存量(需要去掉商品订单中的商品数量)
SQL:
SELECT Goods.Name '商品名称',(Goods.Stock-Order.Num) '库存量'
FROM Goods,`Type`,`Order`
WHERE Type.Name LIKE "化妆品" AND Type.Typeid=Goods.Typeid AND Order.OrderId=Goods.GoodsId
结果:
更多内容请移步个人博客:乌托邦