数据库学习笔记3(SQL初级)

数据库学习笔记3(SQL初级)

1.SQL基础

1. SQL语言有以下几部分

  • 数据定义语言(DDL)
  • 数据操纵语言(DML)
  • 完整性(Integrity)
  • 视图定义(View definition)
  • 事务控制(Transaction control)
  • 授权(Authorization)

2.SQL数据定义

  • SQL的DDL不仅能够定义一组关系,还能够定义每个关系的信息,包括:

    • 每个关系的模式
    • 每个属性的取值类型
    • 完整性约束
    • 每个关系维护的索引集合
    • 每个关系的安全性和权限信息
    • 每个关系在磁盘上的物理存储结构
  • SQL的基本数据类型

    • char(n) 定长字符数组
    • varchar(n) 可变字符数组
    • int 整形
    • smallint 小整形
    • numeric(p,d) p位定点数,小数点后有d位
    • real,double precision 浮点数
    • float(n) 精度至少为n的浮点数
    • null 为缺失值
  • SQL的基本模式

    • creat table可以创建一个关系

    • 命令的通用形式为

    • create table r
      (A1 D1,
      A2 D2
      A3 D3
      < integrity-constraint >
      )
      

      r为关系名称,Ai是属性,Di是Ai的类型

  • SQL支持很多的完整性约束(integrity constraint)

    • primary key(Aj1 Aj2 ... Ajm ) 主码属性必须非空且唯一
    • foreign key (Aj1 Aj2 ... Ajm ) references s 这些A的属性的取值必须对应于关系s某元组在主码属性上的取值
    • not null 表明这个属性不能为空
  • 插入命令 insert into s values ("D1","D2"...),D1,D2为具体的值,s为数据表

  • 删除命令

    1. delete from r
    2. drop table r

    delete保留关系r而drop会删除模式r

  • 添加属性

    alter table r add A D
    

    r是关系的名称,A为属性 D为类型

    刚添加属性时这些新属性的取值为null

3.SQL数据查询

1.单关系查询

select a from t
  • 查找t中属性a这一列

  • 如果想要在查询时去除重复的属性,可以使用关键字 distinct

    select distinct dept_name
    from instructor
    
  • 同样,我们也可以使用all来显式的声明

  • select 还可以支持 运算符

    select salary*1.1 
    from instructor
    

    返回的值就是salary的1.1倍

  • where 可以允许我们只选出那些在from子句中满足特定关系的元组

    select name
    from instructor
    where dept_name='Comp.Sci' and salary > 70000
    

2.多关系查询

    • select 子句用来列出查询结果中所需要的属性
    • from 子句是一个查询求值中所需要访问的关系列表
    • where 子句是一个作用于from子句关系的属性上的谓词
  • select A1,A2,...,An
    from r1,r2,..,rn
    where p
    

    from中用逗号隔开的表在查询时表示查询这两个表的笛卡尔积

  • 理解关系顺序的运算可以这样理解 先是from,然后是where,最后是select

  • 一个SQL查询可以理解如下

    1. 为from子句中所列出的关系产生笛卡尔积
    2. 在步骤1的基础上应用where子句中指定的谓词
    3. 基于步骤2结果的每个元组,输出select子句中指定的属性
  • 自然连接

    select A
    from r1 natural join r2
    where P
    
  • SQL还可以指定自然连接时,需要哪些列相等

    select A
    from r1 join r2 using (A1,A2)
    

4.数据库附加运算

  • 更名运算

    利用 as 子句

    old-name as new-name

  • 字符串运算

    • SQL使用一对单引号来标示字符串,在字符串中,是大小写敏感的,而SQL语句是大小写不敏感的

    • SQL还允许字符串上有多种函数

    • 在字符串上还可以使用like操作符进行匹配

    • % (百分号)可以匹配任意子串

      _ (下划线)可以匹配任意一个字符

    • select dept_name
      from department
      where building like '%Watson%'
      
  • 排列元组的显示次序

    order by 可以让查询结果中的元组按排列顺序显示

    desc表示降序,asc表示升序,其中order by语句默认是升序的

    select *
    from instructor
    order by salary desc,name asc
    
  • where子句谓词

    SQL提供between运算符

    select name
    from instructor
    where salary between 900 and 1000
    

    5.集合运算

    • SQL作用在关系上的union,intersect和except运算对应数学集合论的∩,∪和-运算

    • 并运算

    • (select a1
      from b1
      where p1)
      union
      (select a1
      from b1
      where p1)
      
    • union运算会自动去除重复,如果我们想保留所有重复,可以用union all代替union

    • 交运算和差运算就是把上述示例的union改为对应的关键字

    6.空值

    • 如果算术表达式的任一输入为空,则该算术表达式为空

    • 涉及空值的任意比较结果为unknown

    • 涉及空值的布尔运算

      1. and

        (true and unknown) = unknown

        (false and unknown) = false
        (unknown and unknown) = unknown

      2. or

        (unknown or true) = true,
        (unknown or false) = unknown
        (unknown or unknown) = unknown

      3. not

        not unknown = unknown

    7.聚集函数

    1.基本聚集

    • 聚集函数是以值的一个集合为输入,返回单个值的函数,SQL提供了五个固有聚集函数

      1.平均值 avg

      2.最小值 min

      3.最大值 max

      4.总和 sum

      5.计数 count

    • select avg(salary) as av_salary
      from instructor
      where dept_name='Comp.Sci';
      
    • 如果我们需要删除重复元组,可在聚集表达式中使用关键字distinct

    2.分组聚集

    • 我们可以使用 group by将聚集函数作用到一组元组集上

    • select dept_name,avg(salary) as avg_salary
      from instructor
      group by dept_name;
      
    • 当SQL查询使用分组时,一个很重要的事情就是需要保证出现在select语句中但没有被聚集的属性只出现在group by 子句中的属性

    3.having子句

    • 针对group by子句构成的分组,我们可以使用having 子句,having 子句中的谓词在形成分组后才起作用

    • select dept_name,avg(salary) as avg_salary
      from instructor
      group by dept_name
      having avg(salary) > 78000
      
    • SQL关键字的执行顺序

      1.先根据from子句来计算出一个关系

      2.where子句中的谓词应用到from子句的结果上

      3.满足where谓词的元组通过group by子句形成分组

      4.having子句应用在每个分组上

      5.select子句利用剩下的分组产生出查询结果中的元组

    4.对空值的聚集

    • 除count(*)以外的所有聚集函数都忽略输入集合的空值

    8.嵌套子查询

    • with 子句

      with子句提供定义临时关系的方法

      with max_salary(value1) as(select max(salary) 
      from instructor)
      select ID
      from instructor ,max_salary
      where instructor.salary=max_salary.value1;
      
    • 标量子查询

    • 子查询只返回包含单个属性的单个元组

    1.集合的比较

    • some子句和all子句

    • select name
      from instructor
      where salary > some(select salary
                         from instructor
                         where dept_name='Biology')
      
    • some表示其中的一个元素,all表示其中的所有元素

    2.空关系测试

    • exist 可以测试一个子查询中是否存在元组
    • exist查询非空时则返回true
    • not exist表示查询结果中是否不存在元组

    3.重复元组存在性测试

    • 若查询结果中没有重复的元组,则unique则返回true值,即记录是0或1条时,返回true

    9.数据库的修改

    1.删除

    • delete子句

    • delete from r
      where p
      

    2.插入

    • insert是单个元组的插入请求

    • insert into course
      values(...)
      
      insert into instructor
      select ...
      from student
      where ...
      

    3.更新

    • update

    • update instructor
      set salary=salary*1.05
      
    • case结构

    • case
      	when pred1 then result1
      	when pred2 then result2
      	...
      	else result0
      end
      

posted @ 2022-02-28 19:29  ANewPro  阅读(83)  评论(0编辑  收藏  举报