《数据库讲义(共29页).doc》由会员分享,可在线阅读,更多相关《数据库讲义(共29页).doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上4 简单查询从数据库的一个表中检索数据。样本数据库这个关系数据降包含15个表格,每个表格存储一个特定实体的信息:l 专业大类表中的内容是专业大类信息,包括:专业大类的代码,名称。l 专业表中的内容是专业信息,包括:专业的代码,名称,专业特色,培养目标,培养要求,学制,专业大类代码。l 学位表中的内容是学位信息,包括:学位的代码,名称。l 专业学位表中的内容是专业所授学位信息,包括:专业代码,学位代码。l 单位表中的内容是单位信息,包括:单位的代码,名称,上级代码,负责人。l 专业设置表中的内容是某年级某单位开设专业的信息,包括:年级,专业代码,单位代码。l 教师表中的
2、内容是教师信息,包括:职工号,姓名,职称,年龄,所属单位。l 班级表中的内容是班级信息,包括:班级号,年级,所属学院,所属专业。l 学生表中的内容是专业大类信息,包括:(学号,姓名,班级)l 课程结构表中的内容是某年级某专业的课程结构信息,包括:课程类别,学分,授课学时,实践学时,实践周数,专业代码,年级。l 课程表中的内容是课程信息,包括:课程的编号,名称,学分,学时,简介。l 先修课程表中的内容是某课程的先修课程信息,包括:课程编号,先修课程编号。l 教材表中的内容是教材信息,包括:书号,作者,名称,出版社,版次,出版年月,价格,使用课程。l 教与学表中的内容是教师所授课程,选修学生及其成
3、的信息,包括:课程编号,职工号,学号,成绩。l 计划表中的内容是某年级某专业所应开设的课程及其相关信息,包括:专业代码,年级,课程性质,课程编号,开课学年,开课学期,课程要求,考试类型。4.1 SELECT语句SELECT语句从数据库中检索数据并将查询结果一表的形式返回。语法图:Select子句和From子句是必须的,其余的子句是可选的。l Select子句列举了要检索的数据项,数据项可能是表中的字段,或者是执行查询时SQL的结果。l From子句列举了包含查询的数据表。l Where子句指定仅于查询结果数据有关的行,search-condition用于指定查询行的范围。l Group by子
4、句指定一个分组查询。l Having子句在查询中向SQL指定仅由group by生成那些组。l Order by子句以一个字段或多个字段的数据为基础排列查询结果。4.2 查询结果与数据库中的表一样,SQL的查询结果总是一个数据表,与实际的表具有相同的性质。列出教师的职工号和姓名。select 职工号, 姓名 from 教师职工号姓名05091刘婷婷05092汪惠芬05093张友良05094李东波05095于敏建05096王益祥05097袁红兵05098王霞20998徐骏善列出职工号为20998的教师的姓名、职称和单位代码。SELECT 姓名, 职称, 单位代码 FROM 教师 WHERE 职工
5、号=20998姓名职称单位代码徐骏善副教授0509这个查询只产生一个单行的表,因为仅仅指定了一个教师的职工号。即使这个单行的查询结果不像多行结果那样更具有表的特点,SQL仍认为它是一个三字段和一个一行的表。 在某种情况下,查询结果可能是一个单值,下面就是一个例子。列出教师的平均年龄SELECT Avg(年龄) AS 平均年龄 FROM 教师平均年龄42.56尽管它仅包含一字段和一行,查询结果仍然是一个表。下面的例子可以看出生成零行的查询结果也是可能的。列出年龄超过65岁的教师的姓名和年龄SELECT 姓名,年龄 FROM 教师 WHERE 年龄65姓名年龄即使是在这种情况下,查询结果仍然是一个
6、表,这个表是两字段和零行的空表。如果数据库中的数据项具有NULL值,那么当检索该数据项时,NULL也会出现在查询结果中。列出2004级工业工程(代码为)专业的课程结构SELECT 课程类别, 学分, 授课学时, 实践学时, 实践周数FROM 课程结构WHERE 年级=2004 AND 专业代码=课程类别学分授课学时实践学时实践周数1通识教育基础课628841722学科基础课46.5672883专业选修课12.5180204学科选修课1320085文化素质选修课41286全校公共选修课61927集中实践教学环节3131SQL查询总是生成数据表,这一特点很重要,这意味着:l 查询结果表以重新存储到
7、数据库中;l 两个相同的查询结果能结合在一起生成成一个较大的查询结果表;l 查询结果可以被其自身进行进一步的查询。因此,由于SQL关系查询的方法,关系数据库表格式结构具有非常协同的关系。表能被查询,查询能产生表。4.3 简单查询最简单的SQL查询是从数据库的一个表中取出数据字段。列出班级的班级号、年级、所属学院、所属专业SELECT 班级号, 年级, 所属学院, 所属专业 FROM 班级班级号年级所属学院所属专业200401200501从概念上讲,SQL是通过一次一行扫描FROM子句指定的表来进行的,对于每行,SQL将选择清单中指定的字段值取出,并生成查询结果的一行。4.3.1 计算的字段除了
8、直接从数据库中取值的字段外,SQL查询还包括计算的字段。该字段的取值来自于对存储数据的计算。为了得到计算的字段,在选择清单中应给出SQL表达式。SQL表达式涉及加、减、乘和除。同时可用括号生成更复杂的表达式。当然在运算表达式中涉及的字段必须为数值类型。如果对包含文本的字段进行加、减、乘、除,将产生错误。列出04级网络与数据库课程()成绩表:学号,课程编号,超过低于60分的值SELECT 学号, 课程编号, 成绩-60 FROM 教与学WHERE 学号 Like 04* AND 课程编号=学号课程编号11161612-208下面是用计算的字段查询的其他例子。列出2005级教学计划中的课程编号、开
9、课年份、开课学期、课程要求、考试类型SELECT 课程编号, 开课学年+2004, 开课学期, 课程要求, 考试类型FROM 计划WHERE 专业代码= AND 年级=2005 AND 课程性质=学科基础课课程编号开课学期课程要求考试类型2006春必修考试2006春必修考试2007春必修考试2006春必修考试2007秋必修考试2005秋必修考试2007秋必修考试2007秋必修考试2007秋必修考试2007春必修考试2006秋必修考试2006春必修考试2006春必修考试2006春必修考试2005春必修考试2006秋必修考试2007秋必修考试给每位04级同学网络与数据库课程()的成绩加上其成绩的1
10、SELECT 学号, 课程编号, 成绩, 成绩+成绩*0.01 FROM 教与学WHERE 学号 Like 04* AND 课程编号=学号课程编号成绩7171.717676.767676.767272.724040.46868.68列出教材的名称和出版年份和出版月份SELECT 名称, Year(出版年月), Month(出版年月) FROM 教材名称数据库系统基础教程20067The 80x86 IBM PC and Compatible Computers (Volume I & II) Assembly Language, Design, And Interfacing20042微机原理
11、与接口技术19972计算机网络与互联网19984列出每位教师的职称SELECT 姓名, 是 , 职称 FROM 教师姓名职称刘婷婷是讲师汪惠芬是副教授张友良是教授李东波是教授于敏建是工程师王益祥是副教授袁红兵是副教授王霞是工程师徐骏善是副教授4.3.2 选择所有字段 SELECT *SQL允许使用星号“*”作为“所有字段”的缩写放在选择清单(select-item)的位置处。显示班级表中的所有数据select * from 班级4.4 相同行(DISTINCT)列出所有现在在上课的教师SELECT 职工号 FROM 教与学职工号209982099820998这个查询结果有68行,但所有行完全相
12、同。这是为什么呢?因为样例数据库表“教与学”中仅列出了职工号为20998这一个教师为2004级和2005级开设的“网络与数据库基础”课程,2004级有36个学生,2005级有32个学生,故职工号在“教与学”表的68中出现。这个查询结果可能不是想要的结果。如果这里仅仅有1个不同的教师,你可能期望在查询结果中出现4个职工号。通过在SELECT语句的选择清单前加入DISTINCT关键字消除查询结果的相同的行。列出所有现在在上课的不同的教师SELECT DISTINCT 职工号 FROM 教与学职工号20998从概念上讲,SQL分为两步实现这个查询:第一步生成所有的查询结果(68行);第二步去除与某行
13、完全相同的行形成最终的查询结果。不用考虑select清单的内容,distinct关键字总可以设定。如果省略关键字distinct,SQL将不去除相同行。当然,也可以用关键字all来明确保留相同的行,但没有必要因为这是缺省的行为。4.5 行选择(WHERE子句)列出计算机科学与技术学院(代码为06)开设的专业SELECT 年度, 专业代码, 单位代码 FROM 专业设置WHERE 单位代码=06年度专业代码单位代码200506200506200506200406200406200406列出职工号为20998的教师的姓名、职称SELECT 姓名, 职称 FROM 教师 WHERE 职工号=2099
14、8姓名职称徐骏善副教授列出“课程结构”表中授课学时超过300的课程类别、学分和授课学时SELECT 课程类别, 学分, 授课学时 FROM 课程结构 WHERE 授课学时300课程类别学分授课学时1通识教育基础课628842学科基础课46.5672在上面的查询中搜索条件为:授课学时300,WHERE子句的工作过程如图:从概念上讲,SQL在“课程结构”表中逐行扫描并与搜索条件进行匹配。当字段的值与搜索条件匹配时(例中的“授课学时”字段),SQL将该字段的值放入当前行中。对于每行,搜索条件会产生3种结果:l 如果搜索条件为TRUE,那么该行将放入查询结果中。例如,2004级的“通识教育基础科”具有
15、大于300学时的授课学时数,则其被存放到查询结果中。l 如果搜索条件为FALSE,那么该行将被排除在查询结果之外。例如,2004级的“专业选修课”不具有大于300学时的授课学时数,则该行被排除。l 如果搜索条件为NULL值(未知),那么该行同样被排除在查询结果之外。例如,2004级的“集中实践教学环节”不具有大于300学时的授课学时数,则该行被排除。4.6 搜索条件SQL提供了一组丰富的搜索条件,可使你有效而自然地指定许多不同种类的查询。下面总结了5种基本的搜索条件:l 比较测试。比较一个表达式与另一个表达式的值。l 范围测试。测试表达式的值是否进入某个特定的范围。l 组成员测试。检查表达式的
16、值是否与设定的值匹配。l 样式匹配测试。检查包含字符串数据字段的值是否与指定的样式匹配。l NULL值测试。检查字段中是否具有NULL(未知的)值。4.6.1 比较测试比较一个表达式和另一个表达式的值。SQL在比较测试中比较两个表达式值时,会出现3种结果:l 如果比较是真则测试产生TRUE值。l 如果比较是假,则测试产生FALSE值。l 如果两表达式之一产生NULL值,则比较产生NULL值。列出2006年及其后出版的教材SELECT 书号, 作者, 名称, 出版社 FROM 教材 WHERE 出版年月=#1/1/2006#书号作者名称出版社7-302-03646-2Jeffery D. Ull
17、man著,史嘉权译数据库系统基础教程清华大学出版社列出学分数大于等于4的课程SELECT 编号, 名称, 学分 FROM 课程 WHERE 学分=4编号名称学分网络与数据库基础4生产实习4毕业设计13生产实习5毕业论文12高等数学()5高等数学()6NULL值空 (NULL) 值表示数值未知。空值不同于空白()或零值(0)。没有两个相等的空值。比较两个空值或将空值与任何其它数值相比均返回未知,这是因为每个空值均为未知。空值通常表示未知、不可用或将在以后添加的数据。我们知道在“教与学”表中共有68行数据,分别是04级和05级网络与数据库基础课的成绩,请看下面的例子:列出课程成绩为及格的SELEC
18、T * FROM 教与学 WHERE 成绩=60课程编号职工号学号成绩2099871209987620998762099878209987820998942099879209989420998842099889209987720998922099872209988020998882099888209989220998802099889209988720998962099893209988420998862099878209988020998722099889209987620998842099888209987920998722099868该查询结果共有34行。列出课程成绩为不及格的SELEC
19、T * FROM 教与学 WHERE 成绩 学分*16*1.1年级专业代码课程类别授课学时学分*16*0.9学分*16*1.120045文化素质选修课12857.670.420046全校公共选修课19286.4105.6SELECT 年级, 专业代码, 课程类别, 授课学时, 学分*16*0.9, 学分*16*1.1FROM 课程结构WHERE 授课学时 Between Null And 学分*16*1.1年级专业代码课程类别授课学时学分*16*0.9学分*16*1.1l 如果表达式定义的范围上限产生NULL值,且如果测试值比下限小,则BETWEEN测试返回FALSE值,否则返回NULL值。S
20、ELECT 年级, 专业代码, 课程类别, 授课学时, 学分*16*0.9, 学分*16*1.1FROM 课程结构WHERE 授课学时 =b) and (a40职工号2099805092050930509405096SELECT distinct 职工号 FROM 教与学职工号20998并运算,R SSELECT 职工号 FROM 教师 WHERE 年龄40UNIONSELECT distinct 职工号 FROM 教与学职工号0509205093050940509620998通过UNION操作将两个查询结果表结合在一起有几个限制。l 两表必须包含相同的字段数。l 第一个表各字段的数据类型必须
21、和第二个表对应字段相同。l 两个表均没有用ORDER BY子句进行排序。然而,结合在一起的查询结果可以被排序,这些将在下面介绍。4.8.2 UNION和相同行在缺省状态下:SELECT语句不去处相同的行UNION操作去处相同的行去除相间行的处理非常耗时,尤其是当查询结果包含大量的行时。根据查询结果的复杂性,如果已知道UNION操作不产生相同的行,就应该使用UNION ALL操作,因为这样查询将更快。SELECT 职工号 FROM 教师 WHERE 年龄40UNION ALLSELECT distinct 职工号 FROM 教与学职工号209980509205093050940509620998
22、4.8.3 UNION和排序ORDER BY子句不能用于UNION操作所结合的两个SELECT语句中,在任何情况下,该子句排序查询结果不具有任何意义。可以在最后的SELECT语句后使用ORDER 子句来指定排序。计算并显示课程的绩点SELECT 课程编号, 学号, 成绩, 4.0 FROM 教与学WHERE (课程编号) = ) AND (成绩) Between 90 And 100)UNION ALLSELECT 课程编号, 学号, 成绩, 3.7 FROM 教与学WHERE (课程编号) = ) AND (成绩) Between 85 And 89.5)UNION ALLSELECT 课程
23、编号, 学号, 成绩, 3.3 FROM 教与学WHERE (课程编号) = ) AND (成绩) Between 82 And 84.5)UNION ALLSELECT 课程编号, 学号, 成绩, 3.0 FROM 教与学WHERE (课程编号) = ) AND (成绩) Between 78 And 81.5)UNION ALLSELECT 课程编号, 学号, 成绩, 2.7 FROM 教与学WHERE (课程编号) = ) AND (成绩) Between 75 And 77.5)UNION ALLSELECT 课程编号, 学号, 成绩, 2.3 FROM 教与学WHERE (课程编号) = ) AND (成绩) Between 72 And 74.5)UNION ALLSELECT 课程编号, 学号, 成绩, 2.0 FROM 教与学WHERE (课程编号) = ) AND (成绩) Betwe