MySQL的查询,子查询,联结查询,联合查询
一.mysql查询的五种子句
where(条件查询)、having(筛选)、group by(分组)、order by(排序)、limit(限制结果数)
二.子查询
1.where 子查询
SELECT * FROM tb1 WHERE cat_id IN (SELECT max(id) FROM tb2 GROUP BY cat_id);
2.from 子查询
SELECT t2_id FROM (SELECT t2_id FROM tb2 ORDER BY t2_id DESC);
3.exists子查询(把外层查询结果拿到内层,看内层的查询是否成立,成立就返回外层查询的数据)
SELECT * FROM test5 WHERE EXISTS (SELECT id FROM test2 where test2.id=test5.id);
查询test5中的第一行id=1, 然后执行SELECT id FROM test2 where test5.id=1;如果存在,就返回这行数据,不存在,就不返回
三.UNION用法,联合查询(纵向/行联结)
(把两次或多次的查询结果合并起来,要求查询的列数一致,推荐查询的对应的列类型一致,可以查询多张表,多次查询语句时如果列名不一样,则取第一次的列名!如果不同的语句中取出的行的每个列的值都一样,那么结果将自动会去重复,如果不想去重复则要加all来声明,即union all)
SELECT * from test2 UNION SELECT * FROM test5;
对test2结果集和test5结果集行联合起来(去重)
SELECT * from test2 UNION ALL SELECT * FROM test5;
对test2结果集和test5结果集的行联合起来(不去重)
四.联结查询(横向/列联结)
1.内联结(INNER JOIN,INNER可以省略,以下三种写法等效)
SELECT * FROM test2,test5 WHERE test2.id=test5.id;
SELECT * FROM test2 JOIN test5 ON test2.id=test5.id;
SELECT * FROM test2 JOIN test5 USING(id);//如果两个表的列名相同,可以用USING代替ON
将test2和test5的结果集的列按条件联结起来,是并集
2.左联结
SELECT * FROM test2 LEFT JOIN test5 ON test2.id=test5.id;
以左表test2为准,和test5联结,test2中的数据会被全部取出.
3.右联结
SELECT * FROM test2 RIGHT JOIN test5 ON test2.id=test5.id;
以右表test5为准,和test2联结,test5中的数据会被全部取出.
日常使用固定一种,用左联结代替右联结.
内联结和左联结的区别:
内联结取出了两个表都有的记录,如果一个表有.另一个表没有,则不取出
左联结取出了左表中所有的记录,不管有表有没有该对应记录
参考:
http://www.cnblogs.com/rollenholt/archive/2012/05/15/2502551.html