数据库系统之SQL语言

数据库之SQL语言(Chapter 6 哈工大)

1. SQL语言概述

SQL语言是集DDL(数据库定义语言,用来定义数据库和数据表),DML(数据操纵语言,用于操纵数据库中的数据),DCL(数据控制语言,如设置数据的访问权限)于一体的数据库语言。

SQL语言主要由以下9个单词引导的操作语句构成:

  • DDL语句引导词:Create(建立), Alter(修改),Drop(撤销):
    • 模式的定义和删除,包括定义DataBase, Table, View, Index, 完整性约束条件等,也包括定义对象( RowType行对象,Type列对象)
  • DML语句引导词:Insert, Delete, Update, Select:
    • 各种方式的更新和检索操作,如直接输入记录,从其他Table(由SubQuery建立)输入
    • 各种复杂条件的检索,如连接查找,模糊查找,分组查找,嵌套查找
    • 各种聚集操作,求平均,求和等,分组聚集,分组过滤
  • DCL语句引导词:Grand,Revoke
    • 安全性控制:授权和撤销授权

2. 利用SQL语言建立数据库

建立一个数据库,首先定义数据库和表(使用DDL),其次向表中追加元组(使用DML)

DDL: Data Definition Language

  • 创建数据库(DB) — Create Database
  • 创建DB中的Table(定义关系模式) — Create Table
  • 定义Table及其各个属性的约束关系(定义完整性约束)
  • 定义View(定义外模式及E-C映像)
  • 定义Index,Tablespace等(定义物理存储参数)
  • 上述各种定义的撤销与修正

DDL通常由DBA来使用,也有经DBA授权后由应用程序员来使用

创建Database

  • 数据库(DataBase)是若干具有相互关联关系的Table/Relation的集合
  • 数据库可以看作是一个集中存放若干Table的大型文件
  • ***create database***的简单语法形式:
    • create database 数据库名

创建Table

  • ***create table***简单语法形式:

    • create table 表名(列名 数据类型 [primary key|Unique] [Not null]

      ​ [,列名 数据类型 [Not null], …]);

      "[]"表示其包括的内容可以省略,“|”表示其隔开的两项可取其一

    • Primary key:主键约束。每个表只能创建一个主键约束

    • Unique:唯一性约束(即候选键)。可以有多个唯一性约束

    • Not null:非空约束。是指该列是否允许有空值的出现,如选择了Not null表示该列不允许有空值出现。

    • 数据类型

      • char(n):固定长度的字符串
      • varchar(n):可变长字符串
      • int:整数 //有时不同系统也写作integer
      • numeric(p,q):固定精度数字,小数点左边p位,右边p-q位
      • real:浮点精度数字//有时不同系统也写作float(n),小数点后保留n位
      • date:日期(如2003-09-12)
      • time:时间(如23:15:003)
  • 例如:

    • 定义学生表Student
      • Create Table Student(S# char(8) not null, Sname char(10), Ssex char(2), Sage integer, D# char(2), Sclass char(6));
    • 定义课程表Course
      • Create Table Students(C# char(3) , char (12), Chours integer, Credit float(1), T# char(3) );

DML: Data Manipulation Language

  • 向table中添加新的元组:Insert
  • 修改table中某些元组中的某些属性的值:Update
  • 删除table中的某些元组:Delete
  • 对Table中的数据进行各种条件的检索:Select

向表中追加元组的值 — Insert Into

  • insert into简单语法形式:

    • insert into 表名[(列名[, 列名]…)]

      ​ values (值 [,值], …);

    • values后面值得排列,须与into子句后面得列名排列一致

    • 若表名后的所有列名省略,则values后的值的排列,须与该表存储中的列名排列一致

  • 示例:追加学生表中的元组

    • Insert Into Student

      Values(‘98030101’, ‘张三’, ‘男’, 20, ‘03’, ‘980301’);

    • Insert Into Student(S#, Sname, Ssex, Sage, D#, Sclass)

      Values(‘98030101’, ‘张三’, ‘男’, 20, ‘03’, ‘980301’);

  • 示例:追加课程表中的元组

    • Insert Into Course //列名省略,须与定义或存储的列名顺序一致

      Values(‘001’, ‘数据库’, 40, 6, ‘001’);

    • Insert Into Course(Cname, C#, Credit, Chours, T#)//列名未省略须与语句中列名顺序一致

      Values(‘数据库’, ‘001’, 6, 40, ‘001’);

3. 利用SQL进行基本查询

SQL提供了结构形式一致但功能多样化的检索语句Select

  • select 的基本语法形式:

    • Select 列名 [[, 列名]…]

      From 表名

      [Where 检索条件];

    • 语义:从表名所给出的表中,查询出满足检索条件的元组,并按给定的列名及顺序进行投影显示。

    • 相当于:Π列名,… , 列名(σ检索条件(表名))

    • Select语句中的select…,from…, where…,等被称为子句,在以上基本形式基础上增加许多构成要素,也会增加许多新的子句,满足不同的需求。

  • 示例:检索学生表中所有学生的信息

    • Select S#, Sname, Ssex, Sage, Sclass, D#

      ​ From Student;

      select * From Student;//若包含所有列,则可以用*来

  • 示例:检索学生表中所有学生的姓名及年龄

    • Select Sname, Sage //投影出某些列

      From Student;

  • 示例:检索学生表中所有年龄小于等于19岁的学生的年龄及姓名

    ​ Select Sage, Sname

    ​ From Student

    ​ Where Sage <= 19;


结果唯一性问题

关系模型中不允许出现重复元组,但现实DBMS,却允许出现重复元组,但也允许无重复元组。

  • 在Table中要求无重复元组是通过定义Primary key或Unique来保证的;而在检索结果中要求无重复元组,是通过DISTINCT保留字的使用来实现的。

  • 示例:在选课表中,检索成绩大于80分的所有学号

    • Select DISTINCT S#

      From SC

      Where Score > 80;

      //一个学号有很多大于80分的课,查询结果中会出现重复的学号,DISTINCT(去重符)过滤重复元组,只保留一份

结果排序问题

  • DBMS可以对检索结果进行排序,可以升序排列,也可以降序排列。

    • Select语句中结果排序是通过增加order by子句实现的

      order by 列名 [asc|desc]

    • 意义为检索结果按列名进行排序,若后跟asc或省略,则为升序;若后跟desc,则为降序。

  • 示例:学号由小到大的顺序显示出所有学生的学号和姓名

    ​ Select S#,Sname From Student

    ​ Order By S# ASC;

  • 检索002号课大于80分的所有同学学号并按成绩由高到低顺序显示

    ​ Select S#

    ​ From SC

    ​ where c# = ‘002’ and Score > 80

    ​ Order by score DESC;

模糊查询问题 ---- SELECT-FROM-WHERE * LIKE *

比如检索姓张的学生,检索张某某;这类查询问题,Select语句是通过在检索条件中引入运算符like来表示的

  • 含有like运算符的表达式

    ​ 列名 [not] like “字符串”

  • 找出给定字符串的字符串。其中给定字符串中可以出现%,_等匹配符

  • 匹配规则:

    • “%” 匹配零个或多个字符
    • “_” 匹配任意单个字符
    • “\” 转义字符,用于去掉一些特殊字符的特 殊含义,使其被作为普通字符看待,如用“%”去匹配字符%,用_%去匹配字符_
  • 示例:检索所有姓张的学生学号及姓名

    ​ Select S#, Sname, From Student

    ​ Where Sname Like ‘张%’;

  • 示例:检索名字为张某某的所有同学姓名

    ​ Select Sname From Student

    ​ Where Sname Like ‘张__ __’;//共四个下划线,一个汉字两个下划线

  • 示例:检索名字不姓张的所有同学

    ​ Select Sname From Student

    ​ Where Sname not Like ‘张%’;

4. 利用SQL语言进行多表联合查询

多表联合查询

多表联合检索可以通过连接运算来完成,而连接运算又可以通过广义笛卡尔积后再进行选择运算来实现。

  • Select的多表联合检索语句

    • Select 列名 [[, 列名]…]

      From 表名1, 表名2, …

      where 检索条件;

  • 相当于 Π列名,…, 列名(σ检索条件(表名1 x 表名2 x …))

  • 检索条件中要包含连接条件,通过不同的连接条件可以实现等值连接,不等值连接及各种θ-连接

示例(θ-连接之等值连接)

  • 按“001”号课成绩由高到低顺序显示所有学生姓名(二表连接)

    ​ Select Sname From Student, SC

    ​ where Student.S# = SC.S# and SC.C# = ‘001’

    ​ Order By Score DESC;

  • 多表连接时,如两个表的属性名相同,则需采用表明.属性名方式来限定该属性属于哪个表

  • 示例:按数据库课成绩由高到低顺序显示所有同学姓名(三表连接)

    ​ Select Sname From Student, SC, Course

    ​ where Student.S# = SC.S# and SC.C# = Course.C# and Course.Cname = “数据库”

    ​ Order by Score DESC;

表更名与表别名

  • 连接操作涉及到重名问题,如两个表中的属性重名,连接的两个表重名(同一表连接)等,因此需要使用别名以便区分

  • Select 中采用别名的方式

    • Select 列名 as 列别名 [[,列名 as 列别名]…]

      From 表名1 as 表别名1, 表名2 as 表别名2,…

      Where 检索条件

    • 上述定义中as可以省略

    • 当定义了别名后,在检索条件中可以使用别名来限定属性

示例:不等值连接

  • θ-连接之不等值连接

  • 示例:求有薪水差额的任意两位教师

    ​ Select T1.Tname as Teacher1, T2.Tname as Teacher2

    ​ From Teacher1 T1, Teacher T2

    ​ Where T1.Salary > T2.Salary;

  • 示例:求年龄有差异的任意两位同学的姓名

    Select S1.Sname as Stud1, S2.Sname as Stud2

    From Student S1, Student S2

    Where S1.Sage > S2.Sage;

  • 示例:求’001’号课程有成绩差的任意两位同学

    ​ Select SC1.S# as stu1, SC2.S# as stu2

    ​ From SC SC1, SC, SC2

    ​ where SC1.C# = SC2.C# and SC1.C# = ‘001’ and SC1.score > SC2.score;

多表联合查询训练

  • 示例:求既学过"001"号课又学过"002"号课的所有学生的学号

    ​ Select S1.S#

    ​ From SC S1, SC S2

    ​ where S1.S# = S2.S# and S1.C# = “001” and S2.C# = “002”;

  • 示例:求"001"号课程成绩比"002"号课成绩高的所有学生的学号

    ​ Select S1.S#

    ​ From SC S1, SC S2

    ​ where S1.S# = S2.S# and S1.C# = “001” and S2.C# = “002” and S1.score > S2.score;

  • 示例:列出没学过李明老师讲授课程的所有学生的姓名

5. 利用SQL语句进行增-删-改

你可能感兴趣的:(数据库系统概念)