【MySQL】(四)SQL 基础操作之 DQL 数据查询语言2

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 【MySQL】(四)SQL 基础操作之 DQL 数据查询语言2

MySQL子查询


子查询: 在一个查询中又嵌套了其他的查询,那么嵌套的查询就被称为子查询,而外层的查询被称为父查询。子查询可以任意嵌套!可以出现在INSERT UPDATE DELETE WHERE等中…


需求: 查询在高等数学考试中,成绩比张三高的学生的姓名信息


如果不考虑连表查询

SELECT
  stuId
FROM
  result
WHERE
  subjectId = 1
  AND
  result > 86;


1.查询高等数学的课程编号

SELECT
  subjectId
FROM
  `subject`
WHERE 
  subjectName = '高等数学';


整合

SELECT
  stuId
FROM
  result
WHERE
  subjectId = (
  SELECT
    subjectId
  FROM
    `subject`
  WHERE 
    subjectName = '高等数学'
  )
  AND
  result > 86;


2.查询张三的高数考试成绩

SELECT
  result
FROM
  result
WHERE
  stuId = (SELECT stuId FROM student WHERE stuName = '张三')
  AND subjectId = (SELECT subjectId FROM `subject` WHERE subjectName = '高等数学');


整合

SELECT
  r.stuId,stu.stuName
FROM
  result r,student stu
WHERE
  r.stuId = stu.stuId
  AND
  subjectId = (
  SELECT subjectId FROM `subject` WHERE subjectName = '高等数学'
  )
  AND
  result > (
  SELECT result FROM result WHERE stuId = (
    SELECT stuId FROM student WHERE stuName = '张三'
  )
  AND subjectId = (
    SELECT subjectId FROM `subject` WHERE subjectName = '高等数学'
  )
  );


使用子查询解决连表查询


要求查询学生姓名、年级名称


原来

SELECT stu.stuName,g.gradeName FROM student stu,grade g WHERE stu.gradeId = g.gradeId;


子查询


SELECT
  stu.stuName,
  (SELECT g.gradeName FROM grade g WHERE g.gradeId = stu.gradeId) AS gradeName
FROM
  student stu;


MySQL常用函数


常用的字符串函数


字符串拼接 CONCAT(str1,str2,…)

SELECT CONCAT('这是','MySQL','数据库');


字符串内容替换 REPLACE(str,from_str,to_str)

SELECT REPLACE('这是MySQL数据库','MySQL','Oracle');


去除左侧空格

SELECT LTRIM('     Hello World  ');


去除右侧空格

SELECT RTRIM('   Hello World  ');


获取字符串长度

SELECT LENGTH('Hello');


截取字符串SUBSTR(str,pos) 索引从1开始

SELECT SUBSTR('Hello World',5);


SUBSTR(str,pos,len)

SELECT SUBSTR('Hello World',5,3);


常用的数学函数


获取随机数 Math.random()

SELECT RAND();


向上取整

SELECT CEIL(20.4);


向下取整

SELECT FLOOR(20.7);


四舍五入

SELECT ROUND(20.5);
SELECT ROUND(20.76,1)


常用的时间函数


获取当前时间

SELECT NOW();
SELECT CURRENT_DATE();
SELECT CURRENT_TIME();


获取各种时间信息的函数

SELECT MONTH(NOW());
SELECT YEAR(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());


日期转换

SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');


计算时间差额

SELECT DATEDIFF(NOW(),'2019-05-25');


常用的聚合/统计函数

求年级编号最大的

SELECT MAX(gradeId) FROM grade;


求年级编号最小的

SELECT MIN(gradeId) FROM grade;


求平均分

SELECT AVG(result) FROM result WHERE subjectId = 1;


求和

SELECT SUM(result) FROM result WHERE subjectId = 1;


计算学生总人数

SELECT COUNT(*) FROM student;
SELECT COUNT(stuId) FROM student;
SELECT COUNT(1) FROM student;


分组查询 GROUP BY


注意事项: 在分组查询的查询字段中 不要出现与分组查询中无关的字段值


需求: 计算各个年级的学生人数

SELECT gradeId,COUNT(1) FROM student GROUP BY gradeId;


如果我希望查看 各个年级的总人数 且要求查看对应的学生姓名列表

SELECT gradeId,COUNT(1),GROUP_CONCAT(stuName) FROM student GROUP BY gradeId;


计算各个年级各个性别的人数

SELECT gradeId,gender,COUNT(1) FROM student GROUP BY gradeId,gender;


需求: 查询年级的学生人数大于1人的年级名称

SELECT
  stu.gradeId,count(1),g.gradeName
FROM
  student stu,grade g
WHERE
  stu.gradeId = g.gradeId
GROUP BY 
  gradeId
HAVING 
  count(1) > 1;


HAVING和WHERE的区别?


相同点: 都可以用来进行条件判断 筛选行数


不同点:


  • 位置不同: WHERE是在分组之前 HAVING是在分组之后
  • 条件筛选不同: WHERE是给FROM查询到的数据进行条件筛选 而HAVING是对分组后的数据进行筛选
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
17天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
126 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
17天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
52 14
|
20天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
48 9
|
28天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
46 1
|
29天前
|
SQL 关系型数据库 MySQL
mysql数据误删后的数据回滚
【11月更文挑战第1天】本文介绍了四种恢复误删数据的方法:1. 使用事务回滚,通过 `pymysql` 库在 Python 中实现;2. 使用备份恢复,通过 `mysqldump` 命令备份和恢复数据;3. 使用二进制日志恢复,通过 `mysqlbinlog` 工具恢复特定位置的事件;4. 使用延迟复制从副本恢复,通过停止和重启从库复制来恢复数据。每种方法都有详细的步骤和示例代码。
154 2
|
18天前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
26 0
|
28天前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
37 0
|
28天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0
|
17天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
30 1
|
19天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
32 4