# 第 4 节 SQL简介与数据表分析

***

## SQL简介

SQL指的是结构化查询语言(Structured Query Language)。在世界上80年代的时候基本上存在有80多种数据库。这个时候有一个情况非常麻烦，每一种数据库都有自己的一套操作命令。这样一来给予开发者非常大的开发难度，因为习惯于使用A数据库的用户如果换到了B数据库，基本上就表示需要重新学习。

在70年代末的时候由IBM开发出了最早的SQK操作标准，而Oracle数据库是世界上第一个支持SQL语法的数据库，后来发展到今天，基本上所有的关系型数据库都支持SQL语法。

这样就带来了一个好处，即：如果你本身擅长于使用DB2数据库，那么就可以很轻松的上手Oracle数据库，或者是SQL Server数据库（MySQL）。

但是需要提醒的是，SQL语句语法没有那么复杂：SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、INSERT、UPDATE、DELETE、CREATE、DROP、ALTER、GRANT、REVOKE。

严格来讲SQL会分为三种类型：

* DML（数据操作语言，开发中使用的部分）：主要指的是数据库的查询与更新操作，查询操作是整个SQL的核心；
* DDL（数据定义语言，开发前的设计）：主要指的是数据对象的创建（表、用户），例如：CREATE、DROP、ALTER，这一部分的操作需要使用到相关的设计范式；
* DCL（数据控制语言，系统人员工作）：主要是进行权限的管理操作（需要结合用户），此部分由DBA负责；

## SCOTT用户表的结构

SCOTT用户一共有四张数据表，这四张表的表结构为以后学习过程中使用的部分。首先了解以下两个命令：

\*\*命令一：\*\*查询一个用户下的所有数据表

```sql
SELECT * FROM tab;
```

\*\*命令二：\*\*查询一个表的结构

```sql
DESC 表名称
```

**范例：** 查看dept表结构

```sql
DESC dept;
```

**1、部门信息表：dept**

| No. |   列名称  |      类型      |         描述         |
| :-: | :----: | :----------: | :----------------: |
|  1  | DEPTNO |   NUMBER(2)  |  表示部门编号，最多由2位数字所组成 |
|  2  |  DNAME | VARCHAR2(14) | 表示部门名称，最多由14个字符所组成 |
|  3  |   LOC  | VARCHAR2(13) |        部门位置        |

```sql
SQL> SELECT * FROM dept;

    DEPTNO DNAME                        LOC
---------- ---------------------------- --------------------------
        10 ACCOUNTING                   NEW YORK
        20 RESEARCH                     DALLAS
        30 SALES                        CHICAGO
        40 OPERATIONS                   BOSTON
```

**2、雇员信息表：emp**

| No. |    列名称   |      类型      |            描述           |
| :-: | :------: | :----------: | :---------------------: |
|  1  |   EMPNO  |   NUMBER(4)  |     雇员编号，最多由4位数字所组成     |
|  2  |   ENAME  | VARCHAR2(10) |           雇员姓名          |
|  3  |    JOB   |  VARCHAR2(9) |           雇员职位          |
|  4  |    MGR   |   NUMBER(4)  |        每个雇员的领导编号        |
|  5  | HIREDATE |     DATE     |     入职日期，里面包含有日期和时间     |
|  6  |    SAL   |  NUMBER(7,2) | 基本工资，小数点最多只占2位，整数最多只占5位 |
|  7  |   COMM   |  NUMBER(7,2) |    佣金，一般只有销售才会存在佣金的概念   |
|  8  |  DEPTNO  |   NUMBER(2)  |  部门编号，值的是每个雇员对应的雇员编号信息  |

```sql
SQL> select * from emp;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7369 SMITH                CLERK                    7902 17-12月-80            800                 20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
      7900 JAMES                CLERK                    7698 03-12月-81            950                 30
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10

已选择14行。
```

**3、工资等级表：salgrade**

| No. |  列名称  |   类型   |    描述    |
| :-: | :---: | :----: | :------: |
|  1  | GRADE | NUMBER |  工资等级编号  |
|  2  | LOSAL | NUMBER | 此等级的最低工资 |
|  3  | HISAL | NUMBER | 此等级的最高工资 |

```sql
SQL> select * from salgrade;

     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999
```

工资等级里面的工资确定工资级别是要根据：losal<=工资<=hisal来决定。

**4、工资表：bonus**

| No. |  列名称  |      类型      |  描述  |
| :-: | :---: | :----------: | :--: |
|  1  | ENAME | VARCHAR2(10) | 雇员姓名 |
|  2  |  JOB  |  VARCHAR2(9) |  职位  |
|  3  |  SAL  |    NUMBER    | 基本工资 |
|  4  |  COMM |    NUMBER    |  佣金  |

在bonus表里面没有任何的数据存在。

## 总结

1、学习SQL重点在于DML操作上。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://shepherd-xie.gitbook.io/be-a-javaer/di-4-zhang-oracle-shu-ju-ku-ji-chu/section-4.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
