一、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、综合例子