mysql学习之路_连接查询

回顾

列属性:主键,自增长,唯一键。

关系:一对一,一对多,多对多

三层范式:

1NF:字段设计必须符合原子性

2NF:不存在部分依赖(没有复合主键)

3NF:不存在传递依赖(实体单独成表)

逆规范化:效率磁盘空间博弈;

高级数据操作:

新增操作:主键冲突(更新与替换),蠕虫复制

更新操作:限制更新数量:limit

删除操作:限制删除数量:limit。清空表结构:truncate

查询操作:select选项;

字段别名: 数据源(单表,多表,子查询[别名]

Where子句(条件判断:从磁盘)

Group by子句(判断结构,针对分组统计结果)

Order by子句(排序,多字段排序)

Having 子句 (判断结果,针对分组进行统计结果)

Limit子句 (限制记录数,分页)

连接查询

连接查询:将多张表(可以大于2张)进行记录的连接(按照某个指定条件进行数据拼接)

最终结果:记录数有可能变化,字段数一定会增加(至少两张表合并)

连接查询的意义:用户查看数据的时候,需要现实的数据来自多张表。

连接查询分类

Sql将连接查询分为四类:外链接,自然连接,内连接,交叉连接

连接查询:join,使用方式 左表join 右表;

         左表;在join关键字左边的表;

         右表:在join 关键字右边的表;

   

交叉连接

Cross join从一张表中循环取出每一条记录,每张记录都去另一张表进行匹配。

匹配一定保留(没有条件匹配),而连接本身字段就全增加(保留),最终会形成的结果叫做笛卡尔积

基本语法:

左表 cross join 右表;==from 左表,右表;

笛卡尔积没有意义:应该尽量避免(交叉查询没用)交叉连接的价值:保证连接结构的完整性。

例:select * from my_stu cross join my_class;

内连接:

内连接:[inner] join;

        从左表中取出没一条记录去右表中所有记录进行匹配,匹配必须是某个条件,在左表中与右表中相同的最终会保留,否则不保留。

基本语法

左表 [inner] 右表 on 左表.字段=右边.字段;

On 表示连接条件;

条件字段就是代表相同的业务含义

如:内连接

Select *from my_stu a join my_class b

On a.c_id=b.id;

php中会覆盖:

  字段别名以及表别名对的使用:在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分,而表名太长,通常使用别名。

内连接可以使用where 代替on关键字(where没有on效率高)

外链接:

外链接:outer  join ,以某张表为主,取出里面所有的记录,然后每条与另一表进行连接,不管能不能匹配上条件,最终都会保留。

能匹配,正确保留,不能匹配其他字段制空null

外连接分为两种:以某张表为主

以左表为主: left join :左外连接

以右表为主 right join :右外连接

基本语法

左表  left/right join 右表 on 左表.字段=右表.字段;

例: select * from My_stu a left/right  join My_class  b

On a.c_id=b.id

 虽然左连接和右连接有主表差异,但是显示的结果永远是左表数据在左边,右表数据在右边,左连接和右连接可以相互转

 自然连接

Natural join :自动匹配连接条件,系统以字段名为匹配模式(同名字段作为条件,多个同名字段作为条件)

自然连接分为自然内连接。自然外连接

自然内连接 select * from My_stu

             Natural join my_class;

自然外连接 :左表 natural left/right join 右表

例:select * from my_stu natural left/right join my_class;

其实 内连接与外连接都可以模拟自然连接!!!!!!!!!

原文地址:https://www.cnblogs.com/lqh969696/p/9709730.html