Python MySQL数据库2:数据库查询(下)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Python MySQL数据库2:数据库查询(下)

显示分组中的 name, age, id

select gender,group_concat(name, age, id) from animalTable where gender=1 group by gender


image.png

由于上面的 name, age, id 混在了一起,我们需要分开他们,看的更直观一些

select gender,group_concat(name,"_",age, "_",id) from animalTable where gender=1 group by


image.png

(5)、group by + having


  • having 条件表达式:用来分组查询后指定一些条件来输出查询结果
  • having作用和where一样,但having只能用于group by

查询平均年龄超过7岁的性别,以及姓名

select gender, group_concat(name),avg(age) from animalTable group by gender having avg(a


image.png

  • 查询每种性别中的数量多于2个的信息


select gender, group_concat(name) from animalTable group by gender having count(*)>2;
  • (6)、group by + with rollup
    with rollup 的作用是:在最后新增一行,来记录当前列里所有记录的总和


select gender,count(*) from animalTable group by gender with rollup;


五、分页


image.png

  • 5.1、当数据量过大时,在一页中查看数据是一件非常麻烦的事情
    语法:select * from 表名 limit start,count,解释:start 是页码,count是一页显示的数量
  • 5.2、查询前2行男生信息


select * from personTable where gender = "男" limit 0,2;


image.png

  • 5.3、求第n页的数据,每页 m 条数据(不足m条,有多少显示多少条)


select * from personTable limit (n-1)*m,m;
  • 举例: 如果展示:第三页的数据,每页2个数据:n=3,m=2


select * from personTable limit 4,2;
  • 错误写法:


select * from personTable limit (3-2)*2,2;

提示:limit 要放在其他约束之后,最后面


六、连接查询



(多表的时候有用,单表的时候几乎没有用),当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回,mysql支持三种类型的连接查询,分别为:内连接查询、左连接查询、右连接查询(有了左连接,一般不使用右连接)

语法:inner join ... on...

select * from 表1 inner或left或right join 表2 on 表1.列 = 表2.列


  • 6.1、准备
  • 给 personTable  添加  class_id 字段,并赋值,效果如下
    alter table personTable add class_id int unsigned;


image.png


创建一个班级的数据表,并赋值

mysql> create table classTable(
    ->  id int unsigned primary key auto_increment not null,
    -> class_name varchar(20) default ''
);
mysql> insert into classTable values(0,"一班"),(0,"二班"),(0,"三班")


image.png


6.2、内连接查询:inner join ... on (取交集):查询的结果为两个表匹配到的数据


image.png

  • select ... from 表A inner join 表B;


select * from personTable inner join classTable;
  • (1)、查询 有能够对应班级的学生以及班级信息


select * from personTable inner join classTable on personTable.class_id=classTable.id;


image.png

  • (2)、在上面查询的基础上 按照要求显示姓名、班级:不再使用 *,展示什么: 表名.字段


select personTable.*,classTable.class_name from personTable inner join classTable on personTable.class_id=classTable.id;
// 只显示两个组的名字
select personTable.name,classTable.class_name from personTable inner join classTable on personTable.class_id=classTable.id;
  • (3)、给数据表 起别名(取表名的首字母)


select p.name,c.class_name from personTable as p inner join classTable as c on p.class_id=c


image.png

  • (4)、在以上的查询中,将班级姓名显示在第1列(将上面的p.name,c.class_name调换一下顺序)


select c.class_name,p.name from personTable as p inner join classTable as c on p.class_id=c.id;
  • (5)、查询 有能够对应班级的学生以及班级信息, 按照班级降序进行排序


select c.class_name,p.name from personTable as p inner join classTable as c on p.class_id=c.id order by c.class_name desc;
  • (6)、当时同一个班级的时候,按照学生的id进行从大到小排序


select p.name,p.id,c.class_name from personTable as p inner join classTable as c on p


image.png

image.png

6.3、左连接查询:left join (取左边):查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充


image.png

(1)、查询每位学生对应的班级信息

select * from personTable left join classTable on personTable.class_id= classTable.id;

image.png


(2)、查询没有对应班级信息的学生(用 having 就好,对结果进行处理)

select ... from xxx as s left join xxx as c on..... where .....或者select ... from xxx as s left join xxx as c on..... having .....

select * from personTable left join classTable on personTable.class_id= classTable.id having classTable.class_name is null; 
或者 where 来替换 having
select * from personTable left join classTable on personTable.class_id= classTable.id wher


image.png

6.4、右连接查询(取右边):查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充


image.png



提示: 将数据表名字互换位置,用left join完成  right join...on...


七、自关联



  • 7.1、自关联的引用
  • 设计省信息的表结构provinces


id
ptitle
  • 设计市信息的表结构citys


id
ctitle
proid
  • citys表的proid表示城市所属的省,对应着provinces表的id值
  • 问题:能不能将两个表合成一张表呢?
  • 思考:观察两张表发现,citys表比provinces表多一个列proid,其它列的类型都是一样的
  • 意义:存储的都是地区信息,而且每种信息的数据量有限,没必要增加一个新表,或者将来还要存储区、乡镇信息,都增加新表的开销太大
  • 答案:定义表areas,结构如下


id
atitle
pid
  • 说明:
  • 因为省没有所属的省份,所以可以填写为null
  • 城市所属的省份pid,填写省所对应的编号id
  • 这就是自关联,表中的某一列,关联了这个表中的另外一列,但是它们的业务逻辑含义是不一样的,城市信息的pid引用的是省信息的id
  • 在这个表中,结构不变,可以添加区县、乡镇街道、村社区等信息
  • 7.1、准备工作
    把本地的 city.sql(地区文件内容) 拷贝到 服务器root家目录下,下面代码:前面的city.sql  是本地的路径,后面的是服务器的路径,我是直接放到了 root的家目下


scp -P 22 city.sql root@47.93.240.8: city.sql
  • 在 pythonTestDataBase 库下建立表 city


创建city表的语句如下:


create table city(
      id int unsigned primary key auto_increment not null,
      pid int unsigned default 0,
      cityname varchar(20) default ' ',
      type int unsigned default null
);
  • 导入数据


source  city;
  • 7.2、查询出山东省有哪些市


select * from city as province inner join city as citys on citys.pid=province.aid having province.atitle="山东省";
select province.atitle, citys.atitle from city as province inner join city as citys on citys.pid=province.aid having province.atitle="山东省";
  • 7.3、  查询出青岛市有哪些县城


select province.atitle, citys.atitle from city as province inner join city as citys on citys.pid=province.aid having province.atitle="青岛市";
select * from city where pid=(select aid from city where atitle="青岛市")


八、子查询



image.png


  • 8.1、 子查询 与 主查询


  • 子查询语句:在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句。
  • 主查询:主要查询的对象,第一条 select 语句。
  • 主查询 和 子查询 的关系
  • 子查询是嵌入到主查询中
  • 子查询是辅助主查询的,要么充当条件,要么充当数据源
  • 子查询是可以独立存在的语句,是一条完整的 select 语句


  • 8.2、子查询分类


  • 标量子查询: 子查询返回的结果是一个数据(一行一列)
  • 列子查询: 返回的结果是一列(一列多行)
  • 行子查询: 返回的结果是一行(一行多列)


  • 8.3、标量子查询


  • 查询动物的平均年龄


select avg(age) from animalTable;
  • 查询大于平均年龄的动物


select * from animalTable where age > (select avg(age) from animalTable);


image.png


8.4、列级子查询


image.png


查询还有学生在班的所有班级名字

  • 找出学生表中所有的班级 id
  • 找出班级表中对应的名字
    select class_name from classTable where id in (select class_id from personTable);


image.png


  • 8.5、行级子查询
  • 需求: 查找班级年龄最大,身高最高的学生
  • 行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素


select * from students where (height,age) = (select max(height),max(age) from students);


  • 8.6、子查询中特定关键字使用
  • in 范围
    格式: 主查询 where 条件 in (列子查询)


九、总结



  • 9.1、查询的完整格式


SELECT select_expr [,select_expr,...] [      
   FROM tb_name
   [WHERE 条件判断]
   [GROUP BY {col_name | postion} [ASC | DESC], ...] 
   [HAVING WHERE 条件判断]
   [ORDER BY {col_name|expr|postion} [ASC | DESC], ...]
   [ LIMIT {[offset,]rowcount | row_count OFFSET offset}]
]
  • 9.2、完整的select语句


select distinct *
from 表名
where ....
group by ... having ...
order by ...
limit start,count


  • 9.3、执行顺序为:
  • from 表名
  • where ....
  • group by ...
  • select distinct *
  • having ...
  • order by ...
  • limit start,count


  • 9.4、实际使用中,只是语句中某些部分的组合,而不是全部
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
14天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
46 9
|
11天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
26 1
|
13天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
29 4
|
16天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
44 3
|
19天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
91 1
|
7天前
|
运维 关系型数据库 MySQL
安装MySQL8数据库
本文介绍了MySQL的不同版本及其特点,并详细描述了如何通过Yum源安装MySQL 8.4社区版,包括配置Yum源、安装MySQL、启动服务、设置开机自启动、修改root用户密码以及设置远程登录等步骤。最后还提供了测试连接的方法。适用于初学者和运维人员。
62 0
|
20天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
48 0
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
63 3
Mysql(4)—数据库索引
|
22天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
64 2
下一篇
无影云桌面