数据库标准语言——SQL(实例详解)
关系数据库标准语言——SQL
SQL概述及特点
1. SQL的主要功能(1) 数据定义功能    定义关系数据库的模式、外模式和内模式,以实现对基本表、视图以及索引文件的定义、修改和删除等操作。(2) 数据操纵功能  包括数据查询和数据更新两种数据操作语句:数据查询指对数据库中的数据查询、统计、分组、排序操作;数据更新指数据的插入、删除、修改等数据维护操作。(3) 数据控制功能  通过对数据库用户的授权和收权命令来实现有关数据的存取控制,以保证数据库的安全性。
2. SQL的特点
    1) SQL具有自含式和嵌入式两种形式。2) SQL具有语言简洁、易学易用的特点。3) SQL支持三级模式结构。 全体基本表构成了数据库的模式。 视图和部分基本表构成了数据库的外模式。 数据库的存储文件和它们的索引文件构成了关系数据库的内模式。

5.2 SQL的数据定义功能
5.2.1 基本表的定义和维护功能1. 定义基本表定义基本表语句的一般格式为:
CREATE TABLE [〈库名〉]〈表名〉(
      〈列名〉〈数据类型〉[〈列级完整性约束条件〉]  [
      〈列名〉〈数据类型〉[〈列级完整性约束条件〉]]
        [n] [,〈表级完整性约束条件〉]
      [n] )
(1) SQL支持的数据类型
(2) 列级完整性的约束条件
针对属性值设置的限制条件。
1) NOT NULLNULL约束。NOT NULL约束不允许字段值为空,而NULL约束允许字段值为空。
2) UNIQUE约束。UNIQUE约束是惟一性约束,即不允许列中出现重复的属性值。
3) DEFAULT约束。DEFAULT为默认值约束。    DEFAULT〈约束名〉〈默认值〉FOR〈列名〉
4) CHECK约束。CHECK为检查约束。CONSTRAINT〈约束名〉CHECK (〈约束条件表达式〉)
(3) 表级完整性约束条件
          涉及到关系中多个列的限制条件。1) UNIQUE约束。惟一性约束。2) PRIMARY KEY约束。定义主码,保证惟一性和非空性。
CONTRAINT〈约束名〉PRIMARY KEY [CLUSTERED]
    (〈列组〉)3) FOREIGN KEY约束。用于定义参照完整性。 CONTRAINT〈约束名〉FOREIGN KEY(〈外码〉) REFERENCES〈被参照表名〉(〈与外码对应的主码名〉)
【例5-1】建立基本表: 学生(学号,姓名,年龄,性别,所在系)        课程(课程号,课程名,先行课) 选课(学号,课程号,成绩).
        CREATE TABLE 学生(学号 CHAR(5) NOT NULL UNIQUE                            姓名 CHAR(8) NOT NULL                            年龄 SMALLINT                            性别 CHAR(2)                            所在系 CHAR(20)              DEFAULT C1 20 FOR 年龄,              CONSTRAINT C2 CHECK(性别 IN ('''')))        CREATE TABLE 课程(课程号 CHAR(5) PRIMARY KEY                            课程名 CHAR(20)                           
行课 CHAR(5))        CREATE TABLE 选课(学号 CHAR(5)                            课程号 CHAR(5)                            成绩 SMALLINT          CONSTRAINT C3 CHECK(成绩 BETWEEN 0 AND 100)          CONSTRAINT C4 PRIMARY KEY(学号,课程号)          CONSTRAINT C5 FOREIGN KEY(学号) REFERENCES 学生(学号)          CONSTRAINT C6 FOREIGN KEY(课程号) REFERENCES 课程(课程号))
2. 修改基本表和删除基本表
            ALTER TABLE〈表名〉              [ADD(〈新列名〉〈数据类型〉[完整性约束] [n])]              [DROP〈完整性约束名〉]              [MODIFY(〈列名〉〈数据类型〉[n])](1) 使用ADD子句增加新列【例5-2】向课程表中增加学时字段。    ALTER TABLE 课程 ADD 学时 SMALLINT(2) 使用MODIFY子句修改列的原定义(3) 使用DROP子句删除指定的完整性约束条件【例5-3】删除学生表中对年龄的默认值的定义。    ALTER TABLE 学生 DROP C1;删除基本表的一般格式为: DROP TABLE〈表名〉;

5.2.2 索引的定义和维护功能
1. 索引的作用1) 使用索引可以明显地加快数据查询的速度。2) 使用索引可保证数据的惟一
性。3) 使用索引可以加快连接速度。
2. 建立索引的原则1) 索引的建立和维护由DBADBMS完成。2) 大表应当建索引,小表则不必建索引。3) 对于一个基本表,不要建立过多的索引。4) 根据查询要求建索引。
3. 建立和删除索引的格式
建立格式为:CREATE [UNIQUE] [CLUSTER] INDEX〈索引名〉 ON〈表名〉(〈列名〉[〈次序〉][,〈列名〉[〈次序〉]])
删除索引格式为:    DROP INDEX 〈索引名〉;
【例5-4】为学生_课程数据库中的学生、课程和选课三个表建立索引。其中,学生表按学号升序建立索引;课程表按课程号升序建惟一索引;选课表按学号升序和课程号降序建惟一索引。CREATE UNIQUE INDEX 学号ON 基本的sql语句有哪些学生(学号)CREATE UNIQUE INDEX 课程号 ON 课程(课程号)CREATE UNIQUE INDEX 选课号 ON 选课(学号 ASC,课程号 DESC)
5.2.3 视图的定义和维护功能
1. 视图的优点1) 视图能够简化用户的操作。2) 视图机制可以使用户以不同的方式看待同一数据。3) 视图对数据库的重构提供了一定程度的逻辑独立性。4) 视图可以对机密的数据提
供安全保护。
2. 视图定义的格式一般格式为:
CREATE VIEW〈视图名〉[(列名组)]
            AS〈子查询〉        [WITH CHECK OPTION]
视图举例
【例5-6】建立计算机系学生的视图。    CREATE VIEW 计算机系学生        AS SELECT 学号,姓名,年龄            FROM 学生            WHERE 所在系=‘计算机系
【例5-7】由学生、课程和选课三个表,定义一个计算机系的学生成绩视图,其属性包括学号、姓名、课程名和成绩。 CREATE VIEW 学生成绩(学号,姓名,课程名,成绩)      AS SELECT 学生.学号,学生.姓名,课程.课程名,选课.成绩              FORM 学生,课程,选课            WHERE 学生.学号=选课.学号 AND .课程名=选课.课程号                    AND 学生.所在系='计算机系'
3. 视图的删除 、查询和维护
视图删除语句的一般格式为:    DROP VIEW〈视图名〉;
      视图可以和基本表一样被查询,其使用方法与基本表相同,但利用视图进行数据增、删、改操作,会受到一定的限制。

5.3 SQL的数据查询功能
5.3.1 SELECT语句介绍
1. SELECT语句的语法
SELECT〈目标列组〉
    FROM〈数据源〉
    [WHERE〈元组选择条件〉]
    [GROUP BY〈分列组〉[HAVING 〈组选择条件〉]]
    [ORDER BY〈排序列1〉〈排序要求1 [n]]
语法说明
(1) SELECT子句:指明目标列(字段、表达式、函数表达式、常量)。基本表中相同的列名表示为:〈表名〉.〈列名〉
(2) FROM子句:指明数据源。表间用分割。数据源不在当前数据库中,使用〈数据库名〉.〈表名〉表示。一表多用,用别名标识。定义表别名:〈表名〉〈别名〉
(3) WHERE子句:元组选择条件。
(4) GROUP BY子句:结果集分组。当目标列中有统计函数,则统计为分组统计,否则为对整个结果集统计。子句后带上HAVING子句表达组选择条件(带函数的表达式)。
(5) ORDER BY子句:排序。当排序要求为ASC时升序排序;排序要求为DESC时降序排列。
2. SELECT语句的操作符
(1) 算术操作符+(加号)、-(减号)、*(乘号)和 /(除号)。
(2) 比较操作符=(等于)、>(大于)、<(小于)、<=(小于等于)、>=(大于等于)、!=(不等于)、<>(小于大于)、!>(不大于)和 !<(不小于),共9种操作符。
(3) 逻辑操作符
(4) 组合查询操作符和其他SQL操作符
〈查询1〉〈组合操作符〉〈查询21) UNION:并查询,并在结果集中去掉重复行。2) MINUS:差查询操作。3) INTERSECT:交查询操作。4) *:取全部字段。格式为: * 或〈表名〉.*5) ALL:全部。保留重复值(有统计函数时要求计算重复值)。      格式为: ALL〈字段〉或 ALL〈字段组〉6) DISTINCT:去掉重复值。在结果集中去掉重复值,或在统计函数中不计重复值。    格式为: DISTINCT〈字段〉或 DISTINCT〈字段组〉
5.3.2 SQL的查询实例及分析
学生课程库结构为:学生(学号,姓名,年龄,所在系)
                                    课程(课程号,课程名,先行课)
                                    选课(学号,课程号,成绩).
1. 简单查询:查询过程中只涉及到一个表的查询语句。【例5-9】求数学系学生的学号和姓名。    SELECT 学号,姓名    FROM 学生    WHERE 所在系=‘数学系;【例5-10】求选修了课程的学生学号。    SELECT DISTINCT 学号    FROM 选课;
例子
【例5-11】求选修C1课程的学生学号和成绩,并要求对查询结果按成绩的降序排列,如果成绩相同则按学号的升序排列。    SELECT 学号,成绩    FROM 选课    WHERE 课程号='C1'    ORDER BY 成绩 DESC,学号 ASC
【例5-12】求选修课程C1且成绩在8090之间的学生学号和成绩,并将成绩乘以系数0.8输出。    SELECT 学号,成绩*0.8    FROM 选课    WHERE 课程号 = 'C1' AND 成绩 BETWEEN 80 AND 90
例子
【例5-13】求数学系或计算机系姓张的学生的信息。    SELECT *    FROM 学生    WHERE 所在系 IN ( ‘数学系计算机系’ ) AND 姓名 LIKE ‘%’
【例5-14】求缺少了成绩的学生的学号和课程号。    SELECT 学号,课程号    FROM 选课    WHERE 成绩 IS NULL
2. 连接查询
            连接查询中的连接条件通过WHERE子句表达,连接条件和元组选择条件之间用AND(与)操作符衔接。
(1) 等值连接和非等值连接    [〈表名1.]〈列名1〉〈比较运算符〉[〈表名2.]〈列名2〉比较运算符:=><>=<= !=;列名称为连接字段。【例5-15】查询每个学生的情况以及他()所选修的课程。    SELECT 学生.*,选课.*    FROM 学生,选课    WHERE 学生.学号=选课.学号;
例子
【例5-16】求学生的学号、姓名、选修的课程名及成绩。    SELECT 学生.学号,姓名,课程名,成绩    FROM 学生,课程,选课    WHERE 学生.学号=选课.学号 AND 课程.课程号=选课.课程 号;【例5-17】求选修C1课程且成绩为90分以上的学生学号、姓名及成绩。   
SELECT 学生.学号,姓名,成绩    FROM 学生,选课    WHERE 学生.学号=选课.学号 AND 课程号= ‘C1’ AND 成绩>90
例子
(2) 自身连接例如,课程表中的先行课是在上学期应开设的,先行课的先行课,即间接先行课应提前一学年开设。如果求查询某门课的间接先行课或全部课程的间接先行课,就需要对课程表进行自身连接。
【例5-18】查询每一门课的间接先行课。    SELECT A.课程号,A.课程名,B.先行课    FROM 课程 A,课程 B    WHERE A.先行课=B.课程号
(3) 外部连接
              左外部连接操作是在结果集中保留连接表达式左表中的非匹配记录;右外部连接操作是在结果集中保留连接表达式右表中的非匹配记录。外部连接符号为*=”,右外部连接符号为=*”。外部连接中不匹配的分量用NULL表示。
连接的结果集
【例5-19】用SQL表达职工和部门之间的内连接、左外部连接和右外部连接的语句
内连接:    SELECT 职工.*,部门名称,电话    FROM 职工,部门    WHERE 职工.所在部
= 部门.部门号;
左外部连接:    SELECT 职工.*,部门名称,电话    FROM 职工,部门    WHERE 职工.所在部门*= 部门.部门号;
右外部连接:    SELECT 职工.*,部门名称,电话    FROM 职工,部门    WHERE 职工.所在部门 =*部门.部门号;
3. 嵌套查询
(1) 使用IN操作符的嵌套查询【例5-20】求选修了高等数学的学生学号和姓名。    SELECT 学号,姓名    FROM 学生    WHERE 学号 IN ( SELECT 学号                    FROM 选课                    WHERE 课程号 IN ( SELECT 课程号                                        FROM 课程                                        WHERE 课程名='高等数学' ));该题也可以使用下面的连接查询表达。    SELECT 学生.学号,姓名    FROM 学生,课程,选课    WHERE 学生.学号=课程.学号 AND 课程.课程号=选课.课程号            AND 课程.课程名='高等数学'
(2) 使用比较符的嵌套查询
【例5-21】求C1课程的成绩高于张三的学生学号和成绩。    SELECT 学号,成绩    FROM 选课    WHERE 课程号=‘C1’ AND 成绩 > ( SELEC 成绩                                    FROM 选课
                                    WHERE 课程号=‘C1’AND 学号=                                          (SELECT 学号                                          FROM 学生                                          WHERE 姓名='张三'))
(3) 使用ANYALL操作符的嵌套查询
格式为:〈字段〉〈比较符〉[ANY|ALL]〈子查询〉
例子
【例5-22】求其他系中比计算机系某一学生年龄小的学生。    SELECT *    FROM 学生    WHERE 年龄 <ANY (SELECT 年龄                        FROM 学生                        WHERE 所在系=‘计算机系’ ) AND 所在系<>‘计算机系
【例5-23】求其他系中比计算机系学生年龄都小的学生。    SELECT *    FROM 学生    WHERE 年龄 <ALL (SELECT 年龄                      FROM 学生                      WHERE 所在系='计算机系') AND 所在系<> '计算机系'
(4) 使用EXISTS操作符的嵌套查询
【例5-24】求选修了C2课程的学生姓名。    SELECT 姓名    FROM 学生    WHERE EXISTS (SELECT *                    FROM 选课                    WHERE 学生.学号=学号 AND
程号='C2')
【例5-25】求没有选修C2课程的学生姓名。    SELECT 姓名    FROM 学生    WHERE NOT EXISTS (SELECT *                          FROM 选课                          WHERE 学生.学号=学号 AND 课程号='C2')
例子
【例5-26】查询选修了全部课程的学生的姓名。    SELECT 姓名    FROM 学生    WHERE NOT EXISTS (SELECT *                      FROM 课程                      WHERE NOT EXISTS                            (SELECT *                            FROM 选课                            WHERE 学生.学号=学号 AND
                                              课程.课程号=课程号))
例子
【例5-27】求至少选修了学号为S2”的学生所选修的全部课程的学生学号和姓名。
    SELECT 学号,姓名
    FROM 学生
    WHERE NOT EXISTS (SELECT *
                        FROM 选课 选课1
                        WHERE 选课1.学号='S2' AND NOT EXISTS
                              (SELECT *
                                FROM 选课 选课2
                                WHERE 学生.学号=选课2.学号
                                    AND 选课2.课程号=选课1.课程号)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。