1, cross join 交叉连接
select t1.*,t2.* from table1 t1,table2 t2;
select t1.*,t2.* from table1 t1 cross join table2 t2;
我们把上述"没有任何限制条件的连接方式"称之为"交叉连接","交叉连接"后得到的结果跟线性代数中的"笛卡尔乘积"一样。
2, inner join 内链接
select t1.*,t2.* from table1 t1,table2 t2 where t1.id = t2.id; select t1.*,t2.* from table1 t1 inner join table2 t2 on t1.id = t2.id;
"有条件的" 交叉链接
3,左外链接 left join
select t1.*,t2.* from table1 t1 left join table2 t2 on t1.id = t2.id;
如果连接字段在右表中不唯一,左外链接会出现重复列情况,
所以一般用主键进行关联,注意主表的选择;
mysql> select * from stu; +----+-------+ | id | name | +----+-------+ | 1 | Kobe | | 2 | James | | 3 | Bosh | +----+-------+ 3 rows in set (0.03 sec) mysql> select * from class; +----+------+------+ | id | s_id | c_id | +----+------+------+ | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 2 | 5 | +----+------+------+ 3 rows in set (0.01 sec) mysql> select * from stu left join class on stu.id= class.s_id; +----+-------+------+------+------+ | id | name | id | s_id | c_id | +----+-------+------+------+------+ | 1 | Kobe | 1 | 1 | 1 | | 1 | Kobe | 2 | 1 | 2 | | 2 | James | 3 | 2 | 5 | | 3 | Bosh | NULL | NULL | NULL | +----+-------+------+------+------+ 4 rows in set (0.03 sec)
4,group by 字段
1,GROUP BY 语句根据一个或多个列对结果集进行分组 2,最终查询出的结果只会显示组中一条记录
3,在mysql中没有强调select指定的字段必须属于group by后的条件(和 oracle 中不同)
mysql> select class.*,count(*) from class where id >0 group by s_id having count(*) >1; +----+------+------+----------+ | id | s_id | c_id | count(*) | +----+------+------+----------+ | 1 | 1 | 1 | 2 | | 4 | 4 | 4 | 2 | +----+------+------+----------+ 2 rows in set (0.02 sec) mysql> select class.* from class ; +----+------+------+ | id | s_id | c_id | +----+------+------+ | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 2 | 5 | | 4 | 4 | 4 | | 5 | 4 | 7 | +----+------+------+ 5 rows in set (0.02 sec)
5,having
1,已经筛选出的字段,having和where的效果是等效的 2,未筛出的字段 过滤只能用where 3,group by 的组内过滤, 只能用having [having 的字段必须是聚合函数或者出现在select检索中出现]
mysql> select id,s_id from class having s_id >2; +----+------+ | id | s_id | +----+------+ | 4 | 4 | | 5 | 4 | +----+------+ 2 rows in set (0.02 sec) mysql> select id from class having s_id >2; 1054 - Unknown column ‘s_id‘ in ‘having clause‘
原文:https://www.cnblogs.com/junyi0120/p/11734552.html