一、SQL概述
SQL的特点
- 综合统一
- 高度非过程化
- 面向集合的操作方式
- 以一同一种语法结构提供两种使用方法
- 语言简洁,易学易用
SQL功能 | 动词 |
数据定义 | CREATE,DROP,ALTER |
数据查询 | SELECT |
数据操纵 | INSERT,UPDATE,DELETE |
数据控制 | CRANT,REVOKE |
SQL的操作涉及到模式和外模式,涉及不到内模式
二、学生-课程数据库
本章节用学生课程数据库为例讲解sql各种操作
- 学生表:Student(Sno,Sname,Ssex,Sage,Sdept)(学号,姓名,性别,年龄,所在系)
- 课程表:Course(Con,Cname,Cpno,Ccredit),(课程号,课程名,先行课,学分)
- 学生选课表:SC(Sno,Cno,Grade),(学号,课程号,成绩)
三、数据定义
操作对象 | 创建 | 删除 | 修改 |
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
(一)模式的定义与删除
- 定义模式
CREATE SCHEMA<模式名> AUTHORIZATION<用户名>;
【注意】:能创建模式的用户拥有DBA权限,或者获得DBA授予的CREATE SCHEMA权限
定义模式实际上是定义一个命名空间,在这个空间上可以进一步定义该模式包含的数据库对象,如基本表,视图和索引等
示例: - 模式的删除
DROP SCHEMA<模式名><CASCADE|RESTRICT>
CASCADE(级联):表示在删除模式的同时把该模式中所有的数据库对象全部删除
RESTRICT(限制):表示若模式中已定义下属的数据库对象(表,视图)时,拒绝该删除语句的执行
(二)基本表的定义语句格式
CREATE TABLEV表名〉(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
[,<表级完整性约束条件>]);
列级完整性约束条件:涉及相应属性列的约束条件
表级完整性约束条件:涉及一个或多个属性列的约束条件
- 定义基本表
常用完整性约束
主码约束:PRIMARY KEY
唯一性约束:UNIQUE
非空值约束:NOT NULL
参照完整性约束
【注】主码不可为空,唯一性约束可以为空
示例: - 修改基本表
ALTER TABLE<表名>
[ADD <新列名><数据类型>[完整性约束]]
[ADD<表级完整性约束>]
[DROP <列名>[CASCADE|RESTRICT]]
[DROP <完整性约束名>[RESTRICT | CASCADE ]]
[MODIFY<列名><数据类型>];
示例: - 删除基本表
DROP TABLE<表名>
基本表删除–>数据,表上的索引都删除,视图会保留但无法引用
删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述
(三)建立与删除索引
建立索引是加快查询速度的有效手段
DBA 或表的属主根据需要建立,有些DBMS自动建立以下列上的索引
PRIMARY KEY
UNIQUE
维护索引:DBMS自动完成
使用索引:DBMS自动选择是否使用索引以及使用哪些索引
- 建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON<表名>(<列名>[<次序>][,<列名><次序>]]…);
索引可以建立在一列或多列上,各列之间用逗号分隔
用<次序>指定索引值的排列次序,升序:ASC,降序:DESC,缺省值:ASC
UNIQUE:表名此索引的每一索引值只对应唯一的数据记录
CLUSTER:聚簇索引
示例:
聚簇索引:建立这个索引后,基表中的数据也需要按照指定值得升序或降序存放
2. 删除索引
DROP INDEX<索引名>
删除索引时,系统会从数据字典中删去有关该索引的描述
四、数据查询
- 查询语句概述
语句格式
SELECT子句:指定要显示的属性列
FROM:指定查询对象(基本表或视图)
WHERE:指定查询条件
GROUP BY:对查询结果按指定列的值分组,该属性列值相等的元组为一个组,通常会在每组中用集函数
HAVING短语:筛选出只有满足指定条件的组
ORDER BY:对查询结果按照指定列值得升序或降序排序
【注】首先按WHERE筛选,然后按照GROUP BY分组,然后是HAVING。然后是ORDER BY
(一)单表查询
- 选择表中的若干列
- 查询经过计算的值
- 选择表中的若干元组
- 消除重复取值的行
用DISTINCT
如:SELECT DISTINCT Sno
FROM SC; - 查询满足条件的元组
通过WHERE来实现
1)比较大小
2)确定范围
用BETWEEN…AND…和NOT BETWEEN…AND…,其中BETWEEN后跟范围的下限,AND后跟范围的上限
例:
3)确定集合
用IN 和NOT IN
例:
4)字符匹配
用LIKE 实现 [NOT] LIKE’<匹配串>’[ESCQPE’<换码字符>’]
其中<匹配串>:指定匹配模板
当匹配模板不含通配符时,可以用=取代LIKE ,用!=或<>取代NOT LIKE - 通配符
%:代表任意长度字符串
_ 代表任意单个字符
ESCAPE 短语:后面跟换码字符,为了使字符本身含有的%与_跟通配符不冲突
例:
5)涉及空值的查询
6)多重条件查询
逻辑运算法ADN和OR可用来连接多个查询。AND的优先级高于OR,但用户可以用括号改变优先级
例:
- 对查询结果排序
用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序 (DESC)排列,默认值为升序。 - 使用集函数
COUNT(*) | 统计元组个数 |
CONUT(列名) | 统计一列中值得个数 |
SUM | 计算一列值的总和 |
AVG | 平均值 |
MAX | 最大值 |
MIN | 最小值 |
例:
5. 对查询结果分组
使用GROUP BY 子句分组
分组方法:按指定的一列或多列值分组,值相等的为一组
使用GROUP BY后,SELECT子句的列名列表后只能出现分组函数和集哈数
可以试用HAVING短语筛选出最终输出结果
HAVING与WHERE的区别:作用对象不同,WHERE作用于基表或者视图,从中选择满足条件的元组;HAVING 作用于组,从中选择满足条件的组
例: