1.定义
left join(左联接) 返回包括左表中的所有记录和右表与关联键相等字段的记录 。
right join(右联接) 返回包括右表中的所有记录和左表与关联键相等字段的记录。
inner join(等值连接) 只返回两个表中同一关联键相等的行
2. 如何解决一对多
以上是一对多问题
2.1 解决一对多问题
- group by
把一对多的问题转化成聚合查询
2.使用distinct解决一对多的问题
2.2 group by 和distinct的比较
(1)group by和distinct的区别
distinct:需要将col列中的全部内容存储在一个内存中,hash结构,key为col的值,最后计算hash结构中有多少个key即可得到结果,因此需要将所有的结果存储起来,内存消耗肯能较大。
group by:先将col进行排序
(2)两个极端
数据列的所有数据都一样,即去重计数的结果为1时,用distinct最佳。
如果数据列唯一,没有相同数值,用group 最好。
2.3 distinct
(1)distinct可以作用于单列,也可以作用于多列
SELECT DISTINCT 列 FROM 表; -- 单列去重
(2)distinct可以作用于多列
select distinct name, age from A #根据name和age两个字段来去重的
(3)进行count统计
select count(distinct name) from A; #表中name去重后的数目
count不能统计多个字段,如果要统计多个字段,可以使用嵌套查询
select count(*) from (select distinct name, age from A) AS B;
(4)distinct必须放在开头
3.SQL语句查询原理
3.1 单表查询
(1)根据where条件过滤表中的记录,形成中间表(中间表对用户不可见)
(2)然后根据select选择相应的列返回最终结果
3.2 两表链接查询
(1)对两表求积(笛卡尔积)并用ON条件和连接类型进行过滤形成中间表
(2)然后用where条件过滤中间表记录
(3)根据select指定的列返回查询结果
3.3 多表连接查询
(1)先对第一个表和第二个表按照两表做连接查询,然后用查询结果和第三个表做连接查询,依次类推直到所有的表都连接上为止,最终形成一个中间的结果表
(2)根据where条件过滤中间表记录
(3)根据Selelct指定的列返回最终查询结果