继续sql命令的学习
之前因为设定了系统环境变量PATH,所以这里可以直接进入数据库,用这个命令:
sqlplus / as sysdba
如果不是配置了系统PATH让系统自己寻找路径,那么我们需要自己先要进入到要使用数据库的目录下,我们需要先切换到oracle用户下,
su - oracle
输入下面一系列命令找到数据库目录。
cd dbs
cd $ORACLE_HOME
cd rdbms/admin
找到utlsampl.sql这个文件,我们需要执行它,
sqlplus / as sysdba
startup
启动数据库后,at utls.sql这个文件,
@utlsampl.sql
输入完这个命令,数据库会推出,再进一次sql,这个文件就会加载进去。此时,数据库就可以正常使用了。
进入学习sql命令:
select输出ename,empno,deptno,job这四列,where是将没用的信息过滤掉,之筛选我们需要的数据。下面这条命令就是只输出部门编号为10的部门,部门下员工的信息就输出出来了。
SQL> select ename , empno , deptno , job
2 from emp
3 where deptno=10;
ENAME EMPNO DEPTNO JOB
---------- ---------- ---------- ---------
CLARK 7782 10 MANAGER
KING 7839 10 PRESIDENT
MILLER 7934 10 CLERK
我们把"KING"筛选出来,那么king的基本信息就会被输出。ename是输出名字,所以要加单引号“‘’”,名字和字符都需要用单引号,数字不需要单引号。
SQL> select ename , empno , deptno , job
2 from emp
3 where ename='KING';
ENAME EMPNO DEPTNO JOB
---------- ---------- ---------- ---------
KING 7839 10 PRESIDENT
hiredate是要输出日期,也要加单引号。日期格式“DD-MM-RR”,RR是输出年代,并不是整个年的全称,就只输出后两位。
SQL> select ename , empno , deptno , job , hiredate
2 from emp
3 where hiredate='19-APRIL-87'
4 ;
ENAME EMPNO DEPTNO JOB HIREDATE
---------- ---------- ---------- --------- ---------
SCOTT 7788 20 ANALYST 19-APR-87
SQL> select ename , empno , deptno , job , hiredate
2 from emp
3 where hiredate='19-APR-87';
ENAME EMPNO DEPTNO JOB HIREDATE
---------- ---------- ---------- --------- ---------
SCOTT 7788 20 ANALYST 19-APR-87
alter session的命令是改变时间格式,现在变成了年月日的输出形式。
SQL> alter session
2 set nls_date_format='YYYY-MM-DD';
Session altered.
输出在1987年4月19日以后入职的员工信息。
SQL> select ename , empno , deptno , job , hiredate
2 from emp
3 where hiredate>'1987-04-19';
ENAME EMPNO DEPTNO JOB HIREDATE
---------- ---------- ---------- --------- ----------
ADAMS 7876 20 CLERK 1987-05-23
部门编号大于20的部门及员工输出。
SQL> select ename , deptno
2 from emp
3 where deptno>=20;
ENAME DEPTNO
---------- ----------
SMITH 20
ALLEN 30
WARD 30
JONES 20
MARTIN 30
BLAKE 30
SCOTT 20
TURNER 30
ADAMS 20
JAMES 30
FORD 20
11 rows selected.
between… and…语句表示在两个范围的值之间。部门在10-30之间并且包括10和30。
SQL> select deptno , dname
2 from dept
3 where deptno between 10 and 30;
DEPTNO DNAME
---------- --------------
10 ACCOUNTING
20 RESEARCH
30 SALES
in是在组里的所有的值匹配。这个组里包括了Scott,King和Hyc三个人,但是hyc不在上面数据库里,所以在结果里没有hyc的输出结果。而且这里的名字必须大写,如果不大写的话,也不会有值输出。
SQL> select ename , sal
2 from emp
3 where ename in ('SCOTT','KING','HYC');
ENAME SAL
---------- ----------
SCOTT 3000
KING 5000
输出comm是空值的员工。
SQL> select ename , comm
2 from emp
3 where comm is null;
ENAME COMM
---------- ----------
SMITH
JONES
BLAKE
CLARK
SCOTT
KING
ADAMS
JAMES
FORD
MILLER
10 rows selected.
not是非,这里是过滤掉不是空值的员工,所以有comm的员工会输出出来。
SQL> select ename , sal
2 from emp
3 where comm is not null
4 ;
ENAME SAL
---------- ----------
ALLEN 1600
WARD 1250
MARTIN 1250
TURNER 1500
用and语句连接两个并列的条件,是要同时符合这两个条件。并且and左右两边颠倒过来也是一样的。
SQL> select ename , deptno , sal , comm , hiredate
2 from emp
3 where deptno=30 and sal<3000;
ENAME DEPTNO SAL COMM HIREDATE
---------- ---------- ---------- ---------- ----------
ALLEN 30 1600 300 1981-02-20
WARD 30 1250 500 1981-02-22
MARTIN 30 1250 1400 1981-09-28
BLAKE 30 2850 1981-05-01
TURNER 30 1500 0 1981-09-08
JAMES 30 950 1981-12-03
6 rows selected.
or表示或的关系,要么是条件一要么是条件二
SQL> select ename , deptno , sal , comm , hiredate
2 from emp
3 where sal<3000 or deptno=30;
ENAME DEPTNO SAL COMM HIREDATE
---------- ---------- ---------- ---------- ----------
SMITH 20 800 1980-12-17
ALLEN 30 1600 300 1981-02-20
WARD 30 1250 500 1981-02-22
JONES 20 2975 1981-04-02
MARTIN 30 1250 1400 1981-09-28
BLAKE 30 2850 1981-05-01
CLARK 10 2450 1981-06-09
TURNER 30 1500 0 1981-09-08
ADAMS 20 1100 1987-05-23
JAMES 30 950 1981-12-03
MILLER 10 1300 1982-01-23
11 rows selected.
用distinct去重,只把不同的工作输出出来。
SQL> select distinct job
2 from emp;
JOB
---------
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST
输出job是analyst并且sal大于3000,以及job是manager的。
SQL> select ename , deptno , sal , comm , hiredate
2 from emp
3 where job='ANALYST' and sal>3000 or job='MANAGER';
ENAME DEPTNO SAL COMM HIREDATE
---------- ---------- ---------- ---------- ----------
JONES 20 2975 1981-04-02
BLAKE 30 2850 1981-05-01
CLARK 10 2450 1981-06-09
order by是按顺序排列,asdc是从小到大排列,dscb是从大到小排列,默认是从小到大。
SQL> select ename , sal
2 from emp
3 order by sal;
ENAME SAL
---------- ----------
SMITH 800
JAMES 950
ADAMS 1100
WARD 1250
MARTIN 1250
MILLER 1300
TURNER 1500
ALLEN 1600
CLARK 2450
BLAKE 2850
JONES 2975
ENAME SAL
---------- ----------
SCOTT 3000
FORD 3000
KING 5000
14 rows selected.
按姓名 的字母顺序进行排列。
SQL> select ename , sal
2 from emp
3 order by ename;
ENAME SAL
---------- ----------
ADAMS 1100
ALLEN 1600
BLAKE 2850
CLARK 2450
FORD 3000
JAMES 950
JONES 2975
KING 5000
MARTIN 1250
MILLER 1300
SCOTT 3000
ENAME SAL
---------- ----------
SMITH 800
TURNER 1500
WARD 1250
14 rows selected.
将部门编号和工资升序排列。输出结果是部门从小到达,每个部门的工资从小到大。如果输出三个列,order这个命令就无法排列,只会把第一个排序列出。
SQL> select ename , sal , deptno
2 from emp
3 order by deptno ,sal;
ENAME SAL DEPTNO
---------- ---------- ----------
MILLER 1300 10
CLARK 2450 10
KING 5000 10
SMITH 800 20
ADAMS 1100 20
JONES 2975 20
SCOTT 3000 20
FORD 3000 20
JAMES 950 30
MARTIN 1250 30
WARD 1250 30
ENAME SAL DEPTNO
---------- ---------- ----------
TURNER 1500 30
ALLEN 1600 30
BLAKE 2850 30
14 rows selected.
order by 3是查找上边select后边的第三列,那么就是查找deptno。
SQL> select ename , sal , deptno
2 from emp
3 order by 3;
ENAME SAL DEPTNO
---------- ---------- ----------
CLARK 2450 10
KING 5000 10
MILLER 1300 10
JONES 2975 20
FORD 3000 20
ADAMS 1100 20
SMITH 800 20
SCOTT 3000 20
WARD 1250 30
TURNER 1500 30
ALLEN 1600 30
ENAME SAL DEPTNO
---------- ---------- ----------
JAMES 950 30
BLAKE 2850 30
MARTIN 1250 30
14 rows selected.
优先级运算,最先算加减,后算比较大小,所以2000+1000会被先计算出来,然后结果是sal>3000的结果。
SQL> select ename , sal , deptno
2 from emp
3 where sal>2000+1000;
ENAME SAL DEPTNO
---------- ---------- ----------
KING 5000 10
这个命令是将表格以横200纵200的格式列表。可以横向展开所有的数据,就不会因为格满而跑到下一行。
SQL> set pages 200 lines 200
empno=数字,可以直接用数字去查询员工信息。
QL> select ename , empno , sal
2 from emp
3 where empno=7788;
ENAME EMPNO SAL
---------- ---------- ----------
SCOTT 7788 3000
*/是重复上一条成功执行的命令。
*l是查询上条命令
SQL> select ename , empno , sal
2 from emp
3 where empno=7788;
ENAME EMPNO SAL
---------- ---------- ----------
SCOTT 7788 3000
SQL> /
ENAME EMPNO SAL
---------- ---------- ----------
SCOTT 7788 3000
SQL> l
1 select ename , empno , sal
2 from emp
3* where empno=7788
输入 n a m e 命 令 , 既 可 以 自 动 查 询 名 字 , 只 要 把 想 要 查 找 的 员 工 姓 名 输 入 即 可 。 但 要 注 意 的 是 因 为 还 是 名 字 , 所 以 要 注 意 单 引 号 。 如 果 ′ name命令,既可以自动查询名字,只要把想要查找的员工姓名输入即可。但要注意的是因为还是名字,所以要注意单引号。如果' name命令,既可以自动查询名字,只要把想要查找的员工姓名输入即可。但要注意的是因为还是名字,所以要注意单引号。如果′name’外加引号,下边直接输名字;如果$name外边没加引号,后面输入名字时就要加上,否则没有输出结果。
SQL> select ename , empno , sal
2 from emp
3 where ename='&name';
Enter value for name: KING
old 3: where ename='&name'
new 3: where ename='KING'
ENAME EMPNO SAL
---------- ---------- ----------
KING 7839 5000
我们把所有四行都用$加变量,那么下边就可以输入下边四个变量,可以按自己想查找的条件一次调用。
SQL> select &col
2 from &tab
3 where deptno=&no
4 order by ℴ
Enter value for col: ename ,sal*12,deptno
old 1: select &col
new 1: select ename ,sal*12,deptno
Enter value for tab: emp
old 2: from &tab
new 2: from emp
Enter value for no: 20
old 3: where deptno=&no
new 3: where deptno=20
Enter value for order: 2
old 4: order by &order
new 4: order by 2
ENAME SAL*12 DEPTNO
---------- ---------- ----------
SMITH 9600 20
ADAMS 13200 20
JONES 35700 20
FORD 36000 20
SCOTT 36000 20