SQL语言自用(持续更新)+实验记录

课本:《数据库原理及其应用教程》(第四版) (主编)黄德才&(副主编)陆亿红
实验:学校实验课材料
其他:

  1. [ ]表示可以被删除,也表示可以被替换,请自行判断。
  2. 如果有一些截图或照片,是暂时懒得整理格式,后面有空补。
  3. 如果遇到了没见过的表、视图、属性什么的,上下自己翻一下,我的顺序一部分是乱的。

目录

  • 1 基础知识
    • 1.1数据定义
    • 1.2数据查询
      • 1.2.1一般格式
      • 1.2.2单表查询
        • 1.2.2.1 SELECT
        • 1.2.2.2 DISTINCT
        • 1.2.2.2 WHERE
        • 1.2.2.3 ORDER BY
        • 1.2.2.4 GROUP BY
        • 1.2.2.5 HAVING
      • 1.2.3表达式
        • 1.2.3.1增加列标题
        • 1.2.3.2函数
        • 1.2.3.3字符串常量
        • 1.2.3.4算术表达式
      • 1.2.4连接查询
        • 自身连接
        • 外连接
        • 复合条件连接。
        • 多表连接。
      • 1.2.5嵌套查询
      • 1.2.6集合运算
  • 实验例子
    • 数据定义
    • 数据查询
      • 单表查询
      • 连接查询
        • 笛卡儿连接和等值连接。
        • 自连接。
        • 外连接
        • 复合条件连接。
        • 多表连接。
      • 嵌套查询
        • 通过实验验证对子查询的两个限制条件。
        • 体会相关子查询和不相关子查询的不同。
        • 考察四类谓词的用法,包括:
      • 集合运算
        • 使用保留字UNION进行集合并运算。
        • 采用逻辑运算符AND或OR来实现集合交和减运算。

1 基础知识

1.1数据定义

1.2数据查询

1.2.1一般格式

SELECT[ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]//规定属性列
FROM <表名或视图名>[,<表名或视图名>]//元组的来源
[WHERE <条件表达式>]//设定条件
[GROUP BY <列名1>[HAVING<条件表达式>]]//分组
[ORDER BY <列名2>[ASC|DESC]]//排序

1.2.2单表查询

1.2.2.1 SELECT
【查询所有列】
SELECT *
fROM [students]【查询指定的列】
SELECT [Sname,Sno,Dno]
FROM [Students]【查询指定的列的运算】
见1.2.3
1.2.2.2 DISTINCT
消去查询结果表中相同的元组
eg.查询选修了课程的学生学号(这样子学号就不会重复出现了)
SELECT DISTINCT Sno
FROM Reports
1.2.2.2 WHERE

在这里插入图片描述
BETWEEN AND / NOT BETWEEN AND

 eg.WHERE Sage NOT BETWEEN 18 AND 20//Sage年龄

IN / NOT IN

eg. WHERE Dno IN('D01','D02','D03')

LIKE / NOT LIKE 匹配

 [NOT] LIKE '<匹配串>'[ESCAPE '<换码字符>']%百分号:任意长度字符串_下划线:任意单个字符eg.姓刘的
WHERE Sname LIKE '刘%'
eg.姓刘的,且全名不多于3个汉字
WHERE Sname LIKE '刘__'//两个下划线

ESCAPE ‘<换码字符>’
如果查询的字符串本身带有%或者_

eg.查询课程名为'DB_设计'的课程
WHERE Cname LIKE 'DB\_设计' ESCAPE '\'//换码字符常用\

IS NULL / IS NOT NULL

eg,有一门课没有成绩
WHERE Grade IS NULL

COUNT

COUNT(*) 统计元组个数】
eg.查询学生总人数
SELECT COUNT(*)
FROM Students【COUNT(列名) 统计列值个数】
eg.查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)
FROM Reports
1.2.2.3 ORDER BY
eg.按系别编号升序,编号相同按年龄降序排序
ORDER BY Dno,Sage DESC//DESC表示降序,没有的话默认升序
对于空值
1、不是长度为0的字符串
2.升序的话,空值在最前面
1.2.2.4 GROUP BY

将查询结果表按某一列或多列值分组

eg.求各个课程号以及相应的选课人数
SELECT Cno,COUNT(Sno) CntSno
FROM Reports
GROUP BY Cno
//把选了相同Cno的划分为一组,然后计算每一组中Sno有几个
1.2.2.5 HAVING

分组后还要筛选的话,只能作用于组

eg.查询选修了三门及以上课程的学生学号
SELECT Sno
FROM Reports
GROUP BY Sno
HAVING COUNT(Cno) >= 3

1.2.3表达式

可以是表中的属性列、函数、字符串常量、算术表达式等

1.2.3.1增加列标题
直接在目标列表达式后面加上列名即可
SELECT Sno,YEAR(Birthday) BirthY,Sname
FROM Students
1.2.3.2函数
  • 日期
YEAR(Birthday)//获得日期属性里面的年数值的函数
MONTH(Birthday)
DAY(Birthday)
eg.
SELECT Sno,Sname,YEAR(Birthday)
FROM StudentsGETDATE()//获取系统当前日期
DATE(yyyy,GETDATE())//获得当前提起的年数值的函数
DATE(mm,GETDATE())
DATE(dd,GETDATE())
eg.查询所有年龄大于等于18岁的学生姓名和各自的年龄
SELECT Sname,DATE(yyyy,GETDATE())-YEAR(Birthday) Sage//用现在的年份减去这个人出生年份得到年龄
FROM Students
WHERE DATE(yyyy,GETDATE())-YEAR(Birthday)>=18
1.2.3.3字符串常量
这一列所有的属性值都会是这个字符串常量
SELECT Sno,Sname,‘Birth:’ Title
FROM Students
1.2.3.4算术表达式

1.2.4连接查询

 笛卡儿连接和等值连接。

自身连接
eg.查询每一门课的间接先修课(先修课的先修课)
SELECT A.Cno,A.Cname,B.pre_Cno
FROM Courses A,Courses B
WHERE A.pre_Cno = B.Cno
//在pre_Cno一列,如果是NULL,就表示这门课有先修课,但是没有间接先修课
外连接
SELECT 
FROM Students,Reports
WHERE Students
复合条件连接。
多表连接。

1.2.5嵌套查询

 通过实验验证对子查询的两个限制条件。
 体会相关子查询和不相关子查询的不同。
 考察四类谓词的用法,包括:
第一类,IN、NOT IN;
第二类,带有比较运算符的子查询;
第三类,SOME、ANY或ALL谓词的子查询,查询最大值和最小值;
第四类,带有EXISTS谓词的子查询,实现“所有”等情况(如王宏的“所有”课程,“所有”女生选修的课程)

1.2.6集合运算

 使用保留字UNION进行集合并运算。
 采用逻辑运算符AND或OR来实现集合交和减运算。

实验例子

数据定义

学校实验要求命名加上自己的名字,给库、表、视图、属性命名
之后的例子中名字首字母会时有时没有,大家自行理解一下。

表名表名属性
学生表Pansx_StudentsSno学号,Sname, Semail,Scredit学分,Ssex性别
教师表Pansx_TeachersTno工号,Tname,Temail,Tsalary薪水
课程表Pansx_CoursesCno,Cname,Ccredit课程学分
成绩表Pansx_ReportsSno,Tno,Cno,Score

其中:
psx_Sno、psx_Tno、psx_Cno分别是表Pansx_Students、表Pansx_Teachers、表Pansx_Courses的主键,具有唯一性约束;
psx_Scredit具有约束“大于等于0”;
Pansx_Reports中的psx_Sno,psx_Tno,psx_Cno是外键,它们共同组成Pansx_Reports的主键。

数据查询

先插入一些数据,方便进行查询
【Students】
Students
【Teachers】
Teachers
【Courses】
Courses
【Reports】
Reports

单表查询

1)	查询性别为“男”的所有学生的名称并按学号升序排列。
SELECT psx_sname 
FROM pansx_students
WHERE psx_ssex='男'
ORDER BY psx_sno&2)	查询学生的选课成绩合格的课程成绩,并把成绩换算为积分。积分:[1+(考试成绩-60)*0.1]*Ccredit。考试成绩>=60 否则=0
select psx_cname,(1+(psx_score-60)*0.1)*psx_ccredit as psx_point 
FROM pansx_reports
JOIN pansx_courses ON pansx_courses.psx_cno=pansx_reports.psx_cno
WHERE psx_score>=603)	查询学分是34的课程的名称。
SELECT psx_cname
FROM pansx_courses
WHERE psx_ccredit= 3 or 44)	查询所有课程名称中含有“算法”的课程编号。
SELECT psx_cno
FROM pansx_courses
WHERE psx_cname LIKE '%算法%'5)	查询所有选课记录的课程号(不重复显示)。
SELECT DISTINCT psx_cno
FROM pansx_courses(6)	统计所有老师的平均工资。
SELECT AVG(psx_tsalary)
FROM pansx_teachers&7)	查询所有教师的编号及选修其课程的学生的平均成绩,按平均成绩降序排列。
SELECT psx_tno,psx_cno,ROUND(AVG(psx_score),2) AS psx_avg 
FROM pansx_reports
GROUP BY psx_cno,psx_tno
ORDER BY psx_avg DESC8)	统计各个课程的选课人数和平均成绩。
SELECT psx_cno,COUNT(psx_sno),AVG(psx_score)
FROM pansx_reports
GROUP BY psx_cno

连接查询

笛卡儿连接和等值连接。
【【等待分类!!!】】
(9)	查询至少选修了三门课程的学生编号和姓名。
SELECT pansx_students.psx_sno,psx_sname
FROM pansx_students
JOIN pansx_reports ON pansx_reports.psx_sno=pansx_students.psx_sno
GROUP BY pansx_students.psx_sno
HAVING COUNT(psx_cno)>=310)	查询编号S26的学生所选的全部课程的课程名和成绩。
SELECT pansx_courses.psx_cname,psx_score
FROM pansx_students
JOIN pansx_reports ON pansx_reports.psx_sno=pansx_students.psx_sno
JOIN pansx_courses ON pansx_courses.psx_cno=pansx_reports.psx_cno
WHERE pansx_students.psx_sno='S26'&11)	查询所有选修了“数据库原理及应用”课程的学生编号和姓名。
SELECT pansx_students.psx_sno,psx_sname
FROM pansx_students
JOIN pansx_reports ON pansx_reports.psx_sno=pansx_students.psx_sno
JOIN pansx_courses ON pansx_courses.psx_cno=pansx_reports.psx_cno
WHERE psx_cname='数据库原理及应用'&12)	求出选修了同一个课程的学生对
SELECT DISTINCT a.psx_sno,b.psx_sno
FROM pansx_reports a,pansx_reports b 
where a.psx_cno=b.psx_cno AND a.psx_sno <b.psx_sno(13)	求出至少被两名学生选修的课程编号。
SELECT psx_cno
FROM pansx_reports 
GROUP BY psx_cno
HAVING COUNT(psx_sno)>=214)	查询选修了编号S26的学生所选的某个课程的学生编号。
SELECT DISTINCT psx_sno
FROM pansx_reports
WHERE psx_cno IN (SELECT psx_cnoFROM pansx_reportsWHERE psx_sno='S26'
)15)	查询学生的基本信息及选修课程编号和成绩。
SELECT pansx_students.*,pansx_reports.psx_cno,psx_score
FROM pansx_students
JOIN pansx_reports ON pansx_reports.psx_sno=pansx_students.psx_sno
JOIN pansx_courses ON pansx_courses.psx_cno=pansx_reports.psx_cno&16)	查询学号S52的学生的姓名和选修的课程名称及成绩。
SELECT psx_sname,psx_cname,psx_score
FROM pansx_students
JOIN pansx_reports ON pansx_reports.psx_sno = pansx_students.psx_sno
JOIN pansx_courses ON pansx_courses.psx_cno = pansx_reports.psx_cno
WHERE pansx_reports.psx_sno='S52'&17)	查询和学号S52的学生同性别的所有学生资料。
SELECT *
FROM pansx_students
WHERE psx_sno!='S52' AND psx_ssex=(SELECT psx_ssexFROM pansx_studentsWHERE psx_sno='S52'
)18)	查询所有选课的学生的详细信息。
SELECT DISTINCT pansx_students.*
FROM pansx_students
JOIN pansx_reports ON pansx_reports.psx_sno = pansx_students.psx_sno
WHERE pansx_students.psx_sno IN (SELECT DISTINCT psx_snoFROM pansx_reports
)&19)	查询没有学生选的课程的编号和名称。
SELECT psx_cno,psx_cname
FROM pansx_courses
WHERE psx_cno NOT IN(SELECT psx_cnoFROM pansx_reports
)20)	查询选修了课程名为C++的学生学号和姓名。
SELECT DISTINCT pansx_students.psx_sno,psx_sname
FROM pansx_students
JOIN pansx_reports ON pansx_reports.psx_sno = pansx_students.psx_sno
JOIN pansx_courses ON pansx_courses.psx_cno = pansx_reports.psx_cno
WHERE psx_cname='C++'21)	找出选修课程UML或者课程C++的学生学号和姓名。
SELECT DISTINCT pansx_students.psx_sno,psx_sname
FROM pansx_students
JOIN pansx_reports ON pansx_reports.psx_sno = pansx_students.psx_sno
JOIN pansx_courses ON pansx_courses.psx_cno = pansx_reports.psx_cno
WHERE psx_cname='C++' OR psx_cname='UML'22)	找出和课程UML或课程C++的学分一样课程名称。
SELECT DISTINCT psx_cname
FROM pansx_reports 
JOIN pansx_courses ON pansx_courses.psx_cno = pansx_reports.psx_cno
WHERE psx_cname NOT IN ('C++','UML') AND psx_ccredit IN (SELECT psx_ccreditFROM pansx_coursesWHERE psx_cname = 'C++' OR psx_cname ='UML'
)23)	查询所有选修编号C01的课程的学生的姓名。
SELECT DISTINCT psx_sname
FROM pansx_reports 
JOIN pansx_students ON pansx_students.psx_sno = pansx_reports.psx_sno
WHERE psx_cno = 'C01' &24)	查询选修了所有课程的学生姓名。SELECT psx_sname
FROM pansx_students
WHERE NOT EXISTS(SELECT psx_cnoFROM pansx_coursesWHERE NOT EXISTS(SELECT psx_snoFROM pansx_reportsWHERE pansx_reports.psx_sno=pansx_students.psx_sno AND pansx_reports.psx_cno=pansx_courses.psx_cno)
)25)	利用集合并运算,查询选修课程C++或选择课程JAVA的学生的编号、姓名和积分。
SELECT pansx_students.psx_sno, psx_sname, psx_scredit
FROM pansx_students
JOIN pansx_reports ON pansx_reports.psx_sno = pansx_students.psx_sno
JOIN pansx_courses ON pansx_courses.psx_cno = pansx_reports.psx_cno
WHERE psx_cname = 'C++'
UNION
SELECT pansx_students.psx_sno, psx_sname, psx_scredit
FROM pansx_students
JOIN pansx_reports ON pansx_reports.psx_sno = pansx_students.psx_sno
JOIN pansx_courses ON pansx_courses.psx_cno = pansx_reports.psx_cno
WHERE psx_cname = 'JAVA';26)	实现集合交运算,查询既选修课程C++又选修课程JAVA的学生的编号、姓名和积分。
同(25)将UNION改成INTERSECT即可(27)	实现集合减运算,查询选修课程C++而没有选修课程JAVA的学生的编号。
同(25)将UNION改成 MINUS 即可
自连接。
代码
外连接
代码
复合条件连接。
代码
多表连接。
代码

嵌套查询

通过实验验证对子查询的两个限制条件。
代码
体会相关子查询和不相关子查询的不同。
代码
考察四类谓词的用法,包括:
代码

第一类,IN、NOT IN;
第二类,带有比较运算符的子查询;
第三类,SOME、ANY或ALL谓词的子查询,查询最大值和最小值;
第四类,带有EXISTS谓词的子查询,实现“所有”等情况(如王宏的“所有”课程,“所有”女生选修的课程)

集合运算

使用保留字UNION进行集合并运算。
代码
采用逻辑运算符AND或OR来实现集合交和减运算。
代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5、LMDeploy 量化部署 LLMVLM实战(homework)

基础作业&#xff08;结营必做&#xff09; 完成以下任务&#xff0c;并将实现过程记录截图&#xff1a; 配置lmdeploy运行环境 由于环境依赖项存在torch&#xff0c;下载过程可能比较缓慢。InternStudio上提供了快速创建conda环境的方法。打开命令行终端&#xff0c;创建一…

富格林:专研正规技巧助力出金

富格林指出&#xff0c;现货黄金拥有诸多其他投资产品无法比拟的交易优势&#xff0c;如此一来吸引着越来越多投资者相继涌入现货黄金市场。但有不少投资者发现自己的出金效率与他人的有差异。为什么会这样呢&#xff1f;其实在现货黄金市场中需要有正规技巧的支持才可以更好地…

车牌校验正则表达式

1. 规则 传统车牌&#xff1a; 第一位为省份简称&#xff08;汉字&#xff09;&#xff0c;第二位为发牌机关代号&#xff08;A-Z的字母&#xff09;第3到第7位为序号&#xff08;由字母或数字组成&#xff0c;但不存在字母I和O&#xff0c;防止和数字1、0混淆&#xff0c;另外…

跨域问题CORS

所谓跨域访问&#xff0c;其底层就是访问是否同源的问题&#xff0c;跨域问题跟前端的关系不大&#xff0c;后台只要在服务器上配置好浏览器需要的 header 就可以解决跨域的问题。浏览器的请求为什么不能跨越&#xff0c;主要是为了安全&#xff0c;比如攻击者给用户发了一封邮…

鸿蒙开发快速入门

基本概念 ArkTS 因为ArkTS是基于Type Script扩展而来&#xff0c;是Type Script的超集&#xff0c;所以也可以关注一下Type Script的语法来理解ArkTS的语法 ArkUI HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架…

【日常记录】【CSS】SASS循环的使用

文章目录 1、引言2、安装3、举例4、参考链接 1、引言 目前在任何项目框架中&#xff0c;都会有css 预处理器&#xff0c;目前一般使用 sass、less 这俩其中之一&#xff0c;它可以简化css的书写 Sass 是一款强化 CSS 的辅助工具&#xff0c;它在 CSS 语法的基础上增加了变量 (v…

【深度学习实战(2)】如何使用matplotlib.pyplot模块记录自己的训练,验证损失

一、matplotlib库 在我们自己训练模型时&#xff0c;常常会使用matplotlib库来绘制oss和accuracy的曲线图&#xff0c;帮助我们分析模型的训练表现。 matplotlib库安装&#xff1a;pip install matplotlib 二、代码 import matplotlib.pyplot as plt import torch import to…

Leetcode 3116. Kth Smallest Amount With Single Denomination Combination

Leetcode 3116. Kth Smallest Amount With Single Denomination Combination 1. 解题思路2. 代码实现 题目链接&#xff1a;3116. Kth Smallest Amount With Single Denomination Combination 1. 解题思路 这一题思路上我一开始想的是直接法&#xff0c;但是没想到什么好的方…

设计模式-组合模式(Composite Pattern)

1. 概念 组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树状的层次结构&#xff0c;用来表示“整体-部分”的关系。 2. 原理结构图 原理图 抽象角色&#xff08;Component&#xff09;&#xff1a;这是组合模式的核心&#xff0c;它定义了树叶和树枝构件的公…

vue3从精通到入门22:自定义 Hooks

自定义 Hooks 就是将可重用的逻辑抽象到一个函数中&#xff0c;这样你可以在不同的组件中重复使用这些逻辑&#xff0c;而不必重复编写相同的代码。 使用场景 1. 处理异步数据 当你需要在多个组件中处理异步数据时&#xff0c;可以创建一个自定义 Hook 来封装相关的逻辑。 …

【产品经理修炼之道】- 融资租赁相关业务介绍

一、什么是融资租赁&#xff1f; 根据《民法典》第735条的规定&#xff0c;融资租赁合同是出租人根据承租人对出卖人、租赁物的选择&#xff0c;向出卖人购买租赁物&#xff0c;提供给承租人使用&#xff0c;承租人支付租金的合同。 例如&#xff0c;A工厂因业务发展需要欲购置…

c/c++普通for循环学习

学习一下 for 循环的几种不同方式&#xff0c;了解一下原理及差异 完整的测试代码参考 GitHub &#xff1a;for 循环测试代码 1 常用形态 对于 for 循环来说&#xff0c;最常用的形态如下 for (表达式1; 表达式2; 表达式3) {// code }流程图如下&#xff1a; 编写测试代码…

stack和queue模拟实现

前言 上一期我们介绍了stack和queue的使用&#xff0c;本期我们来模拟实现一下他们&#xff01; 本期内容介绍 容器适配器 deque介绍 为什么stack和queue的底层选择deque为默认容器&#xff1f; stack 模拟现实 queue 模拟实现 什么是容器适配器&#xff1f; 适配器是一种设…

编程新手必看,Python推导式学习总结(16)

介绍&#xff1a; Python推导式是一种简洁、高效的创建列表、字典或集合的方法。它使用一种类似于数学公式的语法&#xff0c;通过一个表达式和一个循环来生成一个新的数据结构。 以下是一些常见的Python推导式&#xff1a; 列表推导式&#xff08;List Comprehension&#xf…

springboot抑郁症科普知识测试系统ssm-java

本系统设计了二种角色&#xff1a;管理员&#xff0c;用户。通过此系统&#xff0c;管理员可以在线视频、案例展示、、测试试卷、测试试题进行测试。以及在线对测试试卷进行批阅和批量删除&#xff0c;用户可以对自己的测试试卷进行测试&#xff0c;对管理员已经批阅过的试卷可…

MySQL——链表

主键&#xff1a;非空 唯一&#xff08;针对整列数据而言&#xff09; 为了方便管理一般主键都是设置为自增 外键&#xff1a;一张表中的一列的值是另一张表的主键&#xff0c;使用外键建立两张数据表的数据关系 一、两张表连接 将两张表格拼接成一个表 1、格式&#xff1a;s…

Linux ln命令

ln 是 Linux 中的一个重要命令&#xff0c;用于创建硬链接或符号链接&#xff08;也称为软链接&#xff09;。链接在 Unix 和 Linux 系统中是文件系统中的一种对象&#xff0c;它引用另一个文件或目录。 以下是 ln 命令的基本用法和选项&#xff1a; 基本语法 ln [选项] 源文…

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

NL2SQL实践系列(1)&#xff1a;深入解析Prompt工程在text2sql中的应用技巧 NL2SQL基础系列(1)&#xff1a;业界顶尖排行榜、权威测评数据集及LLM大模型&#xff08;Spider vs BIRD&#xff09;全面对比优劣分析[Text2SQL、Text2DSL] NL2SQL基础系列(2)&#xff1a;主流大模型…

cURL error 60: SSL certificate problem: unable to get local issuer certifica 解决

无法获取本地颁发者证书 Windows版本 linux版本解决方案 cURL error 60: SSL certificate problem: unable to get local issuer certifica 解决 Laravel 使用GuzzleHttp请求第三方https接口报错 获取 headers windows 清晰版本 Windows版本 1.到 https://curl.haxx.se/ca/cace…

STK与matlab交互 Astrogator模块 (11)

一、背景知识 前面由于定轨的大作业&#xff0c;关于Astrogator模块的学习有所滞后&#xff0c;在本节将重新聚焦Astrogator模块&#xff0c;在本节中&#xff0c;首先解决的问题是已知两个卫星的轨道六根数&#xff0c;求解其中某一颗卫星LVLH坐标下另一颗卫星的位置速度。这…