一千行MySQL学习笔记(四)

/* UNION */ ------------------

将多个select查询的结果组合成一个结果集合。

SELECT ... UNION [ALL|DISTINCT] SELECT ...

默认 DISTINCT 方式,即所有返回的行都是唯一的

建议,对每个SELECT查询加上小括号包裹。

ORDER BY 排序时,需加上 LIMIT 进行结合。

需要各select查询的字段数量一样。

每个select查询的字段列表(数量、类型)应一致,因为结果中的字段名以第一条select语句为准。

/* 子查询 */ -----------------

- - 子查询需用括号包裹。

-- from型
  from后要求是一个表,必须给子查询结果取个别名。
 - 简化每个查询内的条件。
 - from型需将结果生成一个临时表格,可用以原表的锁定的释放。

 - 子查询返回一个表,表型子查询。

 select * from (select * from tb where id>0) as subfrom where id>1;

-- where型

 - 子查询返回一个值,标量子查询。
 - 不需要给子查询取别名。
 - where子查询内的表,不能直接用以更新。
select * from tb where money = (select max(money) from tb);

-- 列子查询
  如果子查询结果返回的是一列。

  使用 innot in 完成查询
  existsnot exists 条件

    如果子查询返回数据,则返回1或0。常用于判断条件。
      select column1 from t1 where exists (select * from t2);

-- 行子查询
查询条件是一个行。
  select * from t1 where (id, gender) in (select id, gender from t2);

  行构造符:(col1, col2, ...) 或 ROW(col1, col2, ...)

  行构造符通常用于与对能返回两个或两个以上列的子查询进行比较。

-- 特殊运算符

  != all() 相当于 not in
  = some() 相当于 inanysome 的别名
  != some() 不等同于 not in,不等于其中某一个。
  all, some 可以配合其他运算符一起使用。

/* 连接查询(join) */ -------------
  将多个表的字段进行连接,可以指定连接条件。

-- 内连接(inner join)

  - 默认就是内连接,可省略inner。
  - 只有数据存在时才能发送连接。即连接结果不能出现空行。
  on 表示连接条件。其条件表达式与where类似。也可以省略条件(表示条件永远为真) 也可用where表示连接条件。 还有 using, 但需字段名相同。 using(字段名)

-- 交叉连接 cross join
  即,没有条件的内连接。
 select * from tb1 cross join tb2;



-- 外连接(outer join)

 - 如果数据不存在,也会出现在连接结果中。



-- 左外连接 left join
 如果数据不存在,左表记录会出现,而右表为null填充



-- 右外连接 right join
 如果数据不存在,右表记录会出现,而左表为null填充

-- 自然连接(natural join)
自动判断连接条件完成连接。 相当于省略了using,会自动查找相同字段名。

  natural join

  natural left join

  natural right join

(未完待续)
      (作者:Shocker 来源:http://www.cnblogs.com/shockerli/p/1000-plus-line-mysql-notes.html)

原文地址:https://www.cnblogs.com/Grace7582/p/4734943.html