第四章SQL语言

第四章SQL语言
第四章SQL语言

第四章数据库查询语言SQL

4.1 SQL语言概述

●数据查询命令(SELECT)

●数据定义命令(CREATE等)

●数据操纵命令(INSERT等)

●数据管理命令(GRANT等)

可以独立完成数据库的全部操作,包括建立数据库、建表、查询、更新、维护数据、数据库的重新构造、数据库安全性等。

注意:第三章讲的命令只适用于VF。SQL 语言适合在任何语言(VB、VC等)中使用,应用更广泛,效率更高,是考试的重点(笔试和上机)。4.2查询功能

难点:写出查询条件(逻辑表达式)。

查询命令的基本格式:

SELECT [ ALL |DISTINCT] 字段名FROM 表名WHERE 条件

4.2.1 简单查询

例1:从学生表中检索所有学生的姓名。

SELECT姓名FROM 学生

例2:从学生表中检索所有学生姓名(不能重复) SELECT DISTINCT姓名FROM 学生

例3:从学生表中检索所有学生的姓名、年龄、出生日期。

SELECT姓名,年龄,出生日期FROM 学生

例4:从学生表中检索所有学生(包括所有字段) SELECT﹡FROM 学生

例5:从学生表中检索所有年龄小于21的学生。SELECT﹡FROM 学生WHERE年龄<21 例6:从学生表中检索出生在1982年和1983

年的所有学生。

SELECT﹡FROM 学生WHERE

YEAR(出生日期)=1982 .OR. YEAR(出生日期)=1983

SET CENTURY ON显示4位年份

SET MARK TO "--" 设置日期分隔符为“--”SET DATE TO YMD按年月日显示日期

例7:从学生表中检索性别为男而且姓王的学生

SELECT﹡FROM 学生WHERE

性别=“男” .AND. 姓名=“王”例8:从学生表中检索不姓王的学生

SELECT﹡FROM 学生WHERE

.NOT. 姓名=“王”

4.2.2 简单的连接查询(多表查询)

例1:无条件连接查询。SELECT *FROM 学生,学院

例2:查询每个学生所属学院名称。(等值连接) SELECT * FROM 学生,学院

WHERE所在学院=学院编号

例3:查询学生王平属于哪个学院。

SELECT 学号,姓名,学院名称

FROM 学生,学院WHERE

姓名=“王平”.AND. 所在学院=学院编号

例4:查询学生赵明的所有课程的成绩。SELECT 学生.学号,姓名,课程编号,成绩FROM 学生,成绩WHERE

姓名=“赵明”.AND. 学生.学号=成绩.学号

注意:若两个表中有相同的字段名,使用该字段

时前面需加表名来区分(表名.字段名)。

4.2.3 嵌套查询

SELECT语句中又包含了SELECT语句

查询任务需要执行两次SELECT,第二次(外层)查询以第一次查询(内层)的结果为基础。

例1:查询选修课程编号02的学生姓名。SELECT 姓名FROM 学生WHERE 学号IN (SELECT 学号FROM 成绩WHERE 课程编号="02")

SELECT 姓名FROM 学生,成绩WHERE 学生.学号=成绩.学号and 课程编号="02"

例2:查询学号0002的学生选修的课程名称。SELECT 课程名称FROM 课程WHERE 课

程编号IN (SELECT 课程编号FROM 成绩WHERE 学号="0002")

例3:查询计算机学院的所有学生学号、姓名。SELECT 学号,姓名FROM 学生WHERE 所在学院IN (SELECT 学院编号FROM 学院WHERE 学院名称="计算机")

例4:查询不是计算机学院的所有学生学号、姓名。

SELECT 学号,姓名FROM 学生WHERE 所在学院NOT IN ( SELECT 学院编号FROM 学院WHERE 学院名称="计算机")

4.2.4 几个特殊的运算符

例1:查询年龄在21—23之间的学生的学号、

姓名、年龄。

SELECT 学号,姓名,年龄FROM 学生WHERE 年龄BETWEEN21AND23

等价于:年龄>=21AND 年龄<=23

例2:查询姓李的学生的学号、姓名、年龄。SELECT 学号,姓名,年龄FROM 学生WHERE 姓名LIKE“李%”

例3:查询不姓李的学生的学号、姓名、年龄。SELECT 学号,姓名,年龄FROM 学生WHERE 姓名NOT LIKE“李%”

SQL通配符:% :表示零个或多个任意字符。

__:表示一个任意字符。

注意:和前面介绍的VF通配符﹡、?不能

互相替代。

例4:查询1986年出生的学生的学号、出生日期。

SELECT 学号,出生日期FROM 学生WHERE YEAR(出生日期)=1986

例5:查询不是1986年出生的学生的学号、出生日期。

SELECT 学号,出生日期FROM 学生WHERE YEAR(出生日期)!=1986

或:

SELECT 学号,出生日期FROM 学生WHERE NOT YEAR(出生日期)=1986

4.2.5 对查询结果排序

ASC:升序DESC:降序

默认为升序

例1:查询所有性别为女的学生的学号、年龄,并按年龄排序(升序)。

SELECT 学号,年龄FROM 学生where

性别="女" ORDER BY 年龄

例2:查询所有学生的学号、姓名,年龄,并先

按姓名排序(升序),姓名相同时再按年龄排序(降序)。

SELECT 学号,姓名,年龄FROM 学生ORDER BY 姓名ASC,年龄DESC

注意:ASC可省略。

4.2.6 简单的计算查询

SQL语言对查询结果有一定计算能力,比如求最大值、最小值、平均值等。

例1:查询男生的人数。

COUNT函数:统计查询到的记录个数SELECT COUNT(学号) FROM 学生WHERE性别=“男”

SELECT COUNT(学号) AS学生人数FROM 学生WHERE性别=“男”

SELECT COUNT(DIST姓名) AS 学生人数FROM 学生WHERE性别=“男”注意:加DIST是去掉重复值。

注意:AS可省略。

例2:查询选修课程02的人数。

SELECT COUNT(*)AS 学生人数FROM 成绩WHERE课程编号=“02”

例3:查询学号为0004的学生的总成绩。SELECT SUM(成绩)AS总成绩FROM 成绩WHERE学号=“0004”

例4:查询学号为0004的学生的总成绩和平均成绩。

SELECT SUM(成绩)AS 总成绩,

AVG(成绩)AS 平均成绩

FROM 成绩WHERE学号=“0004”

例5:查询高等数学的平均成绩。

SELECT AVG(成绩)AS平均成绩

FROM 成绩WHERE课程编号IN (SELECT 课程编号FROM 课程

WHERE 课程名称=“高等数学”)

例6:查询高等数学最高成绩。

SELECT MAX(成绩) AS最高成绩FROM 成绩WHERE课程编号IN (SELECT 课程编号FROM 课程

WHERE 课程名称=“高等数学”)

4.2.7 分组与计算查询(GROUP BY)

例1:求每门课程的最高成绩。

SELECT 课程编号,MAX(成绩) AS

最高成绩FROM 成绩GROUP BY课程编号

例2:求选修两门以上课程的同学。

SELECT 学号,COUNT(*)FROM 成绩GROUP BY学号HAVING COUNT(*)>=2

例3:求各个年龄值(年龄>13)的学生人数。SELECT 年龄,COUNT(*)AS人数FROM 学生GROUP BY年龄HAVING 年龄>13

SELECT 年龄,COUNT(*)AS人数FROM 学生WHERE年龄>13 GROUP BY 年龄

例4:求各个年龄值(年龄>13)的女生人数。

SELECT 年龄,COUNT(*)AS人数FROM 学生WHERE性别=“女”

GROUP BY年龄HAVING 年龄>13

注意:HAVING短语必须与GROUP BY短语同时使用。使用HAVING短语的同时能使用WHERE短语。

先执行WHERE后的条件从表中过滤不符合条件的记录,再执行GROUP对剩下的记录分组,接着执行HAVING后的条件过滤不符合条件的分组,最后对每个分组执行SELECT后的函数计算。

4.2.8 利用空值查询(NULL)

例1:学生表中所在学院为空值NULL的同学。SELECT 学号,姓名FROM 学生

WHERE所在学院IS NULL

例2:学生表中所在学院不为空值NULL的同学。SELECT 学号,姓名FROM 学生

WHERE所在学院IS NOT NULL

4.2.9 别名与自连接查询

例1:查询学生赵明的所有课程的成绩。SELECT 学生.学号,姓名,课程编号,成绩

FROM 学生,成绩WHERE

姓名==“赵明”.AND. 学生.学号=成绩.学号

SELECT X.学号,姓名,课程编号,成绩

FROM 学生X,成绩C WHERE

姓名==“赵明”.AND. X.学号=C.学号

例2:查询学生赵明的班长。

SELECT A.姓名,“的班长是”,B.姓名FROM 学生A,学生 B WHERE

A.姓名==“赵明” .AND. A.班长=B.学号

SELECT姓名FROM学生WHERE学号IN (SELECT班长FROM学生WHERE 姓名="赵明")

4.2.10 内外层互相关联嵌套查询

内层查询需要外层查询的值,外层查询需要内层查询的结果。

例1:查询每个学生的最高成绩。

SELECT*FROM 成绩a WHERE 成绩=(select max(成绩)from 成绩b where

a.学号=

b.学号)

(2) 查询已经选修了课程的学生信息。SELECT*FROM 学生a WHERE

学号in ( select 学号from 成绩 b where a.学号=b.学号)

4.2.11 使用量词和谓词的查询

例1:EXISTS用来检查子查询是否有结果(1) 查询已经选修了课程的学生信息。

SELECT*FROM 学生a WHERE EXISTS (select 学号from 成绩 b where

a.学号=

b.学号)

(2) 查询没有选修了课程的学生信息。SELECT*FROM 学生a WHERE

NOT EXISTS ( select 学号from 成绩 b where a.学号=b.学号)

(3) 查询选修课程01的学生信息。

SELECT*FROM 学生a WHERE EXISTS ( select *from 成绩 b where a.学号=b.学号AND 课程编号=”01”)

例2:ANY或SOME用来检查子查询是否有一个结果使条件为真。

(1)查询其他院中比001学院某一学生年龄小的学生年龄、姓名。

SELECT姓名,年龄FROM 学生WHERE 所在学院<>”001”AND 年龄

(2)查询其他院中比001学院所有学生年龄都小的学生年龄、姓名。

SELECT姓名,年龄FROM 学生WHERE 所在学院<>”001”AND年龄< ALL ( select 年龄from 学生where 所在学院=”001”)

等价于:

相关主题
相关文档
最新文档