明留

将何所持,将何所往?此刻惜之!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、在sqlplus命令行中,show/desc是显示用户、数据库和表的结构;执行命令时可以用这个控制显示的行和列set linesize 行数、set pagesize 列数  sysdba:sys/change_on_instanll  system/manager (常用)
2、sqlplus (ed(记事本调用) ed a;
            @(执行) @ d:\demo.txt或者demo都是在 d分区中创建demo文本文档
3、关闭数据库实例:shutdown 实例
   库被关闭后用户无法直接连接sqlplus命令,但此时可以用/nolog,之后用管理员登录;
   启动数据库实例:startup 实例
   sqlplus命令窗口也可调用本机的os命令。使用host作为前缀。
数据库运算符号:>、>=、<、<=、!=、<>、between、and、like、in、isNull、or、not
    范围:bettwen...and
    判断是否为空:is (not)null
    指定范围判断:in(指定查询范围) not in(...)相反;
    模糊查询like子句:1、匹配单个字符"_" 2、匹配多个字符"%"即0-n个。%%类似like,得到是全部显示数据。
    函数:
    单行函数(数字、日期、转换、字符、通用函数)
字符:upper(转大写) dual(虚拟表,oracle专有)/lower
(转小写)、replace(字符串|列)替换、 substr(字符串|列,开始点[,结束点])从开始点到结束点截取(若设置为负数,则表示从后面截取的个数)。
数字:Round(数字|列[,保留的小数位数]):四舍侮辱五入的操作。
trunc(数字|列[,保留的小数位数]):舍弃指定位置的内容
mod(数字1,数字2):取模
日期:获得当前日期“SYSDATE”
日期+数字:表示若干天后的日期。
日期-数字:表示若干天前的日期。
日期-日期:表示两个日期间的天数。
LASY_DAY(日期):求出指定日期的最后一天。
NEXT_DAY(日期,星期数):求出下一个指定星期数的日期
ADD_MONTHS(日期,数字):求出若干月之后的日期。
MOTHS_between(日期,日期):求出两个日期之间所经历的月份。
转换:toChar(字符串|列,格式字符串):将日期或数字变为字符串显示。
      toDate(字符串,格式字符串):将字符串变为Date数据显示。
      to_Number():字符串变为数字。
(Fm:省另标记;L:表货币标记;24:表24小时制;hh:mm:ss;YYYY:MM:DD)
通用函数:NVL():处理null(将null变为0)。NVL(字段,0)。
          Decode(数值|列,判断值,显示值1,...):多数值判断。
          COUNT(*):表示统计表的总记录数。

--------------------------------------------------
简单查询都是涉及到一张表,其实很多时候我们查询的操作都是几张表;所以多表查询的语法很重要。
select [distinct] *|列[别名][列 别名...]
from 表名称[别名],[表名称[别名],...]
[where 条件(s)]
[order by 排序字段 asc|desc [排序字段 asc|desc];
2、在日后开发中,很多人都肯定要接触许多新的数据库和表,数据量较大的话,直接输入命令可能无法显示数据或是造成系统死机;其实最好消除笛卡尔积,也就是采用关联字段的形式来消除;在多表查询中,不同表中有了相同的字段的时候,访问这些字段必须加上表名称。
select * from emp, dept
where emp.deptNo=dept.deptNo;
此时的查询结果之中已经消除了笛卡尔积,但是只属于显示上的消除,而真正笛卡尔积现在依然存在,因为数据库的操作机制就属于逐行的进行数据的判断,那么如果按照这个思路理解的话,现在假设两张表的数据量都很大的话,那么使用这种多表查询的性能很低。(因为数据量大)
不过,在多表查询的时候往往都会为表起就表别名,通过别名.字段的方式进行查询。
针对多表查询分析步骤:
(确定所需要的表、确定表关联字段)
select * from emp e, dept d
where e.deptNo=d.deptNo;
3、对于自身连接,如果查询的结果中没有某条记录,此时是因为条件没有为null,要想其显示,就需要进行左右连接。
   范例:查询出每个雇员的编号、姓名、基本工资、职位、领导的姓名、部们名称和位置。
   .确定所需要的表:
     |-emp:每个雇员的编号、姓名、基本工资、职位;
     |-emp(领导):领导姓名;
     |-dept:部门名称和位置;
   .确定关联字段:
     |-雇员和部门:emp.deptNo = dept.deptNo;
     |-雇员和领导:emp.mgr=emp.empNo;
   select empNo, ename, sal, job
   from emp;
   加入领导信息,引入自身关联,同时增加消除笛卡尔积的条件
   select e.empNO, e.eName,e.sal,e.job, m.eName
   from emp e, emp m
   where e.mgr=m.empNo;
   加入部门信息,引入dept表,既然有新表进来,则需要继续增加消除笛卡尔积的条件
   select e.empNo, e.eName,e.sal, e.job,m.eName,d.dName,d.loc
   from emp e, emp m, dept d
   where e.mgr=m.empNo and e.deptNo = d.deptNo
   范例:select e.empNo, e.eName,e.sal,d.dName
             DECODE(s.grade,1,'第五等工资',2,'第四  等工资',3,'第五等工资',4,'第二等工  资',5,'第一等工资')gradeInfo
         from emp e, dept d, salgrade s
         where e.deptNo=d.deptNo and e.sal between   s.losal and s.hisal;
3、左、右连接"(+)":是查询参考方向的改变
   "(+)"放在了"="左边表示左连接,反之右连接。这种符号是Oracle是独有的。其他数据库不能支持这种符号。
-------------------------------------------------
SQL1999语法:除了以上的表操作之外,在SQL语法之中,也提供了另外一套表连接来操作SQL;
   select table1.colum, table2.colum
   from table1[cross join table2]
   [natural join table2]
   [join table2 using(colum_name)]|
   [join table on    (table1.column_name=table2.column_name)]|
   [left|right|full outer join table2 on    (table1.colum_name=table2.colum_name)]
 a、交叉连接(across join):用于产生笛卡尔积
    select * form emp across join emp;
    笛卡尔积本身并不是属于无用的内容,在某些情况下    还是需要使用的。
 b、自然连接(natural join):自动找到匹配的关联字段    ,消除掉笛卡尔积。
    select * from emp natural join dept;
    但是并不是所有的字段都是关联字段,设置关联字段
    需要通过约束指定;
 c、join...using子句:用户自己指定一个消除笛卡尔积    的关联字段;
    select * from emp join dept using(deptno)
 d、join...on子句:用户指定一个可以消除笛卡尔积的关    联条件
    select * from emp join dept on(emp.deptNo=dept.deptNO)
 e、连接方向的改变:
    .左(外)连接:left outer join...on;
    .右(外)连接:right outer join...on;
    .全(外)连接:full outer join...on;将表没显示的   数据都显示
    select * from emp right outer join dept on (emp.deptNo=dept.deptNo);
    除Oracle外的数据库都使用以上sql1999语法操作。
--------------------------------------------------

posted on 2012-06-25 21:51  明留  阅读(460)  评论(0编辑  收藏  举报