Oracle-02-基本select查询

首先要配置下环境

su - oracle
vi login.sql

里面放一些sqlplus美化的命令

set linesize 120
set pagesize 200
set long 50000
set timing on
set sqlp '_user@ _connect_identifier>'

set linesize 120 每行显示字符长度120

set pagesize 200 每页显示200行数据

set long 50000 long、lob类型显示长度设置为50000

set timing on 将查询所用时间放在结果集后面显示

set sqlp '_user@ _connect_identifier>' 设置sql提示符:用户名+@+数据库名为前缀

查看修改效果

sqlplus / as sysdba
    

我们创建一个实验用户,并建立相应的表

CREATE TABLESPACE DATA DATAFILE '/u01/app/oradata/sundb/sundb1.dbf' SIZE 800M AUTOEXTEND ON EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
CREATE USER oracle IDENTIFIED BY oracle DEFAULT TABLESPACE DATA;  

grant connect,resource to oracle;  
grant unlimited tablespace to oracle;  
grant create database link to oracle;  
grant select any sequence,create materialized view to oracle;  
grant select on scott.emp to oracle;
grant select on scott.dept to oracle;
grant select on scott.bonus to oracle;
grant select on scott.salgrade to oracle;
conn oracle/oracle
create table emp as select * from scott.emp;
create table bonus as select * from scott.bonus;
create table dept as select * from scott.dept;
create table salgrade as select * from scott.salgrade;

下面开始执行基本select语句

conn oracle
select * from tab;

查看oracle下面所有的对象

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
DEPT                           TABLE
EMP                            TABLE
SALGRADE                       TABLE

11 rows selected.

Elapsed: 00:00:00.01

查看任意的一张表

select * from dept;
 
 
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

Elapsed: 00:00:00.01

一个sql语句一定要有select子句和from子句

描述一个表的信息可以用desc(注意,这里没有用分号

desc emp

 Name                                                              Null?    Type
 ----------------------------------------------------------------- -------- --------------------------------------------
 EMPNO                                                                      NUMBER(4)
 ENAME                                                                      VARCHAR2(10)
 JOB                                                                        VARCHAR2(9)
 MGR                                                                        NUMBER(4)
 HIREDATE                                                                   DATE
 SAL                                                                        NUMBER(7,2)
 COMM                                                                       NUMBER(7,2)
 DEPTNO                                                                     NUMBER(2)
select ename,sal from emp;
ENAME             SAL
---------- ----------
SMITH             800
ALLEN            1600
WARD             1250
JONES            2975
MARTIN           1250
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500
ADAMS            1100
JAMES             950
FORD             3000
MILLER           1300

14 rows selected.

Elapsed: 00:00:00.00

SQL语句的表明和关键字是不区分大小写的,SQL语句可以写成一行,也可以写成多行,但是关键字不能缩写,也不能换行,一般不同的行我们都放在独立的行,SQL语句要运行必须以 ;(分号)结束,或者在新的一行中以 / 结束(/的含义是执行最近一次的SQL语句,实际上就是执行在缓存里的SQL语句)

--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!划重点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

SQL语句分类

数据操纵语言:DML: select; insert; delete; update; merge.
数据定义语言:DDL: create; alter; drop; truncate; rename; comment.
事务控制语言:TCL: commit; rollback; savepoint.
数据控制语言:DCL: grant; revoke.

SQL语句的特点
1)是SQL92/99的ANSI官方标准,只要按照该标准来写,在任何的关系型数据库中都可以直接执行
2)SQL语句的关健字不能简写,例如:select,where,from
3)大小写不敏感,提倡大写 
4)能够对表数据进行增删改查操作
5)必须以分号结束
6)通常称做语句


SQLPLUS命令

COLUMN      
DESCRIPTION
SET
SHOW  (SHOW RECYCLEBIN,SHOW ALL,SHOW USER,SHOW ERROR)
HOST($)
CONNECT
PASSWORD
DISCONNECT
EXIT
LIST
APPEND
CHANGE
INPUT
N
EDIT
RUN(/)
DEL
START(@)
CLEAR SCREEN
SAVE
GET
SPOOL
&
&&
DEFINE

SQLPLUS中的环境变量

ARRAYSIZE
AUTOCOMMIT
COLSEP
FEEDBACK
HEADING
LINESIZE
LONG
PAGESIZE
SERVEROUTPUT
TERMOUT
TIME
TIMING
SQLPROMPT 'xxx'
PAUSE
SQLPLUS命令的特点
1)是oracle自带的一款工具,在该工具中执行的命令叫SQLPLUS命令
2)SQLPLUS工具的命令中的关健字可以简写,也可以不简写,例如:col ename for a10;
3)大小写不敏感,提倡大写
4)不能够对表数据进行增删改查操作,只能完成显示格式控制,例如:设置显示列宽,清屏,记录执行结果
5)可以不用分号结束,也可以用分号结束,个人提倡不管SQL或SQLPLUS,都以分号结束
6)通常称做命令,是SQLPLUS工具中的命令
注意:SQLPLUS命令是SQLPLUS工具中特有的语句

----------------------------------------------------分割线----------------------------------------------------

在select语句后可以直接用四则运算符

select ename,sal,sal+100 from emp;
ENAME             SAL    SAL+100
---------- ---------- ----------
SMITH             800        900
ALLEN            1600       1700
WARD             1250       1350
JONES            2975       3075
MARTIN           1250       1350
BLAKE            2850       2950
CLARK            2450       2550
SCOTT            3000       3100
KING             5000       5100
TURNER           1500       1600
ADAMS            1100       1200
JAMES             950       1050
FORD             3000       3100
MILLER           1300       1400
14 rows selected.
Elapsed: 00:00:00.00

salary+100这一列在表中并不存在,因此我们称作计算表达式的伪列

算数表达式先乘除后加减,从左到右,()强制优先级

例如每个雇员年工资增加100

select ename,sal,sal*12+100 from emp;
 
 
ENAME             SAL SAL*12+100
---------- ---------- ----------
SMITH             800       9700
ALLEN            1600      19300
WARD             1250      15100
JONES            2975      35800
MARTIN           1250      15100
BLAKE            2850      34300
CLARK            2450      29500
SCOTT            3000      36100
KING             5000      60100
TURNER           1500      18100
ADAMS            1100      13300
JAMES             950      11500
FORD             3000      36100
MILLER           1300      15700
14 rows selected.
Elapsed: 00:00:00.00

每个雇员每月加100后年工资

select ename,sal,(sal+100)*12 from emp;
 
 
ENAME             SAL (SAL+100)*12
---------- ---------- ------------
SMITH             800        10800
ALLEN            1600        20400
WARD             1250        16200
JONES            2975        36900
MARTIN           1250        16200
BLAKE            2850        35400
CLARK            2450        30600
SCOTT            3000        37200
KING             5000        61200
TURNER           1500        19200
ADAMS            1100        14400
JAMES             950        12600
FORD             3000        37200
MILLER           1300        16800
14 rows selected.
Elapsed: 00:00:00.00

关系型数据库中存在空值 null ,是一个不确定的值,在做任何四则运算时得到的结果也是空值

select ename,sal,comm from emp;
ENAME             SAL       COMM
---------- ---------- ----------
SMITH             800
ALLEN            1600        300
WARD             1250        500
JONES            2975
MARTIN           1250       1400
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500          0
ADAMS            1100
JAMES             950
FORD             3000
MILLER           1300
14 rows selected.
Elapsed: 00:00:00.01

根据奖金,算出工资总和

select ename,sal,sal+comm from emp;
ENAME             SAL   SAL+COMM
---------- ---------- ----------
SMITH             800
ALLEN            1600       1900
WARD             1250       1750
JONES            2975
MARTIN           1250       2650
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500       1500
ADAMS            1100
JAMES             950
FORD             3000
MILLER           1300
14 rows selected.
Elapsed: 00:00:00.00

这里我们发现没有工资总和的是奖金为空的雇员,这里要说明的是,空值不是0,也不是空格,是一个未定义的值,如果四则运算里面需要用到空值,后续我们会介绍函数来专门处理空值的问题

----------------------------------------------------分割线--------------------------------------------------

select语句中的列别名

可以在列名后面跟as或者用空格再跟别名,虽然列别名在写的时候是小写,但是在结果集的列头中默认都是大写,如果强制要求小写或者列别名中间有空格,关键字,特殊字符时,可以用“”(双引号)把列别名表示出来

让列名以小写出现

select ename "name" from emp;
name
----------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
14 rows selected.
Elapsed: 00:00:00.01

通常别名用在有计算表达式的情况下,以简要说明表达式的意义

select ename,sal*12 annaul_sal from emp;
ENAME      ANNAUL_SAL
---------- ----------
SMITH            9600
ALLEN           19200
WARD            15000
JONES           35700
MARTIN          15000
BLAKE           34200
CLARK           29400
SCOTT           36000
KING            60000
TURNER          18000
ADAMS           13200
JAMES           11400
FORD            36000
MILLER          15600
14 rows selected.
Elapsed: 00:00:00.00

下面是别名有空格的情况

select ename,sal*12 "annaul sal" from emp;
ENAME      annaul sal
---------- ----------
SMITH            9600
ALLEN           19200
WARD            15000
JONES           35700
MARTIN          15000
BLAKE           34200
CLARK           29400
SCOTT           36000
KING            60000
TURNER          18000
ADAMS           13200
JAMES           11400
FORD            36000
MILLER          15600
14 rows selected.
Elapsed: 00:00:00.00
----------------------------------------------------分割线------------------------------------------------

select语句中的列连接,可以用 || 做列的连接符

select ename||job from emp;
ENAME||JOB
-------------------
SMITHCLERK
ALLENSALESMAN
WARDSALESMAN
JONESMANAGER
MARTINSALESMAN
BLAKEMANAGER
CLARKMANAGER
SCOTTANALYST
KINGPRESIDENT
TURNERSALESMAN
ADAMSCLERK
JAMESCLERK
FORDANALYST
MILLERCLERK
14 rows selected.
Elapsed: 00:00:00.00

或者在列中间可以连接字符串,当然这里字符串要用单引号引起来''

select ename||' '||job from emp;
ENAME||''||JOB
--------------------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK
14 rows selected.
Elapsed: 00:00:00.01
select ename||' is '||job from emp;
    
ENAME||'IS'||JOB
-----------------------
SMITH is CLERK
ALLEN is SALESMAN
WARD is SALESMAN
JONES is MANAGER
MARTIN is SALESMAN
BLAKE is MANAGER
CLARK is MANAGER
SCOTT is ANALYST
KING is PRESIDENT
TURNER is SALESMAN
ADAMS is CLERK
JAMES is CLERK
FORD is ANALYST
MILLER is CLERK

14 rows selected.

Elapsed: 00:00:00.00
----------------------------------------------------分割线----------------------------------------------

select语句去除重复值

select ename,deptno from emp;
ENAME          DEPTNO
---------- ----------
SMITH              20
ALLEN              30
WARD               30
JONES              20
MARTIN             30
BLAKE              30
CLARK              10
SCOTT              20
KING               10
TURNER             30
ADAMS              20
JAMES              30
FORD               20
MILLER             10

14 rows selected.

Elapsed: 00:00:00.01

发现有雇员的部门是重复的,如果要去除重复值可以用 DISTINCT

select distinct deptno from emp;
    DEPTNO
----------
        30
        20
        10

Elapsed: 00:00:00.01




























猜你喜欢

转载自blog.csdn.net/paul_george/article/details/80042141
今日推荐