770 likes | 898 Views
Access2010 数据库案例教程. 第 5 章 结构化查询语言 SQL. 本章选修. 学习要点( 本章内容学生可以自学 ). SQL 语言的基本概念、特点 SQL 语言的功能 SQL 语言的用法. 学习目标. 通过本章的学习,了解 SQL 语言及其标准的发展、 SQL 语言的特点及分类、视图相关语句,熟悉 SQL 语言中各种语句的语法,熟悉 SQL 数据定义语言( DDL )语句,掌握 SQL 语言中数据查询、数据操纵语言的详细语法,并能深刻理解、综合应用,以便为今后深层次的学习打下更加坚实的基础。. 重点难点. 重点:
E N D
第5章 结构化查询语言SQL 本章选修
学习要点(本章内容学生可以自学) • SQL语言的基本概念、特点 • SQL语言的功能 • SQL语言的用法
学习目标 通过本章的学习,了解SQL语言及其标准的发展、SQL语言的特点及分类、视图相关语句,熟悉SQL语言中各种语句的语法,熟悉SQL数据定义语言(DDL)语句,掌握SQL语言中数据查询、数据操纵语言的详细语法,并能深刻理解、综合应用,以便为今后深层次的学习打下更加坚实的基础。
重点难点 • 重点: • 1、SELECT命令的使用,如:使用SELECT命令实现基本查询、条件查询、嵌套查询、多表查询和连接查询。 • 2、查询结果的处理,输出重定向,查询结果的排序、查询分组和统计等。 • 3、用查询设计器构造SELECT语句。 • 难点: • 1、SELETE命令的使用。特别是条件查询、嵌套查询、多表查询和连接查询的实现。 • 2、查询结果的排序、分组和统计处理。
5.1 SQL语言概述 • SQL——Structured Query Language,结构化查询语言 • 1986年,由美国ANSI确定为关系数据库的标准语言。 • 1987年,ISO将其定为国际标准。 • 1989年,ISO提出了具有完整性特征的SQL,成为SQL89 • 1992年公布了SQL的新标准,即SQL-92。 • SQL99——SQL3
SQL语言的特点 • SQL是一种结构一体化的语言。它包括了数据定义、数据查询、数据操纵和数据控制等功能,可以完成数据库活动中的全部工作。
SQL语言的组成 • 数据定义:CREATE、DROP(删除)、 ALTER(修改) (删除某记录) • 数据操纵:INSERT、UPDATE、DELETE • 数据控制:GRANT、REVOKE • 数据查询:SELECT(选择工作区)
SQL语言的组成 (1)数据定义语言(Data Definition Language,简称DDL) 用于定义SQL模式、基本表、视图和索引。 (2)查询语言(Query Language,简称QL) 用于数据查询。 (3)数据操纵语言(Data Manipulation Language,简称DML) 用于数据的增、删、修改。 (4)数据控制语言(Data Control Language,简称DCL) 用于数据访问权限的控制。
5.2 数据定义语言 • CREATE • ALTER • DROP
创建表 • 在CREATE TABLE中可以使用的数据类型及说明: • C、N 、 D 、 T 、L、M、G
创建表CREATE TABLE 定义基本表的语句格式为: CREATE TABLE<表名>( <属性名1 > <类型1>[NOT NULL] [UNIQUE] [,<属性名2><类型2] [NOT NULL] [UNIQUE] ]…) [其他参数]; • 例5-1:学生成绩数据库含有三张表: • 学生关系:S(SNO,SNAME,SEX, AGE, DNAME) • 课程关系:C(CNO, CNAME, CREDIT, PRE_CNO) • 选课关系:SC(SNO, CNO, SCORE) • 可用下列SQL语句来实现:
创建表CREATE TABLE CREATE TABLE S ( SNO CHAR(6) PRIMARY KEY, SNAME CHAR(8) NOT NULL, AGE SMALLINT, SEX CHAR(1), DNAME VARCHAR(12)); CREATE TABLE C ( CNO CHAR(2) NOT NULL, CNAME VARCHAR(24) NOT NULL, CREDIT SMALLINT, PRE_CNO CHAR(2), PRIMARY KEY(CNO)); CREATE TABLE SC ( SNO CHAR(6) NOT NULL, CNO CHAR(2) NOT NULL, SCORE SMALLINT, PRIMARY KEY(SNO,CNO), FOREIGN KEY(SNO) REFERENCES S ON DELETE CASCADE, FOREIGN KEY(CNO) REFERENCES C ON DELETE NO ACTION);
创建表 • 例1、使用命令建立数据库XSK,用SQL命令在该库中建立STUDENT表,结构及要如下。
创建表 • 例2、在XSK中建立score表,结构如下。
修改表结构ALTER TABLE • 添加字段: • ALTER TABLE 表名 ADD [COLUMN] 字段名 字段类型 [(宽度)] • 例:为SCORE表添加添加两个字段,“平时(N(5,1))”和“期中(N(5,1))”。
修改表结构 • 修改字段 • ALTER TABLE 表名 ALTER [COLUMN] 字段名 字段类型[(宽度)] • 例:在score中,修改“期末”字段为N(5,1)。
修改表结构 • 删除字段 • ALTER TABLE 表名 DROP [COLUMN] 字段名 • 例:在student表中,删除“是否党员”字段。
修改表结构 • 字段更名 • ALTER TABLE 表名 RENAME [COLUMN] 原字段名 TO 新字段名 • 例:在STUDENT表中,把“备注”字段名改为“其它情况”。
修改表结构 • 改变表的结构时,索引表达式、字段和表的有效性规则、命令、函数等等可能仍会引用原始字段名,因此有时不能执行命令。
删除表DROP TABLE • DROP TABLE 表名 • 执行了 DROP TABLE 之后,所有与被删除表有关信息都将丢失。 • 例:删除SCORE表。
5.3 数据操纵语言 • INSERT • DELETE • UPDATE
插入记录INSERT • INSERT INTO 表名 [字段名1,字段名2…] VALUE(表达式1,表达式2…) • 如果要插入表中所有字段的数据,可省略字段名。 • 如果省略了字段名,则必须按照表结构定义字段的顺序来指定字段值。 • 例1、向STUDENT表中添加记录。
插入记录 • INSERT INTO 表名 FROM ARRAY 数组名 • INSERT INTO 表名 FROM MEMVAR • 把内存变量的内容插入到与它同名的字段中。如果某一字段不存在同名的内存变量,则该字段为空。 • 例1、从数组向表中添加记录。 • 例2、利用内存变量向表中添加记录。
删除记录DELETE • DELETE FROM 数据库名 表名[WHERE 逻辑表达式1 AND|OR 逻辑表达式2] • 为指定的表中的记录加删除标记。如果要删除当前数据库中的表的记录,可省略数据库名,否则必须加上包含有该表的数据库名。在数据库名的后面、表名的前面包含感叹号 (!) 分隔符。 • 例:将STUDENT表中所有男生的记录删除。
UPDATE • UPDATE 数据库名!表名 SET 字段名1=表达式1,字段名2=表达式2…WHERE 逻辑表达式1 AND|OR 逻辑表达式2 • 如果省略了 WHERE 子句,在列中的每一行都用相同的值更新。 • 例:将STUDENT表中所有99级学生的“入学年月”改为“1999/09/10”。
索引的建立和删除 • 建立索引的语句格式为: CREATE [UNIQUE] INDEX <索引名> ON 基本表名(<属性名1>[ASC|DESC] [,<属性名2>[ ASC|DESC]…]); 例如,对表S建立以下索引 CREATE UNIQUE INDEX SNO_INDEX ON S (SNO); CREATE UNIQUE INDEX SNAME_ADDR_INDEX ON S (SNAME ASC,HOSTADDR DESC); • 删除索引的语句格式: DROP INDEX <索引名>;
5.4 数据查询SELECT • SELECT …FROM…WHERE • 功能:从一个表或多个表中查询数据。 • SELECT指定查询哪些字段 • 使用WHERE子句限定记录 • 使用FROM子句限定表名 • 含义:根据WHERE子句的条件表达式,从FROM子句指定的表中找出满足条件的记录,再按SELECT子句中的字段表达式,选出记录形成结果表。
5.4 数据查询SELECT • 在VFP中,查询就是一个扩展名为QPR的查询文件,其中的内容就是一条SELECT语句。
5.4.1 基本查询 基本查询就是单表查询,: SELECT ALL|DISTINCT *|列表达式 FROM 学生 • ALL:查询结果中包含所有行 ( 包括重复值 ), 是默认设置。 • DISTINCT:在查询结果中剔除重复的行。 • 注意 每一个 SELECT 子句只能使用一次DISTINCT。 • *表示所有字段。 • 列表达式可以是字段名,表达式,字符串常量、函数等。
基本查询 • 例1:列出“学生”表中所有同学名单 • SELECT * FROM 学生 • 例2:列出成绩表中所有学生的学号,去掉重复值。 • SELECT DISTINCT 学号 FROM 成绩
SELECT命令中的函数 • 例3、列出所有学生的学号,姓名和入学成绩,其中入学成绩四舍五入保留整数。 • SELECT 学号,姓名,ROUND(入学成绩,0) AS “入学成绩” FROM 学生 • AS :指定查询结果中列的标题。可省略。
例4、列出学生表中所有学生的年龄。 • SELECT 姓名, YEAR(DATE())-YEAR(出生日期) AS 年龄 FROM 学生 • 例5、求出学生总数。 • SELECT COUNT(*) FROM 学生 • 例6、查询选修了课程的学生人数。 • SELECT COUNT(DISTINCT 学号) FROM 成绩
课堂练习 • 1、查询全体学生的姓名、学号、专业。 • 2、查全体学生的姓名及其出生年份。 • 3、查询成绩表中的课号,去掉重复值。 • 4、查询成绩表中平时,期中,期末的平均成绩。
5.4.2 带条件查询 • WHERE子句可指定查询的条件。 • 格式:WHERE 条件表达式 AND|OR条件表达式2…
WHERE——比较操作符 • 例1、查询所有的男生记录。 • SELECT * FROM 学生 WHERE 性别=“男” • 例2、求出计算机专业学生入学成绩的平均分。 • SELECT 专业,AVG(入学成绩) AS 入学成绩平均分 FROM 学生 WHERE 专业=“计算机”
例3、列出非计算机专业的学生名单。 • SELECT * FROM 学生 WHERE 专业<>“计算机” • 例4、统计计算机专业入学成绩在600分以上的学生的人数。 • SELECT COUNT(姓名) 人数 FROM 学生 WHERE 入学成绩>=600 AND 专业=“计算机”
WHERE——IN • WHERE子句中的IN谓词用来确定查询的集合。 • 例1、查询计算机专业和外语专业的学生姓名和专业。 • SELECT 姓名,专业 FROM 学生 WHERE 专业 IN (“计算机”,“外语”) • 相当于 SELECT 姓名,专业 FROM 学生 WHERE 专业 =“计算机” OR 专业=“外语”)
例2、查询既不是计算机专业也不是外语专业的学生姓名和专业。例2、查询既不是计算机专业也不是外语专业的学生姓名和专业。 • SELECT 姓名,专业 FROM 学生 WHERE 专业 NOT IN (“计算机”,“外语”)
WHERE——BETWEEN • WHERE子句中的BETWEEN运算符用来确定范围。 • 格式: • BETWEEN…AND…或NOT BETWEEN…AND • 其中BETWEEN后是范围的下限(低值),AND后是范围的上限(高值)。
例1、列出入学成绩在560分到600分之间的学生名单和成绩。例1、列出入学成绩在560分到600分之间的学生名单和成绩。 • SELECT 姓名,入学成绩 FROM 学生 WHERE 入学成绩 BETWEEN 560 AND 600 • 上述命令还可写成如下形式: • SELECT 姓名,入学成绩 FROM 学生 WHERE 入学成绩>=560 AND 入学成绩<=600
WHERE—— LIKE • WHERE中的LIKE子句用来进行字符串的匹配。 • 格式:[NOT] LIKE “字符串” • 含义:查找指定的字段值中与匹配符相匹配的记录。 • 匹配符可以是字符串,也可以含有通配符。 • 例:查询学号为0108015的同学的详细情况 • SELECT * FROM 学生 WHERE 学号 LIKE “0108015”
LIKE中的通配符 • % 0~任意多个字符 • _ 任意单个字符 • a%b可代表ab,acb,addgb… • A_b可代表acb,afb,akb等。
LIKE中的通配符 • 例1、列出学生表中所有姓李的同学。 • SELECT 学号,姓名 FROM 学生 WHERE 姓名 LIKE “李%” • 例2、列出学生表中所有不姓李且姓名是两个字的同学名单 • SELECT 学号,姓名 FROM 学生 WHERE 姓名 NOT LIKE “李%” AND 姓名 LIKE “_ _”
LIKE中的通配符 • 如果要查询的字符串本身就含有%或_,就要使用ESCAPE “换码字符”对通配符进行转义。 • 例:查询以DB_开头的课程的课程号和学分。 • SELECT 课号,学分 FROM 课程 WHERE 课名 LIKE “DB\_%” ESCAPE "\"
涉及空值的查询 • 空值指不确定的值, 查询空值要使用 IS NULL,不能用比较运算符=NULL • 例1、列出成绩表缺少期末成绩的学生学号和课号 • SELECT 学号,课号 FROM 成绩 WHERE 期末 IS NULL • 例2、查询所有有期末成绩的学生学号和课号 • SELECT 学号,课号 FROM 成绩 WHERE 期末 IS NOT NULL
对查询结果排序 • 使用ORDER BY子句可以对查询结果按照一个或多个字段的值排序输出 • 语法:ORDER BY 排序选项1 [ASC|DESC][,排序选项2 ASC|DESC]… • 例1、按专业顺序列出学生的学号,姓名和专业,同一专业按学号排列。 • SELECT 专业,学号,姓名 FROM 学生 ORDER BY 专业,学号
只显示查询的前几项记录 • 使用TOP 表达式 [PERCENT]短语可以列出满足条件的前几个或前百分之几记录 • TOP短语要与ORDER BY同时使用才有效 • 例1、显示入学成绩最高的前五名同学的记录 • SELECT * FROM 学生 ORDER BY 入学成绩TOP 5 DCSC • 例2、显示入学成绩最高的前50%同学的记录 • SELECT * TOP 50 PERCENT FROM 学生 ORDER BY 入学成绩 DESC
对查询结果分组 • 使用GROUP BY子句可以对查询结果进行分组,分组的目的是为了细化统计函数的作用对象 • 语法:GROUP BY 分组选项 HAVING 条件 • 例1、统计各个课号及相应的选课人数 • SELECT 课号,COUNT(课号) 选课人数 FROM 成绩 GROUP BY 课号