1.66k likes | 1.93k Views
第四章 SQL. 提纲. SQL 概述 SQL 数据定义功能 SQL 数据查询功能 SQL 数据修改功能 SQL 数据控制功能 嵌入式 SQL. SQL 概述. 历史 SQL: Struceured Query Language 1974 年,由 Boyce 和 Chamber 提出 1975-1979 年,在 System R 上实现,由 IBM 的 San Jose 研究室研制,称为 Sequel. SQL 概述. SQL 用户. 用户 1. 用户 2. 用户 3. 用户 4. VIEW. 视图 V1. 视图 V1. Base Table.
E N D
提纲 • SQL概述 • SQL数据定义功能 • SQL数据查询功能 • SQL数据修改功能 • SQL数据控制功能 • 嵌入式SQL
SQL概述 • 历史 • SQL: Struceured Query Language • 1974年,由Boyce和Chamber提出 • 1975-1979年,在System R上实现,由IBM的San Jose研究室研制,称为Sequel
SQL概述 SQL用户 用户1 用户2 用户3 用户4 VIEW 视图V1 视图V1 Base Table 基本表B1 基本表B2 基本表B3 基本表B4 存储文件S1 存储文件S2 存储文件S3 存储文件S4 Stored file SQL数据库体系结构
SQL概述 • 标准化 • 有关组织 • ANSI(American Natural Standard Institute) • ISO(International Organization for Standardization) • 有关标准 • SQL-86 • “数据库语言SQL” • SQL-89 • “具有完整性增强的数据库语言SQL”,增加了对完整性约束的支持 • SQL-92 • “数据库语言SQL”,是SQL-89的超集,增加了许多新特性,如新的数据类型,更丰富的数据操作,更强的完整性、安全性支持等。 • SQL-3 • 正在讨论中的新的标准,将增加对面向对象模型的支持
SQL概述 • 特点 • 一体化 • 集DDL,DML,DCL于一体 • 单一的结构----关系,带来了数据操作符的统一 • 面向集合的操作方式 • 一次一集合 • 高度非过程化 • 用户只需提出“做什么”,无须告诉“怎么做”,不必了解存取路径 • 两种使用方式,统一的语法结构 • SQL既是自含式语言(用户使用),又是嵌入式语言(程序员使用) • 语言简洁,易学易用
示例关系 DEPT(D# , DNAME , DEAN) S(S# , SNAME , SEX , BIRTHDAY , D#) COURSE(C# , CT , P# , CREDIT) SC(S# , C# , SCORE) PROF(P# , PNAME, AGE, D# , SAL) PC(P# , C#) 思考:这个关系模式的定义有没有问题?
SQL数据定义功能 • 域定义 • 基本表的定义 • 索引的定义 • 数据库的建立与撤消 • SQL数据定义特点
域定义 • 域类型(SQL-92) • char(n):固定长度的字符串 • varchar(n):可变长字符串 • int:整数 • smallint:小整数类型 • numeric(p,d):定点数,小数点左边p位,右边q位 • real:浮点数 • double precision:双精度浮点数 • date:日期(年、月、日) • time:时间(小时、分、秒) • interval:两个date或time类型数据之间的差
域定义 • 域定义 • 格式 create domain域名 数据类型 • 示例 create domain PNAME char(20) 类似C语言中: typedefADDRESS_LIST{ char name[10]; char telephone[20]; char location[20] char email[20]}; ADDRESS_LIST tom;
基本表的定义 • 基本表的定义(CREATE) • 格式 create table表名( 列名 数据类型 [default缺省值] [not null] [,列名 数据类型 [default 缺省值] [not null]] …… [,primary key(列名 [,列名] …)] [,foreign key(列名 [,列名] …) references表名 (列名 [,列名] …)] [,check(条件)])
基本表的定义 • 示例 CREATE TABLES ( S# CHAR(4), SNAME CHAR(8)NOT NULL, AGE SMALLINT, ;??? SEX CHAR(1), PRIMARY KEY (S#), CHECK (SEX=0 OR SEX=1) )
基本表的定义 CREATE TABLEC ( C# CHAR(4), CNAME CHAR(10)NOT NULL, TEACHER CHAR(8), PRIMARY KEY (C#), )
基本表的定义 CREATE TABLE SC (S# CHAR(4), C# CHAR(4), GRADE SAMLLINT, ;??? PRIMARY KEY (S#,C#), FOREIGN KEY (S#) REFERENCES S(S#), FOREIGN KEY (C#) REFERENCES C(S#), CHECK((GRADE IS NULL) OR GRADE BETWEEN 0 AND 100))
基本表的定义 • 示例 create domain PNAME char(20) create table PROF ( PNO char[10], person_name PNAME not null, SAL int, AGE int, DNO char[10], primary key (PNO), foreign key (DNO) references DEPT(DNO), check (SAL > 0))
基本表的定义 • 修改基本表定义(ALTER) • 格式: alter table表名 [add子句] 增加新列 [drop 子句] 删除列 [modify 子句] 修改列定义 • 示例 alter table PROF add LOCATION char[30]
基本表的定义 • 撤消基本表定义(drop) • 格式 drop table表名 • 示例 drop tableDEPT • DANGER 撤消基本表后,基本表的定义、表中数据、索引、以及由此表导出的视图的定义都被删除
索引的定义 • 索引的定义 • 格式 create [unique/distinct] [cluster] index索引名 on 表名 (列名 [asc/desc] [ , 列名asc/desc]]…) unique(distinct):唯一性索引,不允许表中不同的行在索引列上取相同值。若已有相同值存在,则系统给出相关信息,不建此索引。系统并拒绝违背唯一性的插入、更新 cluster:聚集索引,表中元组按索引项的值排序并物理地聚集在一起。一个基本表上只能建一个聚集索引 asc/desc:索引表中索引值的排序次序,缺省为asc
索引的定义 • 示例: create cluster index s-index on S(S#) • 索引的删除 • 格式 drop index索引名
索引的定义 • 索引的有关说明 • 可以动态地定义索引,即可以随时建立和删除索引 • 不允许用户在数据操作中引用索引。索引如何使用完全由系统决定,这支持了数据的物理独立性 • 应该在使用频率高的、经常用于连接的列上建索引 • 一个表上可建多个索引。索引可以提高查询效率,但索引过多耗费空间,且降低了插入、删除、更新的效率
数据库的建立与撤消 有的数据库系统支持多库 • 建立一个新数据库 create database数据库名 • 撤消一个数据库 drop database数据库名 • 指定当前数据库 Open database数据库名 • 关闭当前数据库 close database数据库名
SQL数据定义特点 • SQL中,任何时候都可以执行一个数据定义语句,随时修改数据库结构。而在非关系型的数据库系统中,必须在数据库的装入和使用前全部完成数据库的定义。若要修改已投入运行的数据库,则需停下一切数据库活动,把数据库卸出,修改数据库定义并重新编译,再按修改过的数据库结构重新装入数据 • 数据库定义不断增长(不必一开始就定义完整) • 数据库定义随时修改(不必一开始就完全合理) • 可进行增加索引、撤消索引的实验,检验其对效率的影响
设有一个供应商、零件、工程项目数据库SPP,并有如下关系:设有一个供应商、零件、工程项目数据库SPP,并有如下关系: Suppliers(SNO,SName,Status,City) Projects(PRNO,PRName,City) Parts(PARNO,PARName,Color,Weight) SPP(SNO,PRNO,PARNO,Qty) 试写出建表的SQL语句。
SQL数据查询功能 • SQL数据查询基本结构 • select子句 • 重复元组的处理 • from子句 • where子句 • 更名运算 • 字符串操作 • 元组显示顺序 • 集合操作
SQL数据查询功能 • 分组和聚集函数 • 空值 • 嵌套子查询 • 派生关系 • 视图 • 关系的连接
SQL数据查询基本结构 • 基本结构 selectA1 , A2 , … , An fromr1 ,r2 , …, rm whereP ∏A1 , A2 , … , An(p(r1 r2 … rm))
SQL数据查询基本结构 • 示例 给出所有老师的姓名 select PNAME from PROF
select子句 • 目标列形式 可以为列名,* ,算术表达式,聚集函数 • “*”:表示“所有的属性” 给出所有老师的信息 select * from PROF
select子句 • 带,, , 的算术表达式 给出所有老师的姓名及税后工资额 select PNAME,SAL 0.95 from PROF
重复元组的处理 • 语法约束 缺省为保留重复元组,也可用关键字all显式指明。若要去掉重复元组,可用关键字distinct或unique指明 • 示例 找出所有选修课程的学生 selectdistinct SNO from SC
from子句 • 说明 • from子句列出查询的对象表 • 当目标列取自多个表时,在不混淆的情况下可以不用显式指明来自哪个关系 • 示例 • 例:找出工资低于500的职工的姓名、工资、系别 select PNAME , SAL , DNAME from PROF , DEPT where SAL < 500 and PROF.DNO = DEPT.DNO
from子句 • 例:列出教授“哲学”课程的老师的教工号及姓名 select PROF. PNO , PNAME from PROF , PC , COURSE where COURSE.CNAME = “哲学” and COURSE.CNO = PC.CNO and PC.PNO=PROF.PNO
where子句 • 语法成分 • 比较运算符 • 、 、、、=、 • 逻辑运算符 • and,or,not • between条件 • 判断表达式的值是否在某范围内
where子句 • 示例 • 列出工资在500~800之间的老师姓名 select PNAME from PROF where SAL between 500 and 800
更名运算 • 格式 old_name as new_name 为关系和属性重新命名,可出现在select和from子句中 注:as可选
更名运算 • 示例 • 属性更名 例:给出所有老师的姓名、所纳税额及税后工资额 select PNAME,SAL0.05 as taxi, SAL*0.95 as incoming from PROF
更名运算 • 关系更名 找出工资比所在系主任工资高的老师姓名及工资 select P1.PNAME,P1.SAL from PROF as P1,PROF as P2,DEPT where P1.DNO = DEPT.DNO and DEPT.DEAN = P2.PNO and P1.SAL > P2.SAL
字符串操作 • 命令格式 • 格式 列名 [not] like“字符串” 找出满足给定匹配条件的字符串
字符串操作 • 匹配规则 • “%” • 匹配零个或多个字符 • “_” • 匹配任意单个字符 • Escape • 定义转义字符,以去掉特殊字符的特定含义,使其被作为普通字符看待 • 如escape “\”,定义 \ 作为转义字符,则可用\%去匹配%,用\_去匹配_ 思考:用什么去匹配\ ?
字符串操作 • 示例 • 列出姓名以“张”打头的教师的所有信息 select * from PROF where PNAME like“张%”
字符串操作 • 列出名称中含有4个字符以上,且倒数第3个字符是d,倒数第2个字符是_的系的所有信息 select * from PROF where PNAME like“% _d \__”
元组显示顺序 • 命令 order by列名 [asc | desc] • 示例 • 按系名升序列出老师姓名,所在系名,同一系中老师按姓名降序排列 select DNAME,PNAME from PROF,DEPT where PROF.DNO = DEPT.DNO order by DNAME asc,PNAME desc
查询所有姓“张”,而且姓名是两个字的同学信息。查询所有姓“张”,而且姓名是两个字的同学信息。 • 查询所有姓“张”的同学信息。 • 查询所有同学课程编号701的课程成绩,并按由大到小的顺序输出。 • 查询所有同学课程编号701的课程成绩,并按由大到小的顺序输出,如果成绩相同,则按学号由小到大排列。
集合操作 • 命令 集合并:union 集合交:intersect 集合差: except • 提示 集合操作自动去除重复元组,如果要保留重复元组的话,必须用all关键词指明
集合操作 • 示例 • 求选修了001或(且)002号课程的学生号 (select SNO from SC where CNO = 001) union (intersect) (select SNO from SC where CNO = 002) 对于“且”,除了集合交意外还可以怎么写?
集合操作 • 求选修了001或002号而没有选003号课程的学生号 (select SNO from SC where CNO = 001 or CNO = 002 ) except (select SNO from SC where CNO = 003)