join
隐式连接:两个表逗号连接,与INNER JOIN效果相同,只不过逗号连接需要在where条件里写连接条件,不写where结果是笛卡尔积
SELECT * FROM `a` INNER JOIN `b` ON a.id = b.aid ORDER BY a.id
SELECT * FROM `a` , `b` WHERE a.id = b.aid ORDER BY a.id
JOIN
具有比逗号运算符 ( ,
)更高的优先级,因此连接表达式 t1, t2 JOIN t3
被解释为 (t1, (t2 JOIN t3))
,而不是((t1, t2) JOIN t3)
。
LEFT JOIN
INNER JOIN (JOIN)(,)(CROSS JOIN交叉连接)
SELECT * FROM `a` a INNER JOIN `b` b ON a.id=b.aid;
# cross join为交叉连接,即笛卡尔积。不加ON子句的时候展现笛卡尔积
SELECT * FROM `a` a CROSS JOIN `b` b ON a.id = b.aid;
SELECT * FROM `a` a JOIN `b` b ON a.id=b.aid;
SELECT * FROM `a` a , `b` b WHERE a.id=b.aid;
FULL OUTER JOIN
注意:MySQL是不支持全外的连接的,这里给出的写法适合Oracle和DB2。但是可以通过左外和右外求合集来获取全外连接的查询结果。
union
union用于把两个或者多个select查询的结果集合并成一个
SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]
默认情况下,UNION = UNION DISTINCT
①进行合并的两个查询,其SELECT列表必须在数量和对应列的数据类型上保持一致;
②默认会去掉两个查询结果集中的重复行;默认结果集不排序;
③最终结果集的列名来自于第一个查询的SELECT列表
UNION ALL
不去掉结果集中重复的行
注:联合查询结果使用第一个select语句中的字段名
mysql> select * from t1;
+------+------+
| num | addr |
+------+------+
| 123 | abc |
| 321 | cba |
+------+------+
2 rows in set (0.00 sec)
mysql> select * from t2;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | A |
+------+------+
2 rows in set (0.00 sec)
mysql> select * from t1
-> union
-> select * from t2;
+------+------+
| num | addr |
+------+------+
| 123 | abc |
| 321 | cba |
| 1 | a |
| 2 | A |
+------+------+
4 rows in set (0.00 sec)
如果要对合并后的整个结果集进行排序,ORDER BY子句只能出现在最后面的查询中
注意:
在去重操作时,如果列值中包含NULL值,认为它们是相等的