3.1 SQL概述:
- SQL:结构化查询语言,是关系数据库的标准语言,SQL是一个通用的、功能极强的关系数据库语言
- 结构化查询:理解:就是只要告诉数据库我要干什么,怎么干就可以了
- 3.1.2 SQL的特点:
- 综合统一:
- 集数据定义语言 DDL,数据操纵语言 DML,数据控制语言 DCL功能于一体,可以独立完成数据库生命周期中的全部活动,如下:
- 定义关系模式,插入数据,建立数据库,
- 对数据库中的数据进行查询和更新
- 数据库重构和维护
- 数据库安全性、完整性控制等
- 嵌入式SQL和动态SQL定义
- 用户数据库投入运行后,可根据需要随时逐步修改模式,不影响数据的运行
- 数据操作符统一(如:查询就用select,删除就用:delete)
- 高度非过程化:
- 非关系数据模型的数据操纵语言“面向过程”,必须制定存取路径
- SQL只要提出“做什么”,无须了解存取路径
- 存取路径的选择以及SQL的操作过程由系统自动完成
- 面向集合的操作方式:
- 非关系数据模型采用面向记录的操作方式,操作对象是一条记录
- SQL采用集合操作方式:
- 操作对象、查找结果可以是元组的集合
- 一次插入、删除、更新操作的对象可以是元组的集合
- 以同一种语法结构提供多种使用方式:
- SQL是独立的语言
- 能够独立地用于联机交互的使用方式
- SQL又是嵌入式语言
- SQL能够嵌入到高级语言(例如C,C++,Java)程序中,供程序员设计程序时使用
- 简单容学:
- SQL功能极强,完成核心功能只用了9个动词
SQL功能 | 动词 | 数据查询 | SELECT | 数据定义 | CREATE、DROP、ALTER | 数据操纵 | INSERT、UPDATE、DELETE | 数据控制 | GRANT、REVOKE |
- 3.1.3SQL基本概念:
- SQL支持关系数据库三级模式结构:
- 基本表:
- 本身独立存在的表
- SQL中一个关系就对应一个基本表
- 一个(或多个)基本表对应一个存储文件
- 一个表可以带若干索引(索引:目的:快速查找数据,理解:相当于书中的目录,如给学号做一个目录,就可以快速查找)
- 存储文件
- 逻辑结构组成了关系数据库的内模式
- 物理结构是任意的,对用户透明
- 视图
- 从一个或几个基本表导出的表
- 数据库中只存放视图的定义而不存放视图对应的数据
- 视图是一个虚表
- 用户可以在视图上再定义视图
3.2 学生-课程数据库:
3.3 数据的定义:
- SQL的数据定义功能:模式定义、表定义、视图和索引的定义
-
- 3.3.1 模式的定义于删除:
- 定义模式:
- 模式在SQL理解:相当于一个仓库有不同的房间存放不同的工具,不同的房间就是不同的模式,不同的房间也只能放不同的工具,可以给房间授权只允许谁去访问,数据库就相当于仓库
- 语句格式如下:
- CREATE SCHEMA AUTHORIZATION
- AUTHORIZATION :该关键字的意思是把谁设置成该模式的管理员
- 例子:为用户WANG定义一个学生-课程模式S-T
- CREATE SCHEMA "S-T" AUTHORIZATON WANG;
- 细节:
- 若没有指定模式名,那么就以用户名来表示
- CREATE SCHEMA AUTHORIZATON WANG;
- 在创建模式时同时还可以建立表
- 语法:CREATE SCHEMA AUTHORIZATON [|];
- 执行创建模式语句必须拥有DBA权限,或者DBA授权在CREATESCHEMA的权限
- 如:张三管理太多模式了,他就可以在创建模式的时候把权限给到历史,注意的是数据库要有李四这个人
- 删除模式:
- 语法:DROP SCHEMA ;
- 中的两选项必须二选一:
- CASCADE(级联)
- RESTRICT(限制)
- 如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行
- 例子:DROP SCHEMA ZHANG CASCADE;
- 3.3.2 基本表的定义、删除与修改:
CREATE TABLE
( [],
[],
[]);
- 细节:
- 如果完整性约束条件涉及到该表的多个属性列 - [],否则定义在列 - []
- 逗号代表一条语句的结束
- [ ] 大括号里的内部代表可有可无
- 例子:
- 数据类型:
字符串类型:
枚举类型:
枚举类型英文为ENUM,对1~255个成员的枚举需要1个字节存储;对于255 ~ 65535个成员,需要2个字节存储。最多允许65535个成员。创建方式:enum(“M”,“F”);
日期类型:
- 模式与表:
- 每一个基本表都属于某一个模式,一个模式包含多个基本表
- 理解:模式代表仓库房间,基本表代表工具,工具可以是锤子、铁锹等等,所以基本表都属于某一个模式,一个模式包含多个基本表
- 创建基本表(其他数据库对象也一样)时,若没有指定模式,系统根据搜索路径来确定该对象所属的模式
- 理解:创建表,没有指定模式,根据搜索路径来确定:买了工具,都我没有说放到能够房间,那就谁买的谁去管理
- 显示当前搜索路径:
- 搜索路径的当前某默认值:
- $user(用户名,登录时的用户名), PUBLIC;
- DBA用户可以设置搜索路径:
- SET search_path To "S-T",PUBLIC;
- “S-T”就是修改的搜索路径,PUBLIC是没有S-T就创建一个PUBLIC的模式
- 理解:买工具回来放到S-T房间,如果没有S-T房间就放到PUBLIC房间中去
- 若搜索路径的模式名都不存在,系统将给出错误
- 若搜索路径中的存在模式,ROMBS还使用模式列表中第一个存在的模式作为数据库对象的模式名
- 理解:我设置了多个模式名,使用的时候用第一个,如果不存在在找第二个
- 创建基本表:
- 在模式的状态下创建表 - 就是创表的时候指定模式:
- 1.创建表给出模式名:
- CREATE TABLE "ST-T".Studnet(...); // Student所属的模式是S-T
- CREATE TABLE "ST-T".Course(...); // Course所属的模式是S-T - 后需还可以往模式中添加表,一个模式可以有若干个基本表(前面有说)
- CREATE TABLE "ST-T".SC(...); // SC所属的模式是S-T
- 2.在创建模式语句中同时创建表:
- 3.设置所属模式,在创建表中不必给出模式名(就是设置它的搜索路径)
- 修改基本表:
- 语法:
- CASCADE - 级联删除,使用该操作自动删除引用了该列的其它对象
- RESTRICT -限制删除,使用该操作如果该列被其它对象引用,就会拒绝删除该列
- ALTER COLUMN - 用于修改原有的列定义,包括修改列名和数据类型
-
- 例子:
- 删除基本表:
- 语法:DROP TABLE [RESTRICT| CASCADE];
- 基本表定义被删除,数据被删除,表上建立的索引、视图、触发器等一般也将被删除
- RESTRICT:删除表是有限制的,欲删除的基本表不能被其他表的约束所引用
如果存在依赖该表的对象,则此表不能被删除
- CASCADE:删除该表没有限制。
在删除基本表的同时,相关的依赖对象一起删除
- 例子:
- 不同数据库处理的策略:
- 3.3.3 索引的创建和删除:
- 建立索引的目的:加速查询速度
- 谁可以建立索引:DBA或表的属主(建表人)
- DMBS一般会自动建立以下列上的索引(相当于有下面关键字的自动加到目录):
- 谁维护索引:DMBS自动完成
- 使用索引:DMBS自动执行是否使用索引及使用哪些索引
- R(R表示关系数据库)DBMS中索引一般采用B+树、HASH索引来实现
- B+树索引具有动态平衡的优点
HASH索引具有查找速度快的特点
采用B+树,还是HASH索引 则由具体的RDBMS来决定
- 索引是关系数据库的内部实现技术,属于内模式的范畴
- CREATE INDEX 语句定义索引时,可以定义索引是唯一索引、非唯一索引(如:年龄,年龄可能就是会重复)或聚簇索引
- 建立索引:
- 语句:CREATE [UNIQUE(唯一索引)] [CLUSTER(聚簇索引)] INDEX
ON ([][,[] ]…); - 不写大括号里面的索引,就是非唯一索引
- 建立唯一索引例子:
-
- 建立聚簇索引例子:
- 什么是聚簇索引:数据搜索到计算机中
-
- 删除索引:
- 语句:DROP INDEX;
- 删除索引时,系统会从数据字典中删去有关该索引的描述
- 例:删除Student表的Stusname索引
- DROP INDEX Stusname;
- 数据字典: - 和新华字典一样记录了所有数据
- 数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。
- 关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。
- 在进行查询优化和查询处理时,数据字典中的信息是其重要依据
3.4 数据查询:
<ul>语句:
- /*
- SELECT - 查询
- all - 显示所有
- distinct - 显示不同的(去重)
- from - 去哪个表查
- where - 条件
- group by - 分组
- order by - 排序
- */
- SELECT [ALL | DISTINCT ]<目标列表达式>[,<目标列表达式>]...
- FROM<表名或视图名>[,<表名或视图名>...] | (<SELECT语句>)[AS]<别名>
- [WHERE<条件表达式>]
- [GROUP BY<列名1>[HAVING<条件表达式>]]
- [ORDER BY<列名2>[ASC | DESC]]
复制代码
细节:
- 语句中的字母不分大小写
- 语句中的符号都为业务状态下的
- [ ]中的内容,不是语句必须内容,需要该功能在添加
3.4.1 单表查询:
- 什么是单表查询?只对一个表的内容进行查询
- 查询表中的若干列:
- 查询指定列:
- /*
- 查询全体学生的学号和姓名
- */
- SELECT son,sname FROM Student;
复制代码- 查询表中全部列:
- /*
- 查询全体学生的详细记录
- */
- SELECT * FROM Student;
复制代码- 选择经过计算的值:
- 作用:选出表中指定的属性列,经过计算后输出
- 格式:SELECT字语句的可以为:算数表达式、字符串常量、函数、列别名
- 例: 注意表格的名字
- 例:函数的使用,不存在列,输出到表格
- 例:别名的使用
- 选择表中的若干元组:
- 消除取值重复的行(去重):
- 两个关键字:DISTINCT(显示去重后的)和ALL(显示所有),不写关键字默认是ALL
- 例:
-
- 查询满足条件的元组:
- 通过关键字where子句实现
操作符 | 说 明 | = | 等于 | | 不等于 | != | 不等于 | </tdtd小于/td/trtrtd=/tdtd小于等于/td/trtrtd!/tdtd不小于/td/trtrtd/tdtd大于/td/trtrtd=/tdtd大于等于/td/trtrtd!> | 不大于 | BETWEEN , NOT BETWEEN | 在指定的两个值之间 ,不在指定访问的值 | IS NULL, IS NOT NILL | 为NULL的值, 不为NULL的值
| AND,OR,NOT | 并且 ,或者,反;不是
|
- 例子:比较大小
- 例子:确定范围
-
- 例子:确定集合
- 例子:字符匹配
- 例子:匹配串为含通配符的字符串
- %表示任意长度的字符串
- _ ,下斜线表示任意单个字符
- 例子:使用换码字符串将通配符转义为普通字符
- ESCAPE '' - 如:查询的字符串中有& _ 这些特殊字符时,可以通过转码让它转为字符
- 例子:涉及空值的查询
- IS NULL或IS NOT NULL, "IS" 不能用“=”代替
- 例子:多重条件查询
- AND和OR来联结多个查询条件,AND的优先级高于OR,可以用括号来改变优先级
- 有时候可以用:[NOT] IN 或 [NOT] BETWEEN ... AND ...
- 例子:ORDER BY子句(排序)
- ORDER BY 子句可以按一个或多个属性列排序
- 升序:ASC; 降序:DESC; - 默认是升序
- 空值默认是最大值
- ASC:排序列为空值的元组最后显示
- DESC:排序列为空值的元组最先显示
- 聚集函数
- COUNT ( * ) 统计元组(行)个数
- COUNT ( [ DISTINCT | ALL ] ) 统计一列中的值的个数
- SUM( [ DISTINCT | ALL ] ) 计算一列值的总和(该列必须是数组型)
- AVG( [ DISTINCT | ALL ] ) 计算一列值的平均值(该列必须是数组型)
- MAX( [ DISTINCT | ALL ] ) 求一列中的最大值
- MIN( [ DISTINCT | ALL ] ) 求一列中的最效值
- 细节:WHERE子句中不能使用聚集函数作为条件表达式,只能在SELECT和GROUPBY的HAVING子句中
- GRIOUP BY子句(分组)
- GRIOUP BY子句作用:按指定的一列或多列值分组,值相等的为一组,来细化聚集函数的作用对象
- 细节:
- 未对查询结果分组,聚集函数将作用于整个查询结果
- 对查询结果分组,聚集函数将分别作用于每个组
- 语
- HAVING语句
- GROUP BY子句分组后,可以使用HAVING语句指定筛选条件
- 细节:
- HAVING是和GROUP BY语句连在一起的,作用在分组对象中
- HAVING短句与WHERE子句的区别
- HAVING是和GROUP BY语句连在一起的,作用在分组对象中
- WHERE是作用在整个查询对象中
- 作用对象不同:WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的元组
- WHERE子句中是不能用聚集函数作为条件表达式的
3.4.2 连接查询:
<ul>等值连接与非等值连接查询:
- 连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词
等值连接:当连接运算符为=时,称为等值连接
非等值连接:所以非=符号时,称为非等值连接
细节:
<ul>连接谓词中的列名称为连接字段,并且各连接字段必须是可比的,但名字不必相同
<strong>运算符有:= > < >= 、=、 |