850 likes | 1.03k Views
数据库原理与应用. 非计算机应用专业教材. 李明 科学出版社. [ 学习目标 ]. 了解视图定义、定义同义词和建立索引 ; 了解 SQL 数据控制功能包括用户授权、回收权限 ; 掌握数据库模式的建立和删除 ; 掌握基本表的定义、取消和基本表修改 ; 掌握 SQL 数据操纵功能 : 插入、更新和删除数据 ; 熟练掌握数据的查询。. 目 录. 6.1 SQL 概述 6.2 SQL 数据定义功能 6.3 SQL 数据操纵 6.4 SQL 数据查询 6.5 SQL 数据控制. 6.1 SQL 概述.
E N D
数据库原理与应用 非计算机应用专业教材 李明 科学出版社
[学习目标] • 了解视图定义、定义同义词和建立索引; • 了解SQL数据控制功能包括用户授权、回收权限; • 掌握数据库模式的建立和删除; • 掌握基本表的定义、取消和基本表修改; • 掌握SQL数据操纵功能:插入、更新和删除数据; • 熟练掌握数据的查询。
目 录 • 6.1 SQL概述 • 6.2 SQL数据定义功能 • 6.3 SQL数据操纵 • 6.4 SQL数据查询 • 6.5 SQL数据控制
6.1 SQL概述 • SQL是结构化查询语言(Structured Query Language)1974年由Boyce和Chamberlin提出的,并在IBM公司的关系数据库系统SystemR上得到实现。 • SQL92版本=SQL标准版本,标准分为3个级别: • 基本级 • 标准级 • 完全级
SQL结构化查询语言主要特点: • 1)SQL是一种一体化的语言,它包括数据定义(DDL)、数据操纵(DML)和数据控制(DCL)等方面的功能。 • 2)SQL是一种高度非过程化的语言,它没有必要一步地告诉计算机“如何”去做,而只需描述清楚用户“要干什么”,而不需要指出“怎么去干”。SQL语言就可以交给系统,自动完成全部工作。
3)SQL语言非常简洁,其语法也简单,很接近自然语言,因此容易学习与掌握3)SQL语言非常简洁,其语法也简单,很接近自然语言,因此容易学习与掌握 • 4)SQL数据定义功能主要定义数据库的三级模式结构,即外模式、全局模式和内模式结构。在SQL中外模式又叫视图(View),全局模式简称模式(Schema)或数据库(Database),内模式由系统根据数据库模式自动实现,一般无需用户过问。
5)SQL数据操纵功能包括对基本表和视图的数据查询、插入、删除和修改,特别是具有很强的数据查询功能。对于SQL的任何一种数据操纵,它的操作对象都是元组的集合,其操作结果也是元组的集合。5)SQL数据操纵功能包括对基本表和视图的数据查询、插入、删除和修改,特别是具有很强的数据查询功能。对于SQL的任何一种数据操纵,它的操作对象都是元组的集合,其操作结果也是元组的集合。 • 6)SQL数据控制功能主要是对用户的访问权限加以控制,以保证系统的安全性,
7)Visual FoxPro SQL方面支持数据定义、数据查询、数据操纵功能, • 8)SQL有两种使用方法:一种是以与用户交互的方式联机使用;另一种是作为子语言嵌入到其他程序设计语言中使用。前者称为交互式SQL,适合非计算机专业人员,即用户即席查询;后者称为宿主型SQL,适合于程序设计人员用高级语言编写应用程序(如C++)并与数据库打交道时,嵌入到主语言中使用,这两种使用方法的基本语法结构一致。
6.2 SQL数据定义功能 • SQL语言使用数据定义语言(简称DDL)实现数定义功能,可包括数据库、基本表、视图、索引进行定义和撤消,如表6.1所示命令归类表。
表6.1 数据库中的对象定义和撤消等归类表 • 对 象 创 建 扩展名 撤消/删除 修 改 打 开 • 数据库CREATE 库:DBC DROP MODIFY OPEN ATABASE • DATABASE 备注:DCT DELETE • 索引:DCX) • 基本表 CREATE DBF DROP ALTER USE • TABLE • 视图 CREATE VUX DROP ALTER USE、 • VIEW SELECT FROM • 索引 CREATE IDX、 DROP SET INDEX • INDEX CDX
6.3 SQL数据操纵 • 6.3.1 插入记录 • 向基本表中插入数据的命令有两种格式: • 1)是向具体元组插入常量数据; • 2)是把从子查询的结果输入到另一个关系中去。 • 前者进行单元组(一行)插入,后者一次可插入多个元组。
(1)单元组插入 • 命令格式: • INSERT INTO[(数据库名)(基本表名)(〈列名〉,...)] • VALUES [(具体的记录值)] • 例6.1 :在学生表插入一个的学生数据: “502721161,张三,男,1984-0101,电子工程,1”。 • INSERT INTO学生(学生号,姓名,性别,出生日期,专业,年级) • VALUES (“502721161”,“张三”,“男”,{^1984-01-01},“电子工程”,1) • 日期型为(^YYYY-MM-DD);而列值为字符串时,必需用引号括起来,以区别于数值数据。
例6.2向图书基本表中新增加一个元组。 • 基本表图书所定义的关系模式结构是: • 图书(总编号,分类号,书名,作者,出版单位,单价), • INSERT INTO图书; • VALUES (“446943”,“TF31/138”,“计算机基础”,“须艳红”,“高等教育出版社”,12)
例6.3 向图书基本表中插入一个元组的部分字段。 • INSERT INTO图书(总编号,书名,单价); • VALUES(“44698088”,“据库原理及应用”,16 ∙ 50)
例6.3 向图书基本表中插入一个元组的部分字段。 • INSERT INTO图书(总编号,书名,单价); • VALUES(“44698088”,“据库原理及应用”,16 ∙ 50)
(2)多元组插入 • 命令格式: • INSERT INTO [(数据库名)(基本表名)(列名),...] • 〈SELECT 子句〉
例6.4 现有学生表1其结构和例6.1例中学生表相同,若把学生表1中的男生(假若有多个元组)插入到学生表2中。 • INSERT INTO 学生2(学生号,姓名,性别,出生日期,专业,年级); • SELECT学生号,姓名,性别,出生日期,专业,年级; • FROM 学生表1; • WHERE性别=“男”
(3)从指定的数组或内存变量来插入记录值 • 命令格式: • INSERT [ INTO ](数据库名)(基本表名)FROM ARRAY数组名| FROM MEMVAR • FROM ARRAY数组名:从指定的数组中插入记录值。 • FROM MEMVAR:根据同名的内存变量中插入记录值。
例6.5 FROM ARRAY的用法。 • USE 学生表1 • SCATTER TO arry1 • COPY STRUTURE TO学生表2 • INSERT INTO 学生表2 FROM ARRAY arry1 • SELECT 学生表2 • BROWSE • USE DELETE FILE学生表2.dbf
例6.6 FROM MEMVAR的用法。 • USE 学生表1 SCATTER MEMVAR COPY STRUTURE TO学生表2 • INSERT INTO学生表2 FROM MEMVAR SELECT 学生表2 BROWSE USE
6.3.2 修改记录 • 命令格式: • UPDATE[(数据库名)(所有者名)](目的表名) • SET(列名)=(表达式),... [(FROM源表名),...] [ WHERE(逻辑表达式)]
例6.7 假若学生表里若把每个学生的年级增加一年。 • UPDATE学生SET年级=年级+1 • 例6.8 将系名中“计算机科学与技术系”的改为“计算机科学系”。 • UPDATE学生 • SET系名=“计算机科学系” • WHERE系名=“计算机科学与技术系”
6.3.3 删除记录 • 删除命令比较简单,删除单位是元组,不是元组的部分属性。一次可以删除一个或几个元组,也可以将整个表删成空表,只保留表的结构定义。 • 命令格式: • DELETE [FROM] [(数据库名)(所有者名)](目的表名)[ FROM(源表名),...] [ WHERE(逻辑表达式)]
命令举例: • 例6.9 删除学号为“504720069”的学生。 • DELETE FROM学生WHERE学号=“504720069” • 例6.10 把学生表删成空表,只保留表的结构定义。 • DELETE 学生
6.4 SQL数据查询 • SQL基本查询模块的结构是: • SELECT (表达式l),(表达式2),…,(表达式 n); • FROM (关系1),(关系2),…,(关系m); • WHERE (条件表达式);
可用的逻辑运算符和谓词有: • AND逻辑与 OR逻辑或 NOT逻辑非 • IN包含 NOT IN不包含 • EXISTS存在 NOT EXISTS不存在 • UNION集合的并 • INTERSECT集合的交 • MINUS集合的差
6.4.1 简单查询 • 只涉及一个表的关系,在例子中逐渐引入一些短语。 • 例6.11 找出徐平所在的系名。 • SELEC 姓名,系名 FROM 学生 WHERE 姓名=“徐平”
“*”列出全部属性名的用法。 • 例6.12 查看所有学生的全部情况。 • SELECT“*”; • FROM学生;
(1)DISTINCT/ALL去掉重复的用法 • 例6.13 列出所有学生出生年月(去掉同岁) • SELECT DISTINCT 出生日期 FROM 学生; • 查询结果是:(和上图中比较,出生日期=04/23/83只取一个
(2)ORDER BY排序子句的用法 • 例6.14 查找学生表中电子工程系的学生的姓名、系名和出生年月,结果按出生年月降序排列,年龄即从小到大排序。 • SELECT 姓名,系名,出生日期 FROM学生; • WHERE 系名=“电子工程系” ORDER BY 出生日期 DESC • ASC表示升序(缺省为升序)。DESC
(3)特殊运算符LIKE通配符的用法 • 例6.15 查找姓名以“徐”打头的所有学生名。 • SELECT姓名,性别,系名,出生日期; • FROM学生WHERE姓名LIKE“徐%”;
例6.16 WHERE课程名LIKE“%数据库%”;包含“数据库”的书名。 • WHERE课程名LIKE“%数据库”;以“数据库”结尾的书名。 • WHERE姓名LIKE“%强 _ _”;姓名至少4个字符(两个汉字)且倒数第3个汉字是“强”字。
(4)特殊运算符 • BETWEEN...AND...和NOT BETWEEN...AND...之间的用法。 • 例6.17 找学分在3和5之间的课程。 • SELECT课程号;课程名,学分 FROM 课程; • WHERE学分BETWEEN 3 AND 5; • SELECT课程号 ,课程名,学分 FROM 课程; • WHERE学分>=3 AND学分<=5;
例6.18 查找计算机科学与技术系和电子工程系的学生。 • SELECT 姓名,系名 FROM学生; • WHERE 系名 IN(“计算机科学与技术系”,“电子工程系”); WHERE系名=“计算机科学与技术系”OR系名=“电子工程系”;
(6)为关系指定临时别名的用法 • 例6.19 检索课程号为A0074和A0184两门课程的学分。 • SELECT X.课程号,X.学分,Y.课程号,Y.学分; • FROM 课程X,课程Y; • WHERE X.课程号=“A0074”AND Y.课程号=“A0184”;
6.4.2 联接查询 • 1.SQL一般连接查询 • 以上介绍的只是简单的查询,只涉及到一个关系,如果查询要涉及到两个或几个关系,往往要进行联接运算。
例6.20 查所有借阅了图书的读者姓名及所在单位 • SELECT DISTINCT读者,姓名,系名; • FROM读者,借阅; • WHERE读者.借书证号=借阅.借书证号;
例6.21 找出李兰波所借的所有图书的书名及借阅日期。 • SELECT姓名,“所借阅的图书:”,书名,借阅日期; • FROM图书,借阅,读者; • WHERE读者.借书证号=借阅.借书证号; • AND借阅.总编号=图书.总编号AND姓名=“李兰波”;
例6.22 查找已借出的价格在20元以上的图书,结果按单价降序排列。 • SELECT图书,总编号,书名,单价 FROM图书,借阅; • WHERE图书.总编号=借阅.总编号and单价>=22.00; • ORDERBY单价DESC;
2.超联接查询 • 上述介绍的是一般连接在SQL新版中称为中间连接,当然在新版中除中间连接外,还有左连接、右连接的和全连接功能,它们对应的语法格式如下: • SELECT ... • FROM(表名1)INNER | LEFT|RIGHT | FULL JOIN(表名2)ON联接条件 WHERE ...
1)中间连接格式: • FROM(表名1)INNER JION(表名2); • ON(表名1)(连接列名1)(比较符)(表名2)(连接列名2) • 2)左连接格式: • FROM(表名1)LEFT JOIN(表名2); • ON(表名1)(连接列名1)(比较符)(表名2)(连接列名2)
3)右连接格式: • FROM(表名1)RIGHT JOIN(表名2); • ON(表名1)(连接列名1)(比较符)(表名2)(连接列名2) • 4)全联接格式: • FROM(表名1)FULL JOIN(表名2); • ON(表名1)(连接列名1)(比较符)(表名2)(连接列名2) • 注:ON联接条件:指定联接条件(而不在WHERE中)。
例6.23 从教学库中查询出所有学生和选课情况, • 要求没选择任何课程的学生信息也反映出来。此查询需要使用左连接,其中学生表为左,即连接中的第一个表,选课表为右表,即连接中的第二个表。
注 意
例6.24 若要查询出所有课程被学生选修的情况 • SELECT * FROM课程 LEFT JOIN; • (选课 INNER JOIN 学生 ON 学生.学号=选课.学号); • ON课程.课程号=选课.课程号; • 该语句首先实现选课和学生关系的中间连接,产生出中间连接表,然后作为右表同课程关系连接,得到结果表如下:
例6.25 若要从教学库中查询出所有电子专业的学生选课的全部情况 • SELECT * FROM 课程 ; • INNER JOIN(选课INNER JOIN学生ON学生.学生号=选课.学生号)ON课程.课程号=选课.课程号; • WHERE系名=“电子工程系”;
6.4.3 嵌套查询 • 嵌套查询是指在SELECT—FROM—WHERE查询块内部再嵌入另一个查询块,称为子查询,并允许多层嵌套。 • 由于ORDER子句是对最终查询结果的表示顺序提出要求,因此它不能出现在子查询当中。
例6.26 找出借阅了“数据库基础与应用” • 用联接查询来完成: • SELECT姓名,系名 FROM图书,借阅,读者; • WHERE图书.总编号=借阅.总编号AND读者.借书证号= • 借阅.借书证号 AND 书名=“数据库基础与应用”