Oracle_1th_查询语句

一、Oracle
1、连接和登录
1)在命令行窗口中输入sqlplus
2)提示输入用户名,输入scott,回车
3)提示输入口令,输入tiger,回车
4)打印:

连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

2、查询
1)查看表的结构:
desc emp
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)

2)名称这一列,列出了这张表中有哪些表头,哪些字段,这些字段的名字应当是见名知意的。
①EMPNO:雇员编号
②ENAME:雇员姓名
③JOB:雇员工种
④MGR:雇员的管理人
⑤HIREDATE:入职日期
⑥SAL:薪水
⑦COMM:津贴
⑧DEPTNO:部门编号

3)类型这一列,列出了字段的类型。

①EMPNO雇员编号是NUMBER(4)类型,表示4位的数字。

②ENAME雇员姓名是VARCHAR2(10)类型,表示10位的可变的字符串。

③VARCHAR和VARCHAR2的区别是:VARCHAR2支持各种字符,VARCHAR不支持所有字符。

④HIREDATE入职日期是DATE日期类型。

⑤SAL薪水是NUMBER(7,2)表示7位数字,2位小数。



4)查询部门表:
desc dept
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                    NOT NULL NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)

①DEPTNO:部门编号
②DNAME:部门名字
③LOC:部门地址

5)查询薪水等级表:
desc salgrade
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 GRADE                                              NUMBER
 LOSAL                                              NUMBER
 HISAL                                              NUMBER

①GRADE:薪水等级
②LOSAL:最低薪水
③HISAL:最高薪水

3、查询表内容

1)可以使用查询表中数据更好地理解一张表:

select * from salgrade;
     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999

2)查询部门表内容:
select * from dept;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
表中显示四个不同的部门位于四个不同的城市。

3)查询雇员表内容:
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


     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
---------- ---------- --------- ---------- -------------- ---------- ----------
    DEPTNO
----------
      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


     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
---------- ---------- --------- ---------- -------------- ---------- ----------
    DEPTNO
----------
      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


     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
---------- ---------- --------- ---------- -------------- ---------- ----------
    DEPTNO
----------
      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


     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
---------- ---------- --------- ---------- -------------- ---------- ----------
    DEPTNO
----------
      7902 FORD       ANALYST         7566 03-12月-81           3000
        20

      7934 MILLER     CLERK           7782 23-1月 -82           1300
        10

①现在要从雇员表中查询每个人对应的年薪:
select ename, sal*12 from emp;

②也可以通过查询一张表来显示一个算数表达式的值:
select 2*3 from emp;
       2*3
----------
         6
         6
         6
         6
         6
         6
         6
         6
         6
         6
         6


       2*3
----------
         6
         6
         6


已选择14行。

已选择14行是因为这张表中有14条记录。

③oracle中有一张表dual里面只有一条记录,方便显示一个算数表达式的值:
select 2*3 from dual;
       2*3
----------
         6

④不仅是显示一个算数表达式的值,也可以用来显示当前系统日期:
select sysdate from dual;
SYSDATE
--------------
02-4月 -17

⑤之前那张查雇员年薪的表中显示了"sal*12"字段,不太容易理解,可以在查询的时候给这个计算结果起个别名:
select ename, sal*12 annual_sal from emp;
ENAME      ANNUAL_SAL
---------- ----------
SMITH            9600
ALLEN           19200
WARD            15000
JONES           35700
MARTIN          15000
BLAKE           34200
CLARK           29400
SCOTT           36000
KING            60000
TURNER          18000
ADAMS           13200

ENAME      ANNUAL_SAL
---------- ----------
JAMES           11400
FORD            36000
MILLER          15600

⑥如果别名中有特殊的字符(如空格、中文)写成如下查询语句会出错:
select ename, sal*12 annual sal from emp;
提示:
select ename, sal*12 annual sal from emp
                            *
第 1 行出现错误:
ORA-00923: 未找到要求的 FROM 关键字

为了能让annual sal被认为是一个字段,可以加引号:
select ename, sal*12 "annual sal" from emp;
ENAME      annual sal
---------- ----------
SMITH            9600
ALLEN           19200
WARD            15000
JONES           35700
MARTIN          15000
BLAKE           34200
CLARK           29400
SCOTT           36000
KING            60000
TURNER          18000
ADAMS           13200


ENAME      annual sal
---------- ----------
JAMES           11400
FORD            36000
MILLER          15600


已选择14行。

可以观察到双引号不仅让空格得以保留,还让小写状态得以保留,想让字段以小写呈现,可以加上双引号来查询:
select ename "ename", sal*12 "annual sal" from emp;
ename      annual sal
---------- ----------
SMITH            9600
ALLEN           19200
WARD            15000
JONES           35700
MARTIN          15000
BLAKE           34200
CLARK           29400
SCOTT           36000
KING            60000
TURNER          18000
ADAMS           13200

ename      annual sal
---------- ----------
JAMES           11400
FORD            36000
MILLER          15600

已选择14行。

⑦现查询雇员对应的津贴:
select ename, comm from emp;
ENAME            COMM
---------- ----------
SMITH
ALLEN             300
WARD              500
JONES
MARTIN           1400
BLAKE
CLARK
SCOTT
KING
TURNER              0
ADAMS

ENAME            COMM
---------- ----------
JAMES
FORD
MILLER

已选择14行。


可以看到有一些雇员的津贴没有内容,即所谓的NULL值。
其中TURNER的津贴是0,0与空值NULL不是一回事,0是有值,与200、300这些值一样,而NULL是完全没有指定任何值。


⑧现查询每位雇员一年的总收入:
select ename, sal*12 + comm from emp;
ENAME      SAL*12+COMM
---------- -----------
SMITH
ALLEN            19500
WARD             15500
JONES
MARTIN           16400
BLAKE
CLARK
SCOTT
KING
TURNER           18000
ADAMS

ENAME      SAL*12+COMM
---------- -----------
JAMES
FORD
MILLER

已选择14行。

可以看到很多人的总收入计算出来为NULL,这是因为任何含有NULL值的算数表达式的结果都是NULL值,之后再说NULL值的处理。


⑨oracle中有一个字符串连接符"||",举例如下:

select ename||sal from emp;
ENAME||SAL
--------------------------------------------------
SMITH800
ALLEN1600
WARD1250
JONES2975
MARTIN1250
BLAKE2850
CLARK2450
SCOTT3000
KING5000
TURNER1500
ADAMS1100

ENAME||SAL
--------------------------------------------------
JAMES950
FORD3000
MILLER1300

已选择14行。

可以看到两个字段变成了一个字段,并且每条记录都连在了一起,字符串和数字连接在一起,所以相当于Java中的"+"号。

⑩任何数据库的SQL语句,表示字符串的时候都是用单引号引起来,如:
select ename||'asdasdasd' from emp;
ENAME||'ASDASDASD'
-------------------
SMITHasdasdasd
ALLENasdasdasd
WARDasdasdasd
JONESasdasdasd
MARTINasdasdasd
BLAKEasdasdasd
CLARKasdasdasd
SCOTTasdasdasd
KINGasdasdasd
TURNERasdasdasd
ADAMSasdasdasd

ENAME||'ASDASDASD'
-------------------
JAMESasdasdasd
FORDasdasdasd
MILLERasdasdasd

已选择14行。
考虑更复杂的情况,如果字符串中含有单引号应该怎么处理:
select ename||'asd'asd' from emp;
提示:
ERROR:
ORA-01756: 引号内的字符串没有正确结束
使用两个单引号来代替一个单引号:
select ename||'asd''asd' from emp;
ENAME||'ASD''ASD'
-----------------
SMITHasd'asd
ALLENasd'asd
WARDasd'asd
JONESasd'asd
MARTINasd'asd
BLAKEasd'asd
CLARKasd'asd
SCOTTasd'asd
KINGasd'asd
TURNERasd'asd
ADAMSasd'asd

ENAME||'ASD''ASD'
-----------------
JAMESasd'asd
FORDasd'asd
MILLERasd'asd

已选择14行。


4)条件查询

①关键字distinct
直接去查询一个表中的某个字段可能会有很多重复的记录:
select deptno from emp;
    DEPTNO
----------
        20
        30
        30
        20
        30
        30
        10
        20
        10
        30
        20

    DEPTNO
----------
        30
        20
        10

已选择14行。

使用distinct关键字来对要查询的字段的重复记录进行删减:
select distinct deptno from emp;
    DEPTNO
----------
        30
        20
        10


那如果多一个字段会怎样:

select distinct deptno, jog from emp;
    DEPTNO JOB
---------- ---------
        20 CLERK
        30 SALESMAN
        20 MANAGER
        30 CLERK
        10 PRESIDENT
        30 MANAGER
        10 CLERK
        10 MANAGER
        20 ANALYST

已选择9行。
这样查询到的是deptno和job两个字段记录的组合起来没有重复的,可以看出依然删减了5行条重复的记录。


②关键字where

有时候我们并不想查询一个表中全部的记录,只是要对满足某个条件的记录进行查看:

把部门编号为10的记录从雇员表中取出来。

select * from emp where deptno=10;
     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
---------- ---------- --------- ---------- -------------- ---------- ----------
    DEPTNO
----------
      7782 CLARK      MANAGER         7839 09-6月 -81           2450
        10

      7839 KING       PRESIDENT            17-11月-81           5000
        10

      7934 MILLER     CLERK           7782 23-1月 -82           1300
        10

把薪水大于1500的人及其薪水显示出来:
select ename, sal from emp where sal>1500;
ENAME             SAL
---------- ----------
ALLEN            1600
JONES            2975
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
FORD             3000

已选择7行。

查询部门编号不等于10的人的姓名、薪水、部门编号:

不等于可以是"!=",也可以是"<>"。

select ename, sal, deptno from emp where deptno <> 10;
ENAME             SAL     DEPTNO
---------- ---------- ----------
SMITH             800         20
ALLEN            1600         30
WARD             1250         30
JONES            2975         20
MARTIN           1250         30
BLAKE            2850         30
SCOTT            3000         20
TURNER           1500         30
ADAMS            1100         20
JAMES             950         30
FORD             3000         20

通过比较字符串大小来筛选名字,即比较首字母的ASCII码,如果一致则比较下一个字符,以此类推,与Java中一致。
SQL> select ename, sal from emp where ename > 'CBA';
ENAME             SAL
---------- ----------
SMITH             800
WARD             1250
JONES            2975
MARTIN           1250
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500
JAMES             950
FORD             3000
MILLER           1300

已选择11行。


③关键字and
用and来对多个条件取交集。
select ename, sal from emp where sal >= 800 and sal <=1500;
ENAME             SAL
---------- ----------
SMITH             800
WARD             1250
MARTIN           1250
TURNER           1500
ADAMS            1100
JAMES             950
MILLER           1300

已选择7行。

④关键字or
用or来对多个条件取并集。
select ename, sal from emp where deptno = 10 or sal > 1000;
ENAME             SAL
---------- ----------
ALLEN            1600
WARD             1250
JONES            2975
MARTIN           1250
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500
ADAMS            1100
FORD             3000

ENAME             SAL
---------- ----------
MILLER           1300

已选择12行。

⑤关于NULL

从雇员表中找出所有津贴为NULL的指定字段的记录:

select ename, sal, comm from emp where comm is null;
ENAME             SAL       COMM
---------- ---------- ----------
SMITH             800
JONES            2975
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
ADAMS            1100
JAMES             950
FORD             3000
MILLER           1300

已选择10行。
可以看出,查询到的这些记录的津贴的确为空。

查询不为空:
select ename, sal, comm from emp where comm is not null;
ENAME             SAL       COMM
---------- ---------- ----------
ALLEN            1600        300
WARD             1250        500
MARTIN           1250       1400
TURNER           1500          0

⑥关键字in
select ename, sal, comm from emp where sal in (800, 1500, 2000);
ENAME             SAL       COMM
---------- ---------- ----------
SMITH             800
TURNER           1500          0


select ename, sal, comm from emp where ename in ('CLARK', 'KING', 'ABC');
ENAME             SAL       COMM
---------- ---------- ----------
CLARK            2450
KING             5000

⑦取反not
select ename, sal from emp where sal not in (800, 1500);
ENAME             SAL
---------- ----------
ALLEN            1600
WARD             1250
JONES            2975
MARTIN           1250
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
ADAMS            1100
JAMES             950
FORD             3000

ENAME             SAL
---------- ----------
MILLER           1300

已选择12行。



⑧日期范围
找到1981年2月20日以后入职的人员:
select ename, hiredate from emp where hiredate > '20-2月-1981';
ENAME      HIREDATE
---------- --------------
WARD       22-2月 -81
JONES      02-4月 -81
MARTIN     28-9月 -81
BLAKE      01-5月 -81
CLARK      09-6月 -81
SCOTT      19-4月 -87
KING       17-11月-81
TURNER     08-9月 -81
ADAMS      23-5月 -87
JAMES      03-12月-81
FORD       03-12月-81

ENAME      HIREDATE
---------- --------------
MILLER     23-1月 -82

已选择12行。
在没有学习日期函数之前,目前只能按照HIREDATE的日期类型指定的字符串格式来写。

⑨关键字like和正则表达式

查询名字中有指定字符串的记录,使用like关键字+正则表达式:
百分号%表示0个或多个字符。
select ename from emp where ename like '%ALL%';
ENAME
----------
ALLEN

下划线_代表该位有一个字符。
select ename from emp where ename like '_A%';
ENAME
----------
WARD
MARTIN
JAMES


⑩关键字order by
order by+字段:指定查询结果按某一个字段的记录升序或降序排列:
根据部门编号升序排列:
select * from dept order by deptno;

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

根据ename降序来排列:

select ename, sal from emp order by ename desc;
ENAME             SAL
---------- ----------
WARD             1250
TURNER           1500
SMITH             800
SCOTT            3000
MILLER           1300
MARTIN           1250
KING             5000
JONES            2975
JAMES             950
FORD             3000
CLARK            2450

ENAME             SAL
---------- ----------
BLAKE            2850
ALLEN            1600
ADAMS            1100

已选择14行。

在执行条件筛选后进行排序:
select empno, ename from emp where deptno != 10 order by empno;
     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7788 SCOTT
      7844 TURNER
      7876 ADAMS
      7900 JAMES
      7902 FORD

已选择11行。

根据两个字段进行排序:
select ename, sal, deptno from emp order by deptno asc, ename desc;
ENAME             SAL     DEPTNO
---------- ---------- ----------
MILLER           1300         10
KING             5000         10
CLARK            2450         10
SMITH             800         20
SCOTT            3000         20
JONES            2975         20
FORD             3000         20
ADAMS            1100         20
WARD             1250         30
TURNER           1500         30
MARTIN           1250         30

ENAME             SAL     DEPTNO
---------- ---------- ----------
JAMES             950         30
BLAKE            2850         30
ALLEN            1600         30

已选择14行。
部门编号从小到大排列,部门编号相同的再按照雇员姓名从大到小排列。


4、综合例子






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值