数据库的进阶操作

一:连接查询1)内连接 inner join

内连接:使用语法 表一 inner join 表2 on 字段1 = 字段2
//在查询中需要将两张表存在对应关系的数据全部显示出来,需要使用内连接,内连接显示两张表中存在对应关系的全部数据,没有对应关系的数据不显示
    内连接使用前提:有两张表,只显示两张表中某个字段值相同的数据,每有相同字段值的数据不显示
    eg:现有学生表和学生住址表,两个表中的学号是存在对应关系,按照学号进行查询学生的所有信息
    select * from student inner join studentaddress on student.studentid = studentaddress.student
//注意在使用内连接时on后面跟的表名与字段名之间是有个点的,不是逗号是点

二:连接查询通知识点

1:对链接后的表进行显示字段限制
    select 表1.字段名 , 表2.字段名 from 表1名 inner join 表2名 on 表1.字段名 = 表2.字段名
    eg:现有学生表和学生住址表,需要查询他们的姓名,班级。联系电话和住址
    select student.studentName as 姓名,student.studentClass as 班级,studentaddress.tal as 联系电话,studentaddress.address as 家庭住址 from student inner join studentaddress on student.studentid = studentaddress.studentid;
2:在连接查询中往往会用到起别名的方式去缩短表名。给表单独创造空间
eg:
    select st.studentName as 姓名,st.studentClass as 班级,ad.tal as 联系电话,ad.address as 家庭住址 from student st inner join studentaddress ad on st.studentid = ad.studentid;

三:连接查询2)左连接 left join

左连接:以left join为界 关键字左边表的信息要全部显示出来,关键字右边表中只显示有对应关系的字段,没有对应关系的字段以null占位填充即可
eg:select * from student left join studentaddress on student.studentid = studentaddress.studentid;

四:连接查询3)右连接 right join

右连接主要解决三张及以上表查询时常见
以right join为界,关键字左边有关联关系的对应字段全部显示,没有关联关系的字段值不显示以null填充,关键字右边所有字段全部显示
右连接正好是与左连接相反的
eg:select * from student right join studentaddress on student.studentid = studentaddress.studentid;

连接查询总结

一:内连接:匹配两张表中右关联关系的字段值
二:左连接,关键字左边所有字段值全部限制,关键字右边只显示有关联关系的字段值,没有关联关系的字段值以null进行填充
三:右连接,关键字右边所有字段值都显示,关键字左边只显示右关联关系的字段值,没有关联关系以null进行填充
四:连接查询的实质:只是将分布于多张表的数据,通过连接的方式进行整理,形成数据源
    连接操作完成后,之前所有的查询方法都可以使用
    具体连接方法要根据实际工作时进行选择
//注意:使用内连接时,要注意他的特性“如果两张表之间有部分字段没有对应关系,那么将不会显示出来”

五:自关联

特征:只有一张表,表中最少有两个字段具备对应关系
步骤:通过起别名的方式将一张表变为两张表,通过字段的对应关系,进行条件对比,实现连接查询
eg:有一张城市表,包含若干城市,现在需要查询河南省所有城市
select * from areas a1 inner join areas a2 on a1.aid = a2.pid where a1.atitle = '河南省';
//注意:不要漏写表名,否则会报错字段不明确
eg:查询河南省所有的市区
select * from areas a inner join areas b on a.aid = b.pid left join areas c on c.aid = b.pid where a.atitle='河南省';

六:子查询

在一条查询语句中,利用另一条语句作为条件或数据源,充当条件或数据源的语句称为子查询
注意:子查询语句在使用时无比使用括号括起来

子查询-充当条件

eg:查询商品价格超过平均价格的商品
//首先查商品的平均价格,在使用平均价格作为条件,对比高于平均价的商品
--查询商品平均价格
    select avg(price) from goods/得出平均价格为68.333
--在使用查询出的平均价格作为条件,去查询高于平均价格的商品和价格
    select goodsName,price from goods where price >68.333;
--使用子查询
select goodsName,price from goods where price >(select avg(price) from goods);
//犹如数学计算一样,先查询括号里面的,在将括号里面的结果作为条件查询括号外面的

子查询-充当数据源

eg:查询所有来自并夕夕的商品包含商品分类
实现步骤:先查询所有商品,在查询所有商品分类,在进行筛选出属于并夕夕的商品
--查询所有商品和所有分类
select * from goods;
select * from category;
--筛选出属于并夕夕的商品
select * from goods where company='并夕夕';
--实现子查询作为数据源
select * from category F inner join (select * from goods where company="并夕夕") G on F.typeId = g.typeId
//解释:现在有两张表,一张表中包含商品信息,一张表中包含商品分类,这两张表的有个字段信息是有关联的,那么在表1中我么要筛选出要求的公司产品,再将表1的结果作为第三张表与表二进行内连接查询出商品所属分类