数据库原理及应用-用户接口及SQL查询语言(Query Language)
2018-02-07 20:41:39
一、DBMS的用户接口
- 查询语言
- 访问DBMS的访问工具(GUI)
- API
- 相关类库
二、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的递归查询必须满足三个条件:初始条件,递归调用表达式,终止条件。
递归查询至少包含两个子查询:
- 第一个子查询称作定点(Anchor)子查询:定点查询只是一个返回有效表的查询,用于设置递归的初始值;
- 第二个子查询称作递归子查询:该子查询调用CTE名称,触发递归查询,实际上是递归子查询调用递归子查询;
- 两个子查询使用union all,求并集;
递归查询没有显式的递归终止条件,只有当递归子查询返回空结果集(没有数据行返回)或是超出了递归次数的最大限制时,才停止递归。







数据库原理及应用-用户接口及SQL查询语言(Query Language)的更多相关文章
- JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language
JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据 ...
- SQL Structured Query Language(结构化查询语言) 数据库
SQL是Structured Query Language(结构化查询语言)的缩写. SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要发出“做什么”的命令,“怎么 ...
- 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...
- SQL Server数据库中还原孤立用户的方法集合
虽然SQL Server现在搬迁的技术越来越多,自带的方法也越来越高级. 但是我们的SQL Server在搬迁的会出现很多孤立用户,微软没有自动的处理. 因为我们的数据库权限表都不会在应用数据库中,但 ...
- (4.21)SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
转自:指尖流淌 http://www.cnblogs.com/zhijianliutang/p/4100103.html SQL Server数据库启动过程(用户数据库加载过程的疑难杂症) 前言 本篇 ...
- SQL Server 数据库启动过程(用户数据库加载过程的疑难杂症)
前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...
- SQL Server 数据库启动过程(用户数据库加载过程的疑难杂症)
前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...
- SQL Server 2008 错误15023:当前数据库中已存在用户或角色
解决SQL Server 2008 错误15023:当前数据库中已存在用户或角色,SQLServer2008,错误15023,在使用SQL Server 2008时,我们经常会遇到一个情况:需要把一台 ...
- 此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行
错误提示:此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行.若要将此服务器连接到服务器场,请使用 SharePoint 产品配置向导,该向导可从 ...
随机推荐
- java-mybaits-00402-Mapper-动态sql-if、where、foreach、sql片段
1.动态sql(重点) 通过mybatis提供的各种标签方法实现动态拼接sql. 什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. ...
- 通俗了解IaaS,PaaS,SaaS,看这里就对了(转)
[IT168 评论]云服务已经被大众所熟知,但对于刚接触云计算的朋友来说,仍然是云里雾里的绕着,今天小编就为你解读一下云计算的几种服务模式,IaaS,PaaS,SaaS到底是什么…区别有哪些? 字正腔 ...
- 图层的使用要点(CALayer)
A,图层和路径 基本图层 CALayer 动画的主角 形状图层 CAShapeLayer 绘制不规则图形 渐变图层 CAGradientLayer 颜色渐变.阴影 复制图层 CAReplicatorL ...
- 一个App项目设计开发完整流程
作为一个PHP程序猿想转行APP开发可不是件容易的事情,话说隔行如隔山,这隔着一层语言也是多东西需要学习啊,一直对APP开发很感兴趣,最近请教了几个做移动开发的朋友,看了很多的资料,决定把自己学到的东 ...
- 理解android分辨率限定符 layout-sw360dp
首先,我们来看看单位dp是怎么一回事,dp是一种单位,使用它,你可以在高.低分辨率上获得一样的空间表现,也就是说,它是像素无关的. dp计算公式:160*pix/ppi(pix是你要计算的高度或者宽度 ...
- 带你走进ajax(2)
ajax原理介绍 传统的web应用 传统的web应用是客户端向服务器发送一个http请求后,客户端要一直等待服务器的响应,这时用户什么事也干不成. 最麻烦的是对于表单的提交.比如用户要填写用户信息,等 ...
- Linux中Qt的安装
1.下载Ot安装包 Qt5.30的下载地址如下,在网页中打开找到需要的资源,下载.run格式的安装软件. http://download.qt.io/archive/qt/5.3/5.3.0/qt-o ...
- linux下多线程之pthread_detach(pthread_self())
写个碰到的问题,记录下自己的技术之路点滴pthread_detach(pthread_self())linux线程执行和windows不同,pthread有两种状态joinable状态和unjoina ...
- 《Java入门第三季》第一章 异常与异常处理
Java异常简介 1.Java异常的体系结构.万恶之源Throwable以及它的两个大儿子Mr.Error(程序终结者)和Mr.Exception(有大量儿子,包括不受查的RuntimeExcepti ...
- Web前端学习笔记之jQuery基础
0x0 jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Aja ...