面向考试数据库—单表查询(包含建表数据)

  • 引言
  • ● 建立练习数据库(之后习题亦是基于该库)
    • 建表源码
  • 单表查询知识点汇总
  • 单表查询练习题32道
    • (1)选取表中的若干列
    • (2)选择表中若干元祖
    • (3)order by 子句
    • (4)聚集函数
    • (5)Group by 子句
  • 小结
  • 一段


面向考试数据库系列博客以笔者的思维脑图为主线,博文内容为笔者对导图的具体分支所作的详细阐述,其中不足,望读者多加指正。

引言

  学习了一段时间SQL语言之后,其中操作了解到了很多,笔者按照上述脑图进行现阶段的SQL学习,到此在单表查询处涉及到了许多的SQL语句操作,故做此文作为笔记总结之用,其中也插入31到SQL查询例题进行求解阐述,希望帮助读者对知识进行更好的消化。主要内容如下:

● 建立练习数据库(之后习题亦是基于该库)

  开始正文前,读者需要先了解博客使用的库表结构;该库为一个选课库,主要库内容如下图所示:

建表源码

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course`  (`Cno` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`Cname` char(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`Cpno` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`Ccredit` smallint(6) NULL DEFAULT NULL,PRIMARY KEY (`Cno`) USING BTREE,INDEX `Cpno`(`Cpno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', '数据库', '5', 4);
INSERT INTO `course` VALUES ('2', '数学', NULL, 2);
INSERT INTO `course` VALUES ('3', '信息系统', '1', 4);
INSERT INTO `course` VALUES ('4', '操作系统', '6', 3);
INSERT INTO `course` VALUES ('5', '数据结构', '7', 4);
INSERT INTO `course` VALUES ('6', '数据处理', NULL, 2);
INSERT INTO `course` VALUES ('7', 'PASCAL语言\r', '6', 4);-- ----------------------------
-- Table structure for sc
-- ----------------------------
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc`  (`Sno` char(9) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学号',`Cno` char(4) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '课程号',`Grade` smallint(255) NULL DEFAULT NULL COMMENT '成绩\r\n',PRIMARY KEY (`Sno`, `Cno`) USING BTREE,CONSTRAINT `Sno` FOREIGN KEY (`Sno`) REFERENCES `student` (`Sno`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES ('200215121', '1', 92);
INSERT INTO `sc` VALUES ('200215121', '2', 85);
INSERT INTO `sc` VALUES ('200215121', '3', 88);
INSERT INTO `sc` VALUES ('200215122', '2', 90);
INSERT INTO `sc` VALUES ('200215122', '3', 80);-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (`Sno` char(9) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`Sname` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`Ssex` char(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`Sage` smallint(6) NULL DEFAULT NULL,`Sdept` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`Sno`) USING BTREE,UNIQUE INDEX `Sname`(`Sname`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('200215121', '李勇', '男', 20, 'CS');
INSERT INTO `student` VALUES ('200215122', '刘晨', '女', 19, 'CS');
INSERT INTO `student` VALUES ('200215123', '王敏', '女', 18, 'MA');SET FOREIGN_KEY_CHECKS = 1;

单表查询知识点汇总

 关于单表查询的主要操作,主要可以分为5类“题型”。想要熟练的掌握解决好这几类题型,基础知识必需要扎实,关于单表的基础知识,笔者总结如下了内容。
 首先是常用的查询条件;

 其次要注意的是一些细节性的知识点;

  1. 关于排序 ;
    可以按一个或多个属性列排序
    .升序:ASC;降序:DESC;缺省值为升序
    当排序列含空值时
    .ASC:排序列为空值的元组最后显示
    .DESC:排序列为空值的元组最先显示

  2. 关于计数;
    COUNT([DISTINCT|ALL] *)
    COUNT([DISTINCT|ALL] <列名>)
    计算总和
    SUM([DISTINCT|ALL] <列名>)
    计算平均值
    AVG([DISTINCT|ALL] <列名>)
    最大最小值
    MAX([DISTINCT|ALL] <列名>)
    MIN([DISTINCT|ALL] <列名>)
    DISTINCT短语:在计算时要取消指定列中的重复值
    ALL短语:不取消重复值
    ALL为缺省值

  3. 关于分组;
    group by 细化聚集函数的作用对象 未对查询结果分组,聚集函数将作用于整个查询结果
    对查询结果分组后,聚集函数将分别作用于每个组 按指定的一列或多列值分组,值相等的为一组 HAVING短语与WHERE子句的区别;
    作用对象不同 WHERE子句作用于基表或视图,从中选择满足条件的元组 HAVING短语作用于组,从中选择满足条件的组。

  4. 关于通配符匹配问题;
    通配符匹配(% (百分号) 代表任意长度(长度可以为0)的字符串;_ (下横线) 代表任意单个字符);
    使用换码字符将通配符转义为普通字符( ESCAPE ‘\’ 表示“ \” 为换码字符 )这里笔者使用的查询工具不需要使用到ESCAPE ,用到\即可;
    涉及空值的查询( “IS” 不能用 “=” 代替)。

  5. 关于多重条件查询;
    多重条件查询(AND的优先级高于OR;可以用括号改变优先级;可用来实现多种其他谓词)。

单表查询练习题32道

有了这些知识,我们就可以去尝试上手解决关于单表查询的32到例题了,关于例题的,笔者先给出脑图分布。

(1)选取表中的若干列

#例子1:查询全体学生的学号与姓名。
SELECT Sno,Sname FROM Student;#例子2:查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept FROM student;#[例3]  查询全体学生的详细记录。
SELECT  * FROM Student;#[例4]  查全体学生的姓名及其出生年份。
SELECT Sname,2004-Sage AS BIRTH    /*假定当年的年份为2004年*/ FROM Student;[例5]  查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名
SELECT Sname,2004-Sage AS 'year of Brith',LOWER(Sdept) FROM student;使用列别名改变查询结果的列标题:
SELECT Sname NAME ,'year of Brith:' BRITH,2004-Sage Brithday ,LOWER(Sdept) Department FROM student;

(2)选择表中若干元祖

 这类题型在单表查询中设计的知识点最多,也是最需要注意的。

#普通选取
[例6]  查询选修了课程的学生学号。(取消重复行)
SELECT DISTINCT Sno FROM sc;查询选修课程的各种成绩SELECT DISTINCT Cno,Grade FROM SC; #大小比较[例7]  查询计算机科学系全体学生的名单。SELECT SnameFROM StudentWHERE Sdept='CS';[例8]  查询所有年龄在20岁以下的学生姓名及其年龄。SELECT Sname,Sage
FROM    Student
WHERE Sage < 20;[例9]  查询考试成绩有不及格的学生的学号。SELECT DISTINCT SnoFROM  SCWHERE Grade<60;#范围选取
[例10] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄SELECT Sname,Sdept,Sage
FROM     Student
WHERE   Sage BETWEEN 20 AND 23;[例11]  查询年龄不在20~23岁之间的学生姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM     Student
WHERE   Sage NOT BETWEEN 20 AND 23;#集合确定
[例12]查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,SsexFROM  StudentWHERE Sdept IN ( 'IS','MA','CS' );[例13]查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别
SELECT Sname,SsexFROM  StudentWHERE Sdept NOT IN ( 'IS','MA','CS' );#字符匹配
匹配串为固定字符串
[例14]  查询学号为200215121的学生的详细情况。
SELECT *    FROM  Student  WHERE  Sno LIKE '200215121';[例15]  查询所有姓刘学生的姓名、学号和性别SELECT Sname ,Sno,Ssex FROM studentWHERE Sname LIKE '刘%';[例16]  查询姓"欧阳"且全名为三个汉字的学生的姓名。SELECT Sname FROM student WHERE Sname like '欧阳_';[例17]  查询名字中第2个字为"阳"字的学生的姓名和学号。SELECT Sname,SnoFROM StudentWHERE Sname LIKE '__阳%';[例18]  查询所有不姓刘的学生姓名。
SELECT Sname,Sno,SsexFROM StudentWHERE Sname NOT LIKE '刘%';#3) 使用换码字符将通配符转义为普通字符( ESCAPE '\' 表示“ \” 为换码字符 )[例19]  查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE'DB\_Design';# [例20]  查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
SELECT * FROM Course
WHERE Cname LIKE 'DB\_%i_ _' ;#关于空值的查询[例21某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECT Sno,CnoFROM  SCWHERE  Grade IS NULL;[例22]  查所有有成绩的学生学号和课程号。
SELECT Sno,CnoFROM  SCWHERE  Grade IS NOT NULL;[例23]  查询计算机系年龄在20岁以下的学生姓名。
SELECT SnameFROM  StudentWHERE Sdept= 'CS' AND Sage<20;[例12]  查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。(变)
SELECT Sname,Ssex
FROM   Student
WHERE  Sdept= ' IS ' OR Sdept= ' MA' OR Sdept= ' CS ';[例10]  查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。(变)
SELECT Sname,Sdept,Sage
FROM StudentWHERE  Sage>=20 AND Sage<=23;

(3)order by 子句

 这类题型对于解决排名问题有很有帮助的。

#ORDER BY子句
[例24]  查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT Sno,GradeFROM  SCWHERE  Cno= ' 3 'ORDER BY Grade DESC;[例25]  查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT  *FROM  StudentORDER BY Sdept,Sage DESC;

(4)聚集函数

 笔者认为有一定的统计作用。

 [例26]  查询学生总人数。SELECT COUNT(*)FROM  Student;[例27]  查询选修了课程的学生人数。SELECT COUNT(DISTINCT Sno)FROM SC;[例28]  计算1号课程的学生平均成绩。SELECT AVG(Grade)FROM SCWHERE Cno= ' 1 ';[例29]  查询选修1号课程的学生最高分数。SELECT MAX(Grade)FROM SCWHERE Cno= ' 1 ';

(5)Group by 子句

 SQL查询将Group by子句与聚集函数综合利用可进一步解决更多地问题。

[例31]  求各个课程号及相应的选课人数。SELECT Cno,COUNT(Sno)FROM    SCGROUP BY Cno;例32] 查询选修了3门以上课程的学生学号SELECT SnoFROM  SCGROUP BY SnoHAVING  COUNT(*) >3;

小结

 对于用惯了python的笔者而言,觉得MySQL的语言编辑还是比较友好的,比如代码自动补全、大小写友好、不用考虑python需要考虑的排版问题。另外笔者使用的使用的为Navicat 12 for MySQL企业版本的查询环境。不同版本在个别例题的实现上可能会有细微的不同,需要读者自己注意。文章不足之处望多加指针。

一段

 话说一贵妇最近老是犯偏头疼的毛病,找了许多医生诊治,都未能见效,这天,朋友介绍她去找一位著名的医生,据说其专治各种疑难杂症。贵妇抱着试一试的态度,来到这位医生的诊所诊治,说完自己的病况,医生说:“害!小病嘛,我按着我的法子来,当天就见效,你只要每天早晨起床双手按着自己的太阳穴时对着镜子说:“我不会头疼,我不会头疼, 坚持一段时间后,就好的。”说完后,就让贵妇回家。一些日子后,贵妇和她丈夫送来一面锦旗向医生道谢,贵妇:“医生医术高超,实在感谢您,特送锦旗向您道谢。”医生:“害!应该的应该的嘛。“贵妇偷偷想医生道:”医生啊,您能帮看看我老公的毛病嘛?’他最近一段日子总是不举“医生:”简单,不过您要先出去避让一下才好,我好和您丈夫道明解决之道啊。“贵妇:”害!理解理解,我这就出去您慢慢和我老公说。事成之后我必重谢!“
 你还别说,贵妇丈夫经过那名神医诊治后啊,没过多久就恢复了往日的雄风,而且是有过之而不及啊。于是贵妇准备一份大礼赠送与那名神医。不过,贵妇发现,在睡前,老公总是偷偷在镜子面前出双手按着太阳穴说些什么话。 一日,贵妇好奇心上头,便去偷看监听:只见贵妇老公双手按着太阳穴对着镜子说,她不是我老婆,她不是我老婆。 ……

面向考试数据库—单表查询(包含建表数据)相关推荐

  1. 4,表查询语法,表连接,子查询

    数据库基础四: 今日内容: 一:单表查询语法 from 找表 where 第一次筛选 group by 分组 having 二次筛选 distinct 去重(数据一模一样时去重复的,在from之前使用 ...

  2. 数据库(单表查询与多表联查)

    文章目录 一.单表查询 1.创建表 2.查询 二.多表联查 1.创建表 查询 一.单表查询 素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 CREATE T ...

  3. MySQL之单表查询、多表查询(一)

    阅读目录 一.单表查询: ①.基本语法执行顺序 ②.where约束条件的使用 ③.group by 分组 ④.having (类似于where,但是必须在group by语句后使用) ⑤.distin ...

  4. Oracle数据库 登录命令 用户管理 建表 修改字段 数据类型 约束 增删改查

    什么是数据库? 存储数据的仓库 优点: 1.可存储大量数据 2.方便检索 3.保持数据的一致性.完整性 4.安全,可共享 解决的问题? 数据的持久化(把数据写到磁盘中) 安装看安装文档: 口令管理: ...

  5. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询 单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models.T ...

  6. MySQL练习(单表查询和多表查询)

    单表查询 一.创建素材 DROP TABLE IF EXISTS `course`; CREATE TABLE `course` (`cs_id` int(11) NOT NULL COMMENT ' ...

  7. 第十六章、单表查询、多表查询

    目录 第十六章.单表查询.多表查询 单表查询 去重:distinct 数据准备 常用函数 条件:where 分组与筛选:group by | having where与having 聚合函数 分组查询 ...

  8. 微服务springCloud 项目实战 创建数据库表规约及建表语句

    # 创建数据库表规约及建表语句 1.建表规约 **[强制]**表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是tinyint(1) ( 1表示是,0表示否). 说明:任何字段如果为非负 ...

  9. MySQL之单表查询、多表查询(二)

    ⑥.order by (排序) --------------------------------------------------------------------注:如果你对python感兴趣, ...

最新文章

  1. 2022-2028年中国盲盒行业市场研究及前瞻分析报告
  2. python培训深圳-深圳python 培训班多少钱?[Python培训]
  3. INVEST优秀用户故事的特点
  4. Spring Boot (七)MyBatis代码自动生成和辅助插件
  5. 各大主流K8S服务全方位能力比对
  6. 作业-python常用库类 numpy+pandas
  7. LeetCode 310. 最小高度树(图 聪明的BFS,从外向内包围)
  8. Http代理抓包 Fiddler与Charles
  9. 一文看懂:边缘计算究竟是什么?为何潜力无限?(下)
  10. 电力系统同步发电机励磁系统的建模与仿真
  11. (四)DIH导入结构化数据
  12. 三坐标最小二乘法原理_【最小二乘法 | 高斯法】来认识一下传说中的最小二乘法...
  13. 【OpenCV】Chapter7.图像噪声与滤波器
  14. 中南大学计算机学院研究生录取分数线,中南大学研究生录取分数线
  15. 控件中一些常用的属性和事件
  16. 计算机综合布线实验报告,综合布线设计实验报告.doc
  17. 网络安全用什么编程语言_网络安全的5种最佳编程语言
  18. 无法与ftp服务器建立连接
  19. 如何写一个简单的手写识别算法?
  20. 02 - OAI(OpenAirInterface)核心网搭建过程 - 研0

热门文章

  1. 英语的句号在c语言中是什么意思,英语中标点符号用法
  2. COPU名誉主席陆首群在第十七届开源中国开源世界高峰论坛上的致辞
  3. 小米 10 Pro DXOMARK 自拍评分出炉:83分
  4. win10系统更新在哪_win10系统更新在哪
  5. 技嘉显卡性能测试软件,理论性能测试_技嘉 AORUS GTX 1070 Gaming Box_显卡评测-中关村在线...
  6. 京东2016面经(算法春招实习)
  7. HashMap的大小为什么必须是2的倍数
  8. 同品酸甜苦辣,风雨同行,不离不弃
  9. CTF实战训练日志——2021-6-27(五)
  10. 【Flink】JobManager memory configuration failed: Sum of configured JVM Metaspace (256.000mb