第八章++SQL语言
- 格式:doc
- 大小:132.50 KB
- 文档页数:21
SQL语言基础教学第一章:引言SQL(Structured Query Language,结构化查询语言)是一种专门用于管理和操作关系型数据库的标准语言。
本章节将对SQL的背景和概述进行介绍。
第二章:SQL的起源和发展本节将详细介绍SQL的起源、发展和版本更新历程。
介绍IBM的SEQUEL语言如何演变为现今的SQL标准,以及不同数据库管理系统(DBMS)对SQL的实现。
第三章:SQL的数据类型SQL支持多种数据类型,包括整数、浮点数、字符型、日期时间型等。
本章将对这些数据类型进行详细解释,并说明它们在数据库中的应用。
第四章:SQL的表格操作表格是SQL中最基本的数据组织形式。
本章将介绍如何创建数据库表格、插入数据、更新数据、删除数据和查询数据。
还将介绍如何对表格进行排序和过滤以及如何定义表格的主键和外键。
第五章:SQL的数据查询数据查询是SQL的核心功能之一。
本章将介绍SQL中的SELECT语句,包括基本查询、条件查询、排序、聚合函数和多表查询等。
还将介绍如何使用JOIN语句将多个表格关联起来进行查询。
第六章:SQL的数据修改除了查询数据,SQL还提供了修改数据的功能。
本章将介绍如何使用UPDATE语句修改表格中的数据,如何使用INSERT语句插入新的数据,以及如何使用DELETE语句删除数据。
第七章:SQL的数据约束数据约束是为了保证数据库中数据的完整性和一致性。
本章将介绍如何使用SQL中的约束来定义表格的约束条件,包括主键约束、外键约束、唯一约束、默认值和检查约束等。
第八章:SQL的视图和索引视图和索引是提高数据库性能和灵活性的重要工具。
本章将介绍如何使用SQL创建和操作视图,以及如何使用索引来加快数据库的查询速度。
第九章:SQL的事务处理事务处理是SQL中非常重要的概念,用于保证数据的一致性和完整性。
本章将介绍如何使用SQL的事务处理功能,包括事务的提交和回滚,以及如何处理并发访问问题。
第十章:SQL的安全性和权限控制数据库中的数据往往具有重要性,因此安全性和权限控制是SQL中不可忽视的方面。
sql语言的三大类语句SQL(Structured Query Language)是一种专门用于管理和操作关系型数据库的语言。
它被广泛应用于从小型企业到大型组织等各种规模的数据库管理系统中。
SQL语言包含了多种类型的语句,但总体上可以分为三大类:数据操纵语言(DML)、数据定义语言(DDL)和数据控制语言(DCL)。
一、数据操纵语言(DML)数据操纵语言主要用于从数据库中检索、插入、更新和删除数据。
下面是一些常见的DML语句:1. SELECT语句:SELECT语句用于从一个或多个表中检索数据。
它允许我们指定要检索的列和查询的条件,以满足特定的需求。
示例:SELECT 列名 FROM 表名 WHERE 条件;2. INSERT语句:INSERT语句用于将新的数据插入到数据库表中。
示例:INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);3. UPDATE语句:UPDATE语句用于更新表中已经存在的数据。
示例:UPDATE 表名 SET 列名 = 值 WHERE 条件;4. DELETE语句:DELETE语句用于从表中删除数据。
示例:DELETE FROM 表名 WHERE 条件;二、数据定义语言(DDL)数据定义语言主要用于创建、修改和删除数据库对象,例如表、视图、索引等。
下面是一些常见的DDL语句:1. CREATE语句:CREATE语句用于创建新的数据库对象,如表、视图和索引。
示例:CREATE TABLE 表名 (列名1 数据类型, 列名2 数据类型, ...);2. ALTER语句:ALTER语句用于修改现有的数据库对象,如表结构、列定义等。
示例:ALTER TABLE 表名 ADD 列名数据类型;3. DROP语句:DROP语句用于删除数据库对象。
示例:DROP TABLE 表名;三、数据控制语言(DCL)数据控制语言用于定义数据库的安全性和完整性约束,以及授权和回收用户对数据库对象的访问权限。
SQL 教程1SQL 简介SQLStructured Query Language,结构查询语言是一个功能强大的数据库语言;SQL通常使用于数据库的通讯;ANSI美国国家标准学会声称,SQL是关系数据库管理系统的标准语言;S QL语句通常用于完成一些数据库的操作任务,比如在数据库中更新数据,或者从数据库中检索数据;使用SQL的常见关系数据库管理系统有:Oracle、 Sybase、 Microsoft SQL Ser ver、 Access、 Ingres等等;虽然绝大多数的数据库系统使用SQL,但是它们同样有它们自立另外的专有扩展功能用于它们的系统;但是,标准的SQL命令,比如"Select"、 "Insert"、 "Update"、 "Delete"、 "Create"和 "Drop"常常被用于完成绝大多数数据库的操作;但是,不像其它的语言,如C、Pascal等,SQL没有循环结构比如if-then-else、do-wh ile以及函数定义等等的功能;而且SQL只有一个数据类型的固定设置,换句话说,你不能在使用其它编程语言的时候创建你自己的数据类型;SQL功能强大,但是概括起来,它可以分成以下几组:DMLData Manipulation Language,数据操作语言:用于检索或者修改数据;DDLData Definition Language,数据定义语言:用于定义数据的结构,比如创建、修改或者删除数据库对象;DCLData Control Language,数据控制语言:用于定义数据库用户的权限;2SQL 常用语句2.1 SELECT 语句作用:SELECT 语句用于从表中选取数据;结果被存储在一个结果表中称为结果集;语法:SELECT 目标表的一个或多个列名称,列名前可加表达式,如:avg年龄 FROM 目标表的名称;以及:SELECT FROM 表名称;注释:代表选取全部;示例:下面是示范在一个表中选取自己想要的信息,例如我只想要老师们的联系电话;这是原表教师表,里面包含了教师编号等等信息,在这个表中工作时间、政治面目等等都是我们不需要知道的信息所以我们要有选择的选取;这个是在SQL视图中输入的代码如何打开SQL视图不在这里列举;代码的含义是:选取“教师编号,姓名,性别,联系电话“这四个列,列的来源是“教师“这个表这个是最终的结果,可以看到只有我们要的“教师编号,姓名,性别,联系电话“列,政治面目等并没有在里面;拓展1:SELECT DISTINCT 语句作用:在一个表中,可能会包含重复值;这并不成问题,不过,有时你也许希望仅仅列出不同distinct的值;关键词 DISTINCT 作用就是用于返回唯一不同的值;语法:SELECT DISTINCT 列名称 FROM 表名称示例:在教师表中有两个人的名字是江小洋,这里示范只选取江小洋;在原表中可以看到“教师编号“为09,16的两个人的名字都是江小洋;这是SQL代码;代码解析是:选取列名为“姓名“中的唯一值,列的来源是”教师“这个表;这是结果,可以看到他只选取了一个江小洋;并没有显示两个江小洋;拓展2:SELECT 表达式列名语句作用:往往我们在选取信息的时候希望能够直接得到一些间接信息;如,我想要知道班级的平均分;语法:SELECT 表达式列名 FORM 表名示例:这是一个“选课成绩“表里面有一个”成绩“列,我希望直接得到成绩的平均值;这是原表;SQL代码图,名词解释:AVG:为每一组中的指定字段求平均值;更多的函数和逻辑运算符会在附录中列出AS:为指定的列或表指定一个别名;因为AS内容并不多就不再单独列出一个拓展了代码解析:选取“成绩”列,并计算这个字段的平均值,同时为这个字段重新命名为:成绩平均值,这个列的来源表是“选课成绩”表;这是结果图,通过计算可以得知成绩列的平均值是.课堂作业:为每个学生计算平均成绩和为每门课程计算平均成绩,并把结果字段更名为“平均值”;2.2 WHERE 子句作用:WHERE 子句用于规定选择的标准;WHERE后面接的是条件表达式,如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句语法:SELECT 列名称 FROM 表名称 WHERE 条件表达式示例:例如我想知道一个名字叫“洪智伟”的学生的信息;这是原表,里面拥有多条学生信息,我们可以看到第一个就是“洪智伟”同学的信息,我们的目的就是选取他的信息;代码图,代码解析:选取所有字段名,字段的来源表是“学生”表,选取的条件是“姓名”等于“洪智伟”的记录;结果图,可以看到虽然来源表中有N条记录当选取到的记录只有一条;其姓名叫洪智伟;拓展:AND & OR 运算符作用:AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤;AND和OR 运算符AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来;如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录;如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条语法:SELECT 列名称 FROM 表名称 WHERE 条件 AND/OR 条件注释:AND&OR可以嵌套使用示例:我想选取“所有山东省的男生”或“所有北京市的女生”这是原表,数据非常多而且杂乱,用刷选来查找记录的话非常麻烦,所以选用SQL来查询;代码图,代码解析:选取所有字段,字段的来源是“学生”表;选取的条件是“性别是男的并且简历是山东省的学生”或者“性别是女的并且简历是北京市的学生”本来想先做一个简单AND/OR语句再做多个拓展来介绍嵌套的使用,不过觉得太浪费篇幅,并且嵌套不难理解,注意一下嵌套需要用括号括住就可以了课堂作业:选取是团员的男生和简历是山东省的女生;2.3 GROUP BY 子句作用:GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组;语法:SELECT 一个或多个列名,可接函数FROM 表名WHERE 条件表达式GROUP BY 列名示例:要求列出“选课成绩”表中的“课程编号”从“110-120”的课程成绩平均值;呵呵,好像和之前的作业蛮像得=;=原表图,原表中每个课程都有N个学生选,其成绩也有N项,为了直观的显示我们来求以整数来表达的平均值;SQL代码图,名词解释:INT:将数值取整数,如把显示为72,四舍五入;BETWEENAND : BETWEEN 操作符在 WHERE 子句中使用, BETWEEN ... AND 会选取介于两个值之间的数据范围;这些值可以是数值、文本或者日期;代码解析:选取课程编号和成绩两个字段,并且计算成绩字段的整数平均值和更名为成绩平均值,字段的来源表是“选课成绩”表;选取记录的条件是”课程编号在 110 – 120 这个区间内的记录”,然后根据课程编号来分组;结果图,课程编号中只显示了110-120的记录,其成绩的平均值也为整数;拓展:HAVING 子句作用:在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用;同时H AVING都是紧跟着GROUP BY 语句出现的,提供一个组的条件表达式;语法:SELECT 一个或多个列名,可接函数FROM 表名WHERE 条件表达式GROUP BY 列名HAVING 组条件表达式示例:在上一个示例当中更加进一步的精确选取数据,只选取平均分超过75分的记录;因为是延续上个示例,所以原图一样就不再列出;SQL代码图,代码解析:在原有的代码基础上添加了HAVING子句;使得数据更具有精确性,为了让大家更加明确了解WHERE和HAVING的区别在这里在给大家看一个图;可以看到如作用:哪里所说的;WHERE子句当中是不能使用聚合函数的如果我们希望得到一个平均值大于某个数的记录的话;我们使用WHERE子句的话是做不到的,这个时候就必须使用HAVING了而需要注意的是HAVING是在GROUP BY语句后使用的;结果图,可以看到110-120区间内只有两门课程的成绩平均值在75分以上;2.4oRDER BY 子句作用:ORDER BY 语句用于根据指定的列对结果集进行排序;ORDER BY 语句默认按照升序对记录进行排序;如果您希望按照降序对记录进行排序,可以使用 DESC 关键字;语法:SELECT 一个或多个列名,可接函数FROM 表名DRDER BY 列名示例:让教师表里面的记录按照男女排列;原表图,原表中是根据教师编号来排列的;SQL代码图,代码解析:选取全部字段,字段来源表是“教师”表,表的排序是根据表中的“性别”字段来排序;结果图,可以看到表是根据性别来来排序的,先男后女,因为男的拼音是“nan”而女的拼音是“nv”,access中的汉字排序是根据汉字拼音的字母顺序来排序的;拓展:综合应用SELECT 一个或多个列名,可接函数FROM 表名WHERE 条件表达式GROUP BY 列名HAVING 组条件表达式ORDER BY 列名 DESC因为ORDER BY子句是对结果的重新排序,所以在此就不结合多个语句使用了,只是告诉大家能结合之前所学内容使用而已示例:对上个示例的结果进行降序排列;原图一样就不提供了;SQL代码图,代码解析:和之前的示例一样,只是按照降序排列而已;结果图,可以看到和之前的那个结果图的排序刚刚相反,这次是女的排在前;课堂作业:让“教师”表按照性别降序排序,并且“学历”升序排序;2.5INSERT INTO 语句作用:INSERT INTO 语句用于向表格中插入新的记录注意在添加记录之前一定要先查看被添加记录表的字段设置属性,看看字段有没有设置为不能为空或者字段最大值等等之类的;语法:INSERT INTO 表名称 VALUES 值1, 值2,....注释:因为插入的是一个表的全部列值所以列名可以忽略不写;我们也可以指定所要插入数据的列:INSERT INTO 表名列1, 列2,... VALUES 值1, 值2,....注释:如果插入的知识表的部分列值的话,则必须列出相应的列名;没有的列出的列名则取空值;示例:向“学生”表添加一个记录原表图,表中的记录排第一的是“洪智伟”;SQL代码图,代码解析:向“学生”表中的“学生编号,姓名,年龄,简历”字段添加一个新的记录,记录的内容是“学生编号为1991,姓名是黄学宇,年龄为18,简历为广东省”注释:因为添加记录具有不可恢复性所以access会弹出个警告框来询问你是不是确定要进行这步操作;结果图,可以看到记录已经成功添加,没有选择的字段为空值;拓展:高级应用作用:向一个表中添加由多个表组合成的新纪录;语法:INSERT INTO 添加记录的表名称列1,列2……SELECT 表1.列1,表1.列2,表2.列1,表3.列1FROM 表1,表2,表3WHERE 条件表达式;示例:制作一个补考人员名单;原表图,这是个空表,在向一个表添加记录时一定要确认这个表的存在而且要确认字段的属性;这是个我刚刚建立的新表,字段属性都是文本,没有任何限制条件;在这里我是用SQL来建立的这个表;关于建立新表的SQL代码大家可以使用CREATE TABLE 语句,因为这篇教程只是介绍基本SQL内容所以没有在这里列举;有需要的话我会在写多一份相对高级点的教程;SQL代码图,代码解析:向“补考人员名单”这份表中的“学生编号,姓名,课程名称,成绩”字段添加记录;添加的新记录来至于“学生”表中的“学生编号”,“学生”表中的“姓名”,“课程”表中的“课程名称”,“选课成绩”中的“成绩”;选取的条件是“选课成绩”中的“成绩”小于60,且在这些表中“学生”表里面的“学生编号”等于“选课成绩“中的学生编号”,“课程”表中的“课程编号”等于“选课成绩”中的“课程编号”;同样的,因为这个操作具有不可恢复性所以一样会弹出警告框在这里还可以使用INNER JOIN内连接语句来连接这3个表的相同字段;在这里并没有列举,理由同上;结果图,可以看到所有成绩低于60的记录都被选取出来;其显示结果也很直观,联系了3个表中的数据;课堂作业:制作一个优秀学员名单,要求选课成绩有两门成绩上80分;2.6UPDATE 语句作用:Update 语句用于更新,修改表中的数据;语法:UPDATE 表名称SET 列名称 = 需要改变的新值WHERE 条件表达式注释:WHERE子句用于确认目标列来修改数据;示例:修改错误数据;这是之前的例子用INSERT INTO 语句来插入的一条记录,在这里与上个例子不同的是“黄学宇”在这里是为团员,而且入校日期也没有填写,我们利用UPDATE来补齐;SQL代码图,代码解析:更新“学生”表,更新的设置为:把入校日期更新为“2009-4-22”,把学生编号修改为“0 00000”,团员修改为“非团员”;更新的列是姓名等于“黄学宇”的那个列;注释:关于“团员 = false ”存在疑问,因为我是通过其他语言来类比得出来的,经过王老师指导,说是错误的;当然在SQL上使用完全没有问题,在这里只是给大家提供一个参考;结果图,数据已经完全按照我们输入的那样来更新、修改了拓展:ALTER TABLE 语句作用:ALTER TABLE 语句用于在已有的表中添加、修改或删除列;语法:如需在表中添加列,请使用下列语法:ALTER TABLE 表名ADD 列名字段属性文本,时间日期等;;要删除表中的列,请使用下列语法:ALTER TABLE 表名DROP COLUMN 列名注释:某些数据库系统不允许这种在数据库表中删除列的方式 DROP COLUMN 列名;要改变表中列的数据类型,请使用下列语法:ALTER TABLE 表名ALTER COLUMN 列名字段属性示例:为选课成绩增加一个字段“评价”并把90分以上的同学的评价更新为优秀;这是原表,里面并没有我们要的“评价”字段;因为不能同时使用ALTER TABLE语句和 UPD ATE 语句;所以要分开弄两个SQL代码;;SQL代码图,代码解析:向“选课成绩”表增加一个长度为255的文本字段;需要注意的是运行这个SQL代码的时候必须确认你添加列的表并没有被打开;结果图,可以看到评价字段已经能够添加成功;代码图,代码解析:向“选课成绩”表更新数据,把评价设置为“优秀”,更新字段的条件是“成绩”大于并等于“90”结果图,“成绩”字段大于并等于“90”的记录的“评价”都已经被修改为“优秀”了2.7DELETE 语句作用:DELETE 语句用于删除表中的记录;语法:DELETE FROM 表名称 WHERE 条件表达式注释:如果没有WHERE子句的话,则代表删除表中的全部记录;有的话则是删除满足WHERE 条件的记录;示例:删除学生表中1990年到1992年间的所有学生记录;原表图,入校日期都是7月份的九号;SQL代码图,代码解析:删除记录,来源于“学生”表,删除的条件是“入校日期”在1990年初到1992年初;结果图,可以看到现在入校日期是1992年7月9号开始的了,之前1990-1992年间的记录都已经被删除;。
SQL语句结构1.结构化查询语言包含6个部分:一:数据查询语言(DQL:Data Query Language):其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。
保留字SELECT 是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。
这些DQL保留字常与其他类型的SQL语句一起使用。
二:数据操作语言(DML:Data Manipulation Language):其语句包括动词INSERT,UPDATE和DELETE。
它们分别用于添加,修改和删除表中的行。
也称为动作查询语言。
三:事务处理语言(TPL):它的语句能确保被DML语句影响的表的所有行及时得以更新。
TPL语句包括BEGIN TRANSACTION,COMMIT 和ROLLBACK。
四:数据控制语言(DCL):它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。
某些RDBMS 可用GRANT或REVOKE控制对表单个列的访问。
五:数据定义语言(DDL):其语句包括动词CREATE和DROP。
在数据库中创建新表或删除表(CREAT TABLE或DROP TABLE);为表加入索引等。
DDL包括许多与人数据库目录中获得数据有关的保留字。
它也是动作查询的一部分。
六:指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。
SQL简介SQL是关系数据库系统的标准语言。
所有关系数据库管理系统(RDMS),如MySQL、MS Access、Oracle、Sybase、Informix、Postgres和SQL Server都使用SQL作为它们的标准数据库语言。
2.SQL标准命令与关系数据库交互的标准SQL命令是CREATE,SELECT,INSERT,UPDATE,DELETE 和DROP,简单分为以下几组:DDL(数据定义语言)数据定义语言用于改变数据库结构,包括创建、更改和删除数据库对象。
TypeYourNameHere TypeDateHereSQL语言详解简介SQL(Structured Query Language):结构化查询语言,是一种数据库查询和程序设计语言。
SQL语言得到了广泛的应用;如:Oracle,Sybase, DB2, Informix, SQL Server等大型数据库管理系统;Visual Foxpo, PowerBuilder等PC数据库开发系统。
SQL包含4个部分:1. 数据定义语言(DDL), 例如:CREATE, DROP, ALTER等。
2. 数据操作语言(DML), 例如:INSERT, UPDATE, DELETE等。
3. 数据查询语言(DQL), 例如:SELECT等。
4. 数据控制语言(DCL), 例如:GRANT, REVOKE, COMMIT, ROLLBACK等。
SQL语言DDLCREA TE TA BLE:用来建立数据表。
例如:创建一个空的数据表Customer_Data。
CREATE TABLE Customer_Data(customer_id smallint,first_name char(20),last_name char(20),phone char(20))ALTER TA BLE:修改数据表的定义与属性。
例如:在Customer_Data中新增middle_initial数据行。
ALTER TABLE Customer_DataADD middle_initial char(1)DROP TA BLE:删除数据表以及所有的数据,索引,触发程序,条件约束以及权限。
例如:删除Customer_Data数据表DROP TABLE Customer_DataDMLINSERT:向数据表插入一行数据。
例如:在Customer_Data中新增一个客户。
INSERT INTO Customer_Data(customer_id, first_name, last_name, phone)VALUES (777, ‘Frankie’, ‘Stein’, ‘4895873900’)注意:(customer_id, first_name, last_name, phone)列表数据行名称的顺序决定了数据数值将被放在哪个数据列。
翻译:陈拓 chentuo@2006 年 6 月16 日操纵大对象Copyright © Oracle Corporation, 2001. All rights reserved.进度表: 时间 主题80 分钟 讲演40 分钟 练习120 分钟 总共目标完成本课程后, 您应当能够:• 比较和对比 LONG 和大对象 (LOB) 数据类型• 创建并维护 LOB 数据类型• 区分内部和外部大对象的区别• 使用 DBMS_LOB PL/SQL 包• 说明临时大对象的用途82 Copyright © Oracle Corporation, 2001. All rights reserved.本课目标数据库有用于存储大对象的 LONG。
可是,这种内建于数据库的机制不像在 Oracle8 中新 提供的大对象 (LOB) 数据类型那样好用。
本课叙述这种新的数据类型的特性,并与早期的数据 类型进行比较。
用例子介绍 LOB 类型的语法和使用。
注:LOB 是一种数据类型,不要与对象类型混淆。
什么是 LOB ?LOBs用于存储大的非结构化的数据,例如:文本、图象、电影和声音波形。
83 Copyright © Oracle Corporation, 2001. All rights reserved.概览一个LOB是一个用于存储象文本、图形图像、视频剪辑等等这样的大的、非结构化数据的 数据类型。
结构化的数据象客户的记录可能只有几百个字节,但即使很是少量的多媒体数据可能 就会是几千倍之大。
还有,多媒体数据可能驻留在操作系统文件上,这些文件需要从数据库中访 问。
有四种大对象数据类型:· BLOB 表示二进制大对象,例如一个视频剪辑。
· CLOB 表示一个字符大对象。
· NCLOB 表示一个多字节字符大对象。
· BFILE 表示一个存储在数据库外部的一个操作系统二进制文件。
数据库—SQL语⾔1 SQL 基本概念1.1 SQL 概念及分类定义:SQL是Structured Query Language的缩写,意思是结构化查询语⾔,是⼀种在数据库管理系统中查询或对数据库⾥⾯的数据进⾏更改的语⾔主流数据库管理系统关系型数据库MySQLOraclePostgre SQLSQL Server⾮关系型数据库redismongo DB数据定义语⾔DDL(Data Ddefinition Language)SQL 数据定义语⾔主要⽤来定义逻辑结构,包括定义基表,视图和索引删除表定义表修改表数据查询语⾔DQL(Data Query Language)SQL 的数据查询语⾔主要⽤来对数据库中的各种数据对象进⾏查询数据操纵语⾔DML(Data Manipulation Language)SQL 的数据操纵语⾔,⽤于改变数据库中的数据,包括插⼊,删除,修改数据控制功能DCL(Data Control Language)SQL 的数据控制语⾔,对表和视图的授权,完整性规则的描述以及事务开始和结束等控制语句1.2 SQL 语⾔的特点综合统⼀:独⽴完成数据库⽣命周期中的全部活动,包括定义关系模式、录⼊数据、建⽴数据库、査询、更新、维护、数据库重构、数据库安全⾼度⾮过程化:⽤户只需提出“做什么”,⽽不必指明“怎么做⾯向集合的操作⽅式:SQL 采⽤集合操作⽅式以同⼀种语法结构提供两种使⽤⽅式:SQL既是⾃含式语⾔,⼜是嵌⼊式语⾔,SQL语句能够嵌⼊到⾼级语⾔程序中语⾔简洁,易学易⽤:SQL 语⾔语法简单,接近英语⼝语1.3 SQL 基本语法1 SQL 数据类型数据类型含义CHAR(n)CHARACTER(n)长度为 n 的定长字符串VARCHAR(n)CHARACTERVARYING(n)最⼤长度为 n 的变长字符串CLOB字符串⼤对象BLOB⼆进制⼤对象INTINTEGER长整数(4 字节)SMALLINT短整数(2 字节)BIGINT⼤整数(8 字节)数据类型含义NUMERIC(p, d)定点数,由 p 位数字(不包括符号、⼩数点)组成,⼩数点后边有 d 位数字DECIMAL(p, d)DEC(p, d)同 NUMERIC REAL取决于机器精度的单精度浮点数DOUBLE PRECISION取决于机器精度的双精度浮点数FLOAT(n)可选精度的浮点数,精度⾄少为 n 位数字FLOAT(n)可选精度的浮点数,精度⾄少为 n 位数字数据类型含义BOOLEAN逻辑布尔值DATE⽇期,包含年、⽉、⽇,格式为 YYYY-MM-DDTIME时间,包含⼀⽇的时、分、秒,格式为 HH:MM:SS TIMESTAMP时间戳类型TIMERVAL时间间隔类型2 模式的定义及删除模式定义语法:CREATE SCHEMA <模式名> AUTHORIZATION <⽤户名>例⼦:CREATE SCHEMA "S-T" AUTHORIZATION WANG;模式定义 + 视图语法:CREATE SCHEMA <模式名> AUTHORZATION <⽤户名> [<表定义⼦句>|<视图定义⼦句>|<授权定义⼦句>];模式删除语法:DROP SCHEMA <模式名><CASCADE|RESTRICT>;CASCADE、RESTRICT两者必须⼆选⼀VASCADE(级联):删除模式的同时也把给模式的所有数据库对象删除RESTRICT(限制):如果该模式下有下属对象(⽐如表视图),则拒绝该删除语句的执⾏3 表的增删改查创建表CREATE TABLE 表名 (字段名类型字段约束, 字段名类型字段约束, 字段名类型字段约束);CREATE TABLE Student (name VARCHAR(20),age INT,sex CHAR(1),);删除表DROP TABLE <表名> [RESTRICT|CASCADE];DROP TABLE Student RESTRICT;修改ALTER TABLE <表名>[ADD [COLUMN] <新列名><数据类型> [完整性约束]][ADD <表级完整性约束>]ALTER TABLE Student ADD S_entrance DATE;ALTER TABLE Student ALTER COLUMN S_age INT;4 索引的增删改查当数据库中数据量巨⼤时,建⽴索引可以减少查询时间,索引可以建⽴在⼀列或多列上建⽴索引CLUSTER:聚簇索引,物理顺序与索引的逻辑顺序相同UNIQUE:唯⼀索引CREATE [UNIQUE] [CLUSTER] INDEX <索引名>ON <表名>(<列名>[<次序>][,<列名> [<次序>]] ...);CREATE UNIQUE INDEX Stusno ON Student(Sno);修改索引ALTER INDEX <旧索引名> RENAME TO <新索引名>;ALTER INDEX SCno RENAME TO SCSno;删除索引DROP INDEX <索引名>DROP INDEX Stusno;2 SQL 的查询假设关系表Student、Course、SC如下:Student学号(Sno)姓名(Sname)性别(Ssex)年龄(Sage)院系(Sdept) 201215121李勇男20CS 201215122刘晨⼥19CS 201215123王敏⼥18MA 201215125张⼒男19ESCourse课程号(Cno)课程名(Cname)先⾏课(Cpno)学分(Ccredit) 1数据库542数学/23信息系统144操作系统635数据结构746数据处理/27Java语⾔64SC学号(Sno)课程号(Cno)成绩(Grade)2012151211922012151212852012151213882012151222902015151223802.1 查询所有列查询Student表中所有列SELECT * FROM Student;2.2 查询部分列查询Student表中的Sno、Ssex列SELECT Sno, Ssex FROM Student;2.3 列取别名查询Student表中的Sno、Ssex列,并将Sno命名为 “学号”,Ssex命名为 “性别”SELECT Sno 学号, Ssex 性别 FREOM Student;SELECT Sno AS 学号, Ssex AS 性别 FROM Student;2.4 表取别名查询Course表中的Cno列,并将查询结果命名为CCSELECT Cno FROM Course AS CC;2.5 查询结果去重查询SC中的Sno列,并将结果去重SELECT DISTINCT Sno AS 课程名 FROM SC;2.6 查询结果加条件查询条件如下:查询条件谓词⽐较=、>、<、<=、>=!=、<>、!>、!<、NOT确定范围BETWEEN ANDNOT BETWEEN AND确定集合IN、NOT IN字符匹配LIKE、NOT LIKE空值IS NULL、IS NOT NULL逻辑运算AND、OR、NOT 查询 SC 表中 Grade ⼤于 88 的信息SELECT * FROM SC WHERE Grade >= 88;查询 SC 表中 Grade 在 85 ~ 95 之间的信息SELECT * FROM SC WHERE Geade BETWEEN 85 AND 95;查询 1 是否包含在 (1,2) 之间SELECT 1 FROM (1, 2);查询 Course 表中包含 “系统” 的课程的课程号,课程名"%" 可以近似多个字符,"_" 只能近似⼀个字符SELECT Cno, Cname FROM Course WHERE Cname LIKE '%系统';查询 Course 中先⾏课为空的信息SELECT * FROM Course WHERE Cpno IS NULL;查询 Course 中学分为 4 分并且先⾏课为 1 的课程的课程名SELECT Cname FROM Course WHERE Ccredit = 3 AND Cpno = 1;查询 Course 中学分为 4 分或 3 分的课程的课程名SELECT Cname FROM Course WHERE Ccredit = 3 OR Ccredit = 4;2.7 聚集函数函数含义COUNT(*)统计元组个数COUNT([DISTINCT|ALL]<列名>)统计⼀列中值的个数SUM([DISTINCT|ALL]<列名>)计算⼀列值的总和AVG([DISTINCT|ALL]<列名>)计算⼀列值的平均值MAX([DISTINCT|ALL]<列名>)计算⼀列值中的最⼤值MIN([DISTINCT|ALL]<列名>)计算⼀列值中的最⼩值注:DISTINCT是去除重复的值查询 CS 表中 Grade 的个数(去重)、总和、平均值、最值SELECT COUNT(*) FROM SC;SELECT COUNT(DISTINCT Grade) FROM SC;SELECT SUM(Grade) FROM SC;SELECT AVG(Grade) FROM SC;SELECT MAX(Grade) FROM SC;SELECT MIN(Grade) FROM SC;2.8 分组查询将表 SC 按照 Sno 进⾏分组,然后筛选出分组中 Sno 为 "201215121" 的⼀组SELECT Sno FROM SC GROUP BY Sno HAVING Sno = '201215121';将 Student 与 SC 以 Sno 进⾏等值连接SELECT Student AS S, SC WHERE S.Sno = SC.Sno;2.10 ⾃⾝连接将 Student 表与⾃⽣进⾏连接SELECT Student AD S1, Student AS S2 WHERE S1.Sno = S2.Sno;2.11 外连接将 Course 与 SC 以 Cno 分别进⾏外连接、左外连接、右外连接SELECT * FROM Course OUTER JOIN SC ON o = o;SELECT * FROM Course LEFT OUTER JOIN SC ON o = o;SELECT * FROM Course RIGHT OUTER JOIN SC ON o = o;2.12 多表查询将 Student 与 SC 以 Sno 进⾏连接,并且将 Course 与 SC 以 Cno 进⾏等值连接SELECT *FROM Student JOIN SC ON Student.Sno = SC.SnoJOIN Course ON o = o;SELECT *FROM Student, Course, SCWHERE Student.Sno = SC.Sno AND o = o;2.13 嵌套查询查询 Grade > 90 的学⽣的学号(Sno)、姓名(Sname)、所在院系(Sdept)SELECT Sno, Sname, SdeptFROM StudentWHERE Sno IN (SELECT SnoFROM SCWHERE Grade > 90;);2.14 带有 ANY 的查询查询 Sage > 19 的所有学⽣的姓名(Sname)(结果满⾜⼦集中的任⼀值即可)SELECT SnameFROM StudentWHERE Sage > ANY (SELECT SageFROM StudentWHERE Sage > 19;);2.15 带有 ALL 的查询查询 Sage > 19 的所有学⽣的学号(Sno)(结果要满⾜⼦集中的所有值)SELECT SnoFROM StudentWHERE Sage > ALL (SELECT SageFROM StudentWHERE Sage > 19;);2.16 带 EXISTS 的查询查询没有⼀门课不选修的学⽣的姓名(Sname)SELECT SnameFROM StudentWHERE NOT EXISTS(SELECT *WHERE NOT EXISTS (SELECT *FROM SCWHERE Sno = Student.Sno AND Cno = o););)2.17 集合查询1 并集查询所在系(Sdept)为 "CS" 的学⽣与年龄(Sage)⼤于 19 的学⽣的并集SELECT * FROM Student WHERE Sdept = "CS"UNIONSELECT * FROM Student WHERE Sage > 19;2 交集查询所在系(Sdept)为 "CS" 的学⽣与年龄(Sage)⼤于 19 的学⽣的交集SELECT * FROM Student WHERE Sdept = "CS"INTERSECTSELECT * FROM Student WHERE Sage > 19;3 差集查询所在系(Sdept)为 "CS" 的学⽣与年龄(Sage)⼤于 19 的学⽣的差集SELECT * FROM Student WHERE Sdept = "CS"EXCEPTSELECT * FROM Student WHERE Sage > 19;3 SQL 的增删改3.1 数据的插⼊1 标准添加INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept)VALUES ('201215128', '⽯昊', '男', 25, 'IS');2 指定部分字段INSERT INTO Student (Sname, Sage, Sdept) VALUE ('叶凡', 22, 'CS');3 不指定字段-- 不指定字段时,需要⼀⼀对应添加且不能缺少项⽬INSERT INTO VALUE Student ('201215128', '⽯昊', '男', 25, 'IS');4 批量添加INSERT INTO Student VALUES('201215128', '⽯昊', '男', 25, 'IS'),('201215129', '叶凡', '男', 22, 'CS'),('201215130', '狠⼈', '⼥', 20, 'MX');3.2 修改将 Student 表中学号(Sno)为 "201215122" 的学⽣姓名(Sname)改为 “⽯昊”,年龄(Sage)改为 25 UPDATE Student SET Sname = "⽯昊", Sage = 25 WHERE Sno = "201215122";3.3 删除删除 Student 表中年龄(Sage)⼤于 18 的数据DELETE FROM Student WHERE Sage > 18;4 视图4.1 视图定义视图(VIEW)也被称作虚表,即虚拟的表,是⼀组数据的逻辑表⽰,其本质是对应于⼀条 SQL 语句,结果集被赋予⼀个名字视图本⾝并不包含任何数据,它只包含映射到基表的⼀个查询语句,当基表数据发⽣变化,视图数据也随之变化⽬的:⽅便,简化数据操作当我们业务需求要查出多张表的数据,这时我们可能会关联多张表查询处理,如果这个查询 SQL 复杂的话也影响了查询效率,这个时候就可以创建视图,查询时候只需要select * from view就可以4.2 创建视图-- 末尾的 WITH CHECK OPTION 作⽤如下:-- 当后续操作对视图进⾏增删改操作时,可能视图已经不满⾜⼦条件 S 的约束-- 加上该语句之后,后续对视图进⾏增删改的时,系统会⾃动在该⼦条件 S 下进⾏操作CREATE VIEW S_STUAS <⼦查询>[WITH CHECK OPTION];将 Student 表中学⽣年龄(Sage)> 18 的学⽣创建⼀个名为 S_NEW 的视图,该视图包含学⽣的学号(Sno)、姓名(Sname)、性别(Ssex)、所在院系(Sdept)CREATE VIEW S_NEWASSELECT Sno, Sname, Ssex, SdeptFROM StudentWHERE Sage > 18WITH CHECK OPTION;4.3 删除视图-- CASCADE 的作⽤如下:-- 当加上该语句时,会删除该视图以及其下的所有视图-- 当不加该语句时,若该视图下该有其他视图,会删除失败DROP VIEW <视图名> [CASCADE];删除 4.2 创建的视图 S_NEWDROP VIEW S_NEW CASCADE;4.4 查询视图查询 4.2 视图 S_NEW 中性别(Ssex)为 “⼥” 的学⽣的学号(Sno)SELECT SnoFROM S_NEWWHERE Ssex = "⼥";4.5 视图更新视图是虚拟的,不存在的,所以对于视图的操作,最终会反映到基本表上将 4.2 的视图 S_NEW 中所在系(Sdept)为 “CS” 学⽣的性别(Ssex)全改为 “男”-- 更新视图UPDATE S_NEWSET Ssex = "男"WHERE Sdept = "CS";-- 更新基本表-- 因为 4.2 的视图创建条件是 Sage > 18,因此更新基本表时要加上该条件UPDATE StudentSET Ssex = "男"WHERE Sdept = "CS" AND Sage > 18;。
第八章SQL语言SQL(structured Query Language)语言,中文名是结构化查询语言,它的理论基础是基于关系代数与关系演算。
其语法简洁,功能极为强大和全面,自推出以来被广泛采用,历经多次改进、完善以及标准工作。
其地位更加稳固,现已成为关系数据的标准语言。
它主要包括查询、数据定义、数据操纵和数据控制等功能。
§8.1 SQL简介最早的SQL标准是于1986年10月由美国ANSI(American National Standards Institute)公布的。
随后,ISO(International Standards Organization)于1987年6月也正式采纳它为国际标准,并在此基础上进行了补充,到1989年4月,ISO提出了具有完整性特征的SQL,并称之为SQL89。
SQL89标准公布之后,对数据库技术的发展和数据库的应用都起到了很大的推动作用。
尽管如此,SQL89仍有许多不足或不能满足应用需求之处。
为此,在SQL89的基础上,经过三年多的研究和修改,ISO于1992年11月又公布了SQL的新标准,即SQL92。
SQL92标准将其内容分为三个级别,即基本级、标准级和完全级。
但SQL92标准也不够完备,且正在进行修改,考虑增加对象数据的支持能力等。
SQL语言的特点:① SQL是一种一体化的语言,包括了数据定义、数据查询、数据操纵和数据控制等方面的功能,它可以完成数据库活动中的全部工作。
以前非关系模型的数据语言一般包括存储模式描述语言、概念模式描述语言、外部模式描述语言和数据操纵语言等,这种模型的数据语言,一是内容多,而是掌握和使用起来都不象SQL那样简单、实用。
②SQL语言是一种高度非过程化的语言,它没有必要一步步的告诉计算机“如何”去做,而只需要描述清楚用户要做“什么”,SQL语言就可以将要求交给系统,自动完成全部工作。
③ SQL语言非常简洁,虽然SQL语言功能很强,但它只有为数不多的几条命令(下面将要介绍)。
另外,SQL的语法也非常简单,它很接近英语自然语言,因此容易学习和掌握。
④SQL语言可以直接以命令方式交互使用,也可以嵌入到程序设计语言中以程序方式使用。
现在很多数据库应用开发工具都将SQL语言直接融入到自身的语言之中,使用起来更方便,Visual FoxPro就是如此。
这些使用方式为用户提供了灵活的选择余地。
此外,尽管SQL的使用方式不同,但语法基本是一致的。
Visual FoxPro在SQL方面支持数据定义、数据查询和数据操作功能,但在具体实现方面也存在一些差异。
§8.2 SELECT―SQL查询功能在第四章介绍了查询的创建和使用,本节主要介绍SQL语句的使用,SQL语句是实现管理信息系统中查询和统计的核心语句,可在自身的语言之中直接使用。
8.2.1 SELECT-SQL的格式及作用SQL的核心是查询,它的基本形式由SELECT-FROM-WHERE查询块组成,多个查询块可以嵌套执行。
该命令的语法格式如下:SELECT[ALL|DISTINCT] [TOP nExpr[PERCENT]][Alias.]Select_Item[AS Column_name][,[Alias.] Select_Item [AS Column_name]…] FROM[FORCE][Databasename!] Table [[AS]Local_Alias][[INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER]JOINDatabasename!]table[[AS]Local_Alias][ON JoinCondation…][[INTO Destination]|[TO FILE FileName[ADDITIVE]|TO PRINTER[PROMPT]|TO SCREEN]][PREFERENCE PreferenceName][NOCONSOLE][PLAIN][NOWAIT][WHERE JionCondation[AND JoinCondition…][AND|OR FilterCondition[AND|OR FilterCondition…]]][GROUP BY GroupColumn[,GroupColumn…]][HAVING FilterCondition][UNION [ALL] SELECTCommand][ORDER BY Order_Item[ASC|DESC][, Order_Item[ASC|DESC]…]]要掌握看起来复杂的SELECT命令,就必须从它的命令中各个短语的含义入手,具体含义如下:SELECT [ALL|DISTINCT] 参数中的ALL或DISTINCT只选择其一,其中ALL将筛选出满足给定条件的所有记录;DISTINCT将筛选出满足给定条件的记录,但排除记录相同的重复行。
[TOP nExpr[PERCENT]]指定在查询结果里包含的行(记录)数或百分比。
其中<NExpr>指定所包含的记录数,其范围是1~32,767,<PERCENT>指定百分比,其范围是0.01~99.99。
[Alias.]Select_Item[AS Column_name]中的Select_Item参数指定查询结果中的每一项,它可以是字段名、字段名表达式以及常量。
若Select_Item是一个常量,那么查询结果中的每一行都出现该常量值。
[AS Column_name]参数指定查询结果中的每一项的标题。
若Select_Item是一个字段,那么[Alias.]指明该字段所在表的别名。
FROM[FORCE][Databasename!] Table [[AS]Local_Alias]参数指定查询所使用的表,[Local_Alias]为表指定一个临时名,若指定了本地别名,那么在SELECT-SQL语句中都必须用这个别名代替表名。
使用[FORCE]表示数据表按FROM子句出现的顺序联接。
[[INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER]JOIN Databasename!]table [[AS]Local_Alias] [ON JoinCondation…]表示指定联接的类型及联接字段表达式。
[[INTO Destination]表示设置查询的输出结果集。
结果集可以是下列形式之一:165ARRAY ArrayName 数组CURSOR CursorName[NOFILTER] 临时表TABLE TableName 指定表[TO FILE FileName[ADDITIVE]|TO PRINTER[PROMPT]|TO SCREEN]]表示分别将查询结果送到一个文本文件、打印机和屏幕中去。
[PREFERENCE PreferenceName]表示当输出方向为【浏览】窗口时保存该窗口的属性,以便下一次调用。
[NOCONSOLE]表示在将查询结果输出到文本文件或打印机上去的同时禁止在屏幕上显示查询结果。
[PLAIN]表示禁止列标头出现在查询结果上。
[NOWAIT]表示在将查询结果输出到浏览器窗口中去后,允许程序继续执行。
[WHERE JionCondation[AND JoinCondition…][AND|OR FilterCondition[AND|OR FilterCondition…]]]参数用以设置多表连接条件以及筛选条件。
[GROUP BY GroupColumn[,GroupColumn…]] 用以设置分组汇总依据。
[HAVING FilterCondition] 用以设置分组筛选条件。
[UNION [ALL] SELECTCommand] 表示与另一个SELECT-SQL命令相联接。
[ORDER BY Order_Item[ASC|DESC][, Order_Item[ASC|DESC]…]]用以设置查询结果排序依据。
Visual FoxPro允许用户为SELECT-SQL命令添加注释,具体操作如下:①在系统菜单上选择【查询】中的【注释】,Visual FoxPro弹出“注释”对话框。
②在“注释”对话框中,键入有关的注释说明。
③单击【确定】按钮,Visual FoxPro会将键入的注释添加到SQL只读窗口的顶层。
8.2.2 基本查询由SELECT和FROM短语构成无条件查询,或由SELECT、FROM和WHERE短语构成的条件查询。
【例8.1】从学籍表中检索籍贯。
Select jg from d:\vfp_example\xj从查询结果可以看出有重复值,如果要去掉重复值只需要指定DISTINCT短语,即select distinct jg from d:\vfp_example\xj【例8.2】从学籍表中检索出所有记录值。
select * from d:\vfp_example\xj其中“*”是通配符,表示所有属性,即字段,这里的命令等同于:select xh,xm,nl,xb,csrq,jg,jtzz,rxcj,bj,tyf,bz,zp from d:\vfp_example\xj 【例8.3】从学籍表中检索出所有入学成绩在350以上的同学的姓名、家庭住址。
select xm,jtzz from d:\vfp_example\xj where rxcj>=350其中,WHERE短语指定了查询条件,查询条件可以是任意复杂的表达式。
当有WHERE 子句时,系统首先根据指定的条件依次检索关系中的每个元组,然后选出满足条件的元组166(相当于关系的选择操作),并显示SELECT子句中指定属性的值(相当于关系的投影操作)。
从运行结果中可以看出,查询窗口中出现的是字段名,读者很难理解,为此若要将英文字母表示的字段名如XM,JTZZ显示成汉字,只需要使用AS短语即可,select xm as "姓名",jtzz as "家庭住址" from d:\vfp_example\xj where rxcj>=350 【例8.4】从学籍表中检索出所有入学成绩在350以上,并且是团员的同学。
select xm as "姓名",jtzz as "家庭住址" from d:\vfp_example\xj where rxcj>=350 and tyf注:“tyf”是逻辑型字段,可以直接做为表达式使用。
【例8.5】从学籍表中检索出所有1985年出生的团员。
select xm as "姓名",csrq as "出生日期" from d:\vfp_example\xj where tyf and year(csrq)=19858.2.3 联接查询联接查询是一种基于多个关系的查询。