2018-02-07 20:41:39

一、DBMS的用户接口

  1. 查询语言
  2. 访问DBMS的访问工具(GUI)
  3. API
  4. 相关类库

二、SQL语言

SQL语言可以细分为四种:

1、Data Definition Language (DDL):用来定义,删除或者修改数据模式;

2、Query Language (QL):查询语言

3、Data Manipulation Language (DML):对数据进行插删改操作

4、Data Control Language (DCL):对权限的设置

SQL语言中的一些重要的术语:

1、Base table:基表,就是实实在在存储在磁盘上的关系。

2、View:视图,就是一种虚表,是由基表生成的表。

3、Data type supported:数据类型,各种数据库之间数据类型还是有所差异的。

4、NULL:关键字,空值。由于引入了空值所以布尔表达式变成的三值逻辑,即真假和不知道。

5、UNIQUE:关键字,说明某个属性的值不允许重复。

6、DEFAULT:关键字,为某个属性指定缺省值。

7、PRIMARY KEY:主键

8、FOREIGN KEY:外键

9、CHECK (Integration Constraint):关键字,检查,对某个属性的值进行约束。

一些实例表,下面的举例中会使用到:

三、查询语言(Query Language)

1)基本查询语句

从概念上讲,一条这样的查询语句在DBMS里的执行过程是:首先将FROM子句中涉及到的表进行笛卡尔乘积;其次使用WHERE中的布尔表达式进行筛选;接着将筛选出的表根据SELECT子句中的需要的属性进行投影,将不需要的属性去除掉;最后如果加了DISTINCT,则再进行去重。

举个例子:

别名(Range Variables)的使用问题,在不引起混淆的前提下可以不使用别名。不过建议使用别名,尽量规范的写全。

2)表达式和模糊查询

在SELECT子句中可以使用表达式运算,并将运算结果通过‘=’,AS进行属性名的定义;另外,在WHERE子句中可以使用LIKE子句进行字符串的模糊匹配。

3)集合操作,并交差

4)嵌套查询

一种比较简单的嵌套查询是非关联嵌套,理解起来可以类似遍历的理解,对每个外层的tuple,对里层进行结果进行比较:

稍微复杂一点的是关联嵌套,理解起来类似双重循环:

这里用了一些集合的比较操作的关键字,例如EXISTS(Set为非空则为真值,否则为假)。

可以使用嵌套查询重写上文中的INSECTION交集操作,尤其是当查找的结果不是主键的时候使用嵌套操作是有其优越性的。

使用嵌套查询实现除法操作

Solution 1:否定之否定,该水手没有预订的船是不存在的,证明该水手预订了所有的船。

Solution 2:不使用EXCEPT语句也可以实现,基本逻辑是针对一条船,如果不存在一条记录说明该水手预订了这条船,则该水手没有预订这条船,如果这种船不存在的话,那么就可以说明该水手预订了所有的船。

5)聚集函数

COUNT (*):统计一个关系里有多少元组

COUNT ( [DISTINCT] A):统计关系中属性A的值

SUM ( [DISTINCT] A):对A属性的值进行求和

AVG ( [DISTINCT] A):对A属性的值求平均值

MAX (A):对A属性的值求最大值

MIN (A):对A属性的值求最小值

[A is single column]

6)完整的查询语句带有 GROUP BY  和  HAVING

从概念上讲,一条这样的查询语句在DBMS里的执行过程是:首先将FROM子句中涉及到的表进行笛卡尔乘积;其次使用WHERE中的布尔表达式进行筛选;接着按照GROUP BY中的grouping-list根据分组值相等的条件分组;然后使用HAVING子句对组进行筛选,将不符合条件的组筛去;最后按SELECT中的要求进行计算,每一个组得到一条结果元组。因此SELECT子句中的属性和HAVING子句中出现的属性对每个组得是单一的,SQL在文法上要求,这两个子句的属性必须是group-list的子集。

举个例子:

另外,需要注意的是聚集函数是不能嵌套使用的。对于下例,我们可以先生成一张对照表简化求解。

7)NULL空值问题

* 对NULL做加减乘除等运算操作,结果均为NULL

* 在默认情况下,对null进行比较(大于,等于,小于)的结果均为false

* 在使用聚集函数时会自动跳过null值(除了 count(*))

* 在布尔表达式中,如果包含null,如果另一个值能唯一确定结果则输出结果,若不能,结果为null

* 对NULL值需要特别处理,可以使用IS NULL , IS NOT NULL进行判断是否为空值

四、SQL的新特性

  • CAST表达式

就是进行类型强转,在修改精度,对NULL赋值类型时很有作用。

  • CASE表达式

类似C++中的switch-case,可以进行选择处理。

  • 子查询

子查询可以分为三种:

1)标量子查询:查询结果只有一个值。凡是可以出现value的地方都可以出现标量子查询。

2)表表达式子查询:查询结果为一个表,本质上是一种临时表,根据sql文法,可以出现表的地方都可以使用表表达式。

3)公共表表达式子查询:对同一子查询要使用多次,可以进行合并成公共表。

使用WITH子句可以定义一个公共表表达式,即实现定义一次,多次使用。本质上是一种临时视图。

  • 外连接

  • 递归查询

递归查询是指在公共表表达式CTE中自己调用自己的查询。

CTE的递归查询必须满足三个条件:初始条件,递归调用表达式,终止条件

递归查询至少包含两个子查询:

  1. 第一个子查询称作定点(Anchor)子查询:定点查询只是一个返回有效表的查询,用于设置递归的初始值;
  2. 第二个子查询称作递归子查询:该子查询调用CTE名称,触发递归查询,实际上是递归子查询调用递归子查询
  3. 两个子查询使用union all,求并集;

递归查询没有显式的递归终止条件,只有当递归子查询返回空结果集(没有数据行返回)或是超出了递归次数的最大限制时,才停止递归。

数据库原理及应用-用户接口及SQL查询语言(Query Language)的更多相关文章

  1. JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language

    JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据 ...

  2. SQL Structured Query Language(结构化查询语言) 数据库

    SQL是Structured Query Language(结构化查询语言)的缩写. SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要发出“做什么”的命令,“怎么 ...

  3. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  4. SQL Server数据库中还原孤立用户的方法集合

    虽然SQL Server现在搬迁的技术越来越多,自带的方法也越来越高级. 但是我们的SQL Server在搬迁的会出现很多孤立用户,微软没有自动的处理. 因为我们的数据库权限表都不会在应用数据库中,但 ...

  5. (4.21)SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    转自:指尖流淌 http://www.cnblogs.com/zhijianliutang/p/4100103.html SQL Server数据库启动过程(用户数据库加载过程的疑难杂症) 前言 本篇 ...

  6. SQL Server 数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  7. SQL Server 数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  8. SQL Server 2008 错误15023:当前数据库中已存在用户或角色

    解决SQL Server 2008 错误15023:当前数据库中已存在用户或角色,SQLServer2008,错误15023,在使用SQL Server 2008时,我们经常会遇到一个情况:需要把一台 ...

  9. 此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行

    错误提示:此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行.若要将此服务器连接到服务器场,请使用 SharePoint 产品配置向导,该向导可从 ...

随机推荐

  1. kubernetes清除状态为Evicted的pod

    kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod 清除脚本 #!/bin/bash for p ...

  2. 创建正真的Java不可变类

    如果需要设计一个不可变类,尤其要注意其引用类型Field,如果其引用类型Field的类是可变的,就必须采取必要的措施来保护该Field所引用的对象不会被修改,这样才能创建真正的不可变类. class ...

  3. SQL Server 2008 sa用户可以登录,Windows身份验证无法登录

    安装SQL Server 2008时一切正常,但是在启动时出现了问题.若使用SQL Server 身份验证,选择sa用户可以登录到系统,并正常使用.但是,若使用Windows身份验证,提示用户名或密码 ...

  4. 安卓和ios的区别

    安卓不闪退,会卡死,有几率复活,也有可能要强制重启,iOS默认闪退,强制重启的几率小很多. 总的来说,如果要深层次挖掘Android的漏洞就要明白linux内核安全,如果要挖身深层次挖掘iOS的漏洞就 ...

  5. mysql数据库从删库到跑路之select单表查询

    一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...

  6. 移动端web开发 尽量哪些标签 常用标签及注意事项

    H5手机移动端WEB开发资源整合 常用的标签及注意事项: https://blog.csdn.net/u012118993/article/details/56023399 移动前端不得不了解的htm ...

  7. JqGrid 隐藏水平滚动条完美解决方案

    我有强迫症,网上找的几个看着就不舒服 不用更改样式表,隐藏最右侧的边框. .ui-jqgrid .ui-jqgrid-bdiv{ overflow-x: hidden; } 不用通过js控制加1px ...

  8. 机器学习与R语言:C5.0

    #---------------------------------------- # 功能描述:演示C50建模过程 # 数据集:汉堡大学信贷模型,信贷数据 # #------------------ ...

  9. SQL学习笔记之SQL中INNER、LEFT、RIGHT JOIN的区别和用法详解

    0x00 建表准备 相信很多人在刚开始使用数据库的INNER JOIN.LEFT JOIN和RIGHT JOIN时,都不太能明确区分和正确使用这三种JOIN操作,本文通过一个简单的例子通俗易懂的讲解这 ...

  10. RN中有两种方式使用全局变量

    1.通过导入导出文件的方式 新建constants.js文件 const object = { website:'http://www.hao123.com', name:'好123', }; exp ...