第三章 SQL
SQL(structured Query Language)
SQL概述
SQL特点
- 综合统一。
- 高度非过程化。
- 面向集合的操作方式。
- 以同一种语法结构提供多种使用方式。
- 语言简洁易学易用。
主要版本
- SQL-89
- SQL-92 ,SQL2
- SQL-99 ,SQL3
数据库结构
SQL语言是集DDL、DML和DCL于一体的数据库语言
基本表是独立存在的表,一个关系对应一个表
存储文件由一个或多个基本表和表的一个或若干索引组成,它的逻辑结构组成了关系数据库的内模式,物理结构对用户是屏蔽的
视图是虚表,真实的数据仍存放在基表中,数据库只存放视图的定义
分号问题
- 在sql标准中是加分号
* 在程序中不加分号
* 在SQL Server中可以加,也可以不加
数据类型
常用的数据类型:
- varchar(n) 可变长度的字符串
- char(n) 固定长度的字符串
- int 整型数字,也可以写作integer
视图View
视图就是基本表的一个虚拟子表
创建视图
-- 创建一个男生视图
Create View Male as (select * from Student where Ssex='男');
--
select * from Male;
视图的更新
本质是更新基本表
SQL视图更新的可执行性
- 如果视图的select目标列包含聚集函数,则不能更新
- 如果视图的select子句使用了unique或distinct,则不能更新
- 如果视图中包括了groupby子句,则不能更新
- 如果视图中包括经算术表达式计算出来的列,则不能更新
- 如果视图是由单个表的列构成,但并没有包括主键,则不能更新
也就是说,如果当前更新视图的操作与更新基本表的操作有冲突则不能更新
对于由单一Table子集构成的视图,即如果视图是从单个基本表使用选 择、投影操作导出的,并且包含了基本表的主键,则可以更新
DDL语句
引导词:
- Create(建立)
- Alter(修改)
- Drop(撤消)
模式的定义和删除,包括定义Database,Table,View,Index,完整性约束 条件等,也包括定义对象(RowType行对象,Type列对象)
DDL通常由DBA来使用,也有经DBA授权后,由应用程序员来使用
创建Create table
创建数据库
create database 数据库名;
取决于数据库供应商
(1)MySQL的文档中指出,在物理上,模式与数据库是同义的,所以模式和数据库是一回事。
(2)但是,Oracle的文档却指出,某些对象可以存储在数据库中,但不能存储在schema中。 因此,模式和数据库不是一回事。
(3)而根据这篇SQL Server技术文章SQLServer technical article,schema是数据库SQL Server内部的一个独立的实体。 所以,他们也不是一回事。
创建表
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ]
…
[,<表级完整性约束条件> ] );
<表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
修正alter table
撤销表 drop table
drop table tablename #撤销表
drop database 数据库名
数据库的指定与关闭
指定当前数据库
use 数据库名
关闭档期那数据库
close 数据库名
DML语句
引导词:
-
Insert
-
Delete
-
Update
-
Select
各种方式的更新与检索操作,如直接输入记录,从其他Table(由SubQuery 建立)输入
各种复杂条件的检索,如连接查找,模糊查找,分组查找,嵌套查找等
各种聚集操作,求平均、求和、…等,分组聚集,分组过滤等
查询Select from
逻辑运算符用 and , or, not 来表示,
结果去重Distinct
在关系模型中要求元组不重复,但现实可以重复,也可以不重复
在Table中要求无重复元组是通过定义Primary key或Unique来保证的;
而在 检索结果中要求无重复元组, 是通过DISTINCT保留字的使用来实现的。
select distinct Cnum from SC;
结果排序order by
默认升序asc
select Score from SC order by Score desc;
结果计算
表达式
-- 查询非同龄人的年龄差
select S1.Sname as S1N , S2.Sname as S2N,S1.Sage-S2.Sage as '年龄差 '
from Student S1 ,Student S2 where S1.Sage>S2.Sage;
聚集函数
select count(*) from Student;
select max(Sage) from Student;
模糊查询 like
select * from Student where Sname like '%张%';
select * from Student where Sname like '张_';
多表联合查询 ,
如果重名可以用as来设置别名,as可省略
Select Select 列名 as 列别名 [ [, 列名 as 列别名] … ] From 表名1 as 表别名1, 表名2 as 表别名2, … Where Where 检索条件 ;
子查询
- 相关查询:主查询的表不影响子查询
- 非相关查询:主查询的表影响子查询
in
select * From Student Where Sname in ('张三','李宁');
Select Snum, Sname From Student
Where Snum in ( Select Snum From SC Where Cnum = '001' ) ;
some all
-- 找出年纪最大的
Select Sname,Sage from Student where Sage >= all(Select Sage from Student);
-- 找出年纪不是最小的
Select Sname,Sage from Student where Sage > some(Select Sage from Student);
exists
存在返回true,在找到行后立即终止查询处理,因此,可以利用EXISTS
运算符的此功能来提高查询性能。
对于主表中的每一行,子查询检查其他表中是否存在对应的行,如果有返回true
-- 找出学过数据库课程的同学的名字
select Sname from Student where exists(
select * from Course,SC where Course.Cnum=SC.Cnum and Course.Cname='数据库' and Student.Snum=SC.Snum
);
分组查询
-- 求每个学生的平均成绩
select SC.Snum,Avg(Score) as '平均分' from Student,SC where Student.Snum=SC.Snum
Group by SC.Snum;
没有包含在聚合函数或 GROUP BY 子句中的属性不能查询或在having中使用
分组过滤
select SC.Snum,Avg(Score) as '平均分' from Student,SC where Student.Snum=SC.Snum
Group by SC.Snum having avg(SC.Score)>60;
select into
SELECT *
INTO Persons_backup
FROM Person
添加insert into
删除delete from
Delete From 表名 [ Where 条件表达式] ;
更新update
DCL语句
引导词:
- Grant
- Revoke
安全性控制:授权和撤消授权
关系代数
交并差
有的DBMS不支持
-- 求学过002 或003 的学号,默认去重
select Snum from SC where Cnum='002'
UNION
select Snum from SC where Cnum='003';
select Snum from SC where Cnum='002'
UNION all
select Snum from SC where Cnum='003';
-- 求学过002和003 的学号
select Snum from SC where Cnum='002'
INTERSECT
select Snum from SC where Cnum='003';
-- 求没学过002学生的学号
select distinct Snum from SC
except
select Snum from SC where Cnum='002';
空值
空值的处理
现行DBMS的空值处理小结
- 除is[not]null之外,空值不满足任何查找条件
- 如果null参与算术运算,则该算术表达式的值为null
- 如果null参与比较运算,则结果可视为false。在SQL-92中可看成 unknown
- 如果null参与聚集运算,则除count(*)之外其它聚集函数都忽略null
连接
连接类型(四选一)
- inner join 内连接
- 即关系代数中的θ-连接
- left outer join 左外连接
- 保留左表的全部元组
- right outer join 右外连接
- full outer join 全连接
连接条件(三选一)
- natural
- 所有的公共属性相等
- on <连接条件>
- 所有的公共属性满足一定的条件
- using (Col1,Col2,···Coln)
- 部分属性
select * from Student left outer join SC on Student.Snum=SC.Snum;