3数据库查询实验

2024-05-02

3数据库查询实验(精选6篇)

篇1:3数据库查询实验

实验三 数据库查询实验

(3)数据库的组合查询和统计查询实验

课时安排:2课时

一、实验目的和要求

使学生熟练掌握SQL Server查询分析器的使用方法.加深对SQL和Transact-SQL语言的查询语句的理解。熟练掌握数据查询中的分组、统计、计算和组合的操作方法。

二、实验内容 分组查询实验该实验包括分组条件表达、选择组条件的表达方法。使用函数查询的实验。该实验包括统计函数和分组统计函数的使用方法。

组合查询实验。计算和分组计算查询的实验。

三、实验方法

将查询需求用 Transact-SQL语言表示;在 SQL Server查询分析器的输入区中输入Transact-SQL查询语句:设置查询分析器的结果区为Standard Execute(标准执行)或Executeto Grid(网格执行)方式.发布执行命令 并在结果区中查看查询结果;如果结果不正确要进行修改.直到正确为止。

四、实验步骤

基本操作实验

在图书借阅库中实现其查询操作。

(1)查找这样的图书类别:要求类别中最高的图书定价不低于全部按类别分组的图书平均定价的2倍。

(2)求机械工业出版社出版的各类图书的平均定价,用GROUPBY表示。

(3)列出计算机类图书的书号、名称及价格.最后求出册数和总价格。

(4)列出计算机类图书的书号、名称及价格 并求出各出版社这类书的总价格.最后求出全部册数和总价格。

(5)查询计算机类和机械工业出版社出版的图书。

提高操作实验

将自设计的数据库应用项目中的分组、统计、计算和组合查询用Transact-SQL语句表示.并通过SQL Server 查询分析器实现其查询操作。

五、实验报告要求 分别用SQL和Transact-SQLL写出实验操作的查询语句 对两种语言进行比较。

实验步骤和实验结果。实验中的问题和提高。

六、注意事项 子句WHERE<条件>表示元组筛选条件,子句HAVING <条件>表示组选择条件。组合查询的子句间不能有语句结束符。子句HAVING<条件>必须和GROUP BY <分组字段>子句配合使用。

七、思考题 组合查询语句是否可以用其他语句代替,有什么不同? 使用 GROUP BY <分组条件>子句后,语句中的统计函数的运行结果有什么不同?

篇2:3数据库查询实验

一、实验目的

熟练掌握SQL语句的使用

二、实验内容

1.查询成绩在80~90之间的记录

2.查询至少有2个同学选修的课程名

3.查询其他系中比“信息系”所有学生年龄都小的学生名单以及年龄,并按年龄降序输出

4.查询与学生“张立”同岁的学生姓名

5.查询选修了两门以上课程的学生名单

6.查询成绩比该课程平均成绩高的学生名单以及成绩,输出课程号、平均分、学号,成绩。

7.查询每个学生各门课程的平均成绩和最高成绩,按降序输出姓名、平均成绩和最高成绩

8.查询所有未选01号课程的学生名单

9.查询选修了“200215122”号学生选修了的课程的学生学号和姓名

10.查询所有学生都选修了的课程的课程号和课程名

三.心得体会

篇3:查询重写关系数据库查询优化技术

关键词:查询重写,数据库,查询优化

引言

查询优化是数据库管理系统设计与实现所采用的一项重要技术,它是影响数据库性能的关键因素,当前所有的商用数据库都成功地采用了这项技术。但由于目前Internet上存在着大量的半结构化数据,信息集成过程中也产生了大量的半结构化视图,因此如何利用半结构化视图来重写用户查询,减少响应时间成为当前此领域研究的热点问题。

1 优化视图重写

SQL语言是一个描述性的非过程化语言,用户在写SQL语句的时候,不用知道要操作的数据具体是如何存放的以及必须按照什么步骤才能进行处理,查询处理器会自动完成这些工作。但是,查询语句操作的数据库对象除了可能是基本表以外,还可能是视图,如果查询处理器直接对视图进行操作的话,查询优化器所能生成的执行计划的唯一选择就是先执行视图定义,再将视图的查询结果作为一个临时表参与查询的其余处理,这种处理方式在绝大多数情况下效率极低,此时,可以认为用户提供的查询蕴含了过程性。查询重写的目标之一就是将过程性查询转换为描述性的,因此,优化器需要对视图进行重写,也就是将对视图的引用转换为对视图所涉及的基本表的引用,而得到一个语义上完全等价的查询,且重写后的查询效率可以比原来提高很多倍。根据关系数据库查询处理过程,要想提高数据库系统的查询效率,必须编写出性能较优的查询语句。

下面举例来说明视图重写的基本方法。假设一个数据库中包含以下几个关系:

emp (name,age,sal,dno)

dept (dno,dname,floor,budget,mgr,ano)

acnt (ano,type,balance,bno)

blank (bno,bname,address)

例:

select emp_view.name

From emp_view,dept_view

Where emp_view.dno=dept_view.dno and dept_view.dname='市埸部'

查询市場部所有员工的姓名,其中emp_view和dept_view均为视图,定义如下:

create view emp_view (name,dno)

As select name,dno

From emp

Create view dept_view (dno,dname)

As select dno,dname

From dept

以上查询经过视图重写后变换为以下查询,这样就转化为两个基本表的连接操作了。

Select emp.name

From emp,dname

Where emp.dno=dept.dno and dept.name='市場部’

2 基于嵌套子查询的重写

当查询涉及两个表时,如果先连接成一个表后再查询,其中间结果会很大,形成一个临时表放在硬盘中,对该表的操作(表的生成、查询)都可能会有多次访盘,导致效率较低,有时还会产生巨大的运算量,增加对内存的需求。严重时可使软件在执行中出现异常。使用嵌套子查询时每次先执行子查询,产生的中间表规模小,效率远比连接后查询的效率高。

2.1 子查询合并规则

(1)如果外层查询的结果没有重复,即SELECT子句中包含主码,则可以合并其子查询,并且合并后的SELECT子句前应加上DISTINCT标志。

(2)如果外层查询的SELECT子句中有DISTINCT标志,那么可以直接进行子查询合并。

(3)如果内部子查询结果没有重复元组,则可以合并。

2.2 子查询合并

步骤:

(1)将子查询外层查询的FROM子句连接成为一个FROM子句,并具修改相应的运行参数。

(2)将子查询的谓词符号作相应修改(如“IN”修改为“=”)

(3)将子查询的WHERE条件作为一个整体与外层查询的WHERE条件合并,并用AND连接词连接,从而保证新生成的谓词的上下文意思相同,并且成为一个整体。

如:

可重写为:

这里需要指出的是,以上讨论的子查询合并规则只适应于单层嵌套子查询,对于多层嵌套子查询处理能力受到一定限制。

3 等价谓词重写

由于执行引擎对各种谓词的处理方法不同,因此把逻辑表达式重写成等价的且效率较高的表达式是提高效率的有效方法,同时也是切实可行的。笔者通过查阅大量的文献资料以及大量的实验,分析了RDBMS执行引擎对各种谓词执行效率的不同,总结出以下谓词转换规则。

(1)将多个OR连接的谓词转化为ANY表达式

(lexp preop rexp1) or (lexp preop rexp2) or (lexp preop rexp3) or…

lexp preop any (rexp1,rexp2,rexp3,…)

考虑条件表达式中同层次由连接词OR连接的谓词,如果谓词的左表达式lexp相同且谓词符号preop也相同(不包括IN谓词),那么可以将谓词合并为一个右表达式用ANY来描述的谓词。如:

(sal>1000 and dno=3) or (sal>1000 and dno=4) or (sal>1000 and dno=5)

可重写为:

sal>1000 and any (dno=3,dno=4,dno=5)

(2)将ANY或ALL转化为单个值

lexp preop any (rexp1,rexp2,rexp3,…) lexp preoprexp1

lexp preop all (rexp1,rexp2,rexp3,…) lexp preop rex-pn

用于右表达式为ANY或ALL的形式,若ANY (ALL)包含的各表达式有固定值,并且可以比较大小,则可根据谓词符号(仅限于比较大小的操作符)将ANY (ALL)重写为单个值。如:

len>ANY (3,sqrt (8),5*5)可重写为:len>sqrt (8);

len>ALL (3,sqrt (8),5*5)可重写为:len>25;

(3)将BETWEEN转化为AND连接的谓词

lexp between rexp1 and rexp2lexp>=rexp1 and lexp<=rexp2

用于由between rexp1 and rexp2的形式重写为用AND连接的两个谓词,效率往往有一定的提高。如:

Age between 20 and 30重写为:age>=20 and age<=30

(4)将IN谓词表达式扩展为OR连接的谓词表达式

lexp in (rexp1,rexp2,rexp3,…)

lexp=rexp1 or lexp=rexp2 or lexp=rexp3 or…

把IN谓词转换为一串OR连接的表达式。如:

Age in (20,30,40)

重写为:

age=20 or age=30 or age=40

以上所提到的四类谓词重写规则均有其特定的条件,在条件满足的情况下才可以使用。对于简单谓词的重写,每条规则提高的效率可能不太明显,但如果查询语句的WHERE条件同时使用多条规则进行重写时那么效率的提高将非常可观。

4 临时表的重写

在数据库中创建一张表,这个表不用于其他的什么功能,主要用于自己的软件系统的一些特殊功能才用的,而当你用完之后表中的数据就没用了。通常,数据库的临时表创建之后基本不占用表空间,如果你没有指定临时表存放的表空间的时候,插入到临时表的数据是存放在系统的临时表空间中。使用临时表可以避免多重排序操作,而且在其他方面也可以简化优化器的工作。例如有下面的语句:

SELECT*FROM student,thesis WHERE student.ID=the-sis.student-ID and student.id>‘0500000’and thesis.type=‘2’ORDER BY student.ID;

如果这个查询要被执行多次而不止一次,可以把所有论文类型为2号的学生的信息找出来放在一个临时文件中,并按学号排序:

SELECT*FROM student,thesis WHERE student.ID=the-sis.student ID and thesis.type=‘2’ORDER BY student.ID IN-TO TEMP sthe;

然后以下面的方式在临时表中查询:SELECT*FROM sthe WHERE sthe.ID>‘0500000*

临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。

5 结语

优化要抓住关键问题,对于数据库应用程序来说,重点在于如何提高SQL的执行效率。在数据库的开发和维护过程中,查询的优化设计可以提高系统性能,对于海量数据库系统尤为重要。要正确地使用它们,另外在提高查询效率的同时还要兼顾程序的正确性和数据的安全性,只有这样才能真正起到查询优化的作用。

参考文献

[1]杨晓春,王丹,王国仁等.虚拟企业环境中支持完整性约??束的主动规则[J].东北大学学报(自然科学版),2001, 22.

[2]C.Yu,L.Popa.Constraint-Based XML Query Rewriting for Data Integration.In:Proc.of the Intl Conf.on Management of Data (SIGMOD),2004.

篇4:数据库的查询优化

关键词:数据库系统;OLTP;查询优化

中图分类号: TP311文献标识码: A文章编号:1009-3044(2007)16-30938-02

Database Query Optimization

LIPeng

(Liaodong university, Dandong 118001,China)

Abstract:Database system is the key of the management information system ,Based on the database of online transaction processing (OLTP) and online analytical processing (OLAP) are the importantcomputer application of banks, enterprises, business, and government departments. While the SQL statement Submitted by the users is the basis for system optimization. How to design effective and reasonable query is very important. This paper supposes some query optimization experiences based on years of database application development.

Key words:Database system;OLAP;query optimization

1 引言

数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、商业、政府等部门最为重要的计算机应用之一。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。如果数据的量积累到一定的程度,比如积累到上百万甚至上千万条记录,全表扫描一次需要数十分钟,甚至数小时。如果采用比全表扫描更好的查询策略,可以使查询时间降为几分钟,由此可见查询优化技术的重要性。

在应用项目的实施中,许多程序员在利用一些前端数据库开发工具(如PowerBuilder、Delphi等)开发数据库应用程序时,只注重用户界面的华丽,并不重视查询语句的效率问题,大量的使用通配符,隐式转换,过分依赖算子IN、BETWEEN等。导致所开发出来的应用系统效率低下,资源浪费严重。许多程序员认为查询优化是DBMS(数据库管理系统)的任务,与程序员所编写的SQL语句关系不大,这是错误的。查询计划是用户所提交的SQL语句的集合,查询规划是经过优化处理之后所产生的语句集合。DBMS处理查询计划的过程是这样的:在做完查询语句的词法、语法检查之后,将语句提交给DBMS的查询优化器,优化器做完代数优化和存取路径的优化之后,由预编译模块对语句进行处理并生成查询规划,然后在合适的时间提交给系统处理执行,最后将执行结果返回给用户。在实际的数据库产品(如Oracle、Sybase等)的高版本中都是采用基于代价的优化方法,这种优化能根据从系统字典表所得到的信息来估计不同的查询规划的代价,然后选择一个较优的规划。虽然现在的数据库产品在查询优化方面已经做得越来越好,但由用户提交的SQL语句是系统优化的基础,很难设想一个原本糟糕的查询计划经过系统的优化之后会变得高效。因此,如何设计高效合理的查询语句就显得非常重要。

2 优化方法

针对以上的问题,结合在数据库应用程序开发实际经验,本文就查询优化问题,谈点实践体会。

2.1 查询优化一

在SELECT/INSERT语句中,必须记述选择表(项目名)。选择表中禁止使用通配符(*)。假如处理A改变表T,在表增加了项目X(or变更or删除)。对同一表T进行访问,与项目X无关的处理B的程序就发生错误。也就是说维护性不好。

差例:

SELECT * FROM epc_tbl1;

INSERT INTO epc_tbl1 VALUES(1,2,3);

良例:

SELECT cd_col1,cd_col2,cd_col3 FROM tbl1;

INSERT INTO epc_tbl1(cd_col1,cd_col2,cd_col3) VALUES(1,2,3);

用SELECT语句指定的列,限定使用在这种处理中。

2.2 查询优化二

给SELECTDE的项目名起一个表别名(Alias)。为了减轻ORACLE的解析负荷,SELECT的项目名必须做到以下两点。但在单一表中使用SELECT时除外。用table、cloumn的形式指定项目名。table名中尽量使用短的别名(Alias)。

差例:

SELECT nm_ename,nm_dname FROM epc_emp,epc_dept WHERE ~;

良例:

SELECT e.nm_ename,d.nm_dname FROM epc_emp e,epc_dept d WHERE ~;

2.3 查询优化三

在WHERE语句中不要让函数和算子纠缠在INDEX项目中WHERE语句中的INDEX项目成为运算对象,放在函数中或NULL值进行比较时都不能作为索引检索的对象,而成为发生全表扫描的原因。这样性能会变得很糟,因此要十分注意。如在可能成为影响性能的地方,这些问题不可避免的话,就要重新研究处理要件与表设计的合理性。

差例:

~ WHERE nu_sal_nn * 1.1 > 950;(nu_sal_nn是INDEX项目)

~ WHERE TO_CHAR(dt_hire_nn,'YYYY/MM/DD') = :i_dt ;(dt_hire_nn是INDEX项目)良例:

~ WHERE nu_sal_nn > 950 / 1.1;

~ WHERE dt_hire_nn = TO_DATE(:dt,'YYYY/MM/DD');

不得已必须使用时要与开发责任人商议。

2.4 查询优化四

不依赖算子IN、BETWEEN。为了减轻ORACLE的解析负荷,尽量禁止使用算子IN、BETWEEN。

差例:~ WHERE nm_ename IN ('SMITH','KING','JONES');

~ WHERE nu_sal BETWEEN 2000 AND 3000;

良例:~ WHERE nm_ename = 'SMITH' OR nm_ename = 'KING' OR nm_ename = 'JONES';

~ WHERE nu_sal >= 2000 AND nu_sal <= 3000;

2.5 查询优化五

避免隐式转换。在WHERE语句中对字符列项目不做单独引证就进行字符列比较的话就是隐式转换,这样有时不能进行索引检索。

差例:SELECT e.nm_ename FROM epc_emp e WHERE nm_job = sales;

良例:SELECT e.nm_ename FROM epc_emp e WHERE nm_job = 'sales';

但在程序中应不使用有单独引证包围的字符列,而应该提前进行常数定义,再进行与该常数的比较。

2.6 查询优化六

不要无谓地反复选择同一条件的行。一旦把SELECT 的行作为UPDATE/DELETE 对象时,性能发挥作用后可利用ROWID 使ORACLE不做不必要的检索动作。

差例:SELECT nm_ename,nu_sal FROM ~ WHERE no_empno = :i_empno AND ~;

UPDATE ~ WHERE no_empno = :i_empno;(但如从代码的易见性、维护性出发设定了有效的索引,也可以采用这种写法)。

良例:SELECT nm_ename, nu_sal,ROWID FROM ~ WHERE nm_empno = :i_empno AND ~;

UPDATE ~ WHERE ROWID = :i_rowid;

2.7 查询优化七

不要根据INDEX项的NOT EQUAL进行评判

差例: ~ WHERE no_deptno <> 30;

良例:~ WHERE no_deptno > 30 OR no_deptno < 30;

不要根据INDEX项的IS NULL进行评判,不要根据INDEX项的 %LIKE% 进行评判。

2.8 查询优化八

不要使用HAVING语句。在下述的差例中可以看出处理选定的全行内容,与此前使用WHERE语句作出的良例相比,处理负荷大了。

差例:~ GROUP BY nm_regionHAVING nm_region <> 'SYDNEY' AND nm_region <> 'PERTH';

良例:~ WHERE nm_region <> 'SYDNEY' ND nm_region <> 'PERTH'GROUP BY nm_region;

2.9 查询优化九

从NOT IN 开始也要使用NOT EXISTS。不要进行使用NOT IN 的内部分类合并。

差例:SELECT e.no_empno FROM epc_emp e WHERE e.no_deptno NOT IN(SELECT d.no_deptno FROM epc_dept d WHERE d.nm_loc = 'OSAKA');

良例:SELECT e.no_empno FROM epc_emp e WHERE NOT EXISTS(SELECT 'X' FROM epc_dept d WHERE d.no_deptno = e.no_deptno AND d.nm_loc = 'OSAKA');

2.10 查询优化十

从EXISTS开始也要使用JOIN。从副查询开始也要使用JOIN。

差例:SELECT e.nm_ename FROM epc_emp e WHERE EXISTS(SELECT 'X' FROM epc_dept d WHERE d.no_deptno = e.no_deptno AND d.nm_loc = 'OSAKA');

良例:SELECT e.nm_ename FROM epc_dept d, epc_emp e WHERE e.no_deptno = d.no_deptno AND d.nm_loc = 'OSAKA';

2.11 查询优化十一

INDEX的顺序与汇总。要对某个表,在不同的检索条件下进行高效的SELECT就必须对各个检索条件设定适当的INDEX。但是如果对一个表设定太多的INDEX,就会出现类似更新的总开销增大等的弊病(标准要设为三种)。按A,B,C项顺序排列的INDEX对下述检索要求有效。对这些检索要求没必要另外设定对应的INDEX。

只以项目A为关键字的检索。

以项目A和B为关键字的检索。

以项目A、B、C为关键字的检索。

但是,INDEX的项目排列顺序不同的话,有效的检索条件也会不同,这一点要注意。(在上述例子中INDEX的项目排列如果是B,A,C的顺序,那么在项目A的单独检索中INDEX就无效)。项目A,B使用的INDEX在以下条件时可以代用项目A,B,C使用的INDEX。

在A,B项目中的选择性高(缩小到5%以下)在A,B项目中缩小的数据绝对量少(50行以下)。

3 结论

以上着重从实现的角度讨论了查询优化,实际上要想根本解决查询优化问题,还需从设计上进行优化,如尽量使用大的内存,数据可适度冗余,库结构优化,对于频繁使用的表建立索引,面向对象的数据库设计方法等等。

参考文献:

[1]萨师煊,王珊.数据库系统概论[M]. 北京. 高等教育出版社,2004:190-215.

[2]王能斌.数据库系统原理[M]. 北京. 电子工业出版社,2000:157-190.

[3]吴胜利,王能斌.面向对象数据库的查询优化[J]. 软件学报,1997(8-2):27-29.

篇5:3数据库查询实验

一、实验目的

1.掌握集合查询涉及的SQL语句 2.掌握视图创建的SQL语句

二、实验内容

1.查询信息系的男生或者是计算机系的女生名单,输出姓名,性别,系名。(并操作UNION)

2.查询计算机系年龄不大于20岁的学生。(交操作INTERSECT)

3.查询计算机系年龄大于19岁的学生。(差操作EXCEPT)

4.创建一个视图view1,要求输出学号,姓名,课程号,分数。

5.基于view1和Course查询每个人各门课程的平均分,输出学号,姓名,平均分,按平均分降序排列。

6.基于view1和Course查询每个人选课的总学分数,输出学号,姓名,总学分数。

三.心得体会

篇6:3数据库查询实验

继前两次的实验,本次实验以熟练掌握利用select语句进行各种查询操作:单表查询、多表连接及查询、嵌套查询、集合查询等,巩固数据库查询操作,

下面就跟着小编一起练习吧!

在实验一创建并插入数据的表(Student, Course,SC,Teacher,TC)的基础上,完成以下操作。

(1)将教师‘罗莉‘的名字改为‘罗莉莉‘。

代码如下:

update Teacher set tname=‘罗莉莉‘ where tname=‘罗莉‘

(2)将两个同学(数据自己临时设置,用后即删除)的两门课程的成绩以运行sql程序文件的形式插入score表中。该题用以验证、理解和掌握关系模型的完整性规则;

插入:

代码如下:

insert into Score(sno,cno,grade) values (‘04261006‘,‘C003‘,‘64‘)

insert into Score(sno,cno,grade) values(‘04261007‘,‘C004‘,‘79‘)

查询:

代码如下:

select sno 学号,cno 课程号,grade 分数from Score where sno=04261006 or sno=04261007;

删除:

代码如下:

delete from Score where sno=04261006 or sno=04261007;

(3)求每门课的平均成绩,并把结果存入average表(自行设计并创建);

代码如下:

CREATE TABLE average

(

cno CHAR(8),

avscore numeric(5,2),

constraint a1 primary key (cno),

constraint a2 foreign key (cno) references Course(cno),

)

insert into average(cno,avscore)

select distinct cno ,avg(grade) from Score group by cno

(4)将学生“马丽”的年龄改为24;

代码如下:

Update Student set -year(Sbirth) 年龄 where Sname=‘ 马丽‘

(5)将所有学生的szipcode属性列值填补上;

代码如下:

update Student set szipcode=‘221000‘

(6)将average表中的所有课程的平均成绩置零;

代码如下:

update average set avscore=‘0‘

(7)删除average表中的课程号为‘C007‘的平均成绩记录;

代码如下:

delete from average where cno=‘C007‘

(8)删除所有average表中平均成绩记录;

代码如下:

delete from average;

(9)建立一个临时学生信息表(tstudent),删除该表中的学号含‘101‘的所有学生记录。

代码如下:

create table tstudent  ( Sno char(8) primary key,    Sname varchar(8) unique );

Delete from tstudent where Sno like ‘001011%‘;

(10)查询全体学生的学号与姓名;

代码如下:

select sno 学号,sname 姓名from Student

(11)查询全体学生的学号、姓名、所属系;

代码如下:

select sno 学号,sname 姓名,sdept 系from Student

(12)查询全体学生的详细记录;

代码如下:

select * from Student

(13)查询全体学生的姓名及其年龄;

代码如下:

select sname 姓名,2014-year(sbirth) 年龄from Student

(14)查询全体学生的姓名、出生年份;

代码如下:

select sname 姓名,year(sbirth) 出生年份from Student

(15)查询所有修过课的学生的学号;

代码如下:

select distinct sno from Score

select distinct student.sno from Student,Score where Student.sno=Score.sno and Score.grade>0 ;

(16)查询“计算机系”班全体学生名单;

代码如下:

select sno,sname from Student where sdept=‘计算机系‘

(17)查询查询所有年龄在23岁以下的学生姓名及其年龄;

代码如下:

select sname 姓名,2014-year(sbirth) 年龄from Student where 2014-year(sbirth)<23;

(18)查询考试成绩有不及格的学生的学号;

代码如下:

select distinct sno from Score where grade<60;

(19)查询年龄在20至22岁之间的学生姓名、系和年龄;

代码如下:

select sname 姓名,sdept 系,2014-year(sbirth) 年龄from student where 2014-year(sbirth) between 20 and 22;

(20)查询年龄不在20至22岁之间的学生姓名、系和年龄;

代码如下:

select sname 姓名,sdept 系,2014-year(sbirth) 年龄from student where 2014-year(sbirth) not between 20 and 22;

(21)查询“计算机系”和“电商系”的学生的姓名;

代码如下:

select sname from Student where sdept=‘计算机系‘ or sclass=‘电商系‘

(22)查询既不是“计11”也不是“计61”班的学生的姓名和班级信息;

代码如下:

select sname,sclass from Student where sclass not in(‘计‘,‘计‘);

(23)查询学号为“0426”的学生的详细情况;

[code]select student.sno,sname,ssex,2014-year(sbirth),sclass,grade from Student,Score where Student.sno=Score.sno and Student.sno=‘04262002‘;

(24)查询学号以“04262”打头的学生信息;

代码如下:

select * from Student where sno like ‘04262%‘

(25)查询所有姓“张”学生的学号、姓名、性别、年龄;

代码如下:

select sno 学号,sname 姓名,ssex 性别,-year(sbirth) 年龄from Student where sname like‘王%‘

(26)查询名字中第二个字有“海”字的学生的学号、姓名、性别、年龄;

代码如下:

select sno 学号,sname 姓名,ssex 性别,2011-year(sbirth) 年龄from Student where sname like ‘_田%‘

(27)查询所有不姓“刘”学生的姓名;

代码如下:

select sname 姓名from Student where sname not like ‘刘%‘

(28)查询课程号以“C”开头的最后两个字母为“05”的课程号和课程名;

代码如下:

select cno,cname from Course where cno like ‘C%05‘

(29)某些学生选修某门课程后没有参加考试,所以有选修课记录,但没有考试成绩,试查找缺少考试成绩的学生和相应的课程号;

代码如下:

select Student.sno,sname,cno from Student,Score where Student.sno=Score.sno and grade is NULL;

(30)查找全部有成绩记录的学生学号、课程号;

代码如下:

select sno, cno from Score where grade is not NULL;

(31)查找“计算机系”年龄在22岁以下的学生学号、姓名;

代码如下:

select sno ,sname from Student where sdept=‘计算机系‘ and 2014-year(sbirth)<22

(32)查找选修了“C001”号课程的学生学号及其成绩,查询结果按分数降序排序;

代码如下:

select student.sno,grade from student,Score where Student.sno=Score.sno and cno=‘C001‘ order by grade desc;

(33)查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列;

代码如下:

select * from student order by sdept asc,2014-year(sbirth) desc;

(34)查询学生总人数;

代码如下:

select count(*) 人数from Student;

(35)查询选修了课程的学生人数;

代码如下:

select count(distinct sno)人数from Score;

(36)在所有课程中查询最高分的学生学号和成绩;

代码如下:

select sno,grade from Score where grade =(select max(grade)from Score )

代码如下:

select distinct a.* from Score a where a.sno IN (select top 1 Score.sno from Score where Score.cno = a.cno order by grade desc)

(37)查询学习“C001”课程的学生最高分数;

代码如下:

select max(grade)最高分数from Score where cno=‘C001‘

(38)计算各个课程号与相应的选课人数;

代码如下:

select count(sno) 选课人数from Score group by cno;

(39)查询“计算机系”选修了两门课程以上的学生学号、姓名;

代码如下:

select Student.sno,sname from Student where Student.sno in

(select Student.sno from Student,Score where

sdept=‘计算机系‘and Student.sno=Score.sno group by Student.sno having count(cno)>=2);

(40)自然连接student和score表;

代码如下:

select student.*,Score.grade from student ,Score where student.sno=Score.sno;

(41)使用自身连接查询每一门课程的间接先行课(即先行课的先行课)

代码如下:

select a.cno,b.cpno from Course a,Course b where a.cpno=b.cno;

(42)使用复合条件连接查询选修“c001”号课程且成绩在90分以上的所有同学;

代码如下:

select sname,grade from student,Score where Student.sno=Score.sno and cno=‘C001‘ and grade>=90;

(43)使用复合条件连接查询每个学生选修的课程名及其成绩;

代码如下:

select Student.sno,sname,cname,grade from Course,Score,Student where Course.cno=Score.cno and student.sno=Score.sno;

(44)查询选修了全部课程的学生;

代码如下:

select Sname from Student where not exists (select * from Course where not exists(select * from Score where Sno=Student.Sno and Cno=Course.Cno))

(45)查询所有选修了C001号课程的学生学号、姓名;

代码如下:

select student.sno,sname from student,Score where student.sno=Score.sno and cno=‘C001‘;

(46)查询选修了课程C001或C007的学生学号、姓名;

[code]select student.sno,sname,cno from student,Score where student.sno=Score.sno and cno in (‘C001‘,‘C007‘);

[/code]

(47)查询“计算机系”的学生及年龄不大于23岁的学生;

代码如下:

select sno ,sname,2014-year(sbirth) age ,sclass from student where sdept=‘计算机系‘ or 2014-year(sbirth)<=23;

(48)查询既选修了课程C001又选修了课程C007的所有学生学号、姓名;

代码如下:

select student.sno,sname from student,Score where student.sno=Score.sno and cno=‘C001‘ and student.sno in (select student.sno from student,Score where student.sno=Score.sno and cno=‘C007‘)

(49)查询选修了课程名为“数据库原理”的学生的学号、姓名、性别、年龄;

代码如下:

select student.sno ,sname,ssex,cname,2011-year(sbirth) age from student,Score,Course where student.sno=Score.sno and Score.cno=Course.cno and cname=‘数据库原理‘;

(50)查询其他班中比“计算机系”所有学生年龄都小的学生名单;

代码如下:

select sno,sname ,2014-year(sbirth) age from student where 2014-year(sbirth)<(select min(2014-year(sbirth)) from student where sclass=‘计61‘)and sclass !=‘计61‘;

(51)查询与“夏天”在同一个系学习的学生学号、姓名、性别、年龄;

代码如下:

select sno,sname,ssex,2014-year(sbirth) age from student where sdept=(select sdept from student where sname=‘夏天‘) and sname!=‘夏天‘

(52)建立“计算机系”学生的视图1;

代码如下:

create view view_student

as select sno,sname,ssex,sbirth,sclass from student where sclass=‘13z网络‘

(53)建立“计算机系”学生的视图2,并要求进行修改与插入时,仍须保证该视图只有“计算机系”班学生;

代码如下:

create view view_student2

as select sno,sname,ssex,sbirth,sclass from student where sclass=‘13z网络‘ with check option;

(54)建立“计算机系”选修了“C001”课程的学生的视图,定义视图名为“v_cs_C001_student1”;

代码如下:

create view v_cs_C001_student1

as select student.sno,sname,ssex,sbirth,sclass from Student ,Score where

student.sno=Score.sno and sclass=‘13z网络‘ and cno=‘C001‘;

(55)建立“计算机系”班选修了“C001”课程且成绩在90分以上的学生的视图,定义视图名为“cs_c001_student2”;

代码如下:

create view cs_c001_student2

as

select student.sno,sname ,ssex,sbirth,sclass,cno from student,Score where

student.sno=Score.sno and cno=‘C001‘ and sclass=‘13z网络‘and student.sno in (select student.sno from student,Score where student.sno=Score.sno and grade>90)

(56)定义一个反映学生年龄的视图,定义视图名为“v_birth_student”;

代码如下:

create view v_birth_student

as

select sno,sname,2014-year(sbirth) age from student

(57)将学生表中所有女生记录定义为一个视图,视图名为“v_female_student”;

代码如下:

create view v_female_student

as

select * from student where ssex=‘女‘;

(58)将学生的学号及其平均成绩定义为一个视图,视图名为“v_average_student”;

代码如下:

create view v_average_student

as

select sno,avg(grade) avscore from Score group by sno;

(59)在“计算机系”学生视图中找出年龄小于22岁的学生;

代码如下:

select * from view_student where 2014-year(sbirth)<=22;

(60)利用视图查询“计算机系”选修了“C001”课程的学生;

代码如下:

select * from v_cs_C001_student1;

(61)通过(52)中的“计算机系”视图修改某个学生的名字;

代码如下:

update view_student set sname=‘王某某‘where sno=04261001;

(62)通过(53)中的“计算机系”视图,插入一个新学生记录,

代码如下:

insert into view_student2(sno,sname,ssex,sbirth,sclass) values (‘0426‘,‘张某某‘,‘男‘,‘1987/11/09‘,‘计‘);

(63)通过(53)中的“计算机系”视图,删除一个学生记录。

代码如下:

delete from view_student2 where sno=‘04262004‘and sname=‘张某某‘;

实验课结束了,相信通过本节课的实践操作,小伙伴们都对数据库表的操作有了更进一步的了解。

上一篇:三讲三保活动工作总结下一篇:赴辽培养计划