mysql查询重点 之 连接查询 and 外键

mysql查询重点--连接查询 

1、需求1:查询所有存在商品分类的商品信息

  注意: 内连接是取两张表的交集,如果商品没有对应的商品分类信息,则不会被显示出来

-- 需求1:内连接,查询所有存在商品分类的商品信息
-- 查询商品数据
select * from goods;
select * from catergray;

-- 在查询中,需要将两张表存在的对应关系的数据全部显示出来时,需要使用内连接
-- 内连接:显示两张表中存在对应关系的数据,无对应关系的数据不显示
-- 语法: 表1 inner join 表2 on 表1.字段 = 表2.字段
select * from goods inner join catergray on goods.typeId = catergray.typeId;

-- 连接查询共同知识点
-- 对连接后的表进行字段显示限制
-- 注意: 需要由对应的 表名.字段 的方式实现(防止表与表之间存在相同的字段名)
select goods.goods_name,catergray.catergray_name from goods inner join catergray on goods.typeId = catergray.typeId;
-- 表名.* :代表显示该表的所有字段
select goods.* ,catergray.catergray_name from goods inner join catergray on goods.typeId = catergray.typeId;

-- 连接查询中,往往会给表取别名,目的:1)缩短表名 2)给表单独创建空间
select go.goods_name,ca.catergray_name from goods as go inner join catergray as ca on go.typeId = ca.typeId;

2、左连接

  -- 左连接: 以left join 为关键字,关键字左侧的表信息要全部显示出来,而关键字右侧表的信息,有对应的部分显示,无对应的部分 以null 占位填充即可

  -- 语法: 表1 left join 表2 on 表1.字段 = 表2.字段

-- 左连接:以left join 关键字为界,关键字左侧的表的信息要全部显示出来,而关键字右侧的表的信息
-- 有对应的部分显示出来,无对应的部分以null 占位填充即可
-- 语法 表1 left join 表2 on 表1.字段 = 表2.字段
-- 查询 所有商品信息包含商品分类
select * from goods left join catergray on goods.typeId = catergray.typeId;

  -- 查询所有的商品分类 及其对应的商品信息

-- 查询所有商品分类,及其对应的商品信息
select * from catergray left join goods on catergray.typeId = goods.typeId;

3、右连接

  -- 需求2:查询所有商品信息,包含商品分类

  -- 注意: 右连接主要解决三张及以上表 进行连接查询时常见

  --右连接: 以right join 关键字为界,关键字右侧的表的信息要全部显示出来,而关键字左侧表的信息,有对应的部分显示出来,无对应的部分以null占位填充

  -- 语法: 表1 right join 表2 on 表1.字段 = 表2.字段

-- 需求2:查询所有商品信息,包含商品分类
-- 注意: 右连接主要解决三张及以上表 进行连接查询时常见
-- 右连接: 以right join 关键字为界,关键字右侧的表的信息要全部显示出来,而关键字左侧表的信息,有对应的部分显示出来,无对应的部分以null占位填充
-- 语法: 表1 right join 表2 on 表1.字段 = 表2.字段
-- 解析: 就是catergray表中的所有信息都要显示出来,如果catergray中有多的信息并且goods 中没有对应的信息,就以null 占位
-- 那张表要显示所有信息 就把哪张表放在 right Join 右侧
select * from catergray right join goods on goods.typeId = catergray.typeId;

-- 查询所有商品分类 及其对应的商品信息
select * from goods right join catergray on goods.typeId = catergray.typeId;

4、内连接、左连接、右连接 小结

  -- 内连接:是两张表的交集

  -- 左连接是 左侧整张表的信息加上两张表的交集

  -- 右连接 是右侧整张表的信息加上 两站表的交集

 

 5、连接查询的实质

  -- 连接查询的实质:只是将分布于多张表的数据,通过连接的方式进行整理,形成数据源

  -- 连接操作完成后,之前的所有的查询语法,都可以继续使用

  -- 具体的连接查询方法的选择,要以具体的需求为准

  -- 内连接: 如果有商品 没有分类对应的信息,不会被显示出来

  -- 注意: 如果使用内连接,会造成数据缺失,查询结果错误

-- 显示所有价格低于120 的商品信息,包含器对应的商品分类
select * from goods left join catergray on goods.typeId = catergray.typeId where goods.price < 120; 
-- 注意:如果使用内连接,会造成数据缺失;因为内连接 如果没有商品分类信息,不会被显示出来
select * from goods inner join catergray on goods.typeId = catergray.typeId where goods.price < 120;
-- 需求1:内连接,查询所有存在商品分类的商品信息
-- 查询商品数据
select * from goods;
select * from catergray;

-- 在查询中,需要将两张表存在的对应关系的数据全部显示出来时,需要使用内连接
-- 内连接:显示两张表中存在对应关系的数据,无对应关系的数据不显示
-- 语法: 表1 inner join 表2 on 表1.字段 = 表2.字段
select * from goods inner join catergray on goods.typeId = catergray.typeId;

-- 连接查询共同知识点
-- 对连接后的表进行字段显示限制
-- 注意: 需要由对应的 表名.字段 的方式实现(防止表与表之间存在相同的字段名)
select goods.goods_name,catergray.catergray_name from goods inner join catergray on goods.typeId = catergray.typeId;
-- 表名.* :代表显示该表的所有字段
select goods.* ,catergray.catergray_name from goods inner join catergray on goods.typeId = catergray.typeId;

-- 连接查询中,往往会给表取别名,目的:1)缩短表名 2)给表单独创建空间
select go.goods_name,ca.catergray_name from goods as go inner join catergray as ca on go.typeId = ca.typeId;
-- 左连接:以left join 关键字为界,关键字左侧的表的信息要全部显示出来,而关键字右侧的表的信息
-- 有对应的部分显示出来,无对应的部分以null 占位填充即可
-- 语法 表1 left join 表2 on 表1.字段 = 表2.字段
select * from goods left join catergray on goods.typeId = catergray.typeId;

-- 查询所有商品分类,及其对应的商品信息
select * from catergray left join goods on catergray.typeId = goods.typeId;

-- 需求2:查询所有商品信息,包含商品分类
-- 注意: 右连接主要解决三张及以上表 进行连接查询时常见
-- 右连接: 以right join 关键字为界,关键字右侧的表的信息要全部显示出来,而关键字左侧表的信息,有对应的部分显示出来,无对应的部分以null占位填充
-- 语法: 表1 right join 表2 on 表1.字段 = 表2.字段
-- 解析: 就是catergray表中的所有信息都要显示出来,如果catergray中有多的信息并且goods 中没有对应的信息,就以null 占位
-- 那张表要显示所有信息 就把哪张表放在 right Join 右侧
select * from catergray right join goods on goods.typeId = catergray.typeId;

-- 查询所有商品分类 及其对应的商品信息
select * from goods right join catergray on goods.typeId = catergray.typeId;

-- 显示所有价格低于120 的商品信息,包含器对应的商品分类
select * from goods left join catergray on goods.typeId = catergray.typeId where goods.price < 120; 
-- 注意:如果使用内连接,会造成数据缺失;因为内连接 如果没有商品分类信息,不会被显示出来
select * from goods inner join catergray on goods.typeId = catergray.typeId where goods.price < 120;

 

6、自关联介绍

  特征: 只有一张表,表中最少存在两列字段具备对应关系

  原理:通过起别名的方式,将一张表变为两张表,通过对应字段的对应关系,进行条件比对,实现连接查询

  1)需求4: 查询河南省所有的地市

  -- 自关联:

  --1)通过起别名的方式,将一表变两张表

  --2)通过 表1.字段 = 表2.字段 实现表间的关联

  

select * from maps as m1 inner join maps as m2 on m1.aid = m2.pid where m1.name = '河南省';

-- 需求5:查询河南省所有的市和区
select * from maps as m1 inner join maps as m2 on m1.aid = m2.pid left join maps as  m3 on m2.aid = m3.pid where m1.name = '河南省';

7、子查询:

  定义:在一条查询语句中,利用另一条语句作为条件或输入源,充当条件 或 数据源 的语句称之为子查询语句

  注意:子查询语句在使用时,务必使用括号括起来

  -- 需求1:查询价格高于平均价格的商品信息

  -- 需求2: 查询所有来自拼多多的商品信息,包含商品分类

select * from goods where price > (select avg(price) from goods );
-- 需求 查询所有来自并西西的商品,包含商品分类
select * from (select * from goods where company = '并西西') as m  left join catergray on m.typeId = catergray.typeId;

8、扩展:

  根据子查询语句返回的结果形式提现: 子查询共分为4类:

  子查询返回的结果是一个值(一行一列) 称为标量子查询

  子查询返回的结果是一列数据(一列多行) 称为列子查询

  子查询返回的结果 是 一行数据(一行多列) 称为行子查询

  子查询返回的是多行多列(相当于一张表) 称为表级子查询

 

9、外键

  如果一个表中的某个字段指向另一个实体的主键,就称为外键,被指向的实体,称之为主表,也叫父表。负责指向的实体,称之为从表,也叫字表;

  作用: 对关系字段进行约束,当为从表中的关系字段填写值时,会到关联的主表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并报错。

 

 

-- 需求1:内连接,查询所有存在商品分类的商品信息
-- 查询商品数据
select * from goods;
select * from catergray;

-- 在查询中,需要将两张表存在的对应关系的数据全部显示出来时,需要使用内连接
-- 内连接:显示两张表中存在对应关系的数据,无对应关系的数据不显示
-- 语法: 表1 inner join 表2 on 表1.字段 = 表2.字段
select * from goods inner join catergray on goods.typeId = catergray.typeId;

-- 连接查询共同知识点
-- 对连接后的表进行字段显示限制
-- 注意: 需要由对应的 表名.字段 的方式实现(防止表与表之间存在相同的字段名)
select goods.goods_name,catergray.catergray_name from goods inner join catergray on goods.typeId = catergray.typeId;
-- 表名.* :代表显示该表的所有字段
select goods.* ,catergray.catergray_name from goods inner join catergray on goods.typeId = catergray.typeId;

-- 连接查询中,往往会给表取别名,目的:1)缩短表名 2)给表单独创建空间
select go.goods_name,ca.catergray_name from goods as go inner join catergray as ca on go.typeId = ca.typeId;
-- 左连接:以left join 关键字为界,关键字左侧的表的信息要全部显示出来,而关键字右侧的表的信息
-- 有对应的部分显示出来,无对应的部分以null 占位填充即可
-- 语法 表1 left join 表2 on 表1.字段 = 表2.字段
select * from goods left join catergray on goods.typeId = catergray.typeId;

-- 查询所有商品分类,及其对应的商品信息
select * from catergray left join goods on catergray.typeId = goods.typeId;

-- 需求2:查询所有商品信息,包含商品分类
-- 注意: 右连接主要解决三张及以上表 进行连接查询时常见
-- 右连接: 以right join 关键字为界,关键字右侧的表的信息要全部显示出来,而关键字左侧表的信息,有对应的部分显示出来,无对应的部分以null占位填充
-- 语法: 表1 right join 表2 on 表1.字段 = 表2.字段
-- 解析: 就是catergray表中的所有信息都要显示出来,如果catergray中有多的信息并且goods 中没有对应的信息,就以null 占位
-- 那张表要显示所有信息 就把哪张表放在 right Join 右侧
select * from catergray right join goods on goods.typeId = catergray.typeId;

-- 查询所有商品分类 及其对应的商品信息
select * from goods right join catergray on goods.typeId = catergray.typeId;

-- 显示所有价格低于120 的商品信息,包含器对应的商品分类
select * from goods left join catergray on goods.typeId = catergray.typeId where goods.price < 120; 
-- 注意:如果使用内连接,会造成数据缺失;因为内连接 如果没有商品分类信息,不会被显示出来
select * from goods inner join catergray on goods.typeId = catergray.typeId where goods.price < 120;

select * from goods where price > (select avg(price) from goods );
-- 需求 查询所有来自并西西的商品,包含商品分类
select * from (select * from goods where company = '并西西') as m  left join catergray on m.typeId = catergray.typeId;
select * from maps as m1 inner join maps as m2 on m1.aid = m2.pid where m1.name = '河南省';

-- 需求5:查询河南省所有的市和区
select * from maps as m1 inner join maps as m2 on m1.aid = m2.pid left join maps as  m3 on m2.aid = m3.pid where m1.name = '河南省';

 

posted @ 2021-08-24 22:40  GalaxyStar  阅读(268)  评论(0编辑  收藏  举报