zoukankan      html  css  js  c++  java
  • SQL多表组合查询

    在实际应用中,查询的数据往往不止局限在一张表里,通常需要多张表在一起进行组合查询,今天我们将会对Mysql当中的多张有关联的表进行组合查询,本节内容涉及到的几个关键点有:

    等值和非等值连接查询;自然连接查询;嵌套查询;自身连接查询;

    我们还是通过Python中的“pymysql”模块来连接Mysql数据库,进行今天的学习

    准备工作

    和上次一样,我们还是建立了三张表,它们分别是:学生表、学科表、成绩表。每张表都有一个自增量的ID字段,作为该表的主键,同时,成绩表里有两个字段“student_ID”和“subject_ID”与学生表的ID、学科表的ID相关联,同时在这三张表里都插入了一些基础数据,通过已插入的这些基础数据我们来进行分析和介绍。

    下面是三张表的建表语句和一些基础数据:

    建表语句
    基础数据

    等值和非等值连接查询

    通过比较运算符(通常有:=、>=、<=、>、<、<>、!=、like等)进行查询条件的比较,sql语句的写法是:

    select A.*,B.* from A,B where A.主键=B.外键 and 其他查询条件;

    假如我们想要查询学生名字叫陈伟的学生的成绩,在Python中举例如下:

    进行等值连接查询的sql语句编写时,要明确指出数据源来源于哪几张表,并且要很清楚的知道哪几个字段是相互关联的,然后再添加其他的查询条件。其实这种查询的原理就是将数张表合成一张大表,字段相加,记录相乘,即笛卡尔积。

    自然连接查询

    自然连接查询就是在等值连接查询的基础之上,将需要的列展示出来的查询。

    sql语句的写法是:select A.字段1,B.字段2 from A,B where A.主键 = B.外键 and 其他查询条件;

    例如:我们想查询陈伟的所有学科的成绩,展示学生姓名、学科和成绩,如下图所示:

    自然连接查询的本质实际上也是基于等值连接查询结果的,只是在查询结果集中进行筛选。因此,基于以上两种查询,优点是简单方便,缺点也很明显:查询效率较低,不利于海量的数据查询;

    嵌套查询

    嵌套查询就是将一个查询语句嵌套到另一个查询语句里,得到的查询结果集;

    假设我们要查询学生名字叫陈伟的语文考试成绩,用嵌套查询可以这样写:

    编写嵌套查询语句时要注意的地方是:在写之前要理清思路,表的结构要清晰明了。单条sql查询语句要逐个验证,然后再结合在一起进行验证。它的优点在于查询效率较高,缺点就是逻辑性比较强;

    从上例我们看到通过“in”关键词将两条查询语句连在一起进行嵌套查询,下面列举一下嵌套查询所用到的各种关键词:

    in:查询的值是否在子查询语句的结果集中,如上例;exist:子查询语句的结果只要不为空,就返回所有符合条件的查询结果;

    上例中,因为子查询语句能查询到值,因此主查询语句将返回所有的查询结果;

    any:子查询语句的结果集中只要有任意一个满足条件,就返回所有符合条件的查询结果;all:子查询语句的结果集必须都要满足条件,才返回符合条件的查询结果;

    请注意上例中any和all的用法,得到不同的结果;

    自身连接查询

    当在一张表中用到该表的好几个字段作为筛选条件,可以考虑使用自身连接查询实现,此时,需要为该表起一个别名,例如我们要把所有大于女同学年龄的所有男同学查询出来,可以这么做:

    通过as关键词为同一张表命名为一个别名,从而可以使用这个别名,自身连接查询在应用中往往因为语法简单,但逻辑关系复杂而导致不太容易被理解。其实有时候,只要将单表看成是多张表,跳出思维的局限性,有时候在应用中会给我们带来很多方便。

  • 相关阅读:
    ThreadPoolExecutor线程池参数设置技巧
    CountDownLatch与join的区别和联系
    数据库的隔离级别
    Spring事务管理的demo
    Java中isAssignableFrom的用法
    Java注解的基本概念和原理及其简单实用
    System.getProperty("line.separator") 是什么意思?
    关于“100g文件全是数组,取最大的100个数”解决方法汇总
    Intellij IDEA 添加jar包的三种方式
    亿级Web系统搭建 Web负载均衡的几种实现方式(阿里)
  • 原文地址:https://www.cnblogs.com/keima/p/14970908.html
Copyright © 2011-2022 走看看