数据库复习2——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 <table_name>(<{attribute_name type}+>);

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

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

(1)索引

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

create index <index_name> on <table_name>(<{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 ‘PB12%‘ group by d# having count(student_id) > 100;

(5)null空值

关系数据库在满足完整性约束的情况下,支持某个tuple的某个属性为null空值,它有一下特性:

  • 算术运算作用于null得到null
  • 聚合函数忽略聚合属性是null的元组
  • where子句中用is null断言某个属性是null
  • 涉及null的比较,返回一个unknown
  • unknown可以参与逻辑运算,返回值和其逻辑含义保持一致,如unknown and true = true,而unknown and false = unknown
  • 对于unknown的条件P,DBMS认为它是false的
  • 特别注意,count(*)不会忽略unknown的元组

(6)嵌入式子查询

嵌入式子查询是把select语句筛选出的结果当作中间结果,并在此基础上进一步查询的SQL语句

where attr in (subquery)是最常见的用法,比如在dept表中找出是工科院系的系编号d#,在此基础上再来统计个系人数,有以下SQL语句:

select d#, count(student_id) from student where student_id like ‘PB12%‘ and d# in (select d# from dept where type = ‘engineering‘) group by d#;

some和all限定符可以在where从句中配合关系运算符进行筛选,下面是书上最经典的例子:

找出比某些(some)经理工资还高的员工:

select ename from emp where salary > some (select salary from emp where e# in (select mgr from dept));

找出比所有(all)经理工资还高的员工:

select ename from emp where salary > all (select salary from emp where e# in (select mgr from dept));

除此之外,where从句中还可以用exists和unique做存在性和唯一性测试,例子略,配合not还可表示不存在(not exists)以及不唯一/至少两个(not unique)

注:很多DBMS也支持嵌入式子查询出现在select从句中以及from从句中

4.3 修改操作

(1)delete

删除满足条件的元组:

delete from <table_name> where P;

修改操作的花样不如查询的多,但很多高级查询语法也可以用在修改操作中,如嵌套select的in、比较运用于where子句中等

删除语句会导致数据完整性受到破坏,如删除了jcguo这个学生之后,课程成绩表中照样有jcguo的成绩,这些问题将在完整性约束中阐述

(2)insert

插入一个元组:

insert into <table_name> values (completed attr list of tuple);
or
insert into <table_name>(some attrs) values (matched partial attr list of tuple);

insert的值也可以来自于潜逃select子查询语句:

insert into <table_name>(some attrs) (select ...);

(3)update

更新操作基本SQL语法为:

update <table_name> set {attr = new attr value}+ where P;

4.4 嵌入式SQL

很多高级语言都支持SQL,多用游标+execute SQL command的接口提供给程序员(见PLSQL一章)

4.5 SQL中的函数

最后,这里简要的复习一下SQL里内置的扩展函数

需要说明的是这些函数基本上都很少用到,因为这些操作大多都交给SQL嵌入的外部高级语言去完成了,这里就列一个表,以供复习查看

(1)字符函数

函数名 函数说明
lower(attr|string value) 把属性attr或字符串字面值value转换为小写
upper(attr|string value) 把属性attr或字符串字面值value转换为大写
initcap(attr|string value) 把属性attr或字符串字面值value的首字母大写(按句处理)
concat(v1,v2) 连接两个属性attr或字符串字面值value
lpad(col|value,n,c) 左补齐v到n个字符,若c不为空则用c填充否则用空格填充
rpad(col|value,n,c) 右补齐v到n个字符,若c不为空则用c填充否则用空格填充
substr(col|value,pos,n) 截取子串,从pos其截取n位
instr(col|value,c,pos,n) 查找字符出现位置,pos是起始查找位,查找第n个出现的字符c
length(col|value) 求字符串长度

(2)数值函数

(3)日期函数

(4)转换函数

注:这一小节感觉不是很有用,就不总结了

时间: 2024-10-14 06:51:16

数据库复习2——SQL基础的相关文章

数据库复习(SQL)(转)

SQL:Structured Query Language(结构化查询语言): 数据模型:对于数据的描述方式:比如关系数据模型是用二维表来描述,层次数据模型用树来描述数据. 数据模型由三部分组成: (1)数据结构:定义数据的结构: (2)数据操作:CRUD: (3)数据约束:比如键约束.完整性约束等: 数据模型介绍 1.关系数据模型 将数据描述成二维表的形式,例如: 关系模型的特点: (1)建模方便,操作简单(SQL): (2)高效性(访问快速).易用性: (3)描述数据单一,即用表来表述数据:

复习下SQL基础知识

// 备注:这里列出一些使用频率比较高的SQL语句语法,以便他日查询和使用 SQL语句由命令.子句.运算符和统计函数组成. 一. 命令 1. 数据定义命令: CREATE: 建立新的数据表.字段和索引表: DROP: 从数据库删除数据表或索引: ALTER: 增加或修改字段属性: 2. 数据操作命令: SELECT: 找出满足条件的记录: INSERT: 增加记录或合并两个数据表: UPDATE: 更新满足条件的记录: DELETE: 删除满足条件的记录: 二. 子句 FROM: 指定数据表:

SQL基础--&amp;gt;层次化查询(START BY ... CONNECT BY PRIOR)

--====================================================== --SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR) --====================================================== 层次化查询,即树型结构查询,是SQL中经经常使用到的功能之中的一个,通常由根节点,父节点,子节点,叶节点组成,其语法例如以下: SELECT [LEVEL] ,column,ex

数据库复习10——PL/SQL

数据库复习 CH10 PL/SQL 10.1 PL/SQL简介 PL/SQL是Oracle对SQL的过程化的扩展,PL/SQL可以实现SQL相关的过程化程序,并且能够以存储过程和函数的方式让一段SQL业务逻辑驻留在SQL服务器中,以便减少客户机计算任务并减少网络I/O 10.2 PL/SQL编程基础 (1)简介 PL/SQL编程框架为: DECLARE <Variable List> BEGIN <Extented SQL Execution> EXCEPTION <Exce

[SQL] SQL 基础知识梳理(一)- 数据库与 SQL

SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 序 目录 What's 数据库 数据库结构 SQL 概要 创建表 删除和更新表 1-1 What's 数据库 1.数据库(Database,DB):将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合.如:大型-银行存储的信息,小型-电话簿. 2.数据库管理系统(Batabase Management Syste

sql基础复习

--1.while循环 declare @sum int declare @i int set @i=1 set @sum=0 while(@i<101) begin set @sum [email protected]+@i set @[email protected]+1 if(@i>90) print @i end print @sum --2.goto语句 declare @num int set @num=100 flag: print @num select @[email pro

Oracle数据库之SQL基础和分支循环

一.SQL基础语言 DECLARE --声明 a varchar2(10); --变量或对象 BEGIN a:='小明';-- := 表示给一个变量赋值 dbms_output.put_line(a); --输出用 dbms_output.put_line() END; 二.分支 DECLARE --声明 A NUMBER(10); B NUMBER(10); BEGIN A := 2; B := 3; IF A < B THEN DBMS_OUTPUT.PUT_LINE('a小于b'); EL

收集Oracle数据库中的SQL基线信息(一)基础信息收集

Oracle数据库中的SQL基线信息,当数据库出现性能问题时,在业务无法提供相应业务信息时,通过对比SQL基线信息来查找SQL的变化. 查找数据库一天内运行次数大于5000次的sqlid select sql_id,sum(EXECUTIONS_DELTA)from dba_hist_sqlstat a,dba_hist_snapshot b where a.snap_id=b.snap_id and a.INSTANCE_NUMBER=b.INSTANCE_NUMBER and to_char

数据库复习5——安全性

数据库复习 CH7 安全性 7.1 数据库安全性介绍 如果说完整性是针对授权用户的数据库保护措施,那么安全性就是针对非授权用户的数据库保护措施 安全性问题涉及的层面很多,非法用户可以从以下各层面对数据库的窃取或篡改: 层面 窃取或篡改行为 应对措施 数据库系统 获取高级用户数据库权限 身份验证,权限和可获取数据对等 操作系统 获取操作系统root权限想干啥就能干啥,不仅仅限于对数据库的操作了 提升操作系统安全级别 网络 通过网络窃听和身份伪装也能窃取线上机密数据 身份验证和加密传输 物理 物理上