现有两张表,左边表A,右边表B,其中有两条记录name是相同的
什么是cross join
CROSS JOIN运算符可以把一个数据集中和另外一个数据集中的数据组合在一起。在两个数据集之间使用CROSS JOIN运算符产生的结果也被称为笛卡尔积。
语法:SELECT * FROM A CROSS JOIN B
结果:应该是A表数据数量*B表数据数量,就是求表A和表B的所有可能的组合。
注意:不用加条件语句,如果加了条件就跟inner/outer join没什么区别
什么是inner join
inner join(等值连接):只返回两个表中联结字段相等的行,即为AB两者的交集
语法:SELECT * FROM A INNER JOIN B ON A.字段号=B.字段号
注意:inner join是内连接,查询两个表中字段的值必须相等(zda.id=b.id),如果a.id存在(1、1、1、1)而b.id只存在(1),那么会有四行结果(及笛卡尔积),b.id重复三次。
什么是left (outer) join
左外连接,产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
语法:SELECT * FROM A LEFT OUTER JOIN B ON A.name = B.name
什么是right (outer) join
右外连接,产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。
语法与left (outer) join语法类似
什么是full (outer) join
产生A和B的并集。对于没有匹配的记录,则会以null做为值。
语法:SELECT * FROM A FULL OUTER JOIN B ON A.name = B.name
where条件过滤与having的区别
- where是一个约束声明,是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where字句中不能包含聚合函数
- having是一个过滤声明,是筛选满足条件的组,即在分组之后过滤数据。having字句中可以包含聚合函数
- where在group by 之前执行,having在group by 之后执行
- where和having可以同时存在在一个SQL语句中