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. 初识Java集合框架(Iterator、Collection、Map)

    1. Java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 注意: 既有接口也有类,图中画实线的是类,画虚线的是接口 使用之前须要到导入java.util包 List ...

  2. thread msg

    提取的nordic rf51xx/rf52xx sdk中的线程间消息通信机制,非常简洁 demo.c #include <stdio.h> #include <stdlib.h> ...

  3. python学习笔记(八)python操作Excel

    一.python操作excel,python操作excel使用xlrd.xlwt和xlutils模块,xlrd模块是读取excel的,xlwt模块是写excel的,xlutils是用来修改excel的 ...

  4. Python第一个爬虫学习

    在网上查看大神的关于Python爬虫的文章,代码如下: #coding=utf-8 import urllib import re def getHtml(url): page = urllib.ur ...

  5. Linux 超级用户和普通用户切换命令

    默认登录的是普通用户权限显示$符 tree@ubuntu:/usr$ 从普通用户切换超级用户权限: sudo su tree@ubuntu:/usr$ sudo su 输入密码 [sudo] pass ...

  6. PageObject模式的层次结构

    做过UI自动化的都晓得,在做UI自动化时定位特别依赖页面,一旦页面发生变更就不得不跟着去修改页面定位. 在webdriver中,假设你想对一个元素定位操作,那么你可能会编写下面的代码: driver. ...

  7. Full List of NMD R1 Singapore 2017

    The initial adidas NMD Singapore, which sparked a sneaker craze larger than the Three Stripes could' ...

  8. koa2简单demo

    // 导入koa,和koa 1.x不同,在koa2中,我们导入的是一个class,因此用大写的Koa表示: const Koa = require('koa'); const Router = req ...

  9. 学会JS的this这一篇就够了

    转自:http://www.imooc.com/article/1758 以前看某本书上讲: 掌握了JS中this的用法才算真正的跨过了JS的门槛 我深以为是!但是JS的this却并不是那么简单的内容 ...

  10. 洛谷 P4211 [LNOI2014]LCA (树链剖分+离线)

    题目:https://www.luogu.org/problemnew/solution/P4211 相当难的一道题,其思想难以用言语表达透彻. 对于每个查询,区间[L,R]中的每个点与z的lca肯定 ...