zoukankan      html  css  js  c++  java
  • Oracle SQL基本操作

    Oracle数据库基本操作

    1.概述

    Oracle数据库客户端一般需要安装在服务器上,可以在服务器端操作,一般我们可以用sql developer工具远程连接到数据库,先行建立数据库,然后对表进行增删改查。也可以使用MyEclispse的DB Broswer工具进行连接数据库并进行简单的增删改查。

    2SQL语句

    Data Definition LanguageDDL):

    主要用于建立、修改、删除数据库对象(表),不需要事务的参与

    CREATE:创建表

    CREATE TABLE emp(

    id NUMBER(10),

    name VARCHAR2(20),

    gender CHAR(1),

    birth DATE,

    salary NUMBER(6,2),

    );

    DESC :查询表结构

    DESC emp;

    RENAME:重命名表名

    RENAME emp TO employee;

    DROP:删除表

    DROP TABLE emp;

    ALTER:列(字段)操作

    ADD:增加字段

    ALTER TABLE employee ADD (birth DATE DEFAULT sysdate);

    MODITY:修改字段

    ALTER TABLE employee MODIFY (name VARCHAR2(40) DEFAULT 'CLERK' );

    DROP:删除字段

    ALTER TABLE employee DROP (birth);

    Data Manipulation LanguageDML

    用于对数据记录进行操作,包括插入,删除,修改。需要commit才能真正确认操作,如果需要撤销则rollback。

    INSERT INTO:插入数据

    INSERT INTO employee(id, name, salary) VALUES(1001, 'rose', 5500);

    UPDATE…SET..:更新数据

    UPDATE employee SET salary = 8500 WHERE name = 'ROSE';

    DELETE FROM:删除记录

    DELETE FROM employee WHERE job is null;

    Transaction Control LanguageTCL

    事务控制语言,包括commit提交,rollback回滚,savepoint保存点(可以回退到指定保存点)。在sql developer中为图标。

    Data Query LanguageDQL

    SQL基础查询:

    查询语句的执行顺序

    FROM 子句:执行顺序为从后往前、从右到左。数据量较少的表尽量放在后面。

    WHERE子句:执行顺序为自下而上、从右到左。将能过滤掉最大数量记录的条件写在WHERE 子句的最右。

    GROUP BY执行顺序从左往右分组,最好在GROUP BY前使用WHERE将不需要的记录在GROUP BY之前过滤掉。

    HAVING 子句:消耗资源。尽量避免使用,HAVING 会在检索出所有记录之后才对结果集进行过滤,需要排序等操作。

    SELECT子句:少用*号,尽量取字段名称。ORACLE 在解析的过程中, 通过查询数据字典将*号依次转换成所有的列名, 消耗时间。

    ORDER BY子句:执行顺序为从左到右排序,消耗资源。

    也就是从哪张表中以什么样的限制条件确定数据内容,再通过分组与进一步限制分组条件得到一个处理过的数据,最后选择出来,如有需要,则对最后选择的数据进行排序。

    FROM子句:

    From后接表名,from前可以可以是*,但是不建议(查询效率低),一般接要查询的字段名。分组函数,字段和表名都可以使用别名,不加引号数据库中为大写,加引号别名可以用空格小写等。

    WHERE子句:

    当查询条件中和数字比较,可以使用单引号引起,也可以不用,当和字符及日期类型的数据比较,则必须用单引号引起。

    使用条件判断:>,<,<=,<=,!=,<>,=。

    SELECT ename, sal FROM emp WHERE sal< 2000;

    SELECT ename, sal, job FROM emp WHERE job = 'SALESMAN';

    SELECT ename, sal, hiredate FROM emp

    WHERE hiredate>todate('2002-1-1','YYYY-MM-DD');

    使用AND/OR关键字

    如果希望返回的结果必须满足多个条件,应该使用AND逻辑操作符连接这些条件

    如果希望返回的结果满足多个条件之一即可,应该使用OR逻辑操作符连接这些条件

    SELECT ename, sal, job FROM emp

    WHERE sal> 1000 AND job = 'CLERK';

    使用LIKE条件

    SELECT ename, job FROM emp WHERE ename LIKE '_A%';(第二个字母为A)

    _A%’_表示占位一个字符,%表示0到多个字符。

    使用IN/NOT  IN

    WHERE子句中可以用比较操作符IN(list)来取出符合列表范围中的数据。其中的参数list表示值列表,当列或表达式匹配于列表中的任何一个值时,条件为TRUE,该条记录则被显示出来。

    SELECT ename, job FROM emp WHERE job IN ('MANAGER', 'CLERK');

    使用BETWEEN 1 AND 2

    用来查询符合(12)值域范围之内的数据,通常查询数字和日期类型的数据范围。

    SELECT ename, sal FROM emp

    WHERE sal BETWEEN 1500 AND 3000;

    使用IS NULL和IS NOT NULL

    条件筛选值为空的记录,空值不能用‘=’来判断。

    使用ANY和ALL条件

    在比较运算符中,可以出现ALL和ANY,表示“全部”和“任一”,

    > ANY : 大于最小< ANY:小于最大> ALL:大于最大< ALL:小于最小

    SELECT empno, ename, job, sal, deptno

    FROM emp WHERE

    sal> ANY (SELECT sal FROM emp WHERE job = 'SALESMAN');

    查询条件中使用算术表达式

    当查询需要对选出的字段进行进一步计算,可以在数字列上使用算术表达式(+、-、*、/)。表达式符合四则运算的默认优先级,如果要改变优先级可以使用括号。

    SELECT ename, sal, job FROMempWHERE ename = UPPER('rose');

    SELECT ename, sal, job FROM empWHERE sal * 12 >100000;

    使用DISTINCT过滤重复

    DISTINCT必须紧跟SELECT,后面可以有多个字段,表示过滤掉多个字段都重复的选项,第二例中不显示重复的deptno和job相同的记录。

    SELECT DISTINCT deptno FROM emp;

    SELECT DISTINCT deptno, job FROM emp;

    使用ORDER BY子句

    对查询数据按照一定的规则排序,则使用order by子句,order by子句必须为select子句的最后一个子句。默认升序排列,从小到大,ASC表示升序。DESC表示降序,从大到小。

    SELECT ename, sal FROM emp

      ORDER BY sal DESC;

    Order by多个列,每个列需要单独指定排序规则,先按照第一个字段排序,当第一个字段的值相同时,再按照第二个字段的值排序。

    聚合函数分组函数

    当需要统计的数据并不能在表里直观列出,而是需要根据现有的数据计算得到结果,这种功能可以使用聚合函数来实现。

    因为是多行数据参与运算返回一行结果,也称作分组函数、多行函数、集合函数。用到的关键字:GOURP BY 按什么分组,HAVING进一步限制分组结果

    MAX和MIN

    用来取得列或者表达式的最大最小值,包括数字,字符和日期。

    SELECT MAX(sal) max_sal, MIN(sal) min_sal FROM emp;

    AVG和SUM

    用来统计列或者表达式的平均值和求和,只能处理数字类,并且平均值忽略NULL。

    SELECT AVG(sal) avg_sal, SUM(sal)  sum_sal  FROM emp;

    COUNT

    用来计算表中的记录条数,同样忽略NULL。

    SELECT COUNT(job) total_num  FROM emp;

    空值的操作

    NVL(expr1, expr2):将NULL转变为非NULL值。如果expr1为NULL,则取值expr2, expr2是非空值。

    NVL2(expr1, expr2, expr3):和NVL函数功能类似,都是将NULL转变为非空值。NVL2用来判断expr1是否为NULL,如果不是NULL,返回expr2,如果是NULL,返回expr3。

    GROUP BY子句

    Group by是表示对表中某个字段进行分组,值相同为一组,而分组函数的意思则是对这每一个组进行计算,平均值或是最大最小值。

    HAVING子句

    是对分组后的结果进行进一步的限制,HAVING子句必须紧跟在GROUP BY子句后,不能单独存在。限制分组条件不能放在WHERE子句中。

    SELECT deptno, MAX(sal) max_sal FROM emp

    GROUP BY deptno HAVING MAX(sal) >4000;

    SQL关联查询:

    概述,在实际应用中,往往我们所需要的数据是分布在不同的表上的,我们想要获取数据必须跨表格查询。

    关联有两种方式:

    SELECT table1.column, table2.column

    FROM table1, table2

    WHERE table1.column1 = table2.column2;

    SELECT table1.column, table2.column

    FROM table1JOIN table2

    ON(table1.column1 = table2.column2);

    关联查询有三种连接方式

    内连接返回关联表中所有满足条件的记录(也称等值连接)

    外连接返回一些不满足条件的记录,外连接有左外连接,右外连接和全外连接三种形式

    其中左外连接返回左边所有记录而不必管右边是否匹配,如不匹配则为NULL值,

    右外连接返回右边所有记录而不必管左边的记录是否匹配,如不匹配则默认NULL,

    全外连接返回左边和右边所有的数据,左右边不匹配的数据,对应的其他字段值为NULL,

    格式如下

    JOIN ON

    SELECT table1.column, table2.column

    FROM table1 [LEFT | RIGHT | FULL] JOIN table2

    ON table1.column1 = table2.column2;

    WHERE

    Select * from dave a,bl b where a.id=b.id(+);

    +号的位置和意义

    ‘+’号加在哪个表,哪个表就是关联表,另一张表就是基表。基表全部显示,关联表匹配显示。+在左边就是右外连接,+在右边就是左外连接。

    自连接:

    表示数据的来源是同一张表的内容,即将一张表中的不同列进行连接,可以是等值或者不等值。实现方式是利用别名将一张表看作两张表。

    SELECT     worker.empnow_empno,worker.enamew_ename, manager.empnom_empno, manager.enamem_ename

    FROM emp worker join emp manager

    ON worker.mgr = manager.empno;

    SQL高级查询:

    子查询:

    子查询用在WHERE

    SELECT中,往往WHERE的限制条件并不是一个确定的值,而是来源于另一个查询结果,即需要在另一个查询结果的基础上进行查询,这个时候为另一个查询提供数据的查询就叫做子查询。

    SELECT e.ename, e.job FROM emp e

    WHERE e.job = (SELECT job FROM emp WHERE ename = 'SCOTT');

    可以与多行/单行比较操作符混合使用。

    子查询用在HAVING子句

    SELECT deptno, MIN(sal) min_sal FROM emp GROUP BY deptno

    HAVING MIN(sal) > (SELECT MIN(sal) FROM emp WHERE deptno = 30);

    表示分组条件需要满足的条件。可以把子查询当成一个结果。

    子查询用在FROM部分

    子查询用在FROM子句中,子查询可称为行内视图或者匿名试图,可以把它当成一张单独的表,用别名进行标识。

    子查询用在SELECT子句中

    可以认为是外连接的一张表现

     

    分页查询:

    ROWNUM

    伪列,返回标识行数据顺序的数字,伪列并不是真正的列数据,只是用来显示行数,并不能单独作为一列进行分组操作。

    ROWNUM的结果从第一行数据之上开始,每查询到一条数据则指针下移一个,所以只有查询到数据后才能够出现伪列数字,因此不能直接用在where里,如果要利用ROWNUM截取结果集的部分数据,可以将含有ROWNUM伪列的SELECT子句放在FROM内,作为视图,供外部的SELECT语句使用,此时的伪列已形成顺序数据,可以进行分组函数操作。

    也就是将ROWNUM先作为行内视图的一个列,在主查询中就可以使用这个列值作为条件。

    SELECT  * FROM  (SELECT  ROWNUMrn , e.* FROM emp e ) 

     WHERE rn BETWEEN 8 AND 10;

    使用子查询和ROWNUM进行分页

    分页操作需要有一个作为分页标准的数据,该数据线进行排序,排序的结果作为视图被父查询用伪列标识顺序数字,然后在最外面的爷爷查询对伪列进行分页。

    如:

    SELECT  * FROM

      (SELECT  ROWNUMrn , t.* FROM

        (SELECT empno,ename,sal FROM emp

         ORDER BY sal DESC)  t

      ) 

     WHERE rn BETWEEN 8 AND 10;

    DECODE函数

    DECODE (expr, search1, result1[, search2, result2…][, default])

    它用于比较参数expr的值,如果匹配到哪一个search条件,就返回对应的result结果,可以有多组search和result的对应关系,如果任何一个search条件都没有匹配到,则返回最后default的值。default参数是可选的,如果没有提供default参数值,当没有匹配到时,将返回NULL。

    SELECT ename, job, sal,

    DECODE(job, 'MANAGER', sal * 1.2,

                   'ANALYST', sal * 1.1,

                  'SALESMAN', sal * 1.05,

    sal) bonus

    FROM emp;

    SELECT deptno, dname, loc

    FROM dept

    ORDER BY

    DECODE(dname, '研发部',1,'市场部',2,'销售部',3), loc;

    分组函数

    ROW_NUMBER

    ROW_NUMBER()

       OVER (PARTITION BY deptno ORDER BY empno)

    根据deptno分组,在分组内根据empno内排序,比ROWNUM功能更强。可以直接从结果集中取出子集

    RANK

    RANK() OVER( PARTITION BY col1 ORDER BY col2)

    功能与上相同,不同在于存在并列,并列第二跳过第三直接第四的规则。

    DENSE_RANK

    如果有并列第二,下一个排序将是三。

    高级分组函数

    ROLLUP

    如果对两个字段rollup,那么第一个字段相同的值会当成一组,如果有分组函数求和,就会对第一字段所有的数据求和,单独成行。此时第二字段值为空。可以用于统计年度销售(工资)和。

    CUBE

    CUBE函数对字段进行排列统计,比如三个字段的CUBE运算,将三个字段排列成6种情况具体需要使用的时候再参考百度。

    GROUPING()

    GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。案例情况复杂,具体使用时再说。

     

    集合操作

    UNION、UNION ALL、INTERSECT、MINUS

    Union表示取多次SELECT结果的并集,如果去掉重复的数据。

    Union Allunion功能一样,只是它不会去掉重复的数据,会全部显示。

    Intersect表示相交,多次查询后去相同的数据,即同时满足两个查询条件的数据

    Minus表示差集,即将第一个结果集中的数据,减去第二个结果集的数据。即满足第一个查询条件,而不满足第二查询条件的数据。

    Data Control LanguageDCL:

    用于执行权限的授予和收回操作、创建用户等,包括授予(GRANT)语句,收回(REVOKE)语句,CREATE USER语句,其中GRANT用于给用户或角色授予权限, REVOKE用于收回用户或角色已有的权限。DCL语句也不需要事务的参与,是自动提交的。

    GRANT CREATE VIEW TO tarena;

     

    3.视图、索引、序列、约束

    视图

    视图本质上是一条SELECT语句,当SELECT子查询在from子句中,可以把SELECT子句的结果当作一个视图。视图本身只是基表的映射,只是把基表中的数据显示出来,可以把视图当成表看待,所有操作都与表操作极其相似。

    视图有三种,简单视图不包括函数,复杂视图包含了分组函数等附加的内容,连接视图是基于多个表的。

    视图的优劣点:

    如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可,简化复杂查询;视图本质上就是一条SELECT语句,所以当访问视图时,只能访问到所对应的SELECT语句中涉及到的列,对基表中的其它列起到安全和保密的作用,可以限制数据访问。

    同时因为视图本质是基表的数据,所以对视图的操作会影响到基表从而不安全。这里可以使用WITH READ ONLY来限制对视图的DML语言。

    CREATE OR REPLACE VIEW v_emp_10

    AS

    SELECT empno, ename, sal, deptno FROM emp

    WHERE deptno = 10

    WITH READ ONLY;

    使用DCL语句可以授权用户创建视图的权限

    GRANT CREATE VIEW  TO tarena;

    创建简单视图

    CREATE VIEW v_emp_10

    AS

    SELECT empno, ename, sal, deptno

    FROM emp

    WHERE deptno = 10;

    查询视图

    SELECT id, name, salary FROM v_emp_10;

    对视图的DML操作

    简单视图可以进行DML操作,但是操作的对象必须是基表里视图包含的字段,即对视图可见。而且简单视图的DML操作会对影响基表数据。

    WITH CHECK OPTION短语表示,通过视图所做的修改,必须在视图的可见范围内,无论是INSERT UPDATE DELETE操作都必须在视图范围内,超过视图范围不可用。

    CREATE [OR REPLACE] VIEW view_name[(alias[, alias…])]

    AS subquery

    [WITH CHECK OPTION];

    删除视图

    DROP VIEW v_emp_10;

    对视图的删除不会导致基表数据的丢失,不会影响基表数据。

    序列

    序列(SEQUENCE)是一种用来生成唯一数字值的数据库对象。序列的值由Oracle程序按递增或递减顺序自动生成,通常用来自动产生表的主键值,是一种高效率获得唯一键值的途径。

    序列是独立的数据库对象,和表是独立的对象,序列并不依附于表。

    通常情况下,一个序列为一个表提供主键值,但一个序列也可以为多个表提供主键值。

    CREATE SEQUENCE [schema.]sequence_name

        [ START WITH i ] [ INCREMENT BY j ]

        [ MAXVALUE m | NOMAXVALUE ]

        [ MINVALUE n | NOMINVALUE ]

    [ CYCLE | NOCYCLE ][ CACHE p | NOCACHE ]

    创建一个序列,起始数据是100,步进是10:

    CREATE SEQUENCE emp_seq

        START WITH 100

        INCREMENT BY 10;

    NEXTVAL:获取序列的下个值

    CURRVAL:获取序列的当前值

    当序列创建以后,必须先执行一次NEXTVAL,之后才能使用CURRVAL

    获取序列的第一个值,并且使用序列值为EMP表插入新的记录:

    删除序列

    DROP SEQUENCE emp_seq;

     

     

     

    索引

    创建索引

    CREATE [UNIQUE] INDEX index_name

            ON table(column[, column…]);

    index_name表示索引名称

    table表示表名

    column表示列名,可以建立单列索引或复合索引

    UNIQUE表示唯一索引

    CREATE INDEX idx_emp_job_sal ON emp(job, sal);

    可以增加函数

    CREATE INDEX emp_ename_upper_idx

        ON emp(UPPER(ename));

    重建索引,提高索引空间利用率

    ALTER INDEX index_name REBUILD;

    删除索引

    DROP INDEX idx_emp_ename;

     

    为提升查询效率,创建和使用索引的原则:

    1.为经常出现在WHERE子句中的列创建索引

    2.为经常出现在ORDER BY、DISTINCT后面的字段建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致

    3.为经常作为表的连接条件的列上创建索引

    4.不要在经常做DML操作的表上建立索引

    5.不要在小表上建立索引

    6.限制表上的索引数目,索引并不是越多越好

    7.删除很少被使用的、不合理的索引

     

    约束

    CONSTRAINT

    非空约束(Not Null),简称NN

    创建表时添加约束

    CONSTRAINT employees_hiredate_nn NOT NULL

    修改表时增加非空约束

    ALTER TABLE employees

    MODIFY (eid NUMBER(6) NOT NULL);

    修改表时取消非空约束

    ALTER TABLE employees

    MODIFY (eid NUMBER(6));

     

    唯一性约束(Unique),简称UK

    CONSTRAINT employees_email_uk UNIQUE(email)

    ALTER TABLE employees

    ADD CONSTRAINT employees_name_uk UNIQUE(name);

    主键约束(Primary Key),简称PK

    在主键约束下的单字段或者多字段组合上不允许有空值,也不允许有重复值。

    主键应是对系统无意义的数据

    永远也不要更新主键,让主键除了唯一标识一行之外,再无其他的用途

    主键不应包含动态变化的数据,如时间戳

    主键应自动生成,不要人为干预,以免使它带有除了唯一标识一行以外的意义

    主键尽量建立在单列上

    ALTER TABLE employees3

    ADD CONSTRAINT

             employees3_eid_pk PRIMARY KEY (eid);

    外键约束(Foreign Key),简称FK

    ALTER TABLE employees4

    ADD CONSTRAINT employees4_deptno_fk

    FOREIGN KEY (deptno) REFERENCES dept(deptno);

    检查约束(Check),简称CK

    检查(Check)约束条件用来强制在字段上的每个值都要满足Check中定义的条件。当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件。

    ALTER TABLE employees4

    ADD CONSTRAINT employees4_salary_check

    CHECK (salary > 2000);

    其他

    DEFAULT指定字段默认值

    NOT NULL 指定字段值非空,相当于非空约束

  • 相关阅读:
    结对编程-马尔科夫链作业成绩
    结对编程-四则运算(挑战出题)成绩及点评
    结对编程-四则运算成绩
    结对编程-四则运算(挑战出题)
    结对编程
    每天进步一点点-第二天卒
    每天进步一点点-深度学习入门-基于Python的理论与实现 (一)
    今天准备更新每天提高一点点系列
    Books
    WPF命令好状态刷新机制
  • 原文地址:https://www.cnblogs.com/opensesame/p/6073965.html
Copyright © 2011-2022 走看看