首先要配置下环境
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' PAUSESQLPLUS命令的特点
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