记录集叠加
mysql> select name from menpiao_2015 where num = '12' union all select user_mobile from user_info_bd where user_mobile = '13126512870';
需要注意的是 所有表项中 的项目数 和 对应的数据类型 必须匹配。
组合相关的行
select name , package_name from mcp_content a, mcp_content_appinfo b where b.c_id = a.id and a.id = 63039;
连表查询
还有一种方案是 内连接 inner join
select name ,package_name from mcp_content a inner join mcp_content_appinfo b on a.id = b.c_id
where a.id = 63039
这将 连接的逻辑 放在了 FROM 子句中,而不是where子句中。
在SQL中
TRUE or NULL 结果是 TRUE
FALSE or NULL 结果是 NULL
外连接 可以返回一个表中所有的行 ,以及另一个表中 匹配到的行。
或者使用 标量子查询
select e.name, d.loc,
(select eb.received from emp_bonus where eb.empno = e.empno) as receive
from emp e, dept d
where e.deptno = d.deptno order by 2
识别和消除 笛卡尔积
select e.name, d.loc from
emp e, dept d
where e.deptno = 10;
上面这个SQL 会产生多余的数据。
应该改成
select e.name, d.loc from
emp e, dept d
where e.deptno = 10 and d.depno = e.depno;
虽然笔记本电脑 又叫 laptop ,但是最好不要把笔记本直接放在 腿上。 会腿疼的。
避免笛卡尔积 要使用 n-1 规则。
n 是 表的数量, n-1是最小连接数。
产生笛卡尔积的 原因是 表1 限制了某个条件, 但是 表2 的这个条件 没有关联或者限制。就导致多余的错误数据。
当处理聚集与联接 的混合操作时候,连接可能产生重复行。
要再调用聚集函数时,使用DISTINCT 。
内连接 取交集, 外连接 是增加额外的字段,这种字段不是每个记录都有的。
full join = left join + right join
NULL 值永远不会等于或者不等于 任何值。
select ename, comm from emp
where coalesce(comm, 0) < (
select comm from emp where ename = 'WORD'
)
上面这个SQL,在于 最后比较的时候,是另一个SQL查询的结果。以及将NULL值 转化为可以比较的 0值。