table1:
s1 |
---|
2 |
10 |
s2 |
---|
5 |
12 |
20 |
列子查询中使用IN,ANY,SOME和ALL操作符.
细节:IN 是 = ANY 的别名,二者相同,但 NOT IN 的别名却不是 <> ANY 而是 <> SOME。
NOT IN 是 <> ALL 的别名,二者相同
特殊情况
- 如果 table2 为空表,则 ANY 后的结果为 FALSE;
- 如果子查询返回如 (NULL,NULL,NULL) 列为空的结果,则 ANY 后的结果为 UNKNOWN 。
- 一些示例:
SELECT s1 FROM table1 WHERE s1 > ANY (SELECT s2 FROM table2)
结果为:10。
SELECT s1 FROM table1 WHERE s1 > ALL (SELECT s2 FROM table2)
不返回任何结果.
注意:对于 table2 空表的情况,下面的语句均返回 NULL:
SELECT s1 FROM table1 WHERE s1 > (SELECT s2 FROM table2)
SELECT s1 FROM table1 WHERE s1 > ALL (SELECT MAX(s1) FROM table2)
MySQL 中的JOIN
cross join 是笛卡儿乘积 就是一张表的行数乘以另一张表的行数
left join 第一张表的连接列在第二张表中没有匹配是,第二张表中的值返回null
right join 第二张表的连接列在第一张表中没有匹配是,第一张表中的值返回null
full join 返回两张表中的行 left join+right join
inner join 只返回两张表连接列的匹配项
(1)连接
select * from table1,table2
等价于
select * from table1 cross join table2
select * from table1,table2 where table1.row=table2.row
(2)自连接
select * from emploly e1 ,emploly e2
select e1.name,e2.name from employ e1,employ e2
where e1.name=e2.name
(3)内连接(inner join)
select stuname as ‘姓名‘,classname as ‘班级‘ from student inner join class on student.stuid=class.stuid
inner join ‘表名‘ on 条件 --连接多个表
它等价于:
select stuname as ‘姓名‘,classname as ‘班级‘
from student,class
where student.stuid=class.stuid
(4)外连接:(outer join)
允许限制一张表中的行,而不限制另外一张表中的行。
注意:外连接不一定非要有外键约束
1: left outer join --不能用left out join
左表中的记录全部会出现在结果集中,右表中没有对应记录的显示NULL
2: right outer join
右表中的记录全部会出现在结果集中,坐标中没有对应记录的显示NULL
3: full outer join|full join --不能用full out join
返回两个表中的匹配和不匹配的所有记录。
STRAIGHT_JOIN 是 MySQL 对标准 SQL 的扩展,用于在多表查询时指定表载入的顺序。在 JOIN 表连接中,同样可以指定表载入的顺序,本文只讲述 STRAIGHT_JOIN 在表连接 JOIN 中的应用。
MySQL STRAIGHT_JOIN 语法如下:
... FROM table1 STRAIGHT_JOIN table2 ON condition ...
STRAIGHT_JOIN 实际上与内连接 INNER JOIN 表现完全一致,不同的是使用了 STRAIGHT_JOIN 后,table1 会先于 table2 载入。
如果有更多表进行连接,那么使用 STRAIGHT_JOIN 后,其载入顺序就遵循从左往右的规则。最后,STRAIGHT_JOIN 无法应用于 LEFT JOIN 或 RIGHT JOIN。
NATURAL JOIN 也叫自然连接,实际是属于 JOIN 的一种。
MySQL NATURAL JOIN 语法如下:
... FROM table1 NATURALJOIN table2 ... |right>
使用 NATURAL JOIN 时,MySQL 将表中具有相同名称的字段自动进行记录匹配,而这些同名字段类型可以不同。因此,NATURAL JOIN 不用指定匹配条件。
NATURAL JOIN 默认是同名字段完全匹配的 INNER JOIN,也可以使用 LEFT JOIN 或 RIGHT JOIN。一些例子如下:
SELECT article.aid,article.title,user.username FROM article NATURAL JOIN user
// LEFT SELECT
article.aid,article.title,user.username FROM article NATURAL LEFT JOIN user
// RIGHT SELECT
article.aid,article.title,user.username FROM article NATURAL RIGHT JOIN user