第四章SQL语言
![第四章SQL语言](https://imgs.360docs.net/imgfb/1tbk3c669yipj8skf6p7u2r8u2eu8hb5-b1.webp)
![第四章SQL语言](https://imgs.360docs.net/imgfb/1tbk3c669yipj8skf6p7u2r8u2eu8hb5-02.webp)
第四章数据库查询语言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”) 等价于: