Peripateticism

Yuens' blog

View the Project on GitHub

header

简单查询的SQL语法

内容参考《李兴华Oracle数据库》的简单查询部分(链接见文末参考),本节主要包括:[toc]

1. scott用户的主要数据表(重点,背)

传统数据库中使用的是表作为存储的基本单元,在一个数据库中有大量的数据表。而在整个学习中,scott用户是主要的数据来源,所以首先观察此用户下的四张数据表及其表结构。

1.1 范例:查询一个用户的所有表,使用如下命令

SELECT * FROM tab;

此时显示有四张表:dept、emp、salgrade、bonus,观察四张表的结构(查看表结构语法:DESC 表)。

1.1.1 部门表:dept

No. 字段 类型 描述
1 DEPTNO NUMBER(2) 部门编号,最多只能由两位数字组成
2 DNAME VARCHAR2(14) 部门名称,由14个字节长度组成
3 LOC VARCHAR2(13) 部门位置

1.1.2 雇员表:emp

No. 字段 类型 描述
1 EMPNO NUMBER(4) 雇员编号,最多由4位数字组成
2 ENAME VARCHAR2(10) 雇员姓名
3 JOB VARCHAR2(9) 职位信息,多个雇员的职位信息一定会重复
4 MGR NUMBER(4) 领导标号,领导也一定是公司雇员
5 HIREDATE DATE 雇佣日期,DATE包含年月日时分秒数据
6 SAL NUMBER(7,2) 基本工资,由2位小数位和5位整数位组成
7 COMM NUMBER(7,2) 佣金,销售人员才会有佣金
8 DEPTNO NUMBER(2) 雇员所在的部门编号,与dept表对应

1.1.3 工资等级表:salgrade

每位雇员都有一个工资数据,工资在公司中会划分等级。

No. 字段 类型 描述
1 GRADE NUMBER 等级编号
2 LOSAL NUMBER 此等级的最低工资
3 HISAL NUMBER 此等级的最高工资

1.1.4 工资表:bonus

No. 字段 类型 描述
1 ENAME VARCHAR2(10) 雇员姓名
2 JOB VARCHAR2(9) 职位
3 SAL NUMBER 工资
4 COMM NUMBER 佣金

其中三张数据表(emp、dept、salgrade)都存在数据,但是只有bonus表不包含任何数据(类似sh用户)。

2. SQL简介(了解)

SQL是一个功能强大的数据库语言。SQL通常用于与数据库的通讯,SQL是关系数据库管理系统的标准语言。

SQL是在70年代由IBM研发出来的,目的是统一数据库的操作方式(最早的是visual foxpro)。实际上最初的数据库厂商都有自己的操作标准。后来80年代,Oracle公司提供了SQL支持(Oracle是最早支持SQL标准的大型数据库)。到了今天,几乎所有的数据库都支持SQL,大大简化程序开发人员的负担(学习只学习标准SQL)。

PS:SQL的操作属于长期以来的历史发展产物,同时也是现有可能会被延续下去的产物,不过在SQL产生的部分人员认为SQL并不方便(传统的基于行、列的数据库的存储结构不方便),于是产生了一个NOSQL技术(最早的翻译是不使用SQL),但到现在为止NOSQL翻译为:“Not OnlySQL”,其中代表作:MongoDB(Node.JS,taobao),采用的是一种文档的方式进行存储的。

 

SQL功能强大,概括起来,它可以分成以下几组:

3. 简单查询(重点,控制列

对于查询一共分为四类:

  1. 简单查询;
  2. 限定查询;
  3. 多表查询;
  4. 统计查询。

本节主要讲简单查询。

SELECT [DISTINCT]  * | 列 [别名], 列[别名], … FROM 表名称 [别名] 步骤二:控制要显示的数据列
步骤一:确定查询的数据源

数据表的组成是行与列,而简单查询的最大特征在于会将一张数据表之中的全部数据行进行显示,而用控制SELECT来控制显示的数据列。

其中几个参数的作用如下:

3.1 范例:查询查询所有雇员的信息(所有雇员一定包含所有数据)

SELECT *
FROM emp;

3.2 范例:查询每个雇员的编号(empno)、姓名(ename)、职位(job)、基本工资(sal)

SELECT empno, ename, job, sal 
FROM emp;

通过以上的查询可以清楚发现,数据表所有行都显示,而列只显示需要的部分。除了这样的基本查询在进行查询的过程之中,SELECT子句之中也可以进行各种数学计算(+、-、×、÷)。

3.3 范例:查询每个雇员的编号、姓名、基本年薪

SELECT empno, ename, sal*12
FROM emp;

但是现在有问题出现,发现计算处的列名称比较奇怪,并没有其它列的意思明确,所以此时可以起一个别名。

3.4 范例:为查询列起别名

SELECT empno 编号, ename 姓名, sal*12 年薪
FROM emp;

SELECT empno, ename, sal*12 income
FROM emp;

此处的程序是为了演示才采用中文的处理方式,但是在开发之中一定要记住:回避中文。

3.5 范例:现在查询每个雇员的编号、姓名、职位、年薪,而且每个雇员,每个月有200元的饭食补助、200元汽车补助、夏天有4个月发每月300元的防暑补贴,年底的时候可以领到15个月的基本工资。

SELECT empno, ename, job,
      (sal + 400)*12 + 300*4 + sal * 3 income
FROM emp;

四则运算的过程中,也有一定的优先顺序,先乘除后加减。

3.6 范例:查询所有雇员的职位

SELECT job FROM emp;

发现此时的查询结果中,有重复数据,因为多个雇员必然有重复职位,若想消除重复列,可使用DISTINCT关键字处理,此关键字只能出现在SELECT子句中。

3.7 范例:去除重复列

SELECT DISTINCT job
FROM emp;

虽然此时可以消除重复数据,但对于重复数据数据有一个原则,只有在所有列数据都重复的情况下才叫重复数据。

3.8 范例:关于消除重复的一个小问题——查询每个雇员的姓名、职位

职位会有重复,但姓名不会重复,只有所有列都重复的时候才会消除重复。

SELECT DISTINCT ename, job
FROM emp;

以上操作都数据SQL的基本操作,但Oracle中,增加了一个双竖线的连接符“||”,可进行数据的连接。

3.9 范例:观察连接符

SELECT empno, ename
FROM emp;

若在empno和ename字段中间将逗号替换为双竖线,那么两列将会合成为一列。

但这样的合并意义不大,所以下面可以增加一些描述文字,例如现在有这样的数据显示:

SELECT ‘编号:’ || enpno || ‘、姓名:’ || ename || ‘、工资:’ || sal
     info
FROM emp;

注意:别名没有单引号,字符有单引号

提示:关于数据的表示问题

4. 参考

『李兴华java培训01』Oracle数据库 - 网易云课堂  http://study.163.com/course/courseLearn.htm?courseId=932016#/learn/video?lessonId=1116379&courseId=932016