您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 第4章SQL关系数据库查询语言.
全国计算机等级考试二级辅导——VisualFoxPro1第4章SQL关系数据库查询语言4.1SQL语言的特点SQL是英文(StructuredQueryLanguage)的缩写,意思为结构化查询语言,是对存放在计算机数据库中的数据进行组织、管理和查询的一种工具,是一种对关系数据库操作的语言。需要掌握的SQL语句:(1)数据查询SELECT(2)数据定义CREATE、DROP、ALTER(3)数据修改INSERT、UPDATE、DELETE4.2SQL的查询功能SQL语法格式SELECT[ALL|DISTINCT][TOP数值|PERCENT]字段表达式[,字段表达式AS虚拟字段名]…FROM基本表名或视图名[,基本表名或视图名]…[WHERE条件表达式][GROUPBY字段1[HAVING条件表达式]][ORDERBY字段2[ASC|DESC]][INTOARRAY数组名]|[INTOCURSOR临时表名]|[INTODBF|TABLE永久表名]|[TOFILE文本文件名[ADDITIVE]]|[TOPRINTER[PROMPT]]4.2.2简单查询简单查询是指对单表的简单查询。利用WHERE语句筛选出符合条件的记录;利用AS语句显示出虚拟字段。格式SELECT字段FROM表名SELECT字段FROM表名WHERE条件SELECT字段表达式[AS]虚假字段FROM表名4.2.2简单查询1.显示部分或全部字段【例】显示教师表中所有人的姓名和性别信息SELECTFROM姓名,性别教师【例】显示教师表中所有信息SELECTFROM教师号,姓名,性别,职称,党员否教师*【例】显示教师表中男教师的姓名、职称和性别信息。SELECT姓名,职称,性别FROM教师WHERE性别=男【例】显示学生表中入学成绩小于500的日语生或英语生的信息。SELECT*FROM学生;WHERE入学成绩500AND专业=日语OR专业=英语SELECT*FROM学生;WHERE入学成绩500AND(专业=日语OR专业=英语)SELECT*FROM学生WHERE(入学成绩500AND专业=日语);OR(入学成绩500AND专业=英语)注意Where后面条件的写法=DATE()YEAR()虚拟字段2.查询结果可以是通过某一字段或几个字段计算得到的虚拟字段。【例】显示学生表中所有人的学号、姓名和年龄信息。年龄=?2007年出生的人的年龄=2010-2007=2年龄=现在年份-出生年份-YEAR(出生年月)SELECT字段表达式AS虚假字段FROM表名SELECT学号,姓名,年龄FROM学生[]YEAR(DATE())-YEAR(出生年月)AS年龄;注意:WHERE语句后不能使用虚拟字段进行条件限定。【例】显示学生表中年龄大于19岁女生的学号、姓名和年龄信息。SELECT学号,姓名,YEAR(DATE())-YEAR(出生年月)AS年龄;FROM学生WHERE性别=“女”AND年龄19×SELECT学号,姓名,YEAR(DATE())-YEAR(出生年月)年龄FROM学生;WHERE性别=女ANDYEAR(DATE())-YEAR(出生年月)19去掉重复记录3.去掉查询结果中的重复记录【例】显示学生表中都有哪些专业。SELECTDISTINCT专业FROM学生SELECT专业FROM学生利用DISTINCT去掉查询结果中的重复记录。4.2.3联接查询(简单联接)1.简单联接查询【例】显示学生的学号、姓名和成绩的信息。SELECT学生.学号,学生.姓名,选课.成绩FROM学生,选课;在一个数据库中多个表之间一般都存在着某些联系,在一个查询语句中如果同时涉及到两个或两个以上的表时,这种查询称之为联接查询(也称为多表查询)。WHERE后是联接条件,通常表示为两个表中共有字段相等。当不同表中含有相同的字段名时,必须指明是哪个表的字段。WHERE学生.学号=选课.学号4.2.3联接查询(简单联接)【例】显示学生的学号、姓名、课程名和成绩的信息。SELECT学生.学号,姓名,课程名,成绩FROM学生,选课,课程;WHERE学生.学号=选课.学号AND课程.课程号=选课.课程号超联接查询3.超联接查询SELECT…FROM表1INNER|LEFT|RIGHT|FULLJOIN表2ON联接条件表达式INNERJOIN或JOIN为内联接(等值联接)LEFTJOIN为左联接RIGHTJOIN为右联接FULLJOIN为全联接ON指明联接条件内联接SELECT…FROM表1[INNER]JOIN表2ON联接条件INNERJOIN或JOIN为内联接,也称为等值联接。按照条件进行联接,不满足条件的记录不会出现在查询结果中。【例】显示学生的学号、姓名和成绩的信息。SELECT学生.学号,姓名,成绩;SELECT学生.学号,姓名,成绩FROM学生,选课;WHERE学生.学号=选课.学号FROM学生JOIN选课ON学生.学号=选课.学号简单联接=内联接内联接SELECT学生.学号,姓名,课程名,成绩;FROM学生JOIN选课JOIN课程;ON选课.课程号=课程.课程号ON学生.学号=选课.学号注意:多个表用“JOIN”语句联接的顺序要与联接条件“ON”的顺序恰好相反。【例】显示学生的学号、姓名、课程名和成绩的信息。SELECT*FROMAJOINBJOINCONB.**=C.**ONA.**=B.**左联接LEFTJOIN为左联接,除按照联接条件进行联接外,第一个表不满足条件的记录也会出现在查询结果中。【例】左联接查询SELECT学生.学号,姓名,成绩;FROM学生LEFTJOIN选课ON学生.学号=选课.学号右联接RIGHTJOIN为右联接,除按照联接条件进行联接外,最后一个表不满足条件的记录也会出现在查询结果中。【例】右联接查询SELECT学号,课程名,成绩;FROM选课RIGHTJOIN课程ON选课.课程号=课程.课程号全联接FULLJOIN为全联接,除按照联接条件进行联接外,两个表中不满足条件的记录也会出现在查询结果中。全联接查询的结果是左联接查询和右联接查询结果的并集。【例】全联接查询SELECT学生.学号,姓名,课程名,成绩;FROM学生FULLJOIN选课FULLJOIN课程;ON选课.课程号=课程.课程号ON学生.学号=选课.学号别名在联接操作中,经常需要使用关系名用前缀,有时显得很麻烦。【例】显示学生的学号、姓名、课程名和成绩的信息。SELECT学生.学号,姓名,课程名,成绩FROM学生,选课,课程;WHERE学生.学号=选课.学号AND课程.课程号=选课.课程号在联接操作中,可在FROM语句中定义别名来代替关系名。【格式】关系名别名SELECTA.学号,姓名,课程名,成绩;FROM学生A,选课B,课程C;WHEREA.学号=B.学号ANDC.课程号=B.课程号别名并不是必须的,但在关系的自联接操作中,就必不可少了。SELECTA.课程名,B.课程名FROM课程表A,课程表B;WHEREB.课程号=A.先行课自联接查询2.自联接查询【例】查询所有课程的先行课信息。当一个表自己与自己联接时,可以给表取两个别名别名为:课程表A和课程表BABSELECTA.课程名,的先行课是,B.课程名;FROM课程表A,课程表BWHEREB.课程号=A.先行课SELECTA.课程名,的先行课是AS先行课程,B.课程名;FROM课程表A,课程表BWHEREB.课程号=A.先行课A.课程号=B.先行课4.2.4嵌套查询当查询的条件依赖于另一个查询的结果时,就要在查询条件WHERE短语中嵌套一个子查询。【例】查询与王志伟同一年出生的学生的学号、姓名和出生日期。SELECT学号,姓名,出生日期FROM学生WHERE(SELECTYEAR(出生日期)=;姓名=王志伟)YEAR(出生日期)FROM学生WHERE1988量词查询【例】查询大于等于“07010002”的所有科成绩的学号和课程号。SELECT学号,课程号FROM选课WHERE成绩=(SELECT成绩FROM选课WHERE学号=07010002)11ALL注意:在使用、、=、!=等比较运算符时,子查询的结果只能是一条记录或一个字段(即唯一值)。当子查询结果是多条记录或多个字段时,应使用带有量词(ANY、SOME、ALL)的查询语句。ANY9095、85查询就是依次查找满足字段(列)上条件的所有记录谓词查询[NOT]IN和[NOT]EXISTS谓词运算IN和NOTIN表示某个字段值是否在子查询中出现过。【例】查询选修了“C001”或“C004”课程的学生的学号。SELECT学号FROM选课WHERE课程号=C001OR课程号=C004SELECT学号FROM选课WHERE课程号IN(C001,C004)SELECT学号FROM选课WHERE课程号=C001AND课程号=C004SELECT学号FROM选课WHERE课程号=C001AND;学号IN(SELECT学号FROM选课WHERE课程号=C004)【例】查询同时选修了“C001”和“C004”课程的学生的学号。学号=(SELECT……)??C001070100010701000207010003C004070100010701000507010006谓词查询EXISTS和NOTEXISTS:子查询中是否有结果返回(是否存在子查询的结果)。【例】查询没有选修任何一门课的学生信息。SELECT*FROM学生WHERENOTEXISTS;(SELECT*FROM选课WHERE学号=学生.学号)注意:[NOT]EXISTS前没有相应的字段名。谓词查询【例】查询至少选修一门课的学生信息。SELECT*FROM学生WHEREEXISTS;(SELECT*FROM选课WHERE学号=学生.学号)EXISTS等同于简单联接SELECTDISTINCT学生.学号,姓名FROM学生,选课;WHERE学生.学号=选课.学号[NOT]EXISTS与[NOT]IN的区别两者的区别:[NOT]EXISTS:指定一个子查询,检测最终结果中是否存在子查询的结果。子查询:根据两个表的关系进行查询,可以查询多个字段如:NOTEXISTS(SELECT*FROM选课WHERE学号=学生.学号)[NOT]EXISTS前没有字段名[NOT]IN:确定给定的值是否与子查询或列表中的值相匹配。子查询:只对表中的某个字段进行查询,如:学号IN(SELECT学号FROM选课WHERE课程号=C004)[NOT]IN前必须有字段名4.2.5几个特殊的运算符[NOT]BETWEEN…AND…查询的值介于什么范围之内(小数在前,大数在后);【例】查询入学成绩在500到520之间的学生信息。SELECT*FROM学生WHERESELECT*FROM学生WHERE入学成绩BETWEEN500AND520入学成绩=500AND入学成绩=520【例】查询入学成绩小于500或大于520的学生信息。SELECT*FROM学生WHERE入学成绩NOTBETWEEN500AND520[NOT]LIKE对查询内容进行字符串匹配;通配符%(百分号)表示任意长度的字符串;通配符_(下划线)表示任意单个字符;查询汉字时,_表示一个汉字;特殊运算符【例】查询学生表中所有姓王的学生信息。SELECT*FROM学生WHERE姓名LIKE王%【例】查询课程表中所有课程名中没有”大学”的信息。SELECT*FROM课程WHERE课程名NOTLIKE%大学%IS[NOT]NULL空值查询。特殊运算符【例】查询课程1表中有哪些课程还没有选定老师来上课。SELECT*FROM课程1WHERE教师号ISNULL注意:空值不是一个确定的值,所
本文标题:第4章SQL关系数据库查询语言.
链接地址:https://www.777doc.com/doc-3187301 .html