Oralce笔记(更新中...)

select d.dname 部门名称,count(e.empno) 人数  
from  dept d left outer join emp e
on (d.deptno = e.deptno)
group by d.dname

                                                Oracle 学习笔记

 1.SqlPlusw的常用操作命令

set linesize 长度; ---设置每行显示的长度
set pagesize 行数; ---设置每页显示的行数 
@d:\demo.txt ----打开某个文件,并执行 
@d:\demo -----*.sql文件不需要输入后缀 
conn 用户名/密码 [AS SYSDBA] ---- 登陆命令
show user; ---显示当前连接的是哪一个用户

select * from tab;  ---得到本用户下的所有表
desc 表名称;        ---显示表结构
/                   ---表示继续执行上一次的操作命令

2.Oracle常用数据类型

NUMBER(4);        ---表示数字,长度4位的整型
VARCHAR2(10);     ---表示的是字符串,可容纳10个字符
NVARCHAR2(10);    ---表示的是字符串,可容纳10个中文字符,20个英文字符 
DATE;             ---表示日期类型,默认格式是 13-2月-12
NUMBER(7,2);      ---表示的是小数,其中小数位占最多2位,整数位最多5位

3.Sql简介

     Sql(Structured  Query  Language,结构查询语言)

     Structured  : 结构化

      Query        :      查询;询问

    Language  :   语言

      大体分类:

       DML   (Data  Manipulation  Language ,数据操作语言)  ---用于检索或者修改

       DDL   (Data  Definition    Language ,  数据定义语言)  ---用于定义数据的结构,如创建,修改

       DCL   (Data   Control  Language,  数据控制语言)                ---用于定义数据库用户的权限

 4.查询语句

SELECT *|列名  别名  FROM 表名称   ----标准查询语句,尽量使用别名点列名的方式操作,方便

SELECT {DISTINCT} *| 具体的列名 别名  FROM 表名称;  ---消除重复列值,如果查询多列,这必须保证多列都有重复的值;Distinct :截然不同的,完全分开的

SELECT '编号:'||empno||'姓名:'||name||'年龄:'||age  FROM EMP;  ---字符串连接

SELECT 12*SAL-12+1/AGE FROM EMP;  ---支持四则运算 +,-,*,/

SELECT {DISTINCT}*|具体的列 列名 FROM 表名称 {WHERE 条件(s)}    ---Where子句限定查询

---逻辑运算符:<,>,=,>=,<=,

SELECT * FROM emp WHERE comm IS NOT NULL;   ---查询comm列不为空的数据

SELECT * FROM emp WHERE comm  IS NULL;      ---查询comm列为空的数据

SELECT * FROM emp WHERE sal>1500 AND comm IS NOT NULL;  --查询条件连接符


SELECT * FROM emp WHERE sal>1500 OR comm IS NOT NULL;   ---查询条件或连接符,可以连接多个条件

SELECT * FROM emp WHERE NOT (sal>1500 AND comm IS NOT NULL);  ---Not取反,不是或者不在这个范围内


SELECT * FROM emp WHERE sal>1500 AND sal<300 ----指定范围查询

SELECT * FROM emp e WHERE e.sal BETWEEN 1500 AND 3000; --指定范围查询

SELECT * FROM emp e WHERE e.hiredate BETWEEN '1-1月 -81' AND '31-12月 -81'; ---指定时间范围查询

SELECT * FROM emp IN(7369,7499,7521); ---In 范围查询,也可以是字符串,日期。。

SELECT * FROM emp NOT IN(7369,7499,7521);  ---Not In 范围查询


----字符模糊查询,'%':可以匹配任意长度字符的内容; '_':可以匹配一个字符的内容 

SELECT * FROM emp WHERE ename LIKE '_M%'; ---Like模糊查询,可以是日期,数字,字符串,。。。

SELECT * FROM emp WHERE empno <> 7369;   //<> ,不等于

SELECT * FROM emp WHERE empno != 7369;   //!=,不等于

-----------------ORDER BY 子句 排序------------------------
SELECT {DISTINCT}*|具体的列 别名 FROM 表名称 {WHERE 条件(s)} {ORDER BY 排序字段1,排序字段2 ASC|DESC} ---排序语句一般放在最后执行
--ASC 表示升序
--DESC 表示降序

5.Oracle中的函数

function_name(column|expression[arg1,arg2...])
参数说明:

 *   function_name: 函数名称

 *  column: 数据库列名

 *  expression : 字符串或计算表达式

*   arg1,arg2 : 在函数中使用参数

单行函数分离:

   *  字符函数:接受字符输入并且返回字符或数值

  *  数值函数: 接受数值输入并返回数值

  *  日期函数: 对日期型数据进行操作

  *  装换函数: 从一种数据类型转换为另一种数据类型

  *  通用函数: NVL函数,Decode 函数

(1).字符函数

SELECT UPPER('amith') FROM DUAL; ---UPPER将小写字母转换成大写

SELECT LOWER('HELLO!') FROM DUAL;  ---LOWER将大写字母转换成小写

SELECT INITCAP('hello!') FROM DUAL;  ---将每个单词的第一个字母大写,其后小写

SELECT CONCAT('Hello','World!') FROM DUAL; --- CONCAT字符串连接函数,连接几个字符串

SELECT SUBSTR('hello',1,3) FROM DUAL;      ---从第1个字符开始截取,截取3个字符,从0或者1开始都是一样的。

SELECT SUBSTR('hello',-3,3) FROM DUAL;     ---从倒数第三个开始截取,截取三个字符

SELECT LENGTH('hello')  FROM DUAL;         ---求出字符长度

SELECT REPLACE('hello','l','x')  FROM DUAL;  ---字符串替换,把所有l,替换成x

SELECT INSTR(''CORPORATE FLOOR'',''OR'', 3, 2)  FROM DUAL;----字符串查找 源字符''CORPORATE FLOOR'', 目标字符串''OR'',起始位置为3,取第2个匹配项的位置; 

(2).数值函数

SELECT ROUND(897.536) FROM DUAL;     ---四舍五入

SELECT ROUND(783.321,2) FROM DUAL;   ---四舍五入保留两位小数 

SELECT ROUND(789.536,-2) FROM DUAL;  ---对整数进行四舍五入,结果:800

SELECT TRUNC(789.536) FROM DUAL;     ---截取整数,不会进行四舍五入

SELECT TRUNC(789.536,2) FROM DUAL;   ---截取两位小数,不会进行四舍五入 结果:789.53
 
SELECT TRUNC(789.536,-2) FROM DUAL;  ---截取整数,不会进行四舍五入,结果700

SELECT MOD(10,3) FROM DUAL;        ---取余数,结果:1

(3).日期函数

日期函数的规律:

    *  日期 - 数字 = 日期

    *  日期 + 数字 = 日期

    *  日期 - 日期  = 数字(天数)

SELECT SYSDATE FROM DUAL;    ---求出当前日期, 30-3月-12

SELECT MONTHS_BETWEEN(sysdate,hiredate) FROM emp;  --求出给定范围的月数

SELECT ADD_MONTHS(SYSDATE,4) FROM DUAL;  ---求出增加后的月数

SELECT NEXT_DAY(SYSDATE,'星期一') FROM DUAL; ---求出下一个星期一是几号

SELECT LAST_DAY(SYSDATE) FROM DUAL;   ---求出本月的最后一天是几号

(4).装换函数

    * 年:yyyy

    * 月:   mm

    * 日:   dd

SELECT e.name,TO_CHAR(e.hiredate,'yyyy') 年,
              TO_CHAR(e.hiredate,'mm') 月,
              TO_CHAR(e.hiredate,'dd') 日
                                          From emp e;  ---TO_CHAR取日月年
SELECT e.ename,TO_CHAR(e.hiredate,'yyyy-mm-dd')  FROM emp e;  ---TO_CHAR把日期装换成2012-03-30

SELECT e.ename,TO_CHAR(e.hiredate,'fmyyyy-mm-dd')  FROM emp e;---TO_CHAR把日期装换成2012-3-30,fm去掉前导0

SELECT empno,ename,TO_CHAR(sal,'99,999') FROM emp; ---格式化数字,9代表一位数字,结果:1,235..12,356

SELECT empno,ename,TO_CHAR(sal,'$99,999') FROM emp;  ---以美元符号显示,结果:$23,567

SELECT e.ename,TO_CHAR(e.sal,'L99,999') FROM emp e;  ---以本地金钱标识符显示,结果:¥23,567

SELECT TO_NUMBER('123') FROM DUAL;     ---把字符串转换成数字 

SELECT TO_DATE('2012-09-03') FROM DUAL; ---字符串转换成日期,结果:03-9月-12

(5).通用函数

SELECT empno,ename,(sal+NVL(comm,0))*12 FROM emp;---如果某列为空,则整个表达式的值都为空,所以加NVL判断
---如果为空,则是0,对于Null值必须使用NVL判断

SELECT DECODE(1,1,'内容是1',2,'内容是2',3,'内容是3') FROM DUAL; ---使用Decode进行判断,可以使列或者表达式

6.多表联查

SELECT dept_name FROM dept d,emp,e WHERE d.deptno = e.empno

7.左右连接

select e.empno,e.ename,d.deptno,d.dname,d.loc        
   from emp e,dept d
   where e.deptno(+)=d.deptno;  ---(+)在左表示右连接,表示根据右侧所有的列,查出左侧的列,没有以空列填充
select e.empno,e.ename,d.deptno,d.dname,d.loc        
   from emp e,dept d
   where e.deptno=d.deptno(+);  ---(+)在右表示左连接,表示根据左侧所有的列,查出右侧的列,没有以空列填充

9.Sql1999

   select * from emp cross join dept;  ---交叉连接,会产生笛卡尔积
   select * from emp natural join dept;  --自动关联字段
   select * from emp e join dept d using(deptno); ---直接关联的操作列
   select * from emp e join dept d on(e.deptno = d.deptno); --on子句,用户自己编写连接的条件
   select * from emp e right outer join dept d on(e.deptno = d.deptno); --右连接查询
   select * from emp e left outer join dept d on(e.deptno = d.deptno);  --左外连接查询


10.组函数及分组统计(重点)

常用组函数:

     COUNT();求出全部的记录数

     MAX();求出一组中的最大值

     MIN(); 求出最小值

     AVG(); 求出平均值

     SUM();求和

分组函数只能在分组语句中使用,不能在Where后使用

分组统计

SELECT {DISTINCT} *|查询列1 别名1,查询列2 别名2,....

FROM 表名称1 别名1,表名称2 别名2....

{WHERE 条件(s)}
{GROUP BY 分组条件 {HAVING 分组条件}}

{ORDER BY 排序字段 ASC|DESC,排序字段 ASC|DESC....}
 
  

分组求和

select d.dname 部门名称,count(e.empno) 人数  
from  dept d left outer join emp e
on (d.deptno = e.deptno)
group by d.dname
分组求平均工加Having条件代替Where

select d.dname 部门名称,avg(e.empno) 平均工资
from dept d left outer join emp e
on(d.deptno = e.deptno)
group by d.dname
having avg(e.empno)>7700
分组函数统计,多条件

select job 工作,round(sum(sal)) 月工资合计 from emp 
group by job
having sum(sal) > 5000 and job <> 'SALESMAN' 
order by 月工资合计
分组函数嵌套统计

select max(avg(sal)) from emp
group by deptno

select * from table1 where length(字段)>2   ---返回字段的长度



--好啊!








 
  
 
 

你可能感兴趣的:(join,null,语言,function,数据库,query,Oracle)