1.03k likes | 1.16k Views
3.1 SQL 概述 3.2 数据定义 3.3 查询 3.4* 数据更新 3.5 * 视图. 第 3 章 关系数据库标准语言 SQL. 3.1 SQL 概述. SQL ( S tructured Q uery L anguage) 是关系数据库的 标准语言 SQL-86, SQL-89 American National Standards Institute ( ANSI ), International Standard Organization ( ISO )
E N D
3.1 SQL概述 3.2数据定义 3.3 查询 3.4* 数据更新 3.5 * 视图 第 3 章关系数据库标准语言SQL
3.1 SQL概述 • SQL(Structured Query Language)是关系数据库的 标准语言 • SQL-86, SQL-89 American National Standards Institute (ANSI), International Standard Organization (ISO) • SQL2(SQL-92) • SQL3 ( 1999) : 支持“对象(object)” • SQL标准的广泛流行和巨大影响
SQL的特点: • 综合统一 综合DDL、DML、DCL功能于一体 • 高度非过程化 • 面向集合的操作方式 • 以同一种语法结构提供两种使用方式 自含式(交互式) vs. 嵌入式 • 语言简洁,易学易用
SQL语言的基本概念 支持关系数据库三级模式结构
SQL 语言的各个部分 • 数据定义语言(Data-definition language ,DDL) • 交互式数据操纵语言(Interactive data-manipulation language ,DML) • 视图定义 • 事务控制(Transaction control) • 嵌入式SQL和动态SQL • 完整性(Integrity) • 授权(Authorization )
数据定义语言 (DDL) • 关系的模式 • 和各属性关联的域 • 完整性约束 • 为每个关系维护一个索引集合 • 关系的安全性和授权信息 • 关系在磁盘上的物理存储结构 不但允许对一个关系集合进行规格说明,对其中的每个关系也要说明以下有关信息:
SQL的主要数据类型 • char(n)固定长度字符串, n为用户指定的长度. • varchar(n)变长字符串, n为用户指定的最大长度 • int 全字长二进制整数 • smallint 半字长二进制整数 • numeric(p,d)定点数,p为用户指定精度,d为小数点 后位数 • real, double precision浮点数和双精度数 • float(n)用户指定的至少有n位精度的浮点数
SQL的日期/时间类型 • date日期型 如: date ‘2001-7-27’ • time时间型 如: time ’09:00:30’ time ’09:00:30.75’ • Timestamp(时间戳):日期加时间 如 timestamp ‘2001-7-27 09:00:30.75’ • 可从date/time/timestamp中抽取出单个域的值 • 可把串类型强制转换(cast)到date/time/timestamp 类型 如 cast <string-valued-expression> as date
基本表的定义 • 使用CREATE TABLE命令建立一个基本表: CREATE TABLE <表名> (<列名> <数据类型> [列级完整性约束条件] [ ,<列名> <数据类型> [列级完整性约束条件]…] [, <表级完整性约束条件>]); • 定义被存入“数据字典” • 完整性约束条件由DBMS自动维护
例:学生表的建立 CREATE TABLE Student ( Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(20) , Ssex CHAR(1), Sage INT, Sdept CHAR(15));
建表的完整性约束 • not null • primary key (A1, ..., An) • check (P),P是一个谓词 • Unique(A1, ..., An) 说明: • primary key 自动保证 not null 和unique (SQL-92 之后的标准) • 若违反了完整性约束条件,更新操作将被拒绝 • Unique 要求属性值不重复,但允许有多个空值(null)
完整性约束的一个例子 例:要求branch-name为关系 branch的主码 ,资产( assets) 值非负。 create table branch ( branch-name char(15), branch-city char(30), assets integer,primary key(branch-name),check(assets >= 0));
删除和修改基本表 • DROP TABLE :从数据库中删除指定关系的所有信息DROP TABLE r • ALTER TABLE : 向已存在的关系中增加属性列 ALTER TABLE r ADDAD A是要向关系r中加入的属性,D是 A的取值域. • 关系中所有元组的新属性列的取值都为空值(null ) • ALTER TABLE 命令也可用来删除关系中的属性列ALTER TABLE r DROPA A是关系r中一属性 • 但许多数据库不支持这种功能
一般格式: • ALTER TABLE <表名>: • [ADD <新列名> <数据类型> [完整性约束] • [DROP <完整性约束名>] • [MODIFY <列名> <数据类型> ] • 例: • 将年龄的数据类型改为半字长整数。 • ALTER TABLE Student MODIFY Sage SMALLINT; • 删除学生姓名必须取唯一值的约束。 • ALTER TABLE Student DROP UNIQUE(Sname);
建立与删除索引 • 建立索引是加快查询速度的有效手段,可在基本表上建立一个或多个索引。 • 建立索引 CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名> (<列名> [<次序>][, <列名> [<次序>]]…); 说明: • 次序:ASC和DESC • UNIQUE: 索引的每一个索引值只对应唯一的数据记录 • CLUSTER:建立聚簇索引(索引项的顺序与表中记录的物理顺序一致)。
删除索引 DROP INDEX <索引名> 例: CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Coucno ON Course(Cno); CREATE UNIQUE INDEX Scno ON SC(Sno ASC,Cno DESC); DROP INDEX Stusno;
3.3 查 询 • 查询是数据库的核心操作 • 一般格式 SELECT [ ALL|DISTINCT ] < 目标列表达式> [ ,<目标列表达式>]… FROM <表名或视图名>[ ,<表名或视图名>]… [WHERE <条件表达式> ] [GROUP BY <列名1> [HAVING <条件表达式>]] [ORDER BY <列名2> [ASC|DESC]];
学生-课程数据库 Student (Sno,Sname,Ssex,Sage,Sdept)
SQL查询 • 单表查询 • 连接查询 • 嵌套查询 • 集合查询
单表查询 1.选择表中的若干列 2.选择表中的若干元组 3.对查询结果排序 4.使用集函数 5.对查询结果分组
选择表中的若干列 例1 查询全体学生的学号与姓名 SELECT Sno,Sname FROM Student; 例2 查询全体学生的姓名、学号、所在系 SELECT Sname,Sno, Sdept FROM Student;
例3 查询全体学生的详细记录 SELECT * FROM Student; 例4 查全体学生的姓名及其出生年份 SELECT Sname, 2005-Sage FROM Student;
例5 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名 SELECT Sname, ‘Year of Birth:’, 2005-Sage , ISLOWER(Sdept) FROM Student; SELECT Sname NAME, ‘Year of Birth:’ BIRTH, 2005-Sage BIRTHDAY, ISLOWER(Sdept) DEPARTMENT FROM Student;
消除结果表中的重复行 例6 查询所有选修过课的学生的学号(学号要求不重复)。 SELECT DISTINCT Sno FROM SC;
单表查询 1.选择表中的若干列 2.选择表中的若干元组 (WHERE子句) 3.对查询结果排序 4.使用集函数 5.对查询结果分组
通过WHERE子句查询 • 常用的查询条件和谓词 • 比较 ( = , > ,< , .. ) • 确定范围 (BETWEEN AND,…) • 确定集合 (IN,NOT IN) • 字符匹配 (LIKE ,NOT LIKE) • 空值 (IS NULL,IS NOT NULL) • 多重条件 (AND,OR)
例7 查询计算机系全体学生的名单。 SELECT Sname FROM Student WHERE Sdept=‘CS’;
例8 查询所有年龄在20岁以下的学生姓名及其年龄。 SELECT Sname,Sage FROM Student WHERE Sage < 20; 例9 查询考试成绩有不及格的学生的学号。 SELECT DISTINCT Sno FROM SC WHERE Grade < 60;
比较 ( = , > ,< , .. ) • 确定范围 (BETWEEN AND,…) • 确定集合 (IN,NOT IN) • 字符匹配 (LIKE ,NOT LIKE) • 空值 (IS NULL,IS NOT NULL) • 多重条件 (AND,OR)
例10 查询年龄在20至23岁之间的学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23; 例11 查询年龄不在20至23岁之间的学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOTBETWEEN 20 AND 23;
比较 ( = , > ,< , .. ) • 确定范围 (BETWEEN AND,…) • 确定集合 ( IN , NOT IN) • 字符匹配 (LIKE ,NOT LIKE) • 空值 (IS NULL,IS NOT NULL) • 多重条件 (AND,OR)
例12 查信息系(IS)、数学系(MA)和计算机系(CS)的学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept IN (‘IS’,’MA’,’CS’); 例13 查既不是信息系、数学系,也不是计算机系的学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN (‘IS’,’MA’,’CS’);
比较 ( = , > ,< , .. ) • 确定范围 (BETWEEN AND,…) • 确定集合 (IN,NOT IN) • 字符匹配 (LIKE ,NOT LIKE) • 空值 (IS NULL,IS NOT NULL) • 多重条件 (AND,OR)
例14 查询学号为95001的学生的详细情况. SELECT * FROM Student WHERE Sno LIKE ‘95001’; 例15 查询所有姓刘的学生的姓名、学号和性别. 通配符,代表任意长度的字符串 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE ‘刘%’;
例16 查姓“欧阳”且全名为3个汉字的学生姓名。 通配符,代表任意单个字符 SELECT Sname FROM Student WHERE Sname LIKE ‘欧阳_ _’; 例17 查询名字中第2个字为“阳”字的学生的姓名和学号。 SELECT Sname,Sno FROM Student WHERE Sname LIKE ‘_ _ 阳%’;
例19 查询DB_Design课程的课程号和学分。 换码字符 SELECT Cno,Ccredit FROM Course WHERE Cname LIKE ‘DB\_ Design’ ESCAPE ‘\’; 例20 查以“DB_” 开头,且倒数第3个字符为i的课程的详细情况。 SELECT * FROM Course WHERE Cname LIKE ‘DB\_ %i_ _’ESCAPE ‘\’;
比较 ( = , > ,< , .. ) • 确定范围 (BETWEEN AND,…) • 确定集合 (IN,NOT IN) • 字符匹配 (LIKE ,NOT LIKE) • 空值 (IS NULL, IS NOT NULL) • 多重条件 (AND,OR)
例21查询缺少成绩的学生的学号和相应的课程号。例21查询缺少成绩的学生的学号和相应的课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NULL;
比较 ( = , > ,< , .. ) • 确定范围 (BETWEEN AND,…) • 确定集合 (IN,NOT IN) • 字符匹配 (LIKE ,NOT LIKE) • 空值 (IS NULL,IS NOT NULL) • 多重条件 (AND,OR)
例23 查询计算机系年龄在20岁以下的学生姓名。 SELECT Sname FROM Student WHERE Sdept =‘CS’ AND Sage < 20:
单表查询 1.选择表中的若干列 2.选择表中的若干元组 3.对查询结果排序 (ORDER BY子句) 4.使用集函数 5.对查询结果分组
例24 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。 SELECT Sno,Grade FROM SC WHERE Sno =‘3’ ORDER BY Grade DESC ;
例25 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。 SELECT * FROM Student ORDER BY Sdept, Sage DESC
单表查询 1.选择表中的若干列 2.选择表中的若干元组 3.对查询结果排序 4.使用集函数 ( COUNT, SUM,AVG,MAX,MIN,…) 5.对查询结果分组
例26 查询学生总人数。 SELECT COUNT (*) FROM Student; 例27 查询选修了课程的学生人数。 SELECTCOUNT(DISTINCT Sno) FROM SC;
例28 计算1号课程的学生平均成绩。 SELECT AVG(Grade) FROM SC WHERE Cno=’1’: 例29 查询选修1号课程的学生最高分数。 SELECT MAX(Grade) FROM SC WHERE Cno=’1’;