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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 【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是对分组后的数据进行筛选
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
缓存 NoSQL 关系型数据库
13- Redis和Mysql如何保证数据⼀致?
该内容讨论了保证Redis和MySQL数据一致性的几种策略。首先提到的两种方法存在不一致风险:先更新MySQL再更新Redis,或先删Redis再更新MySQL。第三种方案是通过MQ异步同步以达到最终一致性,适用于一致性要求较高的场景。项目中根据不同业务需求选择不同方案,如对一致性要求不高的情况不做处理,时效性数据设置过期时间,高一致性需求则使用MQ确保同步,最严格的情况可能涉及分布式事务(如Seata的TCC模式)。
43 6
|
23天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
|
25天前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
15 0
|
1天前
|
SQL 关系型数据库 MySQL
Spring_jdbc数据连接池(mysql实现增、删、改、查)
Spring_jdbc数据连接池(mysql实现增、删、改、查)
8 0
|
3天前
|
存储 数据可视化 关系型数据库
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
本文探讨MySQL中时间类型的选择,阐述datetime、timestamp、整形时间戳等类型特点以及它们在千万级数据量下的查询性能
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
|
18天前
|
SQL 存储 关系型数据库
【MySQL实战笔记】02.一条SQL更新语句是如何执行的-2
【4月更文挑战第5天】两阶段提交是为确保`redo log`和`binlog`逻辑一致,避免数据不一致。若先写`redo log`, crash后数据可能丢失,导致恢复后状态错误;若先写`binlog`,crash则可能导致重复事务,影响数据库一致性。一天一备相较于一周一备,能缩短“最长恢复时间”,但需权衡额外的存储成本。
16 1
|
25天前
|
SQL 关系型数据库 MySQL
【MySQL】慢SQL分析流程
【4月更文挑战第1天】【MySQL】慢SQL分析流程
|
3天前
|
SQL 存储 关系型数据库
MySQL Cluster集群安装及使用
MySQL Cluster集群安装及使用
|
18天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)
|
7天前
|
关系型数据库 MySQL 数据库
《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)
《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)
31 4