用到了scott和hr用户。
在命令行输入sqlplus hr/hr可以登录hr用户,其中用户名为hr,密码为hr。
学习目的:
作为一个Java工程师,应该掌握的数据库的知识。第四天是DBA的知识。
基本查询:
(1)进入到sqlplusscott/tiger。
--spool可以将输入的所有命令保存到硬盘。
spool c:\基本操作.txt
--清屏
host cls
--当前用户
show user
--切换用户
conn hr/hr
--当前用户下的表,tab可以理解为数据字典,包含了当前用户表的信息。
select * from tab;
--查看表结构
desc emp;
--查询所有员工的所有信息
select * from emp;
--设置行宽,120表示这一行有120个字符,空格也算
set linesize 120
--设置列宽,col表示column,ename表示ename列,for是format的缩写,a表示是字符串,8表示占8位。
col ename for a8
--为数值型列设置列宽,为sal列设置,for是format缩写,用9表示一位数字,9999表示四位数字
col sal for 9999
--“/”表示执行上一条sql语句
/
--根据列名查询
select empno,ename,job,mgr,hiredate,sal,comm.,deptnofrom emp;
--查询员工号姓名月薪
select empno,ename,sal from emp;
--员工号姓名月薪年薪
select empno,ename,sal,sal*12 from emp;
--员工号姓名月薪年薪奖金年收入(年薪+奖金=年收入)
select empno,ename,sal,sal*12,comm.,sal*12+commfrom emp;
--设置每页显示数据数,设置每页显示20条数据。
set pagesize 20
/*
在计算年收入的时候,如果没有奖金,也就是奖金为null,那么年收入也无法显示,
但是正常情况下,如果没有奖金,年收入应该等于年薪。
这涉及到了null的问题,
1, 包含null的表达式都为null
2, 在Oracle中null != null
在计算年收入的式子中:sal*12+comm,如果comm为null,则整个式子的值就是null。
如何解决呢?奖金为null,就是说奖金是0,将null视为0,用到Oracle的滤空函数:
有两个
Nvl(a,b)当a的值不为null的时候返回a的值,如果是null就返回b。
Nvl2(a,b,c),
*/
--修改查询语句,虑空
select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0)from emp;
--什么是null!= null呢?查询奖金为null的员工
select * from emp where comm=null;
/*
上面的这句查询是错误的,comm中有null,但是无法查询,所以null!= null
判断一个值是否为null,使用 is null , is not null
*/
select * from emp where comm is null;
select * from emp where comm is not null;
/*
对于一个系统来讲,数据是核心,如果数据错了,程序写的再对,结果都是错的。
所以应用系统中数据库才是核心。Javaweb程序都是围绕数据库来开发的。
*/
--别名,注意,可以通过as的方式,可以直接双引号,也可以直接写别名,通常用双引号的方式。
select empno as “员工号”,ename “姓名”,sal 月薪,sal*12 年薪,comm 奖金,sal*12+nvl(comm.,0)年收入 from emp;
--改错,from写成form
select * form emp;
--c命令,change,SQL> 后面的光标默认指向上一条SQL语句的第一行。所以我们只敲一个1,就定位到了第一行中。
1
--会显示1*formemp
c /form/from
/
--使用ed命令edit,输入ed回车会弹出系统默认编辑器,并将上一条SQL语句填充进去。在里面改就OK了
--改完之后保存,关闭,回到命令行/执行上一条SQL即可。
ed
/
/*
as “员工号”这个别名和”姓名”这个别名有区别么?没有。
“姓名”这个别名和月薪有区别么?有,如果月 薪的话会报错。也就是说,别名中如果有关键字或特殊符号,就必须加上双引号。
*/
--distinct,去掉重复记录,如果是多列,则作用与后面所有的列,只有当这些列都一样的时候才会被认为是重复的,
--才会被去掉。
select DISTINCT deptno from emp;
select DISTINCT deptno,job from emp;
/*
SQL语言大小写不敏感,SQL可以写在一样或者多行,关键字不能被缩写也不能分行,各字句一般要分行写,使用缩进提高语句的可读性。MySQL中大小写不敏感,可以说是Mysql的一个bug。
*/
--空值null是无效的,未指定的,未知的或不可预知的值,空值不是空格或0。
--连接符,concat,在mysql中,直接selectconcat(‘hello’,’ world’);就可以了,但是Oracle不可以。
/*
因为Oracle遵循一个标准,叫做SQL99,是ANSI国际标准组织在1999年针对SQL语句发布的一个标准,我们把这个标准叫做SQL99。在这个标准中,定义了select语句必须要有from。MySQL并没有严格遵循这个标准。
*/
--在Oracle中,当你要做一个操作,这个操作跟任何表都没有关系的时候,Oracle提供了一张表,叫做dual表。
--dual表也叫做伪表。这张表没有什么用途,只是为了满足select… from … 这个语法。是管理员提供的。
select concat(‘Hello’,’World’) from dual;
select 3+2 from dual;
--连接符 || ,与Java中的+号是一样的。
select ‘Hello’||’ World’ 一列 from dual;
--查询员工信息:***的薪水是***
select ename||’的薪水是’||sal 信息 from emp;
/*
字符串可以是select列表中的一个字符,数字,日期,日期和字符只能在单引号中出现,每当返回一行时,字符串被输出一次。
*/
/*
SQL和SQL*Plus
SQL是一个语言,
SQL*Plus是Oracle提供给我们的一个工具,命令行打开后显示的标题就是sqlplus。Sqlplus有自己的命令。
Set c ed col desc都是sqlplus命令。
如何判断一个命令是 sql 命令还是 sqlplus 命令呢?最大的一个区别就是 SQL 语句关键字不能缩写,而 SQL*Plus 关键字可以缩写。以下是 SQL 和 SQL*Plus 的区别:
在Oracle服务中,最占资源的,启动最慢的是OracleServiceORCL。推荐改为手动开启。
除此之外,还有一个iSQL*Plus,他对应的服务是:OracleOraDb10g_home1iSQL*Plus。这个服务类似于Tomcat。其端口号是5560,开启这个服务后,在浏览器中输入localhost:5560/sqlplus/可以访问这个服务。iSQL*Plus其实就是SQL*Plus命令行工具的Web网页版,可以通过网页完成数据库的操作。
服务OracleDBConsoleorcl,是一个基于Web的图形化工具,通过他我们可以管理Oracle数据库。在浏览器中访问localhost:1158/em/即可。在Oracle10中,每次退出的时候都会弹出这个浏览器窗口。
*/
--保存上一条sql命令到硬盘上。保存到c盘下的a.sql文件中。
save c:\a.sql
--加载保存的硬盘的脚本,@是加载并执行,load是加载,但不执行。
@c:\a.sql
--在Oracle11g中没有iSQL*Plus工具,替代者是SQL Developer。为啥替代呢?因为iSQL*Plus是Web工具,可以通过
--抓包工具抓取数据,会很危险。https协议可以加密传输数据。
--将之前的spool基本查询.txt 到现在的所有的sql操作都保存到硬盘上,通过spool off结束。
spooloff