SQL语言是集DDL、DML、DCL于一体的数据库语言。
DDL语句引导词:Create(建立)、Alter(修改)、Drop(撤销)。
模式的定义和删除,包括定义Database, Table,View,Index,完整性约束条件等,也包括定义对象(RowType行对象,Type列对象)
DML语句引导词:Insert,Delete,Update,Select
各种方式的更新与检索操作,如直接输入记录,从其他Table(由SubQuery建立)输入。
各种复杂条件的检索,如连接查找,模糊查找,分组查找,嵌套查找等。
各种聚集操作,求平均、求和、…等,分组聚集,分组过滤等。
DCL语句引导词: Grant,Revoke
安全性控制:授权和撤消授权
定义数据库和表(使用DDL),向表中追加元组(使用DML)。
简单语法形式:create database 数据库名;
简单语法形式:create table 表名(列名 数据类型[Primary key|Unique] [Not null][,列名数据类型[Not null] ,...]);
“[]”表示其括起的内容可以省略,“|”表示其隔开的两项可取其一。
语法中的数据类型在SQL标准中有定义
简单语法形式:insert into 表名[(列名[列名]...] values(值[,值],.….);
values后面值的排列,须与into子句后面的列名排列一致.
若表名后的所有列名省略,则values后的值的排列,须与该表存储中的列名排列一致.
简单语法形式:Select 列名 [,列名].….] From 表名 [ Where 检索条件];
语义:从表名所给出的表中,查询出满足检索条件的元组,并按给定的列名及顺序进行投影显示。
Select语句中的select … , from… , where…,等被称为子句,在以上基本形式基础上会增加许多构成要素,也会增加许多新的子句,满足不同的需求。
结果唯一性问题:关系模型不允许出现重复元组。但现实DBMS,却允许出现重复元组,但也允许无重复元组。
在Table中要求无重复元组是通过定义Primary key或Unique来保证的;而在检索结果中要求无重复元组,是通过DISTINCT保留字的使用来实现的。
示例∶在选课表中,检索成绩大于80分的所有学号
select S# From sc Where Score > 80;
// 有重复元组出现,比如一个同学两门以上课程大于80
Select DISTINCT S# From sc Where score > 80;
// 重复元组被DISTINCT过滤掉,只保留一份
Select语句中结果排序是通过增加order by子句实现的:order by 列名 [asc | desc]
意义为检索结果按指定列名进行排序,若后跟asc或省略,则为升序;若后跟desc,则为降序。
示例:按学号由小到大的顺序显示出所有学生的学号及姓名:
Select S#, Sname From Student Order By S# ASC ;
示例:检索002号课大于80分的所有同学学号并按成绩由高到低顺序显示:
Select S# From sc Where C# =‘002’and Score > 80 Order By Score DESC ;
含有like运算符的表达式:列名 [not] like “字符串”
找出匹配给定字符串的字符串。其中给定字符串中可以出现%, _等匹配符.
匹配规则:
示例:检索所有姓张的学生学号及姓名
Select S#, Sname From Student Where Sname Like ‘张%’;
示例:检索名字为张某某的所有同学姓名
Select Sname From Student Where Sname Like ‘张_ _’;
示例:检索名字不姓张的所有同学姓名
Select Sname From Student Where Sname Not Like ‘张%’;
多表联合检索可以通过连接运算来完成,而连接运算又可以通过广义笛卡尔积后再进行选择运算来实现。
Select的多表联合检索语句:Select 列名 [[列名].….] From 表名1, 表名2,…. Where 检索条件;
检索条件中要包含连接条件,通过不同的连接条件可以实现等值连接、不等值连接及各种θ-连接
示例:按“001”号课成绩由高到低顺序显示所有学生的姓名(二表连接)
Select Sname From Student, sc Where Student.S# = sc.s# and sC.C# =‘001’ Order By Score DESC;
多表连接时,如两个表的属性名相同,则需采用 表名.属性名 方式来限定该属性是属于哪一个表
示例:按‘数据库’课成绩由高到低顺序显示所有同学姓名(三表连接)
Select Sname From Student, sC, Course Where Student.S# = sc.s# and sC.c# = Course.C# and Cname =‘数据库’ Order By Score DESC;
连接运算涉及到重名的问题,如两个表中的属性重名,连接的两个表重名(同一表的连接)等,因此需要使用别名以便区分。
select中采用别名的方式:Select 列名 as 列别名 [[列名 as 列别名]...] From 表名1 as 表别名1, 表名2 as 表别名2, … Where 检索条件;
上述定义中的as可以省略
当定义了别名后,在检索条件中可以使用别名来限定属性
示例:求有薪水差额的任意两位教师
Select T1.Tname as Teacher1,T2.Tname as Teacher2 From Teacher T1,Teacher T2 Where T1.Salary > T2.Salary;
示例:求年龄有差异的任意两位同学的姓名
Select S1.Sname as Stu1, S2.Sname as Stu2 From Student S1, Student s2 Where S1.Sage > s2.Sage ;
元组新增 Insert 命令有两种形式
insert into 表名 列名 [,列名].….)] values (值 [,值].….);
insert into 表名 [列名[,列名].….)] 子查询;
示例:单一元组新增
Insert Into Teacher (T#,Tname, D#, Salary) Values ("005", “阮小七”, "03", “1250");
Insert Into Teacher Values ("006”,“李小虎”,“03", “950");
示例:批元组新增
新建立Table: St(S#, Sname),将检索到的满足条件的同学新增到该表中:
Insert Into st (S#, Sname) Select S#, Sname From Student Where Sname like ‘%伟’;
lnsert Into St (s#, Sname) Select S#, Sname From Student Order By Sname;
元组删除Delete命令:删除满足指定条件的元组:Delete From 表名 [ Where 条件表达式 ];
如果Where条件省略,则删除所有的元组。
示例:删除SC表中所有元组
Delete From sc ;
示例:删除98030101号同学所选的所有课程
Delete From sC Where s# =‘98030101’;
示例:删除自动控制系的所有同学
Delete From Student Where D# in (Select D# From Dept Where Dname = ‘自动控制);
元组更新Update命令:用指定要求的值更新指定表中满足指定条件的元组的指定列的值
Update 表名 Set 列名 = 表达式 | (子查询) [ [,列名=表达式|(子查询)]….] Where 条件表达式];
如果Where条件省略,则更新所有的元组。
示例:将所有教师工资上调5%
Update Teacher Set Salary = Salary * 1.05 ;
示例:将所有计算机系的教师工资上调10%
Update Teacher Set Salary = Salary * 1.1 Where D# in (Select D# From Dept Where Dname=‘计算机);
修正数据库的定义,主要是修正表的定义
修正基本表的定义:
alter table tablename [add {colname datatype,…}] [drop {完整性约束名) [modify {colname datatype,.…]]
// 增加新列 删除完整性约束 修改列定义
示例:在学生表Student(S#,Sname,Ssex,Sage,D# ,Sclass)基础上增加二列Saddr, PID
Alter Table Student AddSaddr char[40],PID char[18];
示例:将上例表中Sname列的数据类型增加两个字符
Alter Table student Modify Sname char(10) ;
示例:删除学生姓名必须取唯一值的约束
Alter Table student Drop Unique( Sname );
撤消基本表:drop table 表名
示例:撤消学生表Student
Drop Table Student;
注意,SQL-delete语句只是删除表中的元组,而撤消基本表drop table的操作是撤消包含表格式、表中所有元组、由该表导出的视图等相关的所有内容。
撤消数据库:drop database 数据库名;
示例:撤消SCT数据库
Drop database SCT;
指定当前数据库:use 数据库名;
关闭当前数据库:close 数据库名;