一、SQL语言概述
1.1 SQL语言的功能概述
- SQL是集DDL、DML和DCL于一体的数据库语言
- SQL语言主要由以下9个单词引导的操作语句来构成,但每一种语句都能表达复杂的操作请求
- DDL语句引导词:Create(建立)、Alter(修改)、Drop(撤销)
- 模式的定义和删除,包括定义Database,Table,View,Index,完整性约束条件等,也包括定义对象(RowType行对象,Type列对象)
- DML语句引导词:Insert、Delete、Update、Select
- 各种方式的更新与检索操作,如直接输入记录,从其他Table(由SubQuery建立)输入
- 各种复杂条件的检索,如连接查找,模糊查找,分组查找,嵌套查找等
- 各种聚集操作,求平均,求和,...等,分组聚集,分组过滤等
- DCL语句引导词:Grant,Revoke
二、利用SQL语言建立数据库
2.1 课堂讲义使用的数据库


2.2 SQL-DDL
2.2.1 建立数据库
- 定义数据库和表(使用DDL)
- DDL:Data Definition Language
- 创建数据库(DB)——Create Database
- 创建DB中的Table(定义关系模式)——Create Table
- 定义Table及哥哥属性的约束条件(定义完整性约束)
- 定义View(定义外模式及E-C映像)
- 定义Index、Tablespace...等(定义物理存储参数)
- 上述各种定义的撤销与修正
- DDL通常由DBA来使用,也有经DBA授权后由应用程序员来使用
2.3 创建数据库的语句——Create Database
- 创建Database
- 数据库是若干具有相互关联联系的Table/Relation的集合
- 数据库可以看作是一个集中存放若干Table的大型文件
- create database的简单语法形式
create database 数据库名;
2.2.2 创建Table
create table 表名(列名 数据类型 [primary key|unique] [not null]
[,列名 数据类型 [not null],...]);
- “[]”表示其括起来的内容可以省略,“|”表示其隔开的两项可取其一
- Primary key:主键约束。每个表只能创建一个主键约束。
- Unique:唯一性约束(即候选键)。可以有多个唯一性约束
- Not null:非空约束。是指该列不允许有空值出现,如选择了Not null表名该列不允许有空值出现
- 语法中的数据类型在SQL标准中有定义
- 在SQL-92标准中定义的数据类型
- char(n):固定长度的字符串
- varchar(n):可变长字符串
- int:整数 // 有时不同系统也可写作integer
- numeric(p, q):固定精度数字,小数点左边p位,右边p-q位
- real:浮点精度数字 // 有时不同系统也可写作float(n),小数点后保留n位
- date:日期
- time:时间
- ...
2.3 SQL-DML
2.3.1 建立数据库
- 向表中追加元组(使用DML)
- DML:Data Manipulate Language
- 向Table中追加新的元组:Insert
- 修改Table中某些元组中的某些属性的值:Update
- 删除Table中的某些元组:Delete
- 对Table中的数据进行各种条件的检索:Select
- DML通常由用户或应用程序员使用,访问经授权的数据库
2.3.2 向表中追加元组的值——INSERT INTO
insert into 表名[(列名[,列名]...)]
values (值 [, 值]);
- values后面值的排列,须与into子句后面的列名排列一致
- 若表名后的所有列名省略,则values后的值的排列,须与该表存储中的列名排列一致
三、利用SQL语言进行简单查询
3.1 单表查询-SELECT-FROM-WHERE
select 列名 [[, 列名]...]
from 表名
[where 检索条件];
- 语义:从表名所给出的表中,查询出满足检索条件的元组,并按给定的列名及顺序进行投影显示
- 相当于:

- Select语句中的select...,from...,where...,等被称为子句,在以上基本形式上会增加许多构成要素,也会增加许多新的子句,满足不同的需求
3.2 检索条件-SELECT-FROM-WHERE
- 与选择运算
的条件con书写一样,只是其逻辑运算符用and,or,not来表示,同时也要注意运算符的优先次序及括弧的使用。书写要点是对自然语言检索条件的正确理解
3.2 检索结果之去重复记录-SELECT DISTINCT FROM-WHERE
- 结果唯一性问题:关系模型不允许出现重复元组。但现实DBMS,却允许出现重复元组,但也允许无重复元组
- 在Table中要求无重复元组是通过定义Primary key或Unique来保证的;而在检索结果中要求无重复元组,是通过DISTINCT保留字的使用来实现的。
select [distinct] 列名 [[, [distinct] 列名]...]
from 表名
[where 检索条件];
3.3 检索结果之排序-SELECT-FROM-WHERE-ORDER BY
- 结果排序问题:DBMS可以对检索结果进行排序,可以升序排列,也可以降序排列
- select语句中结果排序是通过增加order by子句实现的
select [distinct] 列名 [[, [distinct] 列名]...]
from 表名
[where 检索条件]
[order by 列名 [asc|desc]];
- 意义为检索结果按指定列名进行排序,若后跟asc或省略,则为升序;若后跟desc,则为降序
3.4 模糊查询-SELECT-FROM-WHERE * LIKE *
- 模糊查询问题:比如检索姓张的学生,检索张某某等
- 含有like运算符的表达式
select [distinct] 列名 [[, [distinct] 列名]...]
from 表名
[where [not] like “字符串”]
[order by 列名 [asc|desc]];
- 找出匹配给定字符串的字符串,其中给定字符串中可以出现%,_等匹配符
- 匹配规则:
- %:匹配零个或多个字符
- _:匹配任意单个字符
- \:转义字符
四、利用SQL语言进行多表联合查询
4.1 多表联合查询
- 多表联合检索可以通过连接运算来完成,而连接运算又可以通过广义笛卡尔积后再进行选择运算来实现
- Select 的多表联合检索语句
select 列名 [[, 列名]...]
from 表名1,表名2,...
where 检索条件;
- 相当于

- 检索条件中要包含连接条件,通过不同的连接条件可以实现等值连接、不等值连接及各种
-连接
- 多表连接时,如果连个表的属性名相同,则需采用表名.属性名方式来限定该属性是属于哪一个表
4.2 表更名与表别名
- 连接运算涉及到重名的问题,如两个表中的属性重名,连接的两个表重名(同一表的连接)等,因此需要使用别名以便区分
- select中采用别名的方式
Select 列名 as 列别名 [[, 列名 as 列别名] ...]
from 表名1 as 表别名1, 表名2 as 表别名2, ...
where 检索条件;
- 上述定义中的as可以省略
- 当定义了别名后,在检索条件中可以使用别名来限定属性
五、利用SQL语言进行增-删-改
5.1 SQL之更新操作
- 元组新增Insert:新增一个或一些元组到数据库的Table中
- 元组更新Update:对某些元组中的某些属性值进行重新设定
- 元组删除Delete:删除某些元组
- SQL-DML既能单一记录操作,也能对记录集合进行批更新操作
- SQL-DML之更新操作需要利用前面介绍的子查询(Subquery)的概念,以便处理"一些"、“某些”等
5.2 SQL之INSERT
- 元组新增Insert命令有两种形式
- 单一元组新增命令形式:插入一条指定元组值的元组
insert into 表名 [(列名[, 列名])]
values (值[, 值]...);
- 批数据新增命令形式:插入子查询结果中的若干条元组。待插入的元组由子查询给出
insert into 表名 [(列名[, 列名]...)]
子查询;
- 注意:当新增元组时,DBMS会检查用户定义的完整性约束条件等,如不符合完整性约束条件,则将不会执行新增动作
- 还可以有更复杂的“查询后插入到新表中”的语句,例如可以将中间结果存储成表
5.3 SQL之DELETE
Delete From 表名 [where 条件表达式];
- 若果where条件省略,则删除所有的元组
- 当删除元组时,DBMS会检查用户定义的完整性约束条件等,如不符合完整性约束条件,则将不会执行删除动作
5.4 SQL之UPSATE
- 元组更新Update命令:用指定要求的值更新指定表中满足指定条件的元组的指定列的值
Update 表名
Set 列名=表达式|(子查询)
[[,列名=表达式|子查询]...]
[Where 条件表达式];
六、利用SQL语言修正与撤销数据库
6.1 SQL-DDL之撤销与修改
- 修正数据库:修正数据库的定义,主要是修正表的定义
- 修正表的定义
alter table tablename
[add {colname datatype,...}] # 增加新列
[drop {完整性约束名}] # 删除完整性约束
[modify {colname datatype,...}]; #修改列定义
drop table 表名;
- 注意:SQL-delete语句只是删除表中的元组,而撤销基本表drop table的操作是撤销包含表格式、表中所有元组,由该表导出的视图等相关的所有内容,所以使用要特别注意
- 撤销数据库
drop database 数据库名;
6.2 SQL-DDL之数据库指定与关闭命令
- 有些DBMS提供了操作多个数据库的能力,此时在进行数据库操作时需要指定待操作数据库与关系数据库的功能
- 指定当前数据库
use 数据库名;
close 数据库名;