mysql数据库--SQL中的连接查询

回顾:

列属性:主键,自增长,唯一键
关系:一对一,一对多,多对多
范式:规范数据库的设计,三层范式
	1NF:字段设计必须符合原子性
	2NF:不存在部分依赖(没有复合主键)
	3NF:不存在传递依赖(实体单独建表)
	逆规范化:效率与磁盘空间的博弈
高级数据操作:
	新增数据:主键冲突(更新和替换),蠕虫复制
	更新操作:限制更新数量:limit
	删除操作:限制删除数量:limit,清空表(truncate)
	查询操作:select 选项,字段别名,数据源(单表,多表,子查询[别名]),where 子句(条件判断:从磁盘),group  by子句
	(分组统计,统计函数,分组排序,多字段分组,回溯统计),having 子句(判断结果,针对分组统计的结果),order  by子句
	(排序,多字段排序),limit 子句(限制记录数,分页)

连接查询:

连接查询:将多张表(可以大于两张)进行记录的连接(按照某个指定的条件进行数据拼接);最终结果是:记录数有可能变化
字段数一定会增加(至少两张表的合并)
连接查询的意义:在用户查询数据的时候,需要显示的数据来自多张表。
连接查询:join,使用方式:左表   join   右表
左表:在join关键字左边的表
右表:在join关键字右边的表

连接查询的分类:

 SQL中将连接查询分为四类:内连接,外连接,自然连接和交叉连接

交叉连接:

交叉连接:cross  join,从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配;匹配一定保留(没有条件匹配)
而连接本身字段就会增加(保留),最终形成的结果叫做:笛卡尔积。笛卡尔积本身没有意义,应该尽量避免使用,交叉连接
存在的价值在于保证连接这种结构的完整性。

基本语法:左表  cross  join  右表;相当于from   左表,右表;
-- 交叉连接,my_student cross join my_class是一个数据源
select * from my_student cross join my_class

mysql数据库--SQL中的连接查询_第1张图片
mysql数据库--SQL中的连接查询_第2张图片

内连接:

内连接:[inner]  join,从左表中取出每一条记录,去右表中与所有的记录进行匹配,匹配必须是某个条件在左表中和右表中相同
最终才会保留结果,否则不保留。

基本语法:
左表 [inner]  join  右表  on  左表.字段 = 右表.字段;on表示连接条件,条件字段就是代表相同的业务含义
(如my_student.c_id和my_class.id)

-- 内连接
select * from my_student inner join my_class on my_student.c_id = my_class.id;
-- 因为c_id是唯一的可以简略表示
select * from my_student inner join my_class on c_id = my_class.id;
-- 但是id不是唯一的,简略表示会报错
select * from my_student inner join my_class on c_id = id;

mysql数据库--SQL中的连接查询_第3张图片

但是上图中可以看到有两个name,两个id,在PHP操作的时候会发生数据被覆盖的问题。所以就需要字段别名以及表别名的
使用,在查询数据的时候,不同表有同名字段。
-- 字段和表别名
select s.*,c.name as c_name,c.room from -- 字段别名
my_student as s inner join my_class as c -- 表别名
on s.c_id = c.id;

mysql数据库--SQL中的连接查询_第4张图片
mysql数据库--SQL中的连接查询_第5张图片

内连接可以没有连接条件:没有on之后的内容,这个时候系统会保留所有结果(笛卡尔积)

mysql数据库--SQL中的连接查询_第6张图片

内连接可以使用where代替on关键字,where关键字没有on效率高。因为where关键字是匹配所有,但是on关键字是匹配成功的。

mysql数据库--SQL中的连接查询_第7张图片

外连接:

外连接:outer  join,以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接,不管能不能匹配上条件都会保留,
能匹配正确保留,不能匹配,其他表的字段都置空NULL。
外连接分为两种:是以某种表为主:有主表
	left  join:左外连接(左连接),以左表为主表
	right  join:右外连接(右连接),以右表为主表
基本语法:左表  left/right  join  右表  on  左表.字段 = 右表.字段;

左连接:

-- 左连接
select s.*,c.name as c_name,c.room from 
my_student as s left join my_class as c 
on s.c_id = c.id;

mysql数据库--SQL中的连接查询_第8张图片
右连接:

-- 右连接
select s.*,c.name as c_name,c.room from 
my_student as s right join my_class as c 
on s.c_id = c.id;

mysql数据库--SQL中的连接查询_第9张图片

虽然左连接和右连接有主表差异,但是显示的结果,左表的数据在左边,右表的数据在右边。左连接和右连接可以
互相转换,只需要将两种表的位置对调即可。
-- 右连接
select s.*,c.name as c_name,c.room from 
my_student as s right join my_class as c 
on s.c_id = c.id;

select s.*,c.name as c_name,c.room from 
my_class as c left join my_student as s 
on s.c_id = c.id;

mysql数据库--SQL中的连接查询_第10张图片

自然连接:

自然连接:natural  join,自然连接就是自动匹配连接条件:系统以字段名字作为匹配模式(同字段就作为条件,多个同名字段
都作为条件)
自然连接的分类:自然内连接和自然外连接
自然内连接:左表  natural  右表;
-- 自然内连接
select * from my_student natural join my_class;

mysql数据库--SQL中的连接查询_第11张图片

自然外连接:左表  natural  left/right  join  右表;
-- 自然左外连接
select * from my_student natural left join my_class;

mysql数据库--SQL中的连接查询_第12张图片

其实:内连接和外连接都可以模拟自然连接:使用同名字段合并字段
左表  left/right/inner  join  右表  using(字段名);  -- 使用同名字段作为条件
-- 自然左外连接
select * from my_student natural left join my_class;

-- 外连接模拟自然外连接:using
select * from my_student left join my_class using(id);

mysql数据库--SQL中的连接查询_第13张图片

PHP操作mysql:

事实上:PHP本身不可以操作Mysql,但是PHP有扩展可以实现操作mysql:PHP借助扩展来实现操作mysql。
PHP操作mysql的扩展还挺多:mysql,mysqli,PDO扩展。
mysql扩展:纯面向过程,里面全是函数,加载扩展后可以调用函数。(当前只能使用面向过程)
mysqli扩展:面下过程+面向对象,里面有函数也有类,加载扩展后可以选择调用函数或者调用类操作。
PDO:纯面向对象,只有类,加载后只可以调用类。
mysql扩展在搭建服务器的时候就已经加载开启,不再进行扩展加载。

你可能感兴趣的:(mysql数据库--SQL中的连接查询)