一、SQL概述

SQL的特点

  1. 综合统一
  2. 高度非过程化
  3. 面向集合的操作方式
  4. 以一同一种语法结构提供两种使用方法
  5. 语言简洁,易学易用

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表名〉(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
[,<表级完整性约束条件>]);
列级完整性约束条件:涉及相应属性列的约束条件
表级完整性约束条件:涉及一个或多个属性列的约束条件

  1. 定义基本表
    常用完整性约束
    主码约束:PRIMARY KEY
    唯一性约束:UNIQUE
    非空值约束:NOT NULL
    参照完整性约束
    【注】主码不可为空,唯一性约束可以为空
    示例:
  2. 修改基本表
    ALTER TABLE<表名>
    [ADD <新列名><数据类型>[完整性约束]]
    [ADD<表级完整性约束>]
    [DROP <列名>[CASCADE|RESTRICT]]
    [DROP <完整性约束名>[RESTRICT | CASCADE ]]
    [MODIFY<列名><数据类型>];
    示例:
  3. 删除基本表
    DROP TABLE<表名>
    基本表删除–>数据,表上的索引都删除,视图会保留但无法引用
    删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述

(三)建立与删除索引

建立索引是加快查询速度的有效手段

DBA 或表的属主根据需要建立,有些DBMS自动建立以下列上的索引
PRIMARY KEY
UNIQUE
维护索引:DBMS自动完成
使用索引:DBMS自动选择是否使用索引以及使用哪些索引

  1. 建立索引
    CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
    ON<表名>(<列名>[<次序>][,<列名><次序>]]…);
    索引可以建立在一列或多列上,各列之间用逗号分隔
    用<次序>指定索引值的排列次序,升序:ASC,降序:DESC,缺省值:ASC
    UNIQUE:表名此索引的每一索引值只对应唯一的数据记录
    CLUSTER:聚簇索引
    示例:

SQLite数据库的学生信息管理系统 sql学生课程数据库_SQLite数据库的学生信息管理系统


聚簇索引:建立这个索引后,基表中的数据也需要按照指定值得升序或降序存放

2. 删除索引

DROP INDEX<索引名>

删除索引时,系统会从数据字典中删去有关该索引的描述

四、数据查询

  • 查询语句概述
    语句格式

    SELECT子句:指定要显示的属性列
    FROM:指定查询对象(基本表或视图)
    WHERE:指定查询条件
    GROUP BY:对查询结果按指定列的值分组,该属性列值相等的元组为一个组,通常会在每组中用集函数
    HAVING短语:筛选出只有满足指定条件的组
    ORDER BY:对查询结果按照指定列值得升序或降序排序
    【注】首先按WHERE筛选,然后按照GROUP BY分组,然后是HAVING。然后是ORDER BY

(一)单表查询

  1. 选择表中的若干列
  • 查询经过计算的值
  1. 选择表中的若干元组
  • 消除重复取值的行
    用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,但用户可以用括号改变优先级
    例:
  1. 对查询结果排序
    用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序 (DESC)排列,默认值为升序。
  2. 使用集函数

COUNT(*)

统计元组个数

CONUT(列名)

统计一列中值得个数

SUM

计算一列值的总和

AVG

平均值

MAX

最大值

MIN

最小值

例:

SQLite数据库的学生信息管理系统 sql学生课程数据库_sql_02


5. 对查询结果分组

使用GROUP BY 子句分组

分组方法:按指定的一列或多列值分组,值相等的为一组

使用GROUP BY后,SELECT子句的列名列表后只能出现分组函数和集哈数

可以试用HAVING短语筛选出最终输出结果

SQLite数据库的学生信息管理系统 sql学生课程数据库_sql_03


HAVING与WHERE的区别:作用对象不同,WHERE作用于基表或者视图,从中选择满足条件的元组;HAVING 作用于组,从中选择满足条件的组

例:

SQLite数据库的学生信息管理系统 sql学生课程数据库_数据_04