目录
1.复合查询
1.1 多表查询(联合查询)
1.2 join on (inner join)
1.3 自连接
1.4 子查询
1.5 合并查询
2.内外连接
3.关于高内聚、低耦合
1.复合查询
1.1 多表查询(联合查询)
什么是多表插叙?实际开发中往往数据来自不同的表,我们需要同时查询多个表之间的数据~
多表查询的基本执行过程:笛卡尔积
笛卡尔积通过排列组合得到,列数就是两个表列数之积,行数就是两个表行数之积
仔细观察,笛卡尔积里面的结果,很多是无效的数据,只有一部分是有意义的~
因此我们要把无意义的数据去掉~
如何去掉这一些元素呢?我们通过观察可以发现,有意义的数据都是学生的名字和ID、ID和班级相匹配的数据,我们就需要通过限制条件来筛选这一些结果:
select * from student,class where classID = classID;
但是此时你可能会有疑问:怎么出现了classID = classID?是不是不对?运行过后确实发现这样的写法是不行的
这个时候SQL出现了报错:模糊定义
为了解决这个问题,我们需要引入 . 成员访问运算符来完成,类似于Java中的引用
1.成员访问运算符可以把表视为是数据库的成员
2.成员访问运算符可以把列名视为是表的成员
select * from student,class where student.classID = class.classID;
我们再对条件稍加修改,便得到了学生名字和班级名字的表:
那么我们就得到了联合查询的步骤:
1.计算笛卡尔积
2.引入连接条件
3.加入必要的条件
4.把不必要的列去掉
1.2 join on (inner join)
select * from student join score on student.id = score.student_id;
select * from student inner join score on student.id = score.student_id;
这两种写法跟上面的写法效果是相同的,但是from多个表只能实现内连接,而join on既能实现内连接,也能实现外连接。这里关于内外连接先不细说,这部分内容等到之后再讲~
1.3 自连接
自己和自己进行笛卡尔积,就叫做自连接
这个操作不是一个通用的解决方案,而是特殊问题的特殊处理方式
自连接的作用就是把行转成列
SQL中无法针对行与行之间,使用条件比价,但是有的需求里,又需要进行 行与行 比较
所以就可以使用自连接,把行转成列
那么如何用自连接来完成呢?刚刚不是说是自己和自己进行笛卡尔积吗,那么我们就会想到这样的方式:
但是它提示二名字重复了,不是唯一的,所以我们就需要起别名来完成:
select * from score as s1,score as s2;
这样就完成了一个自连接的操作
请注意:自连接会产生大量的无效数据,所以我们仍然需要通过一层层的筛选条件来把想要得到的数据来筛选出来~
1.4 子查询
子查询,本质上就是套娃,把多个SQL语句合成一个了~实际开发中,子查询要慎用。
因为子查询可能会构造出非常复杂,非常不好理解的语句,对于代码的可读性,是毁灭性的打击,对于SQL的执行效率,也可能是毁灭性的打击~
什么是子查询?一行代码就能解释清楚:
select name from student where class_id = (select class_id from student where name = zhangsan) and name != zhangsan;
在这个代码中间又嵌套了一层SQL语句,外层SQL语句查询的是内层SQL语句返回的结果
把一个查询,作为另一个查询的一部分条件~
同时要注意,内层查询的结果是存放在内存中,如果太大了的话内存就放不下~
1.5 合并查询
合并查询关键字:
union
union all
作用是可以同时查询两个表的相关结果~
他们的区别仅仅是:union是进行过去重操作的,而union all则是不去重,保留多份~
在这张图里看到,union可以对两个表进行同时查询,只要是查询结果的列是匹配的就行~
但是如果是or的话,就只能对一个表进行查询~
2.内外连接
内连接和外连接,大多数情况下没什么区别,但如果要连接的两个表不是一一对应,内连接和外连接就有区别了~
在我们之前所有的学习中,学习的都是内连接
我们重点讲一下外连接:
关键字:left/right join
在上面的代码中,仅仅需要加入一个left/right就会让查询结果大不相同:
也就是说:查询所有学生的成绩,在这个左/右表中,如果这个学生没有成绩,也要将学生的个人信息显示出来,这就是左/右外连接
3.关于高内聚、低耦合
什么叫耦合?
在编程中,耦合描述了模块之间的关联关系是不是比较强,关联关系越强、越复杂,那么耦合程度就越高,就越不好~
为什么呢?写代码的时候,我们会希望耦合比较低,如果两个模块之间关联比较密集,就可能导致修改一个模块,就会影响到另外一个模块,关联大,工作量大,也就容易出错了~
那什么又是内聚呢?把有关联的代码写到一起,就是高内聚~
SQL的基本用法,到这里也就告一段落了~期待后面更加精彩的学习~