首页 > 数据库 >mysql数据库多表查询

mysql数据库多表查询

时间:2024-09-29 10:46:20浏览次数:7  
标签:多表 数据库 查询 score mysql 左表 20 id select

单表查询

1、普通查询

(1)命令:select * from <表名>;//通匹

(2)命令:select <要查询的字段> from <表名>;

2、去重查询(distinct) 命令:select distinct <要查询的字段> from <表名>

3、排序查询(order by) 升序:asc 降序:desc

降序排列命令:select <要查询的字段名> from <表名> order by <要查询的字段名> desc

不加desc一般默认为升序排列

4、分组查询(group by) 命令:select <按什么分的组>, Sum(score) from <表名> group by <按什么分的组>

假设现在又有一个学生成绩表(result)。要求查询一个学生的总成绩。我们根据学号将他们分为了不同的组。

命令:mysql>select id, Sum(score) from result group by id;

多表查询

一、等值查询

现在有两个表:

在这里插入图片描述 在这里插入图片描述

现在要查询年龄小于20岁学生的不及格成绩

语句:select stu.id,score from stu,result where stu.id = result.id and age < 20 and score < 60; 它的查询如下图所示:

在这里插入图片描述  

可见等值查询效率太低

二、连接查询

1、外连接查询

(1)左外连接查询

假设我们依旧使用的是上面的两个表,任然查询年龄小于20岁学生的不及格成绩

我们利用左外连接查询,先将学生表中所有年龄小于20岁的学生取出来,再在成绩表中将所有成绩小于60的学生取出来,然后再进行配对,我们会发现效率大大得提高,只用匹配四次就可以找到。 如下图所示:

在这里插入图片描述 语句为: select a.id,score from (select id,age from stu where age < 20) a (过滤左表信息) left join (select id, score from result where score < 60) b (过滤右表信息) on a.id = b.id; 左外连接就是左表过滤的结果必须全部存在。如果存在左表中过滤出来的数据,右表没有匹配上,这样的话右表就会出现NULL; (2)右外连接查询 select a.id,score from (select id,age from stu where age < 20) a (过滤左表信息) right join (select id, score from result where score < 60) b (过滤右表信息) on a.id = b.id; 左外连接就是左表过滤的结果必须全部存在 如图: 在这里插入图片描述 我们发现过滤出来的表进行的匹配只有两条满足条件(红色代表条件满足),但最后的结果却是: 在这里插入图片描述 左表不匹配的数据改为空,右表过滤出来的数据都要存在。 (3)全外连接查询 结合了左外连接和右外连接,使得左表和右表的数据都存在。 2、内连接查询 只筛选匹配结果 比如过滤的结果如下: 在这里插入图片描述 最后的结果为: 在这里插入图片描述 只匹配我们需要的结果 语句为: select a.id,score from (select id,age from stu where age < 20) a (过滤左表信息) inner join (select id, score from result where score < 60) b (过滤右表信息) on a.id = b.id;

标签:多表,数据库,查询,score,mysql,左表,20,id,select
From: https://www.cnblogs.com/ataoxz/p/18439119

相关文章

  • MySQL登录时出现ERROR 1045: Access denied for user ‘root‘@‘localhost‘ (using p
    Mysql在使用过程中,可能会遇到登录问题,比如常见的错误信息:“Accessdeniedforuser‘root’@‘localhost’(usingpassword:YES)”。本文将分析这个问题的可能原因,并提供一系列解决方案. 定位报错原因出现这个Accessdenied问题的原因有如下可能:MySQL的服务器停止了。......
  • pbootcms提示:“未检测到您服务器环境的sqlite3数据库扩展…”
    当PBootCMS提示“未检测到您服务器环境的sqlite3数据库扩展”时,可以通过以下两种方法来解决:方法一:修改数据库配置连接驱动为 pdo_sqlite打开数据库配置文件:打开数据库配置文件 /config/database.php。修改数据库类型:找到 'type' 这一行,将 sqlite 改为 pdo_sqli......
  • 【2024计算机毕业设计】基于jsp+mysql的JSP酒店预定管理系统
    运行环境:最好是javajdk1.8,我在这个平台上运行的。其他版本理论上也可以。IDE环境:Eclipse,Myeclipse,IDEA或者SpringToolSuite都可以,如果编译器的版本太低,需要升级下编译器,不要弄太低的版本tomcat服务器环境:Tomcat7.x,8.x,9.x版本均可操作系统环境:WindowsXP/7......
  • PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
    根据报错信息,问题在于PHP环境中缺少SQLite3扩展的支持。以下是如何解决此问题的步骤:定位php.ini文件:找到当前PHP安装路径下的php.ini文件。如果你使用的是集成开发环境(如XAMPP、WAMP、phpStudy等),通常可以在环境的配置文件管理器中直接找到php.ini。启用SQLite3扩展:使用......
  • Python对数据库(MySQL,redis、MongoDB)的操作
    Python对数据库的操作(MySQL,redis、MongoDB)一、操作MySQL数据库安装pymysql:需要通过pipinstallpymysql进行安装。查询数据:fetchone、fetchmany(n)、fetchall()importpymysql#建立mysql连接,ip、端口、用户名、密码(passwd,不能写成其他,例如:pwd或者p,否则报错)、库名con......
  • JDBC数据库 连接池配置
    前言我们在写任何一个CRUD方法的时候都要进行即连接数据库和释放资源这两个操作。DAO层方法中每次都创建一个Connection对象,用完就关闭了,创建Connection成本很大,如何解决这个问题呢?每次CRUD操作都要使用数据库的时候,都要创建一个数据库对象,普通的JDBC数据库连接使用DriverMan......
  • 滚雪球学MySQL[6.1讲]:数据备份与恢复
    全文目录:前言6.数据备份与恢复6.1备份的基础知识6.1.1备份的重要性6.1.2备份的类型6.2备份策略6.2.1完全备份与增量备份结合6.2.2定期检查备份有效性6.2.3异地备份6.3MySQL备份工具6.3.1mysqldump6.3.2mysqlhotcopy6.3.3PerconaXtraBackup6.4数据恢复策......
  • 滚雪球学MySQL[5.1讲]:事务与并发控制
    全文目录:前言5.事务与并发控制5.1事务的基本概念5.1.1事务的ACID特性5.1.2事务的使用5.2并发事务的处理5.2.1锁机制详解5.2.2死锁的检测与解决5.3隔离级别与一致性5.3.1四种隔离级别5.3.2幻读、脏读与不可重复读5.4多版本并发控制(MVCC)下期内容预告前......
  • MySQL为什么使用B+树以及什么是覆盖索引和回表
    目录B+树什么是B+树B+树的特性        节点有序性        数据聚集性        查询稳定性        高扇出性MySQL为什么选择B+树        从范围查询的角度        从插入和删除的角度        从磁盘I/O的角......
  • MySQL 之多表设计详解
    在实际应用场景中,我们经常需要处理包含多种数据实体及其之间复杂关系的业务逻辑,例如电商平台的用户、商品、订单,社交网络的用户、帖子、评论等等。如果将所有数据都堆砌在一张表中,不仅会造成数据冗余、难以维护,还会严重影响查询效率。为了解决这些问题,我们需要采用多表设计,即......