1 / 40

结构化查询语言 SQL

结构化查询语言 SQL. SQL 是结构化查询语言 Structured Query Language 的缩写。 5.1 SQL 的特点 5.2 SQL 的查询功能 5.3 SQL 的定义功能 5.4 SQL 的操作功能. 5.1 SQL 的特点. SQL 语言具有如下主要特点: ① SQL 是一种一体化的语言,它包括了数据定义、数据查询、数据操纵和数据控制等方面的功能,它可以完成与数据库相关的全部工作。 ② SQL 语言是一种高度非过程化的语言,用户只需要描述清楚要 “ 做什么 ” , SQL 语言就可以将要求交给系统,自动完成全部工作。

vangie
Download Presentation

结构化查询语言 SQL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 结构化查询语言SQL • SQL是结构化查询语言 Structured Query Language 的缩写。 • 5.1 SQL 的特点 • 5.2 SQL的查询功能 • 5.3 SQL的定义功能 • 5.4 SQL的操作功能

  2. 5.1 SQL 的特点 • SQL语言具有如下主要特点: • ① SQL是一种一体化的语言,它包括了数据定义、数据查询、数据操纵和数据控制等方面的功能,它可以完成与数据库相关的全部工作。 • ② SQL语言是一种高度非过程化的语言,用户只需要描述清楚要“做什么”,SQL语言就可以将要求交给系统,自动完成全部工作。 • ③ SQL语言非常简洁。 • ④ SQL 语言可以直接以命令方式交互使用,也可以嵌入到程序设计语言当中以程式方式使用。

  3. 5.2 SQL的查询功能 • SQL语句创建查询使用的是Select语句 • Select [All|Distinct] • <字段名1>|<函数> [, <字段名2>…… ] • From <表或查询> [ [Left] [Right] • Join <表或查询> On <条件表达式>] • [Where <条件表达式>] • [Order By <排序选项> [Asc] [Desc]] • Group By <分组字段名> • [Having <条件表达式>]]

  4. SELECT [ALL|DISTINCT] [TOP nExpr [PERCENT]] • [Alias.] Select_Item[AS Column_Name][,Alias.]Select_Item[AS Column_Name]…] • FROM[FORCE][DatabaseName!]Table [AS] Local_Alias] • [[INNER | LEFT [OUTER] | RIGHT [OUTER ]|FULL [OUTER] JOIN • DatabaseName!]Table[ [AS] Local_Alias] • [ON joinCondition…] • [[INTO Destination] • | [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]] • [PREFERENCE PreferenceName] • [NOCONSOLE] • [PLAIN] • [NOWAIT] • [WHERE JoinCondition [AND JoinCondition…] • [AND | OR FilterCondition [AND | OR FilterCondition…]]] • [GROUP BY GroupColumn [,GroupColumn…]] • [HAVING FilterCondition] • [UNION [ALL] SELECTCommand] • [ORDER BY Order_Item[ASC | DESC][,Order_Item [ASC | DESC]…]]

  5. 5.2.1 简单查询 • 由SELECT和FROM短语构成无条件查询,或 • 由SELECT,FROM和WHERE短语构成条件查询。 • 例1 从cj表中检索所有同学的数学成绩。 • SELECT 学号 ,数学 FROM cj • 如果要去掉重复值只需要指定DISTINCT短语: • SELECT DISTINCT 数学 FROM cj • DISTINCT短语的作用是去掉查询结果中的重复值

  6. 例2 检索cj表中的所有记录。 • SELECT * FROM cj • 例3 检索数学成绩高于80分的所有记录。 • SELECT * FROM cj WHERE 数学>80 • 用WHERE短语指定了查询条件,查询条件可以是任意复杂的逻辑表达式。 • 例4 检索数学成绩高于80分而且英语成绩及格的所有记录。 • SELECT * FROM cj WHERE 数学>80 and 英语>=60

  7. 5.2.2 简单的联接查询 • 联接是关系的基本操作之一,联接查询是一种基于多个关系的查询。 • 例5 检索数学成绩和英语成绩都及格的所有记录的学号,姓名和数学 • SELECT cj.学号,姓名,数学 FROM xsqk,cj ; • WHERE 数学>=60 and 英语>=60 And xsqk.学号=cj.学号

  8. 5.2.3 嵌套查询 • 查询的结果出自一个关系,但相关的条件却出自多个关系。 • 例6 查询选课成绩及格的学生的姓名 • SELECT 姓名 FROM xsqk WHERE 学号 in (sele 学号from xk where 成绩>=60) • 这个命令中含有两个SELECT-FROM-WHERE查询块,即内层查询块和外层查询块,这里IN相当于集合运算符∈。

  9. 例7 查询所有选课成绩都不及格的学生的姓名。 • SELECT 姓名 FROM xsqk WHERE 学号 not in; • (sele 学号 from xk where 成绩>=60) • 注意到刚才的检索出现了错误,没有选课学生的信息也被检索出来了。 • 正确的SQL命令。 • SELECT 姓名 FROM xsqk WHERE 学号 not in; • (sele 学号 from xk where 成绩>=60) and 学号 in (sele 学号 from xk) • 例8 找出和学生“马大大”的身高相同的所有学生。 • SELECT 姓名 FROM xsqk WHERE 身高=; • (SELECT 身高 FROM xsqk WHERE 姓名='马大大')

  10. 5.2.4 排序 • 使用SQL SELECT 可以将查询结果排序,排序的短语是ORDER BY,可以按升序(ASC)或降序(DESC)排序,允许按一列或多列排序。例: • 按学生的身高升序检索出全部学生信息。 • SELECT * FROM xsqk ORDER BY 身高 • 这里ORDER BY 是排序子句,如果需要将结果按降序排列,只有加上DESC即可: • SELECT * FROM xsqk ORDER BY 身高 DESC • 按学生的身高升序,身高相同的按体重降序检索出全部学生信息。 • 这是一个按多列排序的例子,可以由如下语句完成: • SELECT * FROM xsqk ORDER BY 身高,体重 desc • 注意:ORDER BY是对最终的查询结果进行排序,不可以在子查询中使用该短语。

  11. 5.2.5 简单的计算查询 • SQL 不仅具有一般的检索能力,而且还有计算方式的检索,比如检索的平均成绩、检索最高身高等。用于计算检索的函数及格式如下: • COUNT(*):计算记录个数 • SUM(字段名):求字段名所指定字段值的总和 • AVG(字段名):求字段名所指定字段的平均值 • MAX(字段名):求字段名所指定字段的最大值 • MIN(字段名):求字段名所指定字段的最小值

  12. 找出学生中血型的种类。 • SELECT COUNT (DISTINCT 血型) FROM xsqk • 求学生的数学成绩总和。 • SELECT SUM(数学) FROM cj • 求“O”型和“B”型血的学生的数学成绩总和。 • SELECT SUM(数学) FROM cj WHERE 学号 IN ; • (SELECT 学号 FROM xsqk WHERE 血型="B" OR 血型="O") • 求“O”型和“B”型血的学生数学成绩的平均值 • SELECT avg(数学) FROM cj WHERE 学号 IN; • (SELECT 学号 FROM xsqk WHERE 血型="B" OR 血型="O")

  13. 5.2.6 分组与计算查询 • 上面例子是对整个表的计算查询,而利用GROUP BY 子句进行分组计算查询使用得更加广泛。 • 求男同学和女同学的平均身高。 • SELECT 性别,avg(身高) FROM xsqk GROUP BY 性别 • 求 “O”型和“B”型血的男同学和女同学的平均身高。 • SELECT 血型,avg(身高) FROM xsqk ; • WHERE 血型="B" OR 血型="O" GROUP BY 性别 • GROUP BY子句一般跟在WHERE子句之后,没有WHERE子句时,跟在FROM子句之后。另外,还可以根据多个属性进行分组。 • 在分组查询时,有时要求分组满足某个条件时才检索,这时可以用HAVING子句来限定分组。 • 求各种血型(每种血型至少有两个同学)的同学的平均身高。 • SELECT 血型,avg(身高) FROM xsqk GROUP BY 血型 ; • HAVING COUN(*)>=2

  14. 5.2.7 内外层互相关嵌套查询 • 有时需要内、外层互相关的查询,这时内层查询的条件需要外层查询提供值,而外层查询的条件需要内层查询的结果。 • 列出每个学生选课成绩最高分的记录。 • SELECT * from xk out where成绩=; • (SELECT MAX(成绩) FROM xk Intr WHERE out.学号=intr.学号) • 在这个查询中,外层查询和内层查询使用同一个表,给它们分别指定别名 out 和intr,外层查询提供out中每个记录的学号给内层查询使用;内层查询利用这个学号值,确定该学生的选课成绩最高分;随后外层查询再根据out表的同一记录的选课成绩与该最高分进行比较,如果相等,则该记录被选择。

  15. 5.2.8 使用量词和谓词的查询 • 前面已经使用过和嵌套查询或子查询有关的IN 和NOT IN运算符,除此之外还有两类和子查询有关的运算符,它们有以下两种形式: • <表达式> <比较运算符> ANY|ALL|SOME](子查询) • [NOT] EXISTS(子查询) • ANY、ALL和SOME是量词。 • EXISTS是谓词,EXISTS或NOT EXISTS是用来检查在子查询中是否有结果返回,即存在记录或不存在记录。

  16. 在表xsqk中检索没有选课学生的信息。 • SELECT * FROM xsqk WHERE NOT EXISTS ; • (SELECT 学号 FROM xk where xk.学号=xsqk.学号) • 以上的查询等价于: • SELECT * FROM xsqk WHERE 学号 NOT IN ; • (SELECT 学号 FROM xk ) • 以上查询也可以使用量词如下: • SELECT * FROM xsqk WHERE 学号 <>all ; • (SELECT 学号 FROM xk where xk.学号=xsqk.学号)

  17. 在表xsqk中检索有参加选课学生的信息。 • 这个查询可以使用EXISTS或ANY 、SOME。 • SELECT * FROM xsqk WHERE EXISTS ; • (SELECT 学号 FROM xk where xk.学号=xsqk.学号) • 或: • SELECT * FROM xsqk WHERE 学号 = any ; • (SELECT 学号 FROM xk where xk.学号=xsqk.学号)

  18. 检索选课成绩大于学号为“1161003”的最低选课成绩的所有学生的学号。检索选课成绩大于学号为“1161003”的最低选课成绩的所有学生的学号。 • 这个查询可以使用ANY或SOME量词。 • SELECT DISTINCT 学号 FROM xk WHERE 成绩>any ; • (SELECT 成绩 FROM xk where 学号='1161003') • 或: • SELECT DISTINCT 学号 FROM xk WHERE 成绩>some ; • (SELECT 成绩 FROM xk where 学号='1161003') • 它等价于: • SELECT DISTINCT 学号 FROM xk WHERE 成绩>; • (SELECT min(成绩) FROM xk where 学号='1161003')

  19. 5.2.9 超联接查询 • 在一般 SQL 中超连接运算苻 “*=”和“=*”。其中“*=”称为左连接,含义是输出包含第一个表中满足条件的所有记录,如果第二个表在连接条件上有匹配记录,则第二个表反回相应值,否则第二个表反回空值。 • 注意:VISUAL FOXPOR不支持超级联接运算符 “*=”和“=*”, VISUAL FOXPOR有专门的联接运算语法格式如下: • SELECT 字段表达式表 FROM 表1 INNER |LEFT| RIGHT |FULL JOIN 表2 ON 连接条件 WHERE…… • 其中,INNER JOIN等价于 JOIN,为普通联接;LEFT JOIN称为左联接;RIGHT JION称为右联接;FULL JION可以称为全联接,即两个表的记录不管是否满足联接条件都在目标表或查询表中出现。

  20. 输出cj表和xsqk表的学号及姓名,使用普通联接。输出cj表和xsqk表的学号及姓名,使用普通联接。 • SELECT cj.学号,xsqk.学号 ,姓名 FROM cj join xsqk on cj.学号=xsqk.学号 • 输出cj表和xsqk表的学号及姓名,使用左联接。 • SELECT cj.学号,xsqk.学号 ,姓名 FROM cj LEFT join xsqk on cj.学号=xsqk.学号 • 输出cj表和xsqk表的学号及姓名,使用右联接。 • SELECT cj.学号,xsqk.学号 ,姓名 FROM cj RIGHT join xsqk on cj.学号=xsqk.学号

  21. 5.2.10 集合的并运算 • SQL支持集合的并(UNION)运算,即可以将两个SELECT语句的查询结果通过并运算合成一个查询结果。为了进行并运算,要求这样的两个查询结果具有相同的字段个数,并且对应字段的值要出自同一个值域。 • 输出数学成绩大于80分和小于70分的记录。 • sele * from cj where 数学>80 union; • sele * from cj where 数学<70

  22. 5.2.11 SQL SELECT的几个特殊选项 • 只显示前几项记录(TOP短语要与ORDER BY短语同时使用) • 按学生的身高降序检索出身高最高的3位学生信息。 • SELECT * top 3 FROM xsqk ORDER BY 身高 desc • 按学生的身高降序检索出身高最高的3成学生信息。 • SELECT * top 30 percent FROM xsqk ORDER BY 身高 desc

  23. 将查询结果存放到永久表中 • SELECT * top 3 FROM xsqk ORDER BY 身高 desc into dbf xs3 • 将查询结果存放在临时文件中 • SELECT * top 3 FROM xsqk ORDER BY 身高 desc into cursor xs3cur • 将查询结果存放在文本文件中 • SELECT * top 3 FROM xsqk ORDER BY 身高 desc to file xs3 • 将查询结果送到打印机打印 • SELECT * top 3 FROM xsqk ORDER BY 身高 desc to printer • 查询结果存到数组中 • SELECT * FROM cj INTO ARRAY tmp

  24. 5.3 SQL的定义功能 • 5.3.1 表的定义 • 标准SQL的数据定义功能非常广泛,一般包括数据库的定义,表的定义,视图的定义,存储过程的定义,规则的定义和索引的定义等若干部分。在本节将主要介绍Visual Foxpro支持的定义功能和视图定义功能。

  25. CREATE TABLE |DBF <表名1> [FREE] • (<字段名1> 类型[(长度[,小数位数]) • [CHECK 逻辑表达式l [ERROR 字符表达式1]] [DEFAULT 表达式l] • [PRIMARY KEY|UNIQUE] • [REFERENCES 表名2 [TAG 索引名l]] • [,<字段名2>…] • [,PRIMARY KEY 表达式2 TAG 索引名2 • |,UNIQUE 表达式3 TAG 索引名3] • [,FOREIGN KEY 表达式4 TAG 索引名4 • REFERENCES 表名3 [TAG 索引名5]] • [,CHECK 逻辑表达式2 [ERROR字符表达式2]])

  26. 建立表xsqk1.dbf(结构和表xsqk.dbf类似)。 • create table xsqk1 (xh c(7),xm c(8),rq d ,sg n(4,2),ty l,bz m,zp g) • 建立表xsqk2.dbf(结构和表xsqk.dbf类似),要求建立主关键字等。 • 只有数据库表才能建立主索引,所以建立表之前先建立数据库ABC。 • CREATE DATABASE ABC • CREATE table xsqk2 (xh c(7) primary key ,xm c(8),rq date ,sg n(4,2) ; • check sg>1.5 error "身高应该大于1.5 米" default 1.7, ty l,bz m,zp g) • 建立表cj2.dbf,要求该表有字段xh,并以xh字段与表xsqk2.dbf建立关联。 • CREATE table cj2 (xh c(7) ,sx n(3),yy n(3), ; • foreign key xh tag xh references xsqk2)

  27. 5.3.2 表的删除 • 删除表的SQL命令是: • DROP TABLE 表名

  28. 5.3.3 表结构的修改 • 修改表结构的命令是ALTER TABLE,该命令有三种格式。 • 格式1: • ALTER TABLE 表名1 ADD | ALTER [COLUMN] 字段名1 字段类型 [(字段宽度 [,小数位数])] [NULL | NOT NULL] • [CHECK 逻辑表达式1 [ERROP 字符表达式1]][DEFAULT表达式1] • [PRIMARY KEY | UNIQUE] • [REFERENCES表名2 [TAG 索引名1]] • 该命令可以修改字段的类型、宽度、有效性规则、错误信息、默认值,定义主关键字和联系等;

  29. 把表xsqk1.dbf的xm字段的宽度改为12 ,sg字段改为n(5,2)。 • alter tabl xsqk1 alter xm c(12) alter sg n(5,2) • 给表xsqk1.dbf增加字段dz c(20)及df c(8)。 • alter tabl xsqk1 add dz c(20) add df c(8)

  30. 格式2: • ALTER TABLE 表名1 ALTER [COLUMN] 字段名2 [SET DEFAULT表达式2] • [SET CHECK 逻辑表达式2 [ERROR字符表达式2]] • [DROP DEFAULT] [DROP CHECK] • 从命令格式可以看出,该格式主要用于定义、修改和删除有效性规则和默认值定义。 • 把表xsqk1.dbf的sg字段的有效性规则修改为“sg>1”。 • ALTER TABLE xsqk1 ALTER sg SET CHECK sg>1 • 删除表xsqk1.dbf的sg字段的有效性规则。 • ALTER TABLE xsqk1 ALTER sg DROP CHECK

  31. 格式3: • ALTER TABLE 表名1 [DROP [COLUMN] 字段名3] • [SET CHECK 逻辑表达式3 [ERROR字符表达式3]] • [DROP CHECK] • [ADD PRIMARY KEY 表达式3 TAG 索引名2 [FOR 逻辑表达式4]] • [DROP PRIMARY KEY] • [ADD UNIQUE 表达式4 [TAG索引名3 [FOR 逻辑表达式5]]] • [DROP UNIQUE TAG 索引名4] • [ADD FOREIGN KEY [表达式5] TAG TagName4 [FOR 逻辑表达式6] • REFERENCES 表名2 [TAG索引名5]] • [DROP FOREIGN KEY TAG TagName6 ] • [RENAME COLUMN字段名4 TO字段名5] • 该格式可以删除字段(DROP [COLUMN])、可以修改字段名(RENAME COLUMN)、可以定义、修改和删除表一级的有效性规则等。

  32. 将表xsqk1.dbf的sg字段名改为“身高”。 • ALTER TABLE xsqk1 RENAME COLUMN sg TO 身高 • 删除表xsqk1.dbf的dz及df字段。 • alter tabl xsqk1 drop dz drop df

  33. 5.3.4 视图的定义及删除 • CREATE VIEW view_name [(字段名 1[,字段名2]...)] AS select_statement • 其中select_statement可以是任意的SELECT 查询语句,它说明和限定了视图中的数据;当没有为视图指定字段名时,视图的字段名将与select_statement中指定的字段名或表中的字段名同名。

  34. 从xsqk表中选择学号和姓名字段建立视图vxsqk。 • CREATE VIEW vxsqk AS; • SELECT 学号, 姓名 FROM xsqk • 上面是限定列构成的视图,可以用WHERE限定行定义一个视图。例如: • CREATE VIEW vxsqk1 AS; • SELECT 学号, 姓名 FROM xsqk WHERE 身高>1.7 • 从xsqk表和cj表中选择学号、姓名和总分字段建立视图vxsqkcj。 • CREATE VIEW vxsqkcj AS; • SELECT cj.学号, 姓名, 总分 FROM xsqk ,cj WHERE cj.学号=xsqk.学号

  35. 5.4 SQL的操作功能 • SQL 的操作功能是指对数据库中数据的操作功能,主要包括数据的插入、更新和删除三个方面的内容。 • 5.4.1 插入 • 格式1: • Insert Into <表名> [ (<字段名1> [, <字段名2>……]) ] • Values (<表达式1> [, <表达式2>……]) • 格式2: • INSERT INTO <表名> FROM ARRAY 数组名|FROM MEMVAR

  36. 建立表xsqk3.dbf,然后给表增加姓名为“张三”的一条记录。建立表xsqk3.dbf,然后给表增加姓名为“张三”的一条记录。 • CREATE table xsqk3 (xh c(7) primary key ,xm c(8),rq date ,sg n(4,2) ) • inser into xsqk3 (xm,xh,sg) values('张三','1161005',1.8) • 上面的命令插入的不是完整的记录,所以要指定字段。下面的例子是插入一条完整的记录。 • 给表xsqk3.dbf增加姓名为“王五”的一条完整记录。 • inser into xsqk3 values('1161006','王五',date(), 1.7)

  37. 5.4.2 更新 • SQL的数据更新命令格式如下: • Update <表名> Set <字段名1>=<表达式1> • [, <字段名2>=<表达式2>……] [Where <条件表达式>] • 一般使用WHERE子句指定条件,以更新满足条件的一些记录的字段值,并且一次可以更新多个字段;如果不使用WHERE子句,则更新全部记录。 • 把xsqk4表中姓名为“张三”的记录改名为“李四”,其身高改为2米。 • updat xsqk4 set xm='李四',sg=2 wher xm='张三' • BROWSE &&用BROWSE命令验证更新的结果

  38. 5.4.3 删除 • SQL从表中删除数据的命令格式如下: • Delete From <表名> [Where <条件表达式>] • 这里FROM指定从哪个表中删除,WHERE指定被删除的记录所满足的条件,如果不使用WHERE子句,则删除该表中的全部记录。 • 删除xsqk4表中姓名为 “李四”的记录。 • Dele from xsqk4 wher xm='李四'

  39. 本 节 要 点 • 熟练掌握查询命令SELECT的使用方法。 • 了解SQL的定义功能。 • 了解SQL的操作功能。

More Related