二、DML-查询基础

一、 前提准备工作

​ 为了方便初学者,教程以Oracle下示例方案下的Scott用户下的表为例

​ scott 用户一共有4张数据表,以后讲解 DML 语法都将用到这四张表。所以大家先记住这4张数据表的表结构。

  1. 查询用户下的所有数据表

    SELECT * FROM tab;
    
  2. 查询一个数据表的结构

    DESC 表名;
    

二、Scott 案例下的表

2.1、部门信息表:dept

列名 类型 描述
DEPTNO NUMBER(2) 部门编号;最多由2位数字组成
DNAME VARCHAR2(14) 部门名称;最多由14个字节组成
LOC VARCHAR2(13) 部门所在的位置地址;最多由13个字节组成

2.2、员工(雇员)信息表:emp(employees)

列名 类型 描述
EMPNO NUMBER(4) 员工编号;由4位数字组成
ENAME VARCHAR2(10) 员工姓名
JOB VARCHAR2(9) 员工职位
MGR NUMBER(4) 员工领导的编号
HIREDATE DATE 员工雇佣日期;DATA 包含了日期和时间
SAL NUMBER(7,2) 基本工资;如:99999.99
COMM NUMBER(7,2) 佣金(提成),一般只有销售才有佣金的概念。
DEPTNO NUMBER(2) 员工所在的部门编号。和 dept表的 DEPTNO对应

2.3、工资等级表:salgrade(Salary Grade)

列名 类型 描述
GRADE NUMBER 工资等级编号
LOSAL NUMBER 该等级的最低工资
HISAL NUMBER 该等级的最高工资

2.4、工资表:bonus

列名 类型 描述
ENAME VARCHAR2(10) 员工名字
JOB VARCHAR2(9) 职位
SAL NUMBER 基本工资
COMM NUMBER 佣金

三、查询(控制列)

3.1、简单查询

3.1.1、语法格式

SELECT [DISTINCT] * | 列名 [AS] [别名] ,列名 [AS] [别名] , 2、 控制要显示的数据列
FROM 表名称 [别名] ;                           1、 确定查询的数据来源

3.1.2、参数说明

1、SELECT 关键字 查询数据
2、FROM   关键字 后面跟数据来源
3、 DISTINCT --表示去掉重复行数据   distinct关键字只能跟在select关键字之后
4、* --查询选择所有的列,count(*)意味着计算所有的行,表示通配符时,表示0个或任意多个字符
5、AS --关键字不能用于指定表的别名,可以用来指定列名的别名,指定列的别名的时候可以省略

3.1.3、示例代码

  1. 查询雇员(emp)表的所有数据,即所有行和所有列的数据

    SELECT * 
    FROM emp
    
  2. 查询每个雇员(emp)的编号(empno)、姓名(ename)、职位(job)、基本工资(sal)

    SELECT empno,ename,job,sal 
    FROM emp;
    

  3. 使用别名方式查询(开发中禁止使用中文别名,看到用中文别名的直接拖出打死)

     SELECT empno 编号,ename 姓名,job 职位,sal 薪资 
     FROM emp;
    

  4. 去掉重复数据(DISTINCT)

    SELECT job 
    FROM emp;
    

    SELECT DISTINCT job 
    FROM emp;
    

5.表的别名的使用(当多表联查时各表有相同列名时就可以使用别名来特指查询的列)

SELECT e.empno,e.ename,e.deptno
FROM emp e;

3.2、简单查询(+、-、×、÷)

3.2.1、说明

  1. 四则运算可以对数字类型,日期类型,数字类型的字符串进行运算

  2. 运算符的优先级跟数学的加,减,乘,除一样

3.2.2 、示例代码

  1. 查询每个雇员的编号、姓名、基本年薪

    SELECT empno,ename,sal*12 
    FROM emp ;
    

  2. 查询每个雇员的编号、姓名、职位、年薪,而且每位雇员,每个月有 300 元的饭食补助、180元的交通补助,年底的时候可以领到 14个月的基本工资

    SELECT empno 编号,ename 姓名 ,job 职位,(sal*14 + (300+180)*12) 年薪 
    FROM emp
    

总结:以上是SQL标准的基本操作但在Oracle里还有一些扩充的操作

3.3、连接符 ||(Oralce)

3.3.1、说明

  1. 对数据进行连接

  2. 开发基本不用

3.3.2、示例代码

  1. 查询 empno 员工编码,ename 员工姓名,sal 员工工资,要求显示在一起

    SELECT empno || ename || sal 
    FROM emp
    

  2. 很显然这样显示没有任何意义(当然连接本省就没有多大意义),如果想阅读性稍微好一点可以使用常量

3.4、常量使用

3.4.1、 说明

  1. 如果常量是数字类型直接编写

  2. 如果常量是其他类型则需要使用单引号'

3.4.2、示例代码

  1. 使用数字常量

    SELECT  1 
    FROM emp;
    

  2. 使用其他类型常量

    SELECT '员工编号:' 
    FROM emp;
    

  3. 结合连接符,查询 empno 员工编码,ename 员工姓名,sal 员工工资,要求显示在一起,每行前面加上常量格式如下

    SELECT '员工编号: ' || empno 编号 ,
         '员工姓名: ' || ename 姓名, 
         '员工工资: ' || sal 工资,
         '部门: '|| deptno 部门  
    FROM emp;
    

3.5、其他

3.5.1 单引号

  1. 表示字符串常量

    select 'sysdate' from dual;
    

3.5.2 双引号

  1. 表示其内部的字符串严格区分大小写(Oracle将严格区分大小写,否则Oracle都默认大写)

    select '字段1' As "列a",'字段2' "小写b",'字段c' 默认大写c from dual;  
    select ename "Ename" from emp;//查询后显示列名不会转化为全大写,而是用双引号指定的别名显示。
    
  2. 双引号用在字符串中当成普通字符处理

  3. 当出现在to_char的格式字符串中时,双引号有特殊的作用,就是将非法的格式符包装起来, 避免出现ORA-01821: date format not recognized错误, to_char在处理格式字符串时,会忽略双引号

    SELECT TO_CHAR(sysdate, 'hh24"小时"mi"分"ss"秒"') AS RESULT from dual
    

results matching ""

    No results matching ""