连表查询,分为内连接和外连接,外连接又分为左连接和右连接。
1.内连接:select 列名.... from 表1 inner join 表2 on 表1.外键=表2.主键 【where /order by]
示例:select user.name,order_basic.oid from order_basic inner join user on order_basic.uid=user.uid;
内连接查询出的数据一定是orde_basic表中的uid与user表中uid相一致,切都存在的记录。
2.外连接:
2.1》左连接:select 列名.... from 表1 left outer join 表2 on 表1.外键=表2.主键
示例:select a.name , b.oid from order_basic as b left join user as a on a.uid=b.uid; -- 查询与用户相关的订单信息一览,没有任何订单信息的用户也会被检索出来
--查询出a表所有的信息记录,不管b表有莫有对应的,都会被检索到,如同2.2右连接
2.2》右连接:select 列名.... from 表1 right outer join 表2 on 表1.外键=表2.主键
示例:select a.name,b.oid from order_basic as b right outer join user as a on a.uid=b.uid; -- 查询出b表所有的信息,如果b表中有的记录中a表没有对应的信息,也会显示
****
****
内连接时抽取的是两表间键值一致的记录,外连接时是以其中一个表的全部记录为基准进行检索。左右外连接只是选择那个表作为数据抽取的基准上有所区别,实质是一致的。
3.3个或者3个以上表间的连接:
下面是订单基本信息表(order_basic),订单详细表(order_details),产品表(product),用户表(user)间的连接实例。
select ob.oid,ob.odate,p.name,p.price,od.quantity,u.name from
( 1
( order_basic as ob inner join order_details as od 2
on ob.oid=od.oid)
inner join product as p on od.pid=p.pid
}
inner join user as u on ob.uid=u.uid; -- 要把1和2括号中的看成一个表。
子查询:
语法:select 列名..... from 表名 where 列名 比较运算符 (select 命令);
示例:select * from product where price > (select AVG(price) from product); --
select name,address from user where uid not in(select uid from order_basic where odate='2014/7/28'); -- 在那一天没有下单的用户
select name,address from user where exists (select * from order_basic where user.uid=order_basic.uid); -- 检索出至少下过一个订单的用户(这个为相关子查询:及
对用户表中的每一条记录,进行子查询匹配。如果基数过大,小心给数据库服务器带来的负荷)。