前面我们介绍了单张表的查询,包括模糊查询、分组、排序、各种筛选条件等等操作,在实际应用中,查询的数据往往不止局限在一张表里,通常需要多张表在一起进行组合查询,今天我们将会对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关键词为同一张表命名为一个别名,从而可以使用这个别名,自身连接查询在应用中往往因为语法简单,但逻辑关系复杂而导致不太容易被理解。其实有时候,只要将单表看成是多张表,跳出思维的局限性,有时候在应用中会给我们带来很多方便。

Python操作Mysql数据库——多表组合查询的更多相关文章

  1. python 操作mysql数据库之模拟购物系统登录及购物

    python 操作mysql数据库之模拟购物系统登录及购物,功能包含普通用户.管理员登录,查看商品.购买商品.添加商品,用户充值等. mysql 数据库shop 表结构创建如下: create TAB ...

  2. 【转】python操作mysql数据库

    python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...

  3. Python操作MySQL数据库9个实用实例

    用python连接mysql的时候,需要用的安装版本,源码版本容易有错误提示.下边是打包了32与64版本. MySQL-python-1.2.3.win32-py2.7.exe MySQL-pytho ...

  4. python接口自动化(三十八)-python操作mysql数据库(详解)

    简介 现在的招聘要求对QA人员的要求越来越高,测试的一些基础知识就不必说了,来说测试知识以外的,会不会一门或者多门开发与语言,能不能读懂代码,会不会Linux,会不会搭建测试系统,会不会常用的数据库, ...

  5. Python操作MySQL数据库(步骤教程)

    我们经常需要将大量数据保存起来以备后续使用,数据库是一个很好的解决方案.在众多数据库中,MySQL数据库算是入门比较简单.语法比较简单,同时也比较实用的一个.在这篇博客中,将以MySQL数据库为例,介 ...

  6. Python 操作MySQL 数据库

    Python 操作 MySQL 数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的 ...

  7. python操作MySQL数据库报错问题解决

    编写好Python操作数据库的脚本后,运行报错如下: 报错1:“AttributeError: 'NoneType' object has no attribute 'encoding'” 解决办法: ...

  8. python操作mysql数据库的相关操作实例

    python操作mysql数据库的相关操作实例 # -*- coding: utf-8 -*- #python operate mysql database import MySQLdb #数据库名称 ...

  9. Windows下安装MySQLdb, Python操作MySQL数据库的增删改查

    这里的前提是windows上已经安装了MySQL数据库,且配置完成,能正常建表能操作. 在此基础上仅仅需安装MySQL-python-1.2.4b4.win32-py2.7.exe就ok了.仅仅有1M ...

随机推荐

  1. 【Java】forward & redirect 的差异

    1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地 ...

  2. Android开发(十二)——头部、中部、底部布局

    参考: [1] http://www.thinksaas.cn/group/topic/82898/ [2] http://***/Article/12399 其实RadioGroup不好使,不能图片 ...

  3. java框架篇---struts之文件上传和下载

    Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...

  4. 【iCore4 双核心板_ARM】例程十二:通用定时器实验——定时点亮LED

    实验原理: 通过STM32的三个GPIO口来驱动LED灯的三个通道,设定GPIO为推挽输出模式,采 用灌电流的方式与LED连接,输出高电平LED灭,输出低电平LED亮,通过通用定时器TIM3 实现50 ...

  5. Loadrunner C/S关联函数(LSP)AND(LSSS)使用-案例

    LSP就是lrs_save_param()函数 LSSS就是lrs_save_searched_string()函数 一下我们用一个例子去说明他们的使用. C/S机制和B/S不一样,特别是有一个dat ...

  6. C++ 智能指针四

    /* 智能指针enable_shared_from_this模板类使用 */ #include <iostream> #include <string> #include &l ...

  7. java-信息安全(八)-迪菲-赫尔曼(DH)密钥交换

    概述 信息安全基本概念: DH(Diffie–Hellman key exchange,迪菲-赫尔曼密钥交换) DH 是一种安全协议,,一种确保共享KEY安全穿越不安全网络的方法,它是OAKLEY的一 ...

  8. OpenWRT AR9331 mjpg-streamer 网络安装和离线ipk安装

    OpenWRT  AR9331 固件 我的摄像头ID为: root@Off-1CD0:/# lsusb Bus 001 Device 002: ID 1871:0101 OpenWRT支持的UVV摄像 ...

  9. 服务器最大TCP连接数及调优汇总

    启动线程数: 启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU内核数 最佳启动线程数和CPU内核数量成正比,和IO阻塞时间成反比.如果任务都是CPU计算型任务,那么线程数最多不超过 ...

  10. HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别

    HashMap 是否是线程安全的,如何在线程安全的前提下使用 HashMap,其实也就是HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的 ...