17. 2.1 查询语句格式:
SELECT [all | distanct] ·|具体的列 别名
FROM 表名称1 别名1 , .......
WHERE 条件,......
GROUP BY 分组条件 HAVING 分组条件
ORDER BY 字段名 ASC/DESC ;查询全体学生的学号和姓名SELECT Sno , Sname
From Student ;
18. 其结果为:分析:
|= SELECT后面可以加上参数 all 或者 distanct , 加上all表示列出全部查询出来的记录,默认就是all。如果是distinct则表示会去掉查询结果中的重复记录。· 查询全体学生的详细记录SELECT * FROM Student ;其结果为:
20. 2.2. WHERE语句
如果在查询中需要加入判断就需要使用where语句。在where语句中可以加入一天谓词作为查询条件。常用的查询条件查询条件谓词比较= , > , < , >= , != , <> , !> , !< 确定范围BETWEEN......AND...... , NOT BETWEEN......AND...... 确定集合IN , NOT IN 字符匹配LIKE , NOT LIKE v空值IS NULL , IS NOT NULL 多重条件AND , OR
21. SELECT Sname
FROM Student
WHERE Sdept= 'CS' ; SELECT Sname
FROM Student
WHERE Sage BETWEEN 20 AND 23; ·查询计算机科学系全体学生的名单
----- 验证比较大小操作其结果为:·查询年龄在20-23岁(包括20和23岁)之间的
学生的姓名-----验证确定范围SELECT Sname
FROM Student
WHERE Sdept= 'CS' ; SELECT Sname
FROM Student
WHERE Sage BETWEEN 20 AND 23; 这里需要注意的是between....and.....包括两边的边界值
22. 其结果为:·查询计算机科学系(CS),数学系(MA)。信息系(IS)学生的姓名和性别-----验证集合SELECT Sname , Ssex
FROM Student
WHERE Sdept IN ('CS','MA','IS'); 在使用IN操作的时候,如果集合里出现了表以外的其他内容,不会影
响结果。其结果为:
23. ·查询所有姓刘的学生的姓名,学号和性别------验证字符匹配SELECT Sname , Sno , Ssex
FROM Student
WHERE Sname LIKE '刘%'; 分析:
在使用LIKE进行操作的时候需要注意通配符的使用,一般有两种
通配符:
·% :表示任意个字符的长度。
·_ :表示一个字符的长度,需要说明的是,一个汉字占两个字符。其结果为:·查询姓“欧燕”且全名为3个汉字的学生的姓名SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳__';
24. 其结果为:·查询姓“欧燕”且全名为3个汉字的学生的姓名 SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳__'; 其结果为:特别的两个操作需要注意:
·当我们需要查询在任意一个地方出现“·”的模式匹配应该写成‘%·%'
·当我们需要全部查询的模式匹配为 '%%'
在使用的过程中,如果我们匹配的关键字本身就有跟通配符一样的符号,就需要进行转义,这个时候我们需要使用ESCAPE关键字进行换码操作。
25. Printable PagePoints of interestAdd text here·查询DB_DESIGN课程的课程号和学分SELECT Ccredit
FROM Course
WHERE Cname like 'DB\_DESIGN' ESCAPE '\' ; 其结果为:·查询所有有成绩的学生的学号和课程号-----验证空查询 SELECT Sno , Cno
FROM SC
WHERE grade IS NOT NULL ; 其结果为:
26. ·查询计算机科学系年龄在20岁以下的学生的姓名 ------ 验证多条件查询SELECT Sname , Ssex
FROM Student
WHERE Sdept = 'CS' AND Sage < 20 ; 其结果为:
28. ·查询选修了课程的学生人数SELECT COUNT(DISTINCT Sno)
FROM SC ;其结果为:
·计算1号课程的学生平均成绩SELECT avg(grade)
FROM SC
WHERE Cno = 1 ;其结果为:
29. 2.3.2 GROUP BY 子句
GROUP BY子句将查询的结果按某一列或多列的值分组,值相等的为一组。
对于查询结果分组的目的是为了细化组函数的作用对象。如果为对查询结果分组,组函数将作用于整个查询结果,分组后聚集函数将作用于每一个组,即每一组都有一个函数值。
·求各个课程号及相应的选课人数SELECT Cno , COUNT(Sno)
FROM SC
GROUP BY Cno ;其结果为:
·查询选修了3门以上课程的学生的学号。
此时考略,选修了3门以上一定是一个COUNT函数的值大于3。这时我们需要注意,组函数的判断条件是不可以写在WHERE子句中的。那么此时这个条件需要借助我们新的关键字HAVING来实现我们需要的功能
30. SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(Cno) > 3 ;
从本质上区别WHERE和HAVING:
·WHERE子句作用于基本表或视图上,从中选择满足条件的记录。
·HAVING短语作用于组,从中选择满足条件的组。
其结果是:
52. 一、带有IN谓词的子查询[例7] 查询与“刘晨”在同一个系学习的学生。
此查询要求可以分步来完成
① 确定“刘晨”所在系名
SELECT Sdept
FROM Student
WHERE Sname= ' 刘晨'
结果为:
Sdept
IS
53. 带有IN谓词的子查询 ② 查找所有在IS系学习的学生。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept= 'IS'
结果为:
Sno Sname Sdept
95001 刘晨 IS
95004 张立 IS
54. 构造嵌套查询SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname= '刘晨')
55. 带有IN谓词的子查询 用自身连接完成本查询要求
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept AND
S2.Sname = '刘晨'
56. 带有IN谓词的子查询 父查询和子查询中的表均可以定义别名
SELECT Sno,Sname,Sdept
FROM Student S1
WHERE S1.Sdept IN
(SELECT Sdept FROM Student S2
WHERE S2.Sname= '刘晨')
57. 带有IN谓词的子查询 [例8]查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname ③ 最后在Student关系中
FROM Student 取出Sno和Sname
WHERE Sno IN
(SELECT Sno ② 然后在SC关系中找出选
FROM SC 修了3号课程的学生学号
WHERE Cno IN
(SELECT Cno ① 首先在Course关系中找出“信
FROM Course 息系统”的课程号,结果为3号
WHERE Cname= '信息系统'))
61. 带有比较运算符的子查询 [例9]假设一个学生只可能在一个系学习,并且必须属于一个系 :
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept =
SELECT Sdept
FROM Student
WHERE Sname= '刘晨'
62. 带有比较运算符的子查询(续) 子查询一定要跟在比较符之后
错误的例子:
SELECT Sno,Sname,Sdept
FROM Student
WHERE ( SELECT Sdept
FROM Student
WHERE Sname= '刘晨' )
= Sdept
63. 三、带有ANY或ALL谓词的子查询谓词语义
ANY:任意一个值
ALL:所有值
64. 带有ANY或ALL谓词的子查询(续)需要配合使用比较运算符
> ANY 大于子查询结果中的某个值
> ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
>= ANY 大于等于子查询结果中的某个值
>= ALL 大于等于子查询结果中的所有值
<= ANY 小于等于子查询结果中的某个值
<= ALL 小于等于子查询结果中的所有值
= ANY 等于子查询结果中的某个值
=ALL 等于子查询结果中的所有值(通常没有实际意义)
!=(或<>)ANY 不等于子查询结果中的某个值
!=(或<>)ALL 不等于子查询结果中的任何一个值
65. 带有ANY或ALL谓词的子查询 [例 9] 查询其他系中比信息系任意一个(其中某一个)学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage < ANY (SELECT Sage
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <> ' IS '
68. 带有ANY或ALL谓词的子查询 [例10]:用集函数实现[例9]
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MAX(Sage)
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <> ' IS '
69. 带有ANY或ALL谓词的子查询 [例11] 查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。
方法一:用ALL谓词
SELECT Sname,Sage
FROM Student
WHERE Sage < ALL
(SELECT Sage
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <> ' IS '
查询结果为空表。
70. 带有ANY或ALL谓词的子查询(续) 方法二:用集函数
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MIN(Sage)
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <>' IS '
73. 带有EXISTS谓词的子查询 [例12] 查询所有选修了1号课程的学生姓名。用嵌套查询 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= ‘ 1 ’)
74. 带有EXISTS谓词的子查询 用连接运算SELECT SnameFROM Student, SCWHERE Student.Sno=SC.Sno AND SC.Cno= '1'
75. 带有EXISTS谓词的子查询 [例13] 查询没有选修1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno='1')
此例用连接运算难于实现
77. 带有EXISTS谓词的子查询(续)例:[例7]查询与“刘晨”在同一个系学习的学生。可以用带EXISTS谓词的子查询替换:
SELECT Sno,Sname,Sdept
FROM Student S1
WHERE EXISTS
SELECT *
FROM Student S2
WHERE S2.Sdept = S1.Sdept AND
S2.Sname = '刘晨'
105. 范围和存储大小Adaptive Server 允许将大写或小写字符用于系统数据类型,但数据类型是用小写字符输出的。用户定义的数据类型(例如 timestamp)是区分大小写的。 Adaptive Server 提供的大多数数据类型都不是保留字,并且可以用于命名其它对象。Adaptive Server 系统数据类型
106. (本页无文本内容)
107. 数据类型的转换隐式转换:许多由一种数据类型到另一种数据类型的转换都是由 Adaptive Server 自动处理的。这些转换称作隐式转换。显示转换:必须使用 convert、hextoint、inttohex、hextobigint 和 biginttohex 函数显式执行的转换。固定长度的 NULL 列的自动转换只有具有可变长度的数据类型的列才能存储空值。当创建具有固定长度的数据类型的 NULL 列时,Adaptive Server 会自动将其转换为相应的可变长度的数据类型。Adaptive Server 不会告诉用户数据类型有更改。某些可变长度的数据类型(例如,moneyn)是保留的数据类型;不能使用它们来创建列、变量或参数