数据库的查询和视图
- 格式:docx
- 大小:166.29 KB
- 文档页数:13
实验五:多表查询及视图一、实验目的1.掌握SELECT语句的基本语法和查询条件表示方法;2.掌握数据表的连接查询、嵌套查询、集合查询的使用方法。
3.掌握创建及管理视图的方法;二、实验学时2学时三、实验要求1.了解SELECT语句的基本语法格式和执行方法;2.掌握连接查询、嵌套查询和集合查询的语法规则;3.掌握使用界面方式和命令方式创建及管理视图;4.完成实验报告;四、实验内容1.以实验3数据库为基础,请使用T-SQL 语句实现进行以下操作:1)查询选修了‘数学’或者‘大学英语’的学生学号、姓名、所在院系、选修课程号及成绩;2)查询与‘张力’(假设姓名唯一)年龄不同的所有学生的信息;3)按照“学号,姓名,所在院系,已修学分”的顺序列出学生学分的获得情况。
其中已修学分为考试已经及格的课程学分之和;4)查找选修了至少一门和张力选修课程一样的学生的学号、姓名及课程号;5)查询只被一名学生选修的课程的课程号、课程名;6)使用嵌套查询出选修了“数据结构”课程的学生学号和姓名;7)使用嵌套查询查询其它系中年龄小于CS系的某个学生的学生姓名、年龄和院系;8)使用ANY、ALL 查询,列出其他院系中比WM系所有学生年龄小的学生的姓名;9)使用集合查询查询选修1号课程同时选修2号课程的同学的学号与姓名;2.以实验数据库为基础数据,利用对象资源管理器创建以下视图:1)创建所有学生学号、姓名及年龄的信息视图v_stu_info2)创建CS系学生基本信息视图v_stu_cs3)创建选修课成绩在80分以上的学生的信息视图v_stu_80,包括学生基本情况及成绩。
3. 以实验数据库为基础数据,请使用T-SQL语句完成以下内容,并将SQL语句写在实验报告册中:1) 创建v_CS视图,包括CS系各学生的学号、姓名及年龄,要求进行修改和插入操作时仍需保证该视图只有CS系的学生;2) 创建v_CS_age20视图,包括CS系学生年龄在20岁以上的基本信息;并保证对视图文本的修改都要符合年龄大于20这个条件。
数据库实验4_数据库查询与视图在学⽣选课数据库中完成规定查询,并创建视图。
1.查询线性代数不及格的同学的学号和姓名;SQL语句为:SELECT名单$.学号,姓名FROM名单$,学⽣选课信息和成绩$,课程$WHERE名单$.学号=学⽣选课信息和成绩$.学号AND课程$.课号=学⽣选课信息和成绩$.课号AND 课程$.课程名='线性代数'AND学⽣选课信息和成绩$.成绩<60;执⾏后结果为:2.查询没有选课记录的同学的所有基本信息;SQL语句为:SELECT*FROM名单$WHERE NOTEXISTS(SELECT*FROM学⽣选课信息和成绩$WHERE学号=名单$.学号);执⾏后结果为:3.查询具有简介先修课的课程信息及对应的先修课名;SQL语句为:SELECTFIRST.课号,SECOND.课程名FROM课程$FIRST,课程$SECONDWHEREFIRST.先修课号=SECOND.课号;执⾏后结果如下:4.统计⾼等数学(1)的平均成绩;SQL语句为:SELECT AVG(成绩)FROM学⽣选课信息和成绩$,课程$WHERE学⽣选课信息和成绩$.课号=课程$.课号AND课程$.课程名='⾼等数学(1)'; 执⾏后结果如下:5.统计各门课的选课⼈数;SQL语句为:SELECT课号,COUNT(学号)FROM学⽣选课信息和成绩$GROUPBY课号;执⾏后结果为:6.查询选修5门课以上的学⽣的学号;SQL语句为:SELECT学号FROM学⽣选课信息和成绩$GROUPBY学号HAVING COUNT(*)>5;执⾏后结果为:7.⽤你的学号查询和你⼀个班的同学的学号和姓名;SQL语句为:SELECT学号,姓名FROM名单$WHERE班级IN(SELECT班级FROM名单$WHERE学号='201000800145');执⾏后结果如下:8.查询⾼等数学(1)成绩⽐你⾼出10分以上的同学的姓名和对应成绩;SQL语句为:SELECT姓名,成绩FROM名单$,学⽣选课信息和成绩$WHERE名单$.学号=学⽣选课信息和成绩$.学号AND学⽣选课信息和成绩$.课号='82006010'AND成绩>(SELECT成绩+10FROM学⽣选课信息和成绩$,课程$WHERE学⽣选课信息和成绩$.课号=课程$.课号AND课程$.课程名='⾼等数学(1)' AND学⽣选课信息和成绩$.学号='201000800145')执⾏后结果为:9.找到每门课获得最⾼成绩的同学的学号、姓名、课名和成绩;选做。
一、视图与查询的区别功能不同。
视图可以更新字段内容并返回原表,而查询文件中的记录数据不能修改。
这是视图与查询的本质区别。
归属不同。
视图不是一个独立的文件,它保存在数据库中。
查询文件是一个独立的文件,不属于数据库。
访问限制不同。
视图的数据来源可以是本地数据源,也可以是远程数据源,而查询不能访问远程数据源。
输出去向不同。
视图只能当表使用,而查询可以选择多种查询去向,如表、图表、报表、标签等多种形式。
使用方法不同。
视图可以作为数据源被引用,而查询不能被引用。
使用方式不同。
视图只有所属的数据库被打开时才能使用。
而查询可在“命令”窗口中执行。
二、数据库在创建关系之前,要关联的表之间必须有公共的字段和索引。
在数据库中创建的关系称为“永久关系”,之所以成为永久关系,是因为这种表与表之间的关系作为数据库的一部分存储在数据库文件中。
两个建立了关系的表可以分为父表和子表。
显然,一个父亲可以有一个或多个子女,而每个子表只能有一个父表。
这样两个表之间的关系就由子表在建立关系使用的索引类型决定了。
如果子表索引类型为[主索引]或[候选索引],那么,两表之间就是一对一关系。
否则,若子表索引类型为[普通索引]或[唯一索引],那么,两表间就是一对多关系。
而作为父表来说,它在建立关系时使用的索引类型就只能是[主索引]或[候选索引]。
三、查询在多表查询中,可以使用数据库表、自由表、本地视图或远程视图的任意组合。
在查询中,我们在表之间建立的联接与数据库中表之间的关系是不同的。
在查询中,表之间建立的联接是以选择标准存在,不会象数据库中表之间的持续关系那样持续保存下来,也不必建立在索引的基础上。
只有当字段的大小相等,且数据类型相同时才能建立联接。
同表之间的永久关系一样,一个表不能同时为两个父表的子表,也不能同时为两个子表的父表。
实验四数据库的查询和视图T4.1 数据库的查询1.目的与要求(1)掌握select语句的基本语法;(2)掌握子查询的表示(3)掌握连接查询的表示(4)掌握select语句的group by子句的作用和使用方法(5)掌握select语句的order by子句的作用和使用方法2 实验准备(1)了解SELECT语句的基本语法格式;(2)了解SELECT语句的执行方法;(3)了解子查询的表示方法;(4)了解连接查询的表示;(5)了解SELECT语句的GROUPBY子句的作用和使用方法;(6)了解SELECT语句的ORDERBY子句的作用;3实验内容SELECT语句的基本使用。
①对于实验2给出的数据库表结构,查询每个雇员的所有数据。
新建一个查询,在查询分析器中输入如下语句并执行:USEYGGLGOSELECT *FROM Employees【思考与练习】用SELECT语句查询Departments和Salary表中所有的数据信息。
用SELECT语句查询Employees表中每个雇员的地址和电话。
新建一个查询,在查询分析器中输入如下语句并执行:Use YGGLGOSELECT Address PhoneNumberFROM Employees【思考与练习】a.用SELECT语句查询Deparments和Salary表的一列或若干列。
b.查询Employees表中的部门号和性别,要求使用DISTINCT消除重复行。
c.查询EmployeeID为000001的雇员的地址和电话。
Use YGGLGOSELECT Address PhoneNumberFROM EmployeesWHERE EmployeeID=’000001’【思考与练习】a.查询月收入高于2000元的员工号码。
b.查询1970年以后出生的员工的姓名和住址。
c.查询所有财务部的员工的号码和姓名。
查询Employees表中女雇员的地址和电话,使用AS子句将结果中各列的标题分别指定为地址、电话。
第八章查询与视图8.1创建查询查询8.1.1利用“查询向导”建立查询⏹在“项目管理器”中选择“数据”选项卡,然后选择“查询”。
⏹选择“新建”。
⏹选择“查询向导”按钮。
⏹选择所建查询的类型。
⏹按照向导屏幕上的指令进行操作。
8.1.2利用查询设计器设计查询1. 在“项目管理器”中,选择“数据”选项卡,然后选择“查询”选项。
2. 单击“新建”按钮,弹出“新建查询”对话框。
3. 单击“新建查询”按钮,添加建立查询的表,选择出现在查询结果中的字段。
4. 设置选择条件来查询给出所需结果的记录。
5. 设置排序或分组选项来组织查询结果。
6. 选择查询结果的输出类型,包括浏览、表、报表等。
7. 运行查询。
8.1.3查询的运行和修改1. 在“项目管理器”的“数据”选项卡中选择要运行的查询文件名,然后单击“运行”按钮即可。
2. 选择查询文件,单击“修改”按钮,打开“查询设计器”窗口,然后选择“查询”菜单下的“运行查询”命令,或者在工具栏选择按钮。
3. 用命令方式运行查询文件,格式为:DO查询文件名。
8.1.4定向输出查询结果⏹浏览:在“浏览”窗口中显示查询结果。
⏹临时表:将查询结果保存在临时表中。
⏹表:将查询结果作为表文件保存起来。
⏹图形:使查询结果可用于Microsoft Graph,图形使包含在Visual FoxPro中的一个独立的OLE应用程序。
⏹屏幕:在活动输出窗口中显示查询结果。
⏹报表:向报表文件发送查询结果。
⏹标签:向标签文件发送查询结果。
8.2创建视图视图8.2.1利用“视图向导”创建视图1. 在“项目管理器”中,选定一个数据库。
2. 选定“本地视图”,选择“新建”按钮。
3. 选择“视图向导”按钮。
4. 按照向导屏幕上的指令操作。
8.2.2用视图设计器创建视图1. 从“项目管理器”中选定一个数据库,展开该数据库。
2. 选择“本地视图”并选择“新建”按钮,弹出“新建本地视图”按钮。
3. 单击“新建视图”按钮,在“添加表或视图”对话框中,选定需使用的表或视图,再选择“添加”。
实验四数据库的查询和视图T4.1 数据库的查询1.目的与要求(1)掌握select语句的基本语法;(2)掌握子查询的表示(3)掌握连接查询的表示(4)掌握select语句的group by子句的作用和使用方法(5)掌握select语句的order by子句的作用和使用方法2 实验准备(1)了解SELECT语句的基本语法格式;(2)了解SELECT语句的执行方法;(3)了解子查询的表示方法;(4)了解连接查询的表示;(5)了解SELECT语句的GROUPBY子句的作用和使用方法;(6)了解SELECT语句的ORDER BY子句的作用;3实验内容SELECT语句的基本使用。
①对于实验2给出的数据库表结构,查询每个雇员的所有数据。
新建一个查询,在查询分析器中输入如下语句并执行:USEYGGLGOSELECT*FROMEmployees【思考与练习】用SELECT语句查询Departments和Salary表中所有的数据信息。
用SELECT语句查询Employees表中每个雇员的地址和电话。
【思考与练习】a.用SELECT语句查询Deparments和Salary表的一列或若干列。
b.查询Employees表中的部门号和性别,要求使用DISTINCT消除重复行。
c.查询EmployeeID为000001的雇员的地址和电话。
【思考与练习】a.查询月收入高于2000元的员工号码。
b.查询1970年以后出生的员工的姓名和住址。
c.查询所有财务部的员工的号码和姓名。
d.查询Employees表中女雇员的地址和电话,使用AS子句将结果中各列的标题分别指定为地址、电话。
【思考与练习】使用SELECT语句进行简单的计算。
⑦获得员工总数。
【思考与练习】a.计算salary表中员工月收入的平均数。
b.获得Employees表中最大员工号码。
c.计算Salary表中所有员工的总支出。
d.查询财务部雇员的最高和最低实际收入。
USE YGGLSELECT MAX(InCome-OutCome) AS 最高实际收入, MIN(InCome-OutCome) AS 最低实际收入FROM SalaryGO⑧找出所有姓王的雇员的部门号。
USE YGGLSELECT DepartmentIDFROM EmployeesWHERE Name LIKE '王%'Go【思考与练习】a.找出所有其地址中含有“中山”的雇员的号码及部门.USE YGGLSELECT ,EmployeeID,DepartmentIDFROM EmployeesWHERE Address LIKE ‘中山’GOb.查找员工号码倒数第二个数字为0的员工的姓名、地址和学历。
USE YGGLSELECT Name,Address,EducationFROM EmployeesWHERE EmployeeID =LIKE’%0_’GO⑨找出所有收入在2000-3000元之间的员工号码。
(1)子查询的使用。
①查找在财务部工作的雇员的情况USE YGGLGOselect *from Employeeswhere DepartmentID=(select DepartmentID from Departmentswhere DepartmentName='财务部')【思考与练习】用子查询的方法查找所有收入在2500元以下的雇员的情况②查找财务部年龄不低于研发部雇员年龄的雇员的姓名。
【思考与练习】查询每个雇员的情况及其工作部门的情况。
②使用内连接的方法查询名字为“王林”的员工所在的部门select DepartmentName from DepartmentsJoin Employees on Departments.DepartmentID=Employees.DepartmentID where ='王林'【思考与练习】a.使用内连接的方法查找出不在财务部工作的所有员工信息。
b.使用外连接方法查找出所有员工的月收入。
①查找财务部收入在2000元以上的雇员姓名及其薪水详情。
USE YGGL【思考与练习】查询研发部在1976以前出生的雇员姓名及其薪水详情。
(2)聚合函数的使用。
1.求财务部雇员的平均收入新建一个查询,在查询分析器中输入如下语句并执行。
USE YGGLGOselect AVG(Income) as '财务部平均收入' from Salarywhere EmployeeID in(select EmployeeIDfrom Employeeswhere DepartmentID=(select DepartmentIDfrom Departmentswhere DepartmentName='财务部'))【思考与练习】3.求财务部的平均实际收入【思考与练习】③求财务部雇员的总人数(5)GROUP BY、ORDER BY子句的使用:①查找Employees表中男性和女性的人数select Sex,COUNT(Sex)from Employeesgroup by Sex;【思考与练习】a.按部门列出在该部门工作的员工的人数。
USE YGGLSELECT DepartmentID,COUNT(DepartmentID)AS'人数' FROM EmployeesGROUP BY DepartmentIDb.按员工的学历分组,排列出本科、大专和硕士的人数。
USE YGGLSELECT Education AS'学历',COUNT(Education)AS'人数' FROM EmployeesGROUP BY Education②查找员工数超过2的部门名称和员工数量。
【思考与练习】将各雇员的情况按收入由低到高排列。
USE YGGLSELECT*FROM EmployeesORDER BY InComeGOT4.2视图的使用1.目的和要求(1)熟悉视图的概念和作用;(2)掌握视图的创建方法;(3)掌握如何让查询和修改视图。
2.实验准备(1)了解视图的概念;(2)了解创建视图的方法;(3)了解并掌握对视图的操作。
3.实验内容(1)创建视图。
(2)①创建YGGL数据库上的视图DS_VIEW,视图包含Departments表的全部列。
CREATE VIEW DS_VIEWAS SELECT*FROM Departments②创建YGGL数据库上的视图Employees-view,视图包含“员工号码”、“姓名”、“实际收入”三列。
使用如下SQL语句:CREATE VIEW Employees_view(EmployeeID,Name,realIncome)ASSELECT Employees.EmployeeID,Name,Income-OutComeFROM Employees,salaryWHERE Employees.EmployeeID=salary.EmployeeID【思考与练习】a.在创建视图时SELECT语句有那些限制?不能使用COMPUTE或者COMPUTE BY子句;除非和TOP子句一起使用,否则,不能使用ORDER BY子句;不能使用INTO关键字;不能使用OPTION子句;不能引用临时表和表变量。
b.再创建视图时有哪些注意点?1.在CREATE VIEW语句中,不能包括ORDER BY,COMPUTE或者COMPUTE BY 子句也不能出现INTO关键字2.创建视图所参考基表的列数最多为1024列3.创建视图不能参考临时表4.尽量避免使用外连接创建视图5.在一个批处理语句中,CREATE VIEW 语句不能和其他TRANSACT-SQL语句混合使用c.创建视图,包含员工号码、姓名、所在部门名称和实际收入这几列。
CREATE VIEWEmployees_View(EmployeeID,Name,DepartmentName,RealInCome)AS SELECTDepartments.DepartmentID,name,DepartmentName,InCome-OutCome as RealInComeFROM Employees,Departments,Salarywhere Departments.DepartmentID =Employees.DepartmentIDand Employees.EmployeeID =Salary.EmployeeID(2)查询视图:①从视图DS_VIEW中查询出部门号为3的部门名称。
select DepartmentName from DS_viewwhere DepartmentID='3'②从视图Employees_view中查询出姓名为“王林”的员工的实际收入select RealIncome from Employees_viewwhere Name='王林'【思考与练习】a.若视图关联了某表中的所有字段,而此时刻表中添加了新的字段,视图中能否查询到该字段?不能,必须重新创建视图才能查询到新字段。
b.自己创建一个视图,并查询视图中的字段。
SELECT*FROM Employees_ViewWHERE EmployeeID = 1(3)更新视图。
在更新视图前需要了解可更新视图的概念,了解什么视图是不可以进行修改的。
更新视图真正更新的是和视图关联的表。
①向视图DS_VIEW中插入一行数据“6,广告部,广告业务”insert into DS_VIEW values('6','广告部','广告业务')执行完该命令,使用SELECT语句分别查看视图DS_VIEW和基本表Departments中发生的变化。
尝试向视图Employees_view中插入一行数据看看会发生什么情况。
②修改视图DS_VIEW,将部门号为5的部门名称修改为“生产车间”update DS_VIEWset DepartmentName='生产车间'where DepartmentID='5'执行完该命令,使用SELECT语句分别查看视图DS_VIEW和基本表Departments中发生的变化。
③将视图Employees_view中员工号为“000001”的员工的姓名修改为“王浩”update Employees_viewset Name='王浩'where EmployeeID='000001'④删除视图DS_VIEW中部门号为“1”的一行数据delect from DS_VIEWwhere DepartmentID='1'【思考与练习】视图Employees_view中无法插入和删除数据,其中的realincome 字段也无法修改,为什么?因为视图employees-view中的字段realincome是基本表列通过计算所得的列,所以无法修改。