《数据库原理与运用》上机实验之SPJ

  • 前言
  • 一、关系模式
  • 二、使用SQL语句创建、修改基本表
    • 1.对基本表字段名的增加
    • 2.对基本表字段名的增加
    • 3.索引
  • 二、使用SQL语句对数据库表的单表查询
    • 1.对指定列的查询
    • 2.对表达式计算和改变表达方式的查询
    • 3.消除重复行的查询
    • 4.WHERE条件查询
    • 5.分组查询和排序查询
    • 6、实验内容
  • 三、利用SQL语句对数据库表的多表查询
    • 1、多表间的联接查询和合并查询
    • 2、多个SELECT语句的嵌套查询
    • 3、实验内容
  • 总结

前言

因为最近上机课老师把【数据库的建立与维护】、【创建数据库表及其索引】、【单表查询】、【多表查询】都过了一遍,但是脑子里还是乱乱的,于是整理了这份笔记,便于今后的整理与复习。主要内容是单表和多表的查询。


提示:以下个人上课笔记整理,仅供参考。若有误,期待广大网友的批评指正~

一、关系模式

接下来的所有操作都是针对该数据进行处理操作:




在建立表时一定要注意先后顺序,例如,若你先建立SPJ表,会出现外键调用出错(因为S,P,J这三个表并没有建立,无法调用外键),但是也可以先选择部分执行,外键操作后选择并执行的方式。以防出错,代码顺序尽可能保持一致。

建立表格代码如下:

CREATE DATABASE SPJ;USE SPJ;CREATE TABLE S(SNO VARCHAR(10) PRIMARY KEY,SNAME NVARCHAR(100) NOT NULL,SADDR NVARCHAR(100),
);
CREATE TABLE P(PNO VARCHAR(10) PRIMARY KEY,PNAME NVARCHAR(100) NOT NULL,COLOR NCHAR(1),WEIGHT INT,
);
CREATE TABLE J(JNO VARCHAR(10) PRIMARY KEY,JNAME NVARCHAR(100) NOT NULL,JCITY NVARCHAR(50),BALANCE DECIMAL(10,2),
);
CREATE TABLE SPJ(SNO VARCHAR(10),PNO VARCHAR(10),JNO VARCHAR(10),PRICE DECIMAL(10,2),QTY INT,PRIMARY KEY(SNO,PNO,JNO),FOREIGN KEY(SNO) REFERENCES S(SNO),FOREIGN KEY(PNO) REFERENCES P(PNO),FOREIGN KEY(JNO) REFERENCES J(JNO),
);

注意:not null 指该属性值不可为空,可以根据题目的需要来修改约束条件。

下面是插入表格数据代码,内容如图所示:

INSERT INTO S VALUES('S1','原料公司','南京北门23号')
INSERT INTO S VALUES('S2','红星钢管厂','上海浦东100号')
INSERT INTO S VALUES('S3','零件制造公司','南京东晋路')
INSERT INTO S VALUES('S4','配件公司','江西上饶58号')
INSERT INTO S VALUES('S5','原料厂','北京红星路88号')
INSERT INTO S VALUES('S8','东方配件厂','天津叶西路')INSERT INTO P VALUES('P1','钢筋','黑','25')
INSERT INTO P VALUES('P2','钢管','白','26')
INSERT INTO P VALUES('P3','螺母','红','11')
INSERT INTO P VALUES('P4','螺丝','黄','12')
INSERT INTO P VALUES('P5','齿轮','红','18')INSERT INTO J VALUES('J1','东方明珠','上海','0.00')
INSERT INTO J VALUES('J2','炼油厂','长春','-11.20')
INSERT INTO J VALUES('J3','地铁三号','北京','678.00')
INSERT INTO J VALUES('J4','明珠线','上海','456.00')
INSERT INTO J VALUES('J5','炼钢工地','天津','123.00')
INSERT INTO J VALUES('J6','南浦大桥','上海','234.70')
INSERT INTO J VALUES('J7','红星水泥厂','江西','343.00')INSERT INTO SPJ VALUES('S1','P1','J1','22.60','80')
INSERT INTO SPJ VALUES('S1','P1','J4','22.60','60')
INSERT INTO SPJ VALUES('S1','P3','J1','22.80','100')
INSERT INTO SPJ VALUES('S1','P3','J4','22.80','60')
INSERT INTO SPJ VALUES('S3','P3','J5','22.10','100')
INSERT INTO SPJ VALUES('S3','P4','J1','11.90','30')
INSERT INTO SPJ VALUES('S3','P4','J4','11.90','60')
INSERT INTO SPJ VALUES('S4','P2','J4','33.80','60')
INSERT INTO SPJ VALUES('S5','P5','J1','22.80','20')
INSERT INTO SPJ VALUES('S5','P5','J4','22.80','60')
INSERT INTO SPJ VALUES('S8','P3','J1','13.00','20')
INSERT INTO SPJ VALUES('S1','P3','J6','22.80','6')
INSERT INTO SPJ VALUES('S3','P4','J6','11.90','6')
INSERT INTO SPJ VALUES('S4','P2','J6','33.80','8')
INSERT INTO SPJ VALUES('S5','P5','J6','22.80','8')

注意:插入表格时也要注意先后顺序!

二、使用SQL语句创建、修改基本表

1.对基本表字段名的增加

在基本表S中增加一个联系电话(TELE)属性

代码如下(示例):

ALTER TABLE S ADD TELE CHAR(13)

执行效果图:(红色部分则是刚刚所加字段,因为未进行赋值,默认null)

2.对基本表字段名的增加

在基本表S中删除联系电话(TELE)属性
代码如下(示例):

ALTER TABLE S DROP COLUMN TELE

执行后,刚刚添加的字段【TELE】就会被删除

3.索引

创建索引的语句一般格式为:

CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED] INDEX < 索引名> ON {< 表名>| <视图名 >} (<列名 > [ASC|DESC ] [ ,…n])

其中,UNIQUE指唯一索引,CLUSTERED指聚集索引,NONCLUSTERED指非聚集索引
索引可以建在该表或视图的一列或多列上,各列名之间用逗号分隔,每个列名后面还可以用次序指定索引值的排列次序(ASC升序,DESC降序)

例:对SPJ表作非聚集索引,其中,SNO作降序排列,PNO和JNO作升序排列
代码如下:

CREATE NONCLUSTERED INDEX SPJ_SNO_PNO_JNO ON SPJ(SNO DESC,PNO ASC,JNO ASC)

删除索引:运用DROP关键字

DROP INDEX SPJ_SNO_PNO_JNO ON SPJ(SNO DESC,PNO ASC,JNO ASC)

二、使用SQL语句对数据库表的单表查询

查询是数据库应用的核心内容,sql中运用SELECT进行查询

1.对指定列的查询

例:查询零件全部信息
代码如下:

SELECT * FROM S

其中【*】是指所有的字段名,等价于:

SELECT SNO,SNAME,SADDR FROM S

2.对表达式计算和改变表达方式的查询

目标表达式中各个列的先后顺序可以与表中的顺序不一致。也就是说,用户在查询时可以根据需要改变列的显示顺序。(这里不做演示)

此外,SELECT子句的目标列表不仅可以是表中的属性列,也可以是有关表达式。

例:将价格作为【原价】列输出,QTY作为【折扣后数量】输出(随意例子并无含义)

代码如下:

SELECT PRICE AS 原价,0.8*QTY AS 折扣后数量 FROM SPJ

(as可以省略不写)

运行结果如图:

3.消除重复行的查询

在SELECT查询语句中,第一行有ALL|DISTINCT选择,ALL表示对所有行查询,默认状态;DISTINCT查询后会取消重复的行。

例如:
1、查询所有零件的零件编号
代码如下:

SELECT DISTINCT SNO FROM SPJ

运行结果如图:

倘若不加DISTINCT,默认为ALL

SELECT  SNO FROM SPJ

结果输出如下:


显然,第二个图的结果并不是我们想要的,重复行太多。可见DISTINCT在统计方面很重要

4.WHERE条件查询

查询满足指定条件的记录可以通过WHERE子句来实现。WHERE子句常用的查询条件如图所示:

5.分组查询和排序查询

*分组查询:*GROUP BY子句可以将查询结果表的各行按一列或多列取值相等的原则进行分组,查询结果分组的目的是为了**细化集函数的作用对象。**如果分组后还要求按一定的条件对这些分组进行筛选,则可以使用HAVING短句指定筛选条件。

注意:HAVING条件是指分组后要求设定的条件,而WHERE是指对查询表(或多个表)内所有内容设定的条件

*排序查询:*通过ORDER BY子句指定一个或多个字段值的升序(ASC)或降序(DESC)重新排列查询结果。(默认升序)

6、实验内容

1、查询工程为J1的供应商数、提供零件的最大数量,最少数量及平均数量。

代码如下:

SELECT COUNT(JNO)供应商数 ,MAX(QTY)最大数量,MIN(QTY)最小数量,AVG(QTY)平均数量
FROM SPJ
WHERE JNO='J1'

注意:此处省略了AS

2、查询供应零件给工程J1,且零件编号为P1的供应商编号SNO。

代码如下:

SELECT SNO FROM SPJ
WHERE JNO='J1' AND PNO='P1'

3、查询上海的供应商名称,假设供应商关系的SADDR列都以城市名开头。

代码如下:

SELECT SNAME  FROM S
WHERE SADDR LIKE '上海%'

4、查询使用零件数量在100~1000的工程编号、零件号和数量。

代码如下:

SELECT JNO,PNO,QTY
FROM SPJ
WHERE QTY BETWEEN 100 AND 1000

5、查询给出三个以上(包含三个)工程,供贷的供应商号及提供的工程数(注意提供一个工程多种零件,可算作多个工程)。

代码如下:

SELECT DISTINCT SNO, COUNT(JNO)
FROM SPJ
GROUP BY SNO HAVING COUNT(JNO)>=3

运行结果如图:

6、查询没有正余额的工程编号、名称以及城市,结果按工程编号升序排列。

代码如下:

SELECT JNO,JNAME,JCITY
FROM J
WHERE BALANCE <= 0
ORDER BY JNO

三、利用SQL语句对数据库表的多表查询

1、多表间的联接查询和合并查询

联接查询:若一个查询同时涉及两个或两个以上的表,则称为联接查询。
按照它们的联接方式的不同可以分为等值与非等值联接、自身联接、外联接、合并联接等几种。

  • 等值联接与非等值联接:如之前所学关系代数操作方法执行。



    在SQL语言中,一般格式为:

表名1.列名1 <比较运算符> 表名2.列名2

当联接运算符为“=”时,称为等值联接,反之为非等值联接。

  • 自然联接:表与自己进行联接。
  • 外联接:为了保存没条件联接的本来要删除的记录信息。

外联接符号:FULL[OUTER] JOIN
左外联接符号:LEFT[OUTER] JOIN
右外联接符号:RIGHT[OUTER] JOIN

  • 合并查询: 合并查询结果使用UNION操作符将来自不同查询数据组合起来,形成一个具有综合信息的查询结果。UNION会自动将重复的数据剔除。必须注意的是,参加合并查询结果的各子查询使用的表结构应该相同,即各子查询的数据数目相同,对应的类型要相容

2、多个SELECT语句的嵌套查询

带有IN谓词的子查询

基本语法:

表达式[not] in (子查询)

语法中,表达式的最简单形式就是列名或常数。该语义是判断某一表达式的值是否在子查询结果中。

带有比较运算符的子查询

基本语法:

表达式 θ some (子查询)
表达式 θ all (子查询)

语法中, θ是比较运算符: < , > , >= , <= , = , <>。语义是将表达式的值与子查询的结果进行比较:
· 如果表达式的值至少与子查询结果的 某一个值 相比较满足θ 关系,则“表达式θ some (子查询)”的结果便为真;
· 如果表达式的值与子查询结果的所有值相比较 满足θ 关系,则“表达式θ all (子查询)”的结果便为真;

注意:
当“表达式=some(子查询)”时,
相当于“表达式 in (子查询)“

但是not in 和“<> some“含义不同,not in 对应“<>all”

带有EXISTS谓词的子查询

基本语法:

[not] EXISTS(子查询)

语义是子查询中有无元组存在。exists表示( )内子查询语句返回结果不为空说明where条件成立就会执行主sql语句,如果为空就表示where条件不成立,sql语句就不会执行。

然而 not Exists 却可以实现很多新功能
not exists和exists相反,子查询语句结果为空,也就是不符合条件的则表示where 条件成立,执行sql语句

3、实验内容

1、求使用了P3零件的工程全称

代码如下:

SELECT DISTINCT JNAME
FROM J,SPJ
WHERE SPJ.PNO = 'P3' AND SPJ.JNO = J.JNO

也可以使用IN谓词,如下:

SELECT DISTINCT JNAME
FROM J
WHERE JNO IN(SELECT JNO FROM SPJWHERE PNO='P3' )

2、求至少使用了零件编号为P3和P5的工程编号JNO

代码如下:

SELECT DISTINCT X.JNO
FROM SPJ X, SPJ Y
WHERE X.JNO=Y.JNO AND X.PNO='P3' AND Y.PNO='P5'

3、求使用了全部零件的工程名称

代码如下:

SELECT JNAME
FROM J
WHERE NOT EXISTS (SELECT * FROM PWHERE NOT EXISTS(SELECT * FROM SPJWHERE JNO=J.JNO AND PNO=P.PNO ))

4、统计上海地区的工程使用零件总数(超过三种)和零件总数量。要求查询结果按零件的种数升序排列,种数相同的按总数量降序排列。

代码如下:

SELECT SPJ.JNO,COUNT(DISTINCT PNO) AS COUNT_PNO, SUM(QTY) AS SUM_QTY
FROM J,SPJ
WHERE JCITY = '上海' AND J.JNO=SPJ.JNO
GROUP BY SPJ.JNO
HAVING COUNT(DISTINCT PNO)>3
ORDER BY 2,3 DESC

方法2:

SELECT SPJ.JNO,COUNT(DISTINCT PNO) AS COUNT_PNO, SUM(QTY) AS SUM_QTY
FROM J INNER JOIN SPJ ON J.JNO=SPJ.JNO AND JCITY='上海'
GROUP BY SPJ.JNO
HAVING COUNT(DISTINCT PNO)>3
ORDER BY 2,3 DESC

5、检索至少不使用P3和P5这两种零件的工程编号JNO,把检索结果放在表STORE中存储起来

代码如下;

SELECT JNO INTO STORE
FROM J
WHERE JNO NOT IN (SELECT X.JNO FROM SPJ X, SPJ Y WHERE X.PNO='P3' AND Y.PNO='P5'AND X.JNO=Y.JNO)

总结

1、在编码时在注意数据备份,方便后续使用。
2、在执行语句时记得选中执行。
3、一个题目最先考虑内联接方法,若无法解决再考虑子查询,最最最后考虑笛卡尔积(一般也不用该方法)。

(emmm,暂时先这样了,后续补充,用于个人复习用,可参考)

《数据库原理与运用》上机实验之SPJ相关推荐

  1. 《数据库系统原理》教学上机实验报告

    <数据库系统原理>教学上机实验报告 实验题目: 实验一 创建数据库与表 实验目的和要求: 了解 mysql 数据库的存储引擎分类; 了解表的结构特点; 了解 mysql 的基本数据类型; ...

  2. 《数据库原理与应用》实验一

    题目来源学校课后作业,禁商业用途,仅用于课业学习 <数据库原理与应用>实验一 一.实验目的及要求 1.掌握MySQL系统的数据库创建方式. 2.掌握MySQL系统的数据表的创建方式. 3. ...

  3. 《数据库原理与应用》实验二

    题目来源学校课后作业,禁商业用途,仅用于课业学习 <数据库原理与应用>实验二 一.实验目的及要求 1.掌握SQL查询语言的使用. 2.掌握SQL流程控制语句的使用. 3.要求独立完成,并记 ...

  4. 林子雨—大数据技术原理与应用—上机实验三

    题目:熟悉常用的HBase操作 实验环境:        操作系统:ubuntu16.04        hadoop版本:1.2.1        JDK版本:1.8        Eclipse ...

  5. 数据库原理及安全技术教学实验报告SQL实践(二)

    目录 一.实验目的 二.实验软硬件要求 三.实验预习 四.实验内容(实验步骤.测试数据等) 运行结果: 1.使用查询语句完成以下任务(每一个查询都要给出SQL语句,并且列出查询结果). 2.使用数据操 ...

  6. 林子雨—大数据技术原理与应用—上机实验二

    题目:熟悉常用的HDFS操作 实验环境:        操作系统:ubuntu16.04        hadoop版本:1.2.1        JDK版本:1.8        Eclipse 3 ...

  7. 书店销售管理系统----数据库原理及应用综合实验

    枯木逢春犹再发,人无两度再少年

  8. 工程热力学c语言 朗肯循环第二题,软件工程上机实验报告_相关文章专题_写写帮文库...

    时间:2019-05-12 14:56:17 作者:admin <数据库与软件工程>上机实验答案 实验三 SQL语言的DDL 3.CREATE TABLE aa( Bb1 VARCHAR( ...

  9. 数据库原理上机实验内容报告代码

    --创建数据表 create table stu_info( stu_id char(10) not null constraint pk_stu_id primary key,--主键 name n ...

  10. 《数据库原理实验指导书》

    <数据库原理实验指导书> 河南科技大学软件学院 目录 实验规则 基本实验方法 实验环境 实验一 数据定义 实验二 数据更新 实验三 数据查询-简单查询和连接查询 实验四 数据查询-分组查询 ...

最新文章

  1. 从“冰柜”到“冰棍儿”,下载Github单个文件
  2. 封装html5,封装Html5 Fullscreen API
  3. 写给小白看的硬核递归(低调点,当回小白)
  4. 2007年度最具投资价值100强网站揭晓——博客园榜上有名
  5. Vue.js-Day01-AM【第一次学习-安装、基础使用(引入方式)、数据展示、指令介绍(v-html、v-text、v-bind、v-if、v-for】
  6. 为什么vue前端项目要使用nodejs
  7. QT操作sqlite概念
  8. Ubuntu 14.04.3 LTS 配置 DNS Server
  9. 我是永远不可能出轨的,除非......
  10. [Training Video - 1] [Selenium Basics] [Download and Install Selenium]
  11. mysql 字符串函数大全_mysql 字符串函数大全
  12. abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十三)
  13. Java的表达式和运算符
  14. 在EXCEL中进行趋势拟合与预测的方法
  15. itools苹果录屏大师_录屏可以有声音,发照片可以免流量,计算器输错可回删
  16. 浅谈网页压缩GZIP
  17. MVC进阶学习--View和Controller之间的数据传递(一)
  18. 微信小程序收款手续费_为什么有人做的小程序交易手续费是0.38%而不是0.6%?
  19. 〖Python 数据库开发实战 - Python与MySQL交互篇⑩〗- 创建新闻管理系统的具体python文件
  20. 从深度学习到LSTM

热门文章

  1. espnet中的transformer和LSTM语言模型对比实验
  2. 居家办公,无需公网IP远程桌面内网电脑【免费内网穿透】
  3. CAN总线网关是什么?
  4. 数字三角形(C语言)
  5. python表单验证wtf_正在验证wtfforms中的美国电话号码
  6. 想自己做个网站,常用的自助建站哪个好呢?需要注意什么
  7. 五、03【Java IO模型】之字节流
  8. 军哥独家QCIE(囊括CCIE和HCIEv3.0)的全新课程。请大家参阅
  9. 考研英语 长难句训练day12
  10. 应用nslookup命令查看A记录、MX记录、CNAME记录和NS记录