四、给定一个查询需求,构造其关系代数表达式的步骤如下: 1、明确该查询涉及哪些属性。 2、明确该查询涉及哪些关系。
3、根据数据库模式导航图,通过多对一联系(或一对多联系)把所有涉及的关系连接起来,每一个多对一联系(或一对多联系)都可以表示为外码属性的自然连接。
4、由于多对多关系都要借助于“联系”关系转化为多对一联系(或一对多联系),因此将所有关系连接起来的过程中可能会涉及更多的关系。
第三章 SQL语言
一、SQL发展:
1、第一个SQL标准是SQL-86,由美国国家标准局公布,1987念国际标准化组织通过,该标准也称为SQL-1.
2、SQL语言由4部分组成: A、数据定义语言DDL B、数据操纵语言DML C、数据控制语言DCL D、其他
二、SQL语言的特点:
1、综合统一 2、高度非过程化
3、面向集合的操作方式
4、同一种语法结构提供两种使用方式 5、语言简洁,易学易用: A、数据查询:SELECT
B、数据定义:CREATE、DROP、ALTER 3、数据操纵:INSERT、UPDATE、DELETE 4、数据控制:GRANT、REVOKE
三、SQL查询语句
1、基本结构包括3个子句:SELECT、FROM、WHERE 2、SELECT子句对应于关系代数中的投影运算 3、FROM子句对应于关系代数中的笛卡尔积 4、WHERE子句对应于关系代数中的选择运算
四、语句实例
1、查询所有班级的班级编号、班级名称和所属学院 SELECT calssNO, className, institute FROM Class
2、消除重复元组
A、查询所有学院的名称(不消除) SELECT institute FROM Class
B、查询所有学员的名称(消除) SELECT DISTINCT institute FROM Class
3、查询所有列:
A、将所有的列在SELECT子句中列出:
SELECT classNo, className, classNum, grade, institute FROM Class
B、用*符号,*表示所有属性 SELECT * FROM Class
4、给属性列取别名:
A、查询所有班级的所属学员、班级编号和班级名称,要求用中文显示列名 SELECT institute所属学院, classNo班级编号, className班级名称 FROM Class
B、用AS关键字来取别名
SELECT institute AS 所属学院, classNo AS 班级编号, className AS 班级名称 FROM Class
5、查询经过计算的列:即将计算的结果显示出来
例:查询每门课程的课程号、课程名以及周课时(周课时为课时数除以16),并将课程名中大写字母改为小写字母输出:
SELECT courseNo 课程号, lower (courseName) 课程名, courseHour/16 AS周课时 FROM Course
其中:函数lower()表示将大写字母改成小写字母。
6、比较运算:
例:A、查询2007级的班级编号、班级名称和所属学院: SELECT classNo, className, institute FROM Class
WHERE grade=2007
B、在学生Student表中查询年龄大于或等于19岁的同学学号、姓名和出生日期:
SELECT studentNo, studentName, birthday FROM Student
WHERE year(getdate())-year(birthday)>=19
其中:getdate() 可获取当前系统的日期,函数year()用于提取日期中的年份。
7、范围查询:BETWEEN??AND可用于查询属性值在某一个范围内的元组,NOT BETWEEN??AND 可用于查询属性值不在某一个范围内的元组。BETWEEN后是属性的下限值,AND 后是属性的上限值。 例:在选课Score 表中查询成绩在80~90分之间的同学学号、课程号和相应成绩。 SELECT StudentNo, courseNo, score FROM Score
WHERE score BETWEEN 80 AND 90
8、集合查询:IN 可用于查询属性值在某个集合内的元组,NOT IN 可用于查询属性值不在某个集合内的元组。IN 后面是集合,可以是具体的集合,也可以是查询出来的元组集合。
例:
A、在选课Score 表中查询选修了001、005、或003课程的同学学号、课程号和相应成绩。
SELECT StudentNo, courseNo, Score FROM Score
WHERE CourseNo IN (‘001’ , ’005’ , ‘003’)
B、在学生Student表中查询籍贯既不是“南昌”也不是“上海”的同学姓名、籍贯和所属班级编号。
SELECT StudentName, native, ClassNo FROM Student
WHERE native NOT IN (‘南昌’ , ‘上海’)
9、空值查询:空值表示为未知或不确定的值,空值表示为null。IS null 可以用于查询属性值为空值;IS NOT null 可用于查询属性值不为空值。这里的IS 不能用“=”替代。 例:A、在课程Course表中查询选修课程为空值的课程信息。 SELECT * FROM Course
WHERE priorCourse IS nul
B、在课程Course表中查询选修课程不为空值的课程信息。
SELECT * FROM Course
WHERE priorCourse IS NOT null
10、字符串匹配查询:
例:A、在班级Class表中查询班级名称中含有会计的班级信息。 SELECT * FROM Class
WHERE className LIKE ‘%会计%’
注意:匹配字符串必须用一对引号括起来。
B、在学生Student表中查询所有姓王且全名为三个汉字的同学学号和姓名。 SELECT* FROM Class
WHERE StudentName LIKE ‘王_ _’
C、在学生Student表中查询名字中不含有“福”的同学学号和姓名。 SELECT* FROM Class
WHERE StudentName NOT LIKE ‘%福%’
D、在学生Student表中查询蒙古族的同学学号和姓名。 SELECT*
FROM Student
WHERE nation LIKE ‘蒙古族’ 等价于: SELECT*
FROM Student
WHERE nation = ‘蒙古族’
E、在班级Class表中查询班级名称中含有“08_”符号的班级名称。 SELECT className FROM Class
WHERE ClassName LIKE ‘ \\_% ’ ESCAPE ’ \\’
ESCAPE’ \\ ’表示\\为换码字符,这样紧跟在\\符号后的_不是通配符,而是普通用户要查询的符号。如果将#字符作为换码字符,则该查询可改写为: SELECT className FROM Class
WHERE ClassName LIKE ‘ #_% ’ ESCAPE ’ # ’
11、逻辑查询: