设为首页 收藏本站
查看: 699|回复: 0

[经验分享] oracle之sql查询

[复制链接]

尚未签到

发表于 2018-9-7 11:59:49 | 显示全部楼层 |阅读模式
  oracle表管理
  表名和列的命名规则:
  必须以字母开头
  长度不能超过30字符
  不能使用oracle的保留字
  只能使用如下字符:A-Z,a-z,0-9,$,#等
  字符型:
  char:定长 最大2000字符
  例子:char(10) '小韩' 前四个字符放'小韩',后面添6个空格补全
  比如身份证定长,查询速度很快
  varchar2(20) 变长 最大4000字符,oracle推荐使用的类型
  例子:varchar2(10) '小韩' oracle分配四个字符,这样可以省略空间
  clob(character large object) 字符型大对象,最大4G
  数字类型
  number 范围10的-38次方,10的38次方
  可以表示整数,也可以表示小数
  number(5,2),表示有小数部位,且最大允许5位有效数,2位小数,number(5)表示最大允许5位整数
  日期类型
  date 包含年月日和时分秒
  timestamp精度高
  图片类型
  blob   二进制数据 可以存放图片,声音视频 4G(如果需要安全很高就存放数据库中)
  建表语句:
  SQL>create table stu(xh number(4),xm varchar2(20),sex char(3),birthday date,sal number(7,2));
  或者:
  SQL> create table stu(
  2  xh number(4),
  3  xm varchar2(20),
  4  sex char(3),
  5  sal number(7,2)
  6  );
  Table created.
  SQL> desc stu;       查看表结构
  Name                                      Null?    Type
  ----------------------------------------- -------- ----------------------------
  XH                                                 NUMBER(4)
  XM                                                 VARCHAR2(20)
  SEX                                                CHAR(3)
  BIRTHDAY                                           DATE
  SAL                                                NUMBER(7,2)
  删表:
  SQL> drop table student;     由于先前已经有张表为student
  Table dropped.
  向表stu中添加一个新字段

  SQL>>
  Table>  修改表stu中的某一个字段

  SQL>>
  Table>  删除表stu中某一个字段

  SQL>>
  Table>  修改表的名字
  SQL> rename stu to student;
  Table renamed.
  向表student中插入数据,先查看表结构
  SQL> desc student;
  Name                                      Null?    Type
  ----------------------------------------- -------- ----------------------------
  XH                                                 NUMBER(4)
  XM                                                 VARCHAR2(30)
  SEX                                                CHAR(3)
  BIRTHDAY                                           DATE
  CLASSID                                            NUMBER(2)
  SQL> insert into student values (1,'小黄','F','9-6月-16',1);
  insert into student values (1,'小黄','F','9-6月-16',1)
  *
  ERROR at line 1:
  ORA-01843: not a valid month
  插入数据一直出错,月份一直有问题,百度了一下,解决方法如下
  先查看数据库支持的是什么语言的
  SQL> select * from nls_session_parameters where parameter='NLS_DATE_LANGUAGE'
  2  ;
  PARAMETER
  --------------------------------------------------------------------------------
  VALUE
  --------------------------------------------------------------------------------
  NLS_DATE_LANGUAGE
  AMERICAN       由这里可以看出是AMERICAN
  SQL> show parameter nls_language;
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  nls_language                         string      AMERICAN
  由这条语句查看也是AMERICAN,所以猜想不能使用汉字模式,修改如下
  SQL> insert into student values (1,'小黄','F','9-July-16',1);
  1 row created.
  表示插入数据成功,查看数据
  SQL> select * from student;

  XH XM                             SEX BIRTHDAY    >  ---------- ------------------------------ --- --------- ----------
  1 ??????                         F   09-JUL-16          1
  可以看出插入数据最好匹配数据库原始支持的语言
  修改默认日期格式:
  alter session set nls_date_format = 'yyyy-mm-dd';--->修改后为2016-06-09

  SQL>>
  Session>  SQL> insert into student values (2,'xiaobai','F','2016-09-06',2);
  1 row created.
  SQL> select * from student;
  XH XM                             SEX BIRTHDAY      CLASSID
  ---------- ------------------------------ --- ---------- ----------
  1 ??????                         F   2016-07-09          1
  2 xiaobai                        F   2016-09-06          2
  插入数值也可以为空
  SQL> insert into student values (3,'xiaohua','F',null,3);
  1 row created.
  SQL> select * from student;
  XH XM                             SEX BIRTHDAY      CLASSID
  ---------- ------------------------------ --- ---------- ----------
  1 ??????                         F   2016-07-09          1
  2 xiaobai                        F   2016-09-06          2
  3 xiaohua                        F                       3
  查出生日为空的同学:
  错误操作如下:
  SQL> select * from student where  birthday='';
  no rows selected
  正确操作如下:
  SQL> select * from student where  birthday is null;
  XH XM                             SEX BIRTHDAY      CLASSID
  ---------- ------------------------------ --- ---------- ----------
  3 xiaohua                        F                       3
  SQL> select * from student where birthday is not null;
  XH XM                             SEX BIRTHDAY      CLASSID
  ---------- ------------------------------ --- ---------- ----------
  1 ??????                         F   2016-07-09          1
  2 xiaobai                        F   2016-09-06          2
  update修改某个字段:

  SQL> update student set>  1 row updated.
  SQL> select * from student;
  XH XM                             SEX BIRTHDAY      CLASSID
  ---------- ------------------------------ --- ---------- ----------
  1 ??????                         F   2016-07-09          1
  2 xiaobai                        F   2016-09-06          2
  3 xiaohua                        F                       2
  模拟删除用户能否恢复
  SQL> savepoint a;        预先定义一个保存点
  Savepoint created.
  SQL> delete from student;  模拟删除表
  3 rows deleted.
  SQL> select * from student;  查看表数据,发现没有数据
  no rows selected
  SQL> rollback to a;      rollback回滚到保存点
  SQL> select * from student;   查看数据,发现数据恢复,回滚成功
  XH XM                             SEX BIRTHDAY      CLASSID
  ---------- ------------------------------ --- ---------- ----------
  1 ??????                         F   2016-07-09          1
  2 xiaobai                        F   2016-09-06          2
  3 xiaohua                        F                       2
  Rollback complete.
  于是结论如下:
  delete from table,删除表所有记录,但表结构还在,写日志,可以恢复
  drop table student:删除表的结构和数据
  truncate table student:删除表中的所有记录,但表结构还在,但不写日志,无法找回删除的记录,速度很快
  表空间:就是存放某些表的那些空间(oracle事先就有很多表空间)
  表用来存放数据
  scott用户下面的表
  1、emp表
  SQL> select * from emp;
  EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
  ----- ---------- --------- ----- ----------- --------- --------- ------
  7369 SMITH      CLERK      7902 1980/12/17     800.00               20
  7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
  7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
  7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
  7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
  7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
  7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
  7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20
  7839 KING       PRESIDENT       1981/11/17    5000.00               10
  7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
  7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20
  7900 JAMES      CLERK      7698 1981/12/3      950.00               30
  7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
  7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
  14 rows selected
  EMPNO:雇员number
  ENAME:雇员名字
  JOB:工作职位(clerk:员工)
  MGR:雇员上级id
  HIREDATE:入职时间
  SAL:薪水工资
  COMM:奖金
  DEPTNO:所在的部门,部门编号
  2、dept部门表
  SQL> select * from dept;
  DEPTNO DNAME          LOC
  ------ -------------- -------------
  10 ACCOUNTING     NEW YORK
  20 RESEARCH       DALLAS
  30 SALES          CHICAGO
  40 OPERATIONS     BOSTON
  DEPTNO:所在的部门,部门编号
  ACCOUNTING:财务部
  RESEARCH:研发
  SALES:销售
  显示一张表有多少行数据?
  SQL> select count(*) from emp;
  COUNT(*)
  ----------
  14
  关键字
  1、distinct过滤掉重复的行
  SQL> select deptno,job from emp;
  DEPTNO JOB
  ---------- ---------
  20 CLERK
  30 SALESMAN
  30 SALESMAN
  20 MANAGER
  30 SALESMAN
  30 MANAGER
  10 MANAGER
  20 ANALYST
  10 PRESIDENT
  30 SALESMAN
  20 CLERK
  30 CLERK
  20 ANALYST
  10 CLERK
  SQL> select distinct deptno,job from emp;
  DEPTNO JOB
  ---------- ---------
  20 CLERK
  30 SALESMAN
  20 MANAGER
  30 CLERK
  10 PRESIDENT
  30 MANAGER
  10 CLERK
  10 MANAGER
  20 ANALYST
  Oracle一般不区分大小写,但如下情况却区分
  SQL> select * from emp where ename='smith';
  no rows selected
  SQL> select * from emp where ename='SMITH';
  EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM
  ---------- ---------- --------- ---------- ---------- ---------- ----------
  DEPTNO
  ----------
  7369 SMITH      CLERK           7902 1980-12-17        800
  当匹配表中某内容时,需要区分大小写
  2、使用算是表达式
  SQL> select ename,sal*12 from emp;
  ENAME          SAL*12
  ---------- ----------
  SMITH            9600
  ALLEN           19200
  WARD            15000
  JONES           35700
  MARTIN          15000
  BLAKE           34200
  CLARK           29400
  SCOTT           36000
  KING            60000
  TURNER          18000
  ADAMS           13200
  JAMES           11400
  FORD            36000
  MILLER          15600
  当然也可以将列去个另外的别名
  SQL> select ename,sal*12 nianxin from emp;
  ENAME         NIANXIN     此时这里就使用了别名替换了sal*12
  ---------- ----------
  SMITH            9600
  ALLEN           19200
  如果字段中有一个值为null,那么计算出来的值也是null,该如何准确查询呢?
  SQL> select ename,sal*13+comm*13,comm from emp;
  ENAME      SAL*13+COMM*13      COMM     由于字段comm有些员工并没有,所以有些为空
  ---------- -------------- ---------
  SMITH
  ALLEN               24700    300.00
  WARD                22750    500.00
  JONES
  MARTIN              34450   1400.00
  BLAKE
  CLARK
  SCOTT
  KING
  TURNER              19500      0.00
  ADAMS
  JAMES
  FORD
  MILLER
  如何处理null值,使用nvl函数
  SQL> select ename,sal*13+nvl(comm,0)*13 as 年工资,comm from emp;   ----》当comm为空值时,用后面的0替换,当comm有值时,用自己本身的值计算
  ENAME      SAL*13+NVL(COMM,0)*13      COMM
  ---------- --------------------- ---------
  SMITH                      10400
  ALLEN                      24700    300.00
  WARD                       22750    500.00
  JONES                      38675
  MARTIN                     34450   1400.00
  BLAKE                      37050
  CLARK                      31850
  SCOTT                      39000
  KING                       65000
  TURNER                     19500      0.00
  ADAMS                      14300
  JAMES                      12350
  FORD                       39000
  MILLER                     16900


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-566031-1-1.html 上篇帖子: Mysql与Oracle的分页查询比较 下篇帖子: RemoveIPC=yes 的RHEL7.2 会crash掉Oracle asm 实例和Oracle database实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表