多表查询语句:
在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如:
SELECT * FROM table1 CROSS JOIN table2
SELECT * FROM table1 JOIN table2
SELECT * FROM table1,table2 (隐式内连接)
由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为 当数据表项目太多的时候,会非常慢。一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN
select * from product cross JOIN type;
select * from product JOIN type;
select * from product ,type WHERE pt_id=t_id;# 可以通过添加条件过滤掉无用数据
内连接
内连接INNER JOIN 在MySQL中把INNER JOIN叫做等值连接,即需要指定等值连接条件在MySQL中CROSS和INNER JOIN被划分在一起。
select 字段 from table1 inner join table2 on 条件;
select * FROM product INNER JOIN type ON pt_id=t_id;
/* 注意:(1)别名:在为表取别名之后,表的原名在当前语句中失效,只能使用别名
(2)由于涉及多表,需要考虑字段同名的情况,所以建议在使用字段时指定是哪一张表中的字段 */
select p.p_id,p.p_name,p.pt_id, t.t_name FROM product as p INNER JOIN type t ON pt_id=t_id
外连接:
MySQL中的外连接,分为左外连接和右外连接,即除了返回符合连接条件的结果之外,还要返回左表(左连接)或者右 表(右连接)中不符合连接条件的结果,如另一表中无相对应的使用NULL对应。
select 字段 from table1 left [outer] join table2 on 条件;
--右外连接 select 字段 from table1 right [outer] join table2 on 条件;
-- 左外连接 select * FROM product left OUTER JOIN type ON product.pt_id=type.t_id;
-- 右外连接 select * FROM product RIGHT OUTER JOIN type ON product.pt_id=type.t_id;
子查询
一个select语句中包含另一个完整的select语句(被查询表,条件)。 子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子 查询语句了。
SELECT * FROM product WHERE pt_id='t01'; -- 在已获取的数据中,价格>5000 SELECT * FROM (SELECT * FROM product WHERE pt_id='t01') aa WHERE p_price>5000;
-- 2.查询类型为家电,并且价格>5000 -- 查询类型为家电的类型信息type SELECT t_id FROM type WHERE t_name='家电';
-- 在商品表中,获取所有类型为家电的信息 SELECT * FROM product p WHERE p.pt_id = (SELECT t_id FROM type WHERE t_name='家电');
-- 价格>5000 SELECT * FROM (SELECT * FROM product p WHERE p.pt_id = (SELECT t_id FROM type WHERE t_name='家电')) bb WHERE bb.p_price>5000;
表连接的约束条件:
-- WHERE SELECT * FROM product_copy p,type t WHERE p.t_id=t.t_id;
-- ON SELECT * FROM product_copy p LEFT JOIN type t ON p.t_id=t.t_id;
-- USING(字段):指定字段在两张表中名称一致 SELECT * FROM product_copy p LEFT JOIN type t USING(t_id);
多表左联:
SELECT * FROM table LEFT JOIN table1 ON 条件1 LEFT JOIN table2 ON 条件2……
some,any,al
any,in,some,all分别是子查询关键词之一,可以与=、>、>=、<、<=、<>结合起来使用,any表示等于、大于、 大于等于、小于、小于等于、不等于其中的任何一个数据,all表示全部数据。
any,all关键字必须与一个比较操作符一起使用。any关键词可以理解为“对于子查询返回的列中的任一数值,如果比较 结果为true,则返回true”。
-- 1.查询价格不在300~5000区间的,类型为t01,t02的商品
-- 1.1 在300~5000区间 SELECT p_price FROM product WHERE p_price BETWEEN 300 AND 5000;
-- 1.2 不在300~5000区间,类型为t01,t02 SELECT * FROM product WHERE pt_id in ('t01','t02') AND p_price <> all(SELECT p_price FROM product WHERE p_price BETWEEN 300 AND 5000);
-- 2.查询价格不在300~5000区间的,类型为家电或服饰的商品
-- 2.1 在300~5000区间 SELECT p_price FROM product WHERE p_price BETWEEN 300 AND 5000;
-- 2.2 类型家电或服饰的商品id SELECT t_id FROM type where t_name in ('家电','服饰');
-- 2.3 价格不在300~5000区间的,类型为家电或服饰的商品 select * FROM product WHERE pt_id=ANY(SELECT t_id FROM type where t_name in ('家电','服饰')) AND p_price not in(SELECT p_price FROM product WHERE p_price BETWEEN 300 AND 5000);
-- 3.查询价格大于所有化妆品的所有商品
-- 3.1 化妆品的类型id SELECT t_id from type WHERE t_name='化妆品';
-- 3.2 所有化妆品的价格 SELECT p_price FROM product WHERE pt_id = (SELECT t_id from type WHERE t_name='化妆品'); -- 3.3 select * FROM product where p_price>all(SELECT p_price FROM product WHERE pt_id = (SELECT t_id from type WHERE t_name='化妆品'));
-- 4.查询价格不低于化妆品的最低价格的商品
-- 4.1 化妆品的id SELECT t_id from type WHERE t_name='化妆品';
-- 4.2 化妆品价格 SELECT p_price FROM product WHERE pt_id = (SELECT t_id from type WHERE t_name='化妆品');
-- 4.3 select * FROM product where p_price >= ANY(SELECT p_price FROM product WHERE pt_id = (SELECT t_id from type WHERE t_name='化妆品'));
-- 5.查询价格为300、5500的类型为化妆品、家电的商品
-- 5.1 类型为化妆品、家电的商品 SELECT * FROM product p,type t WHERE t.t_name in ('化妆品','家电') AND t.t_id=p.pt_id; -- 5.2 select * FROM (SELECT * FROM product p,type t WHERE t.t_name in ('化妆品','家电') AND t.t_id=p.pt_id)p1 WHERE p1.p_price BETWEEN 300 AND 5500;
本文详细解析了SQL中的多表查询技巧,包括内连接、外连接及子查询的应用,阐述了如何通过不同类型的连接和子查询提高数据检索效率,特别强调了WHERE、ON和USING条件在多表查询中的作用。
1191

被折叠的 条评论
为什么被折叠?



