首页 > 代码库 > mysql数据库基础(一)

mysql数据库基础(一)

Mysql列子查询及IN,ALL,SOME,ANY的使用

table1:

s1
2
10
table2:
s2
5
12
20

列子查询中使用IN,ANY,SOME和ALL操作符.

IN:在指定项内,同IN(项1,项2,..)
ANY:与比较操作符联合使用,接在比较操作符后面表示与子查询返回的任何值比较为TRUE,则返回TRUE。
SOME:ANY的别名,较少使用.
ALL:与比较操作符联合使用,表示与子查询返回的所有值比较都为TRUE,则返回TRUE。

   细节: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 NATURAL  JOIN table2 ... 

使用 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