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

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

文章目录



DQL(Data Query Language) 数据查询语言

MySQL的标准查询语句结构

where查询条件

特殊的比较运算符

模糊查询

连接查询原理及掌握连接查询的使用 (多表连查)


DQL标准语法结构

排序查询 ORDER BY

限制查询(分页) LIMIT

MySQL子查询


MySQL常用函数

常用的字符串函数

常用的数学函数

常用的时间函数

常用的聚合/统计函数


分组查询 GROUP BY

HAVING和WHERE的区别?


DQL(Data Query Language) 数据查询语言


MySQL的标准查询语句结构

SELECT [ALL|DISTINCT]
  {* | 表名.* | 表名.字段名.... [AS 别名]}
  FROM 要查询的表名 [AS 别名]
  [LEFT | RIGHT | INNER JOIN 连接表名 [AS 别名]]
  WHERE 查询条件;


  • SELECT后 FROM前的这一块内容 它是用来筛选查询字段的


简单理解就是你想查看哪些信息 例如:我想查看student表中的学生名、学生年龄、学生性别信息


查看学生表中的所有信息(不推荐写* 推荐写全字段名年列表) 效率低

SELECT * FROM student;


查看学生表中的学生姓名和性别

SELECT stuName,gender FROM student;


  • 别名(比较常用) 注意: 此处使用中文只不过是方便你理解而已 后面不会采用写中文别名


AS关键字可以省略 ''也可以省略

SELECT stu.stuName AS '姓名',stu.gradeId + 1 年级 FROM student stu;


  • 如果SQL过长可以进行"美化" 目前个人推荐写法:
SELECT
  stuName AS '姓名',
  gradeId + 1 年级 
FROM
  student;


  • 去重 (默认的)ALL所有的、全部 DISTINCT直接的、明显的 (去重)
SELECT ALL stuName,gradeId FROM student;


DISTINCT 用来在指定的查询字段值范围内 去除重复数据

SELECT DISTINCT stuName,gradeId FROM student;
SELECT DISTINCT stuName,gender,gradeId FROM student;


where查询条件


在修改和删除时用,目的是为了防止修改/删除全表。


用于检索数据表中符合条件的记录的


简单理解: 上方的操作是用来筛选列的 where是用来筛选行的


  • 在where条件语句中 可以由一个或者多个逻辑表达式组成 结果一般为真或假
<关系/比较运算符和逻辑运算符>
SELECT * FROM student;


查询年级是大于1的学生信息

SELECT * FROM student WHERE gradeId > 1;


  • 复杂条件的处理: 逻辑运算符 与and 或or 非not


查询姓名为 张三 且 性别为女 的学生信息

SELECT * FROM student WHERE stuName = '张三' AND gender = '女';


查询性别是女的 或者 年级为3的

SELECT * FROM student WHERE gender = '女' OR gradeId = 3;


查询性别不是女的

三种方法
SELECT * FROM student WHERE NOT gender = '女';
SELECT * FROM student WHERE gender <> '女';
SELECT * FROM student WHERE gender != '女';


特殊的比较运算符


IS NULL          IS NOT NULL


  • 查询地址为空的学生姓名 查询空千万记住不能使用 “ = ”
SELECT stuName FROM student WHERE address IS NULL;
SELECT stuName FROM student WHERE address IS NOT NULL;


  • BETWEEN … AND 在…之间/范围内 它等价于>= and <=


查询年级在2-3之间的学生姓名

SELECT stuName FROM student WHERE  gradeId >= 2 AND gradeId <= 3;
-- 更加简洁
SELECT stuName FROM student WHERE  gradeId BETWEEN 2 AND 3;


IN查询 在…内/里面


查询年级为1或年级为3的学生信息

SELECT * FROM student WHERE gradeId = 1 OR gradeId = 3;
-- 更加简洁
SELECT * FROM student WHERE gradeId IN (1,3);
SELECT * FROM student WHERE gradeId NOT IN (1,3);


模糊查询


  • LIKE 像…一样 喜欢
  • %表示任意单个/多个字符
  • _表示任意单个字符


查询姓为张的学生信息

SELECT * FROM student WHERE stuName LIKE '张%';


查询姓张的两个字的学生信息

SELECT * FROM student WHERE stuName LIKE '张_';


查询名称中带有三的学生信息

SELECT * FROM student WHERE stuName LIKE '%三%';


查询三是姓名第二个字符的学生信息

SELECT * FROM student WHERE stuName LIKE '_三%';


连接查询原理及掌握连接查询的使用 (多表连查)


  • 连接查询: 内连接查询、外连接查询、自连接查询
  • 内连接: 显式内连接、隐式内连接


查询学生的姓名和所在年级

SELECT stuName,gradeId FROM student;


采用显式内连接[推荐给多表起别名 区分清楚 防止出现模糊不清错误]


内连接可以理解为交集

SELECT 
  stu.stuName,g.gradeName
FROM 
  student stu
INNER JOIN grade g 
ON stu.gradeId = g.gradeId; # 关联条件


采用隐式内连接查询 笛卡尔积

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


查询所有的学生姓名、课程名称、考试成绩

SELECT
  stu.stuName,sub.subjectName,r.result
FROM
  student stu,`subject` sub,result r
WHERE 
  stu.stuId = r.stuId 
  AND 
  sub.subjectId = r.subjectId;


外连接: 左外连接、右外连接


查询学生的姓名和所在年级


采用左外连接 以左表为主 LEFT JOIN前面的就是左表

SELECT
  stu.stuName,g.gradeName
FROM
  student stu LEFT OUTER JOIN grade g
  ON stu.gradeId = g.gradeId;


采用右外连接

SELECT
  stu.stuName,g.gradeName
FROM
  student stu RIGHT JOIN grade g
  ON stu.gradeId = g.gradeId;


自连接(内连接)


查询游戏名称和所属分类

SELECT
  c1.categoryName,c2.categoryName
FROM 
  category c1,category c2
WHERE
  c1.pid = c2.id


编写DQL一定要严格按照此语法的顺序来实现!

SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重
    {* | 表名.* | 表名.字段名[ AS 别名][,...]} 指定查询出的字段的
  FROM
    表名[AS 别名][,表1... AS 别名]
  [INNER | [LEFT | RIGHT] [OUTER] JOIN 另一张表名 [AS 别名] ON 关联条件]
  [WHERE 条件]
  [GROUP BY 分组字段[,...]] 
  [HAVING 给分组后的数据进行条件筛选]
  [ORDER BY 排序字段[,...]]
  [LIMIT [startIndex,]pageSize]


排序查询 ORDER BY


排序: 成绩、游戏排行榜(金额、战力、等级…)、音乐、销量


需求: 查询出学生姓名、课程名称、成绩 并且按照成绩进行降序排序


ORDER BY 默认情况下为升序排序即ASC(Ascend) 降序DESC(Descend)

SELECT
  stu.stuName,sub.subjectName,r.result
FROM 
  result r,student stu,`subject` sub
WHERE
  r.stuId = stu.stuId AND r.subjectId = sub.subjectId
ORDER BY r.result DESC;


需求: 在上方基础进行改动 要求按照成绩进行降序 且如果成绩相同按照时间降序

SELECT
  stu.stuName,sub.subjectName,r.result,r.examDate
FROM 
  result r,student stu,`subject` sub
WHERE
  r.stuId = stu.stuId AND r.subjectId = sub.subjectId
ORDER BY 
  r.result DESC , r.examDate DESC; # (X) ORDER BY r.result,r.examDate DESC;


限制查询(分页) LIMIT

LIMIT offset,row;


LIMIT startIndex起始索引<从0开始>,pageSize 分页场景


需求:只想看前两条学生信息

SELECT
  *
FROM
  student
LIMIT 0,2; -- 如果offset是从0开始 那么可以省略 LIMIT 2


-- 基本分页:
select * from result limit 10;
-- 取前10行
select * from result limit 5,10;
-- 从第六行开始,取前10行
select * from result limit 10 offset 5;
-- 排序分页
select * from result order by StudentNo limit 10;


分页: 因为数据量比较大的时候 如果把所有数据显示在一页上


LIMIT 可以在我们的MySQL中实现分页的数据查询/指定页码的数据查询


  • 需求: 现在学生信息要求每页显示2条 想查看第一页的数据
SELECT * FROM student LIMIT 0,2;


  • 要求查看第二页的数据
SELECT * FROM student LIMIT 2,2;


  • 要求查看第三页的数据
SELECT * FROM student LIMIT 4,2;


  • 页码和起始索引的计算公式:(页码 - 1) * 显示条数
startIndex = (currentPage - 1) * pageSize;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
29天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
57 5
|
1月前
|
SQL 运维 关系型数据库
MySQL 运维 SQL 备忘
MySQL 运维 SQL 备忘录
47 1
|
1月前
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
199 1
|
26天前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
36 0
|
26天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0
|
1月前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
47 0
|
1月前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
20 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
87 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
40 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
48 0

热门文章

最新文章

下一篇
无影云桌面