sqlplus_oracle
spool off关闭记录
spool文件名此命令会把所有的操作存在某个文件中去
设置日期格式:alter session set nls_date_format='yyyy mm dd hh24:mi:ss'
SQL全名是结构化查询语言(Structured Query Language),是用于数据库中的标准数据查询语言,IBM公司最早使用在其开发的数据库系统中.不过各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充.所以,实际上不同数据库系统之间的SQL语言不能完全相互通用.
SQL语言分为四大类:
1数据查询语言DQL
数据查询语言DQL基本结构是由select子句,from子句,where子句组成的查询块:select<字段名表>from<表或视图名>where<查询条件>
2数据操纵语DML(insert.update,delete)
主要有三种形式:插入:INSERT更新:UPDATE删除:DELETE
3数据定义语言DDL(create,drop,alter)
用来创建数据库中的各种对象---表,视图,索引等.
4数据控制语言DCL(commit,rollback,grant)
用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等.如:
1)grant:授权。
2)rollback to[savepoint]:回滚到某一点:rollback回滚命令使数据库状态回到上次最后提交的状态.其格式为:SQL>rollback;
3)commit:提交。
a.sql语句,表名以及字段名是大小写不敏感的。
b.sql语句要以";"结尾,来表示sql语句结束,如果不加";"系统不会执行此条sql
中字符显示是左对齐,数值右对齐。
字符串拼接使用(||)符号
目标字段名||''||目标字段名from表名;
中使用shell命令.实际上是sqlplus开了子进程来执行shell命令)。
(2)改变身份可以直接
connect用户名/密码---这个是sqlplus命令
select
student;
3)where xx like‘…’字符串通配查询:'%'表示0或任意多个字符,’_’表示任
意一个字符
注意转义的用法:like‘S\_%’escape‘\’
eg:找出表名是以S_开头的表
select table_name from user_tables where table_name like‘S\_%’escape‘\’;
escape定义谁为转义字符,我们把\(下划线)定义为转义字符
escape可以使我们自己定义需要的转义字符.escape关键字经常
用于使某些特殊字符,如通配符:'%','_'转义为它们原来的字符的意义,被定
义的转义字符通常使用'\',但是也可以使用其他的符号.
table_name like'S@\'escape'@'这里将@定义为转义字符,而不是'\'.
1)order by+字段名:表示按哪个字段排序
2)order by+别名(允许)
select first_name,salary*12sal from s_emp order by sal(正确)
3)order by column_name DESC按某个字段降序排序
column_name ASC<=>order by column_name(默认是升序)
distinct也会触发排序
注意:在使用having的时候一定要有group by语句,并且having后面所过滤的字段一定要在group by语句中出现,同样having语句后面不能用select 中字段的别名。
语句完整的执行顺序:
子句组装来自不同数据源的数据;
子句基于指定的条件对记录行进行筛选;
substr:取子字符串,从start 开始,取count 个substr(string,start,count)length:select 'zhang'||'san'from dual;
select substr(‘zhangsan’,6,3)from dual;=>san
起始位置(start )的值可以为负数,表示从右至左截取。
select substr('zhangsan',-6,3)from dual;=>ang 求长度:select length(‘abcdef’)from dual;=>6
select nvl(salary,0)from s_emp;
如果salary为空,则显示0,不为空,则显示工资数,注意两
个参数的格式要保持一致.
replace('string','s1','s2')
select months_between(add_months(sysdate,2),sysdate)from dual;=>2 add_months:增加或减去月份
select to_char(add_months(to_date('200911','yyyy mm dd'),2),'yyyy mm dd')MYDATE from dual;=>20090301
select to_char(add_months(to_date('200911','yyyy mm dd'),-2),'yyyy mm dd')MYDATE from dual;=>20081101
_day(date,'day'):从date这个日子开始数,第一次出现指定星期的日期返回日期的最后一天
next_day(’2-SEP-09’,’FRIDAY’)from dual;=>04-SEP-09
last_day(sysdate)from dual;=>30-SEP-09
select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss')from dual;
2009/09/0213:49:37
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')from dual;
2009-09-0213:50:54
select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss')from dual;
2009.09.0213:51:27
日期格式’):字符串转日期,主要用于日期的入库
原理:把两个字段的关系转成两个表之间的关系
3.外连接:外连接查询出来的结果是对内连接的补充
to_date('20080808','yyyy mm dd')from dual;
列出每个员工对应的领导select a.first_name ename,b.first_name mname
from s_emp a,s_emp b where a.manager_id=b.id;
左外连接:
查询所有员工及对应部门的记录,包括没有对应部门编号dept_id的员工记录
https://www.360docs.net/doc/187745227.html,st_name,e.dept_id,https://www.360docs.net/doc/187745227.html,
注意:Oracle10g以前的数据库不支持全外连接
(+)这种形式只适用于Oracle数据库
right(left)outer join...on中的outer可以省略
4.子查询
子查询对返回结果排序,排重
哪些人是领导
select first_name from s_emp where id in(select manager_id from s_emp);未加distinct,因为子查询对返回结果排序,排重
单行子查询
ename,deptno,sal from emp where deptno=(select deptno
e)在HAVING子句中使用子查询
select deptno,job,avg(sal)from emp group by deptno,job
having avg(sal)>(
SELECT sal FROM EMP WHERE ename='Ben');
联合:将两条记录和起来作为一个整体
select count(*)from s_emp union select count(*)from s_dept COUNT(*)
----------
12
25
MINUS减去:
SQL>select id,first_name from s_emp
2where rownum<=10minus select id,first_name from s_emp 3where rownum<=5;
ID FIRST_NAME
-----------------------------------
6Molly
7Roberta
8Ben
9Antoinette
10Marta
可以找出rownum在5与10之间的数据
userinfo,包含userid,username字段,其中userid是唯一的,可重复,请写一句sql查询语句,把有重复的记录全部取出来
3count(username)>1)n
4where https://www.360docs.net/doc/187745227.html,ername=https://www.360docs.net/doc/187745227.html,ername
5order by u.id;
SQL>/
ID USERNAME
--------------------
1laowang
2laowang
3laoli
4laoli
1select id,username from userinfo where username in( 2select username from userinfo group by username 3having count(username)>1)
4*order by id;
SQL>/
ID USERNAME
-------------------------------
1laowang
2laowang
3laoli
4laoli