设为首页 加入收藏

TOP

数据库复习2――SQL基础(一)
2015-07-24 10:25:18 来源: 作者: 【 】 浏览:1
Tags:数据库 复习 SQL 基础

数据库复习">数据库复习

CH4 SQL

SQL(Structured Query Language,结构化查询语言)是通用的关系数据库系统操作语言,下面从几个方面来复习SQL基础

4.1 DDL

SQL语句可根据其操作性质分成三类:

DDL(Data Definition Language) DCL(Data Constraint Language) DML(Data Manipulation Language)

DCL完成完整性和安全性的约束,也可以看作从属于DDL,下面介绍DCL除外的DDL部分SQL语句

DDL可以定义三种结构:表、视图和索引,视图view将在后面专门章节中介绍

SQL建表的语句很简单:

create table (<{attribute_name type}+>);

创建表的时候attribute list中除了可以建表以外也可以声明Key、添加约束等等(见完整性)

create table很简单,下面主要复习一下索引index

(1)索引

索引是加快检索表中数据的一种结构,索引由用户创建但并且DBMS使用(使用对用户透明),下面是创建普通索引的SQL语句:

create index  on (<{attribute_name}+>);

对表student的属性student_id创建了索引,那么在查询student_id=PB12210134时,不用遍历整张表而是通过索引以及索引优化过的查找算法快速查找

可以把索引看成是经过数据结构优化了的键值对表,键是属性的值如上面的学号PB12210134,而值是指向表中tuple的指针,通过一些优化(如hash)可以加速键值对的查找

索引可以分成4类:

普通索引 唯一索引 主键索引 聚簇索引

唯一索引,create unique index ...,不允许表中任意两行具有相同的值,一般我们不直接创建唯一索引,而是通过声明主键来隐式地创建唯一索引的特例――主键索引

主键索引是创建主键时,DBMS自动创建的索引,和唯一索引以及主键定义(见完整性)一样,不允许表中任意两行具有相同的主键

聚簇索引是一种“物理索引”,它让元组在物理存储的顺序尽量按照索引值的顺序排布,那么在查询时能够有效的降低I/O时间,创建聚簇索引:create cluster index ...

需要注意的是,索引并不是百利而无一害的:

创建索引需要消耗时间,和数据量成正比 存储索引需要占用物理空间,建立聚簇索引物理空间需求更大 当对表中数据添加、修改和删除时需要动态维护索引,降低数据维护时间

4.2 基础查询

SQL基础查询语句的语法是:

select A1,A2,...,An from t1,t2,...,tm where P;

(1)select从句

select从句列出了查询所需求的属性(SQL是大小写不敏感的),select完成Project操作(见数据库复习1)

DBMS不会清除冗余数据,如果需要select出的属性没有重复项需要声明关键字distinct:select distinct a1 from t1

select时可以对属性做操作,如对数值属性做加减乘除操作等

(2)where从句

where从句列出了对关系中属性的断言,其作用是选出满足需求条件的属性,where完成Restrict操作

where从句跟出的条件P可以是用逻辑连接词and、or和not连接的复合条件,关系运算符可以是=、~=,也可以是数值比较的大小(等)于,如以下语句:

select name from student where department = 'computer science' and age > 20;

一种特殊的where从句是between A and B从句,表示大于等于A且小于等于B,并不常用

(3)from从句

from从句列出select语句要扫描的关系/表,从句中有多张表时往往和where语句配合完成Join操作:

select * from student, dept where student.d# = dept.d#;

这句SQL讲以d#作为连接点Join学生表和院系表

from多个表时我们经常使用重命名来区分重名属性或为了简写表达,属性和表名都可以用as关键词进行重名,如:

select s.name as sname, d.name as dname from student as s, dept as d where s.d# = d.d#;

C.J.Date在书中把关系的重命名又叫做元组变量(Tuple Variables)

4.3 高级查询

select from where是最基本的SQL查询语句,在此基础上SQL还支持各种各样的高级扩展查询操作

(1)串操作

where条件中可以使用like关键字配合串匹配来设定条件,SQL支持两个匹配符:

%百分号:百分号匹配任何字串(通配符) _下划线:下划线匹配任意但字符

比如可以利用串匹配操作选出USTC12级的同学:

select name from student where student_id like 'PB12%';

串操作还有很多,如连接、大小写转换、求字符串长度、截取子串等等(并不是很常用)

(2)排序

SQL分配关键词order by来支持对select出的结果排序,可以指定升序asc或降序desc,默认是升序排列

举一个USTCCS12级班上同学分配保研名额需要GPA排倒序的例子:

select name, GPA from student where student_id like 'PB12%' and d# = '011' order by GPA desc;

(3)集合操作

SQL支持以下三种集合操作对select语句产生中间结果进行再次加工:

union求并集 intersect求交集 except求差集

集合操作自动排重,并且union不会在意属性的type是否吻合,仅仅只需要保证union属性数相等即可,如以下一个奇怪的union:

(select name, student_id from student) union (select d#, name from dept) 

这句话是可以执行的,得到的表头是name和student_id,但表中有院系的(d#, name)元组

(4)聚合函数

聚合函数是对select出的结果的某一个属性的全部值做操作,SQL支持一下五种聚合操作:

avg求平均值 min求最小值 max求最大值 sum求和 count求个数

比如统计USTCCS12级班上有多少个从EE转来的同学:

select count(*) from student where d# = '011' and student_id like 'PB1221%';

(PS:答案是三个)

聚合函数还有一个特殊操作group by分组,通过group by属性划分的分组来统计聚合函数值,如以下我们统计12级每个系的人数:

select d#, count(student_id) from student where student_id like 'PB12%' group by d#;

注意group by的属性,必须出现在select的属性当中

使用了group by从句的SQL语句还可以添加分组后筛选条件:having从句,需要注意的

having从句是分组后执行,而where从句是分组前执行 having从句只能对聚合函数做出限制条件,而where语句不能对聚合函数做出限制条件

例如下面统计12级每个系人数超过100人的系的SQL语句:

select d#, count(student_id) from student where student_id like '
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SQL系列-SQL语句优化个人总结 下一篇How to backup and restore datab..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)
·MySQL 数据类型:从 (2025-12-26 18:20:03)
·Linux Shell脚本教程 (2025-12-26 17:51:10)
·Qt教程,Qt5编程入门 (2025-12-26 17:51:07)