第三章:SQL
3.1 概述
1.SQL: Structured Query Language
2.特点
一体化:
①集DDL,DML,DCL于一体
②单一的结构----关系,带来了数据操作符的统一
面向集合的操作方式:一次一集合
高度非过程化:用户只需提出“做什么”,无须告诉“怎么做”,不必了解存取路径
两种使用方式,统一的语法结构:SQL既是自含式语言,又是嵌入式语言
语言简洁,易学易用
3.SQL组成:
①数据定义语言(DDL)
②数据操纵语言 (DML)
③数据控制语言(DCL)
④事务控制(Transaction Control)
⑤嵌入式SQL和动态SQL(Embedded SQL and Dynamic SQL)
4.SQL语言对大小写不敏感!
3.2 SQL数据定义功能
1.
2.基本数据类型:
3.基本表的定义:
格式:
比如:
接下来这个例子是将外键和主键进行了重命名,如果不这样做的话编译能过但是用起来会很麻烦,DBMS会自动为其分配名字(比较奇怪):
这里的pk_sc和fk_scs就是重命名了
4.常用完整性约束:
PRIMARY KEY与 UNIQUE的异同?
→PRIMARY KEY:约束数据唯一和非空
UNIQUE:约束数据唯一
5.表空间:
→表空间是数据库的逻辑划分,一个表空间只能属于一个数据库,一个数据库可以拥有多个表空间,表空间分为系统表空间和用户定义的表空间
→一个表空间可以包含多个表,一个表只能属于一个表空间
注意这两点的区别!
Example:
6.表的属主(Owner):
→每个数据库对象都有自己的属主(Owner),表也有自己的属主(Owner) 。数据库对象的默认属主(Owner)是创建该对象的用户。
→属主(Owner)拥有表的所有权限。
7.修改表:
(注意:修改列的长度时,只能改长,不能改短)
Attention:alter table T add location char(30) not null;
这个语句在执行的时候,只有空表没报错QAQ
8.删除属性列:
9.删除表中的约束:
alter table 表名 drop constraint 约束名
10.索引:
目的:大部分的查询只涉及数据库中的少量数据,建立索引是加快查询速度的有效手段
基本格式:
索引的删除:
索引的有关说明:
①可以动态地定义索引,即可以随时建立和删除索引
②不允许用户在数据操作中指定索引,索引如何使用完全由DBMS决定
③应该在使用频率高的、经常用于连接的列上建索引
④索引实现:B+树,散列(hash)
⑤一个表上可建多个索引。索引可以提高查询效率,但索引过多耗费空间,且降低了插入、删除、更新的效率
3.3 SQL数据查询基本结构
1.基本结构:
等价于:
语句格式:
其中,
SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
HAVING短语:筛选出只有满足指定条件的组
ORDER BY子句:对查询结果按指定列值的升序或降序排序
2.目标列形式:
可以为列名,* ,算术表达式,聚集函数
*就是“所有的信息”
3.select语句:
执行这个语句后,表的属性名就是tname和sal*0.95
4.重复元组的处理:
若要去掉重复元组,可用关键字distinct或unique指明
5.from语句:
from子句列出查询的对象表,当目标列取自多个表时,在不混淆的情况下可以不用显式指明来自哪个关系
相当于表的笛卡尔积,不是自然连接
6.常用查询条件:
7.更名运算:
8.元组变量:
9.匹配规则:
如果想匹配\,则可以用\
10.SQL正则表达式:
REGEXP_LIKE(匹配)
REGEXP_INSTR (包含)
REGEXP_REPLACE(替换)
REGEXP_SUBSTR(提取)
示例:
11.元组显示顺序:
order by 列名 [asc | desc]
当元组中含有空值时:
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示
12.集合操作:
集合并:union
集合交:intersect
集合差: except(minus)
集合操作自动去除重复元组,如果要保留重复元组的话,必须用all关键词指明
13.聚集函数:
14.分组命令:
group by 列名 [having 条件表达式]
group by将表中的元组按指定列上值相等的原则分组,然后在每一分组上使用聚集函数,得到单一值
having则对分组进行选择,只将聚集函数作用到满足条件的分组上,从关系代数角度来看,having是在分组之后进行的选择运算
15.where和having的异同:
相同:二者均是选择运算
不同:二者的作用对象不同,where的作用对象是元组,having的作用对象是分组
16.空值测试:
注意事项
①除is [not] null之外,空值不满足任何查找条件
②如果null参与算术运算,结果为null
③如果null参与比较运算,结果为null,按照false处理
④如果null参与聚集运算,除count(*)之外其它聚集函数都忽略null
3.4嵌套子查询
1.成员资格判断:
2.子查询不能使用order by语句
3.不相关子查询和相关子查询的区别在于,元组变量的作用域不同
4.当能确切知道内层查询返回单值时,可用比较运算符。
5.some/all子查询(每次都忘!)
感觉会用这个子查询能减少很多SQL语句和临时视图的出现,而且SQL语句也更加直观!
some——表达式的值至少与子查询结果中的一个值相比满足
all——表达式的值与子查询结果中的所有的值相比都满足
6.SOME与ALL与聚集函数的对应关系
7.测试是否为空关系
in和exists的区别:in后的子查询与外层查询无关,每个子查询执行一次,而exists后的子查询与外层查询有关,需要执行多次,称之为相关子查询。
8.对于EXISTS而言:
若子查询结果非空集,exists返回真值
若子查询结果为空集,exists返回假值
9.首先取外层查询中关系的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果集合中;然后再取外层关系的下一个元组;重复这一过程,直至外层关系全部检查完为止。
10.“全部” 的概念在sql中的三种书写方法:
11.测试集合是否存在重复元组
如果子查询结果中没有重复元组,则返回true
12.With子句提供定义一个临时视图的方法,这个定义只对于with子句出现的那条查询有效。(挺少用的感觉)
3.5SQL的数据修改功能
1.插入
2.
3.删除操作
从表中删除符合条件的元组,如果没有where语句,则删除所有元组。
4.更新操作
老师PPT比之前发的这版多一些内容……
END