文章目录
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;