本文共 4635 字,大约阅读时间需要 15 分钟。
在数据库管理系统中,Data Query Language (DQL) 是核心的一部分,它允许用户从数据库中检索数据。作为MySQL学习的重要环节,本章将详细介绍DQL的使用方法,包括选择字段、where条件子句、联表查询、分页排序、分组过滤以及子查询等高级功能。
DQL(Data Query Language) 是MySQL 中最核心和重要的语句,所有查询操作都依赖于它。无论是简单的还是复杂的查询,DQL 都能满足需求。它是数据库操作中使用频率最高的语句之一。
在进行具体的数据查询之前,通常需要创建一些表来模拟实际的数据环境。以下是创建相关表的语句:
CREATE DATABASE IF NOT EXISTS `school`;USE `school`;DROP TABLE IF EXISTS `student`;CREATE TABLE `student` ( `studentno` INT(4) NOT NULL COMMENT '学号', `loginpwd` VARCHAR(20) DEFAULT NULL, `studentname` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名', `sex` TINYINT(1) DEFAULT NULL COMMENT '性别,0或1', `gradeid` INT(11) DEFAULT NULL COMMENT '年级编号', `phone` VARCHAR(50) NOT NULL COMMENT '联系电话,允许为空', `address` VARCHAR(255) NOT NULL COMMENT '地址,允许为空', `borndate` DATETIME DEFAULT NULL COMMENT '出生时间', `email` VARCHAR(50) NOT NULL COMMENT '邮箱账号允许为空', `identitycard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号', PRIMARY KEY (`studentno`), UNIQUE KEY `identitycard` (`identitycard`), KEY `email` (`email`), ENGINE=MYISAM DEFAULT CHARSET=utf8;
同样,我们需要创建年级表、科目表和成绩表:
CREATE TABLE `grade` ( `gradeid` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号', `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称', PRIMARY KEY (`gradeid`), ENGINE=INNODB AUTO_INCREMENT = 6 DEFAULT CHARSET = utf8;
CREATE TABLE `subject` ( `subjectno` INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号', `subjectname` VARCHAR(50) DEFAULT NULL COMMENT '课程名称', `classhour` INT(4) DEFAULT NULL COMMENT '学时', `gradeid` INT(4) DEFAULT NULL COMMENT '年级编号', PRIMARY KEY (`subjectno`), ENGINE=INNODB AUTO_INCREMENT = 19 DEFAULT CHARSET = utf8;
CREATE TABLE `result` ( `studentno` INT(4) NOT NULL COMMENT '学号', `subjectno` INT(4) NOT NULL COMMENT '课程编号', `examdate` DATETIME NOT NULL COMMENT '考试日期', `studentresult` INT(4) NOT NULL COMMENT '考试成绩', KEY `subjectno` (`subjectno`), ENGINE=INNODB DEFAULT CHARSET = utf8;
where 子句是用来筛选数据的重要工具。它通过指定条件,返回符合条件的记录。通常,条件是用逻辑运算符组合而成的。
运算符 | 语法 | 描述 |
---|---|---|
and | a and b | 逻辑与,有两个条件都为真时结果为真 |
or | a or b | 逻辑或,有一个条件为真时结果为真 |
not | not a | 逻辑非,条件为假时结果为真 |
查询成绩大于等于90的数据:
select `studentno`,`studentresult` from result where studentresult >= 90;
查询成绩在90和100之间的数据:
select `studentno`,`studentresult` from result where studentresult between 90 and 100;
查询科目成绩不为60的数据:
select `studentno`,`studentresult` from result where studentresult != 60;
查询地址为空的学生:
select `studentno`,`studentname` from student where address = '' or address is null;
联表查询 是DQL 中的高级功能,用于将两张或多张表中的数据结合起来检索。常见的join类型包括 INNER JOIN
、LEFT JOIN
和 RIGHT JOIN
。
join 类型 | 描述 |
---|---|
INNER JOIN | 只返回两张表中至少有一个匹配的行 |
LEFT JOIN | 以左表为基准,返回所有左表记录 |
RIGHT JOIN | 以右表为基准,返回所有右表记录 |
查询参加了考试的同学:
select s.studentno, studentname, subjectno, studentresult from student as sinner join result as r on s.studentno = r.studentno;
查询科目所属的年级:
select subjectname, gradename from subject as sub inner join grade as g on sub.gradeid = g.gradeid;
查询父子栏目关系:
select categoryName as '父栏目', categoryName as '子栏目' from category as a, category as b where a.categoryid = b.pid;
分页 和 排序 是DQL 的高级功能,通常用于处理大量数据查询。
排序 通过 ORDER BY
子句实现,可以按特定字段排序。支持升序 (ASC
) 和降序 (DESC
) 两个模式。
查询成绩降序排列的同学:
select studentno, studentname, subjectname, studentresult from student as sinner join result as r on s.studentno = r.studentno where subjectname = '数据库结构-1' order by studentresult desc;
分页 用于限制返回的记录数量,使用 LIMIT
关键字。通用语法为 LIMIT [offset,] count
。
查询前5条记录:
select * from table limit 5;
分页示例:
select s.studentno, studentname, subjectname, studentresult from student as sinner join result as r on s.studentno = r.studentno where subjectname = '数据库结构-1' order by studentresult desc limit 0,5;
分组 用于聚合数据,GROUP BY
子句用于指定分组条件;having 子句用于对分组后的数据进行过滤。
查询不同课程的平均分、最高分和最低分:
select subjectname, avg(studentresult) as 平均分, max(studentresult) as 最高分, min(studentresult) as 最低分 from result as r inner join subject as sub on r.subjectno = sub.subjectno group by r.subjectno having avg(studentresult) > 80;
子查询 是在 WHERE
子句中嵌套查询语句,常用于复杂的数据获取场景。
查询数据库结构-1的考试成绩:
select studentno, subjectno, studentresult from result where subjectno = (select subjectno from subject where subjectname = '数据库结构-1');
查询高分成绩的学生信息:
select studentno, studentname from student where studentno in (select studentno from result where studentresult > 80 and subjectno = (select subjectno from subject where subjectname = '高等数学-1'));
DQL 的完整语法如下:
select [all | distinct] {字段名[as 别名]} from 表名 [as 表别名] [join ...] [where ...] [group by ...] [having ...] [order by ...] [limit ...];
本章通过详细讲解选择字段、条件过滤、联表查询等内容,帮助大家掌握DQL 的核心技能。MySQL 的学习还在继续,欢迎在评论区交流!
转载地址:http://rcgtz.baihongyu.com/