zoukankan      html  css  js  c++  java
  • 第三周博客之二---Oracle中的sql语句

    一、用户及权限(DBA有最高系统权限)

    1.数据库的安全性:系统的安全性、数据的安全性

    2.权限分类:

    2.1系统权限:获得后可访问数据库

    常用的有create table,create user,create views,create session

    2.2对象权限:操作数据库对象的内容

    Select  insert  update  delete

    3.权限的使用

    3.1授予系统权限

    grant 系统权限 to 用户 [with admin option]

    with admin option :权限具有传递作用

    3.2对象权限

    对象权限:数据   select  insert  update  delete

    grant  对象权限 on 表名 to 用户 [with grant option]

    with grant option:对象权限具有传递作用

    3.3创建用户:

    create user 用户名 identified by 密码

    3.4创建表格:

    create table 表名(

    字段1  字段类型1

    字段2  字段类型2

    ……

    4.权限的回收

    revoke 权限 from 用户;

    5.角色:简化权限管理

    create role 角色名;

    grant 权限  to 角色;

    grant 角色  to 用户;

    6. 删除用户

    drop user 用户名 [cascade]

    cascade:级联删除,删除用户连带把用户下的所有表删除

    7.修改用户信息:

       自己改自己的密码

            password

         修改别人的密码(dba的角色)

           alter user 用户名 identified by 密码

         第一次使用时密码失效(dba的角色)

           alter user 用户名 password expire;

          

         锁定|解锁用户

           alter user 用户名 account lock|unlock;

    8.小结

    CREATE USER DBA           可以创建用户

    GRANT                              允许用户给其他用户授予访问自己的数据库对象

    CREATE ROLE                   允许DBA创建一个角色,角色包含一组权限

    ALTER USER                      用户可以修改自己的口令等信息

    REVOKE                            收回用户访问数据库对象的权限

    二、数据类型:

       1.字符类型

         char(n):            固定长度,不足的以空格补充

         varchar2(n):     可变长度

       2.数值类型

         number(p,s):

         s=0:整数

           number(p) <==> number(p,0),p是有效数

         s>0:

           number(p,s),p是有效位数,s小数点后有s位

         s<0:

            number(p,s),总有效位数p+|s|,小数点往左数s位,数的位数置为0,最前面的位数要考虑四舍五入。

       3.日期型

         date

           当前系统时间:sysdate     oracle默认的时间格式:'18-10月-17'

       4.large object(大对象型):4G

         clob:文本类型

         blob:二进制流   图片,音频,视频

         bfile:将文件作为整体以二进制流存储

     

    三、SQL语言

    1.Sql编码规范

    1.1sql语句的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大写。

    1.2连接符or、in、and、以及=、<=、>=等前后加上一个空格。

    1.3对较为复杂的sql语句、过程、函数加上注释,说明算法、功能。

    1.4SQL语句的缩进风格

    一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进

    where子句书写时,每个条件占一行,语句另起一行时,以保留字或者连接符开始,连接符右对齐。

    1.5多表连接时,使用表的别名来引用列。

    1.6SQL 命令是大小写不敏感

    1.7SQL 命令可写成一行或多行

    1.8一个关键字不能跨多行或缩写

    1.9子句通常位于独立行,以便编辑,并易读

    2.Sql语句规则

    SQL 语句是大小写不敏感

    SQL 语句可写成一行或多行

    一个关键字不能跨多行或缩写

    子句通常位于独立行,以便编辑,并易读

    空格和缩进使程序易读

    关键字大写,其他小写

    3.sql语言基础

    Select                             数据查询语句(select)

    DML:manipulation    数据操作语言(insert update delete )

    DDL: definition           数据定义语言(create table create user;alter,drop)

    DCL: control                    数据控制语言(grant revoke)

    DTL: transanction         数据事务语言(commit,rollback)

    4. select查询

    4.1 简单的查询

       select *(所有的列)|字段名(指定的列)... from 表名

    4.2 字段加别名、连接操作

    空格加别名

    空格 as 别名

    注意:

    如果别名中出现空格,必须用“”引起来

       如 select '员工编号:'||empno  "emp no"  from emp

    如果别名中出现系统关键字,必须用“”引起来

           如 select '员工编号:'||empno  "from"  from emp

    将列或字符与其它列连结

    用双竖条表示 (||)

    产生的结果列是一个字符表达式

    4..3 算数表达式

    比较运算符:=,!=,>=,<=,<>

    算术运算符:+,-,*,/

    逻辑运算符:

     

    其他运算符:

     

    优先级

     

    乘法和除法的优先级高于加法和减法

    同级运算的顺序是从左到右

    表达式中使用括号可强行改变优先级的运算顺序

    4.4 删除重复行

    使用方法:

    SELECT  DISTINCT  deptno  FROM  emp;

    注:DISTINCT操作会引起排序,通过排序去掉重复记录!

    4.5 限定和排序数据

    限定的使用(where):

    SELECT  [DISTINCT]  {*, column [alias], ...}  FROM  table  [WHERE condition(s)];

    排序数据(order  by)

    Desc:降序

    Asc:升序

    注意:如果按照多个字段排序order by后面可以跟多个字段,需要用逗号(,)隔开

    4.6 单行函数

    4.6.1.字符函数

        大小写转换函数

        lower():转换成小写

        upper():转换成大写

        initcap():首字母大写

        字符控制函数

        length():字符数

        lengthb():字节数

        substr(string1,start,length):

         start=0时:等同于start=1

         start>0时:从左往右数start位,截取从左往右截length

         start<0时:从右往左数start位,截取从左往右截length

        instr(string1,string2):在母字符串string1中查找子字符串string2的位置;如果string1中没有string2,返回0

        trim():去除收尾的空格

        trim('字符' from string1):将string1字符串前后的'字符'去除

        lpad(string,length,string1):左填充,判断string 的长度是否小于length,如果小于,靠左填充string1

        rpad(string,length,string1):右填充,判断string 的长度是否小于length,如果小于,靠右填充string1

        replace(string,str1,str2):用str2替换string中的str

     4.6.2.数值函数

        trunc(num1,s):直接截取

          s=0:trunc(num1)

          s>0:从小数点后s位开始截取

          s<0:从小数点前s位开始截取

        round(num1,s):四舍五入

          s=0:round(num1)

          s>0:从小数点后s位开始四舍五入

          s<0:从小数点前s位开始四舍五入

        mod(num1,num2):取余,正负数取决于num1

     4.6.3.日期函数

         日期 - 日期 = 天数

         months_between(date1,date2):date1>date2,两个日期之间相差的月份

         add_months(date1,n):在指定的日期上加上相应的月份

         next_day(date1,weekday):给定日期的下一个星期weekday是多少号

         last_day(date1):给定日期的月份最后一天的日期

      4.6.4.转换函数

     

    a.对日期格式的转换

                  to_char(date1,'format')

     

           示例:

    查询雇员进入公司的年份和月份,并且按年份的升序排序,

           如果年份相同,按照月份的降序排序

           select ename,to_char(hiredate,'yyyy') year,to_char(hiredate,'mm') month

           from emp

           order by year ,month desc;

       b.对数字进行转换

          to_char(date1,'format')

           格式:

           9:1~9任意数字

           0:0

           ,: 千位符   100,000,000

           .: 小数点

           L:local 本地货币语言

           $: 美元

           C.把字符串转换成日期

                  to_date(string,'formate')

           d.把字符串转换成数值型

    to_number(sring):把字符串转换成数值型

      4.6.5.通用函数

        nvl(arg1,arg2):判断了arg1的值,如果为空,返回arg2,否则返回arg1

        nvl2(arg1,arg2,arg3):判断arg1的值,如果为空,返回arg3,否则返回arg2

           decode(column|expression,result1,value1,result2,value2...[,value])

    4.7 多表查询

    4.7.1 笛卡尔积

    select * from emp,dept;--笛卡尔积

    笛卡尔结果形成于:

    连接条件被省略

    连接条件无效

    第一个表的所有记录连接到第二个表的所有记录

    注意:为了避免笛卡尔结果我们总是在 WHERE 子句中使用有效连接

    4.7.2 连接类型

    I.等值连接

    例如:

      查询出雇员的姓名,工作,工资及部门名称和部门所在地

      select e.ename,e.job,e.sal,d.dname,d.loc

      from emp e,dept d

      where e.deptno=d.deptno; ---等值连接

    Ii. 不等连接

      查询出雇员的姓名,工资,以及工资的等级

      select e.ename,e.sal,s.grade

      from emp e,salgrade s

      where e.sal between s.losal and s.hisal;---非等值连接

    iii. 自连接

           查询雇员的姓名,雇员的领导姓名

        select e.ename,m.ename

        from emp e,emp m

        where e.mgr=m.empno;---自连接

    iiii.外连接

           左[外]连接

           右[外]连接

    例如:

        查询雇员的姓名,工资,以及雇员的部门,部门名称

        (把没有员工的部门也要显示)

        Select  e.ename,e.sal,d.deptno,d.dname

        from emp e,dept d

        where e.deptno(+)=d.deptno ---右连接

        select e.ename,m.ename

        from emp e,emp m

        where e.mgr=m.empno(+); ---左连接

    SQL 1999:

        select * from table1 cross join table2                      ---交叉连接

                             natural join table2   ---自然连接

                          join table2 using(column)                     ---using连接

                          join table2 on table1.column=table2.column ---on连接

                          left [outer] join table2 on table1.column=table2.column

    LEFT OUTER JOIN

    在LEFT OUTER JOIN中,会返回所有左边表中的行,甚至在被连接的表中没有可对应的列名的情况下也如此。

    返回左表中的所有行,即使左表中有不符合条件的记录,也会在查询结果中显示。

    Oracle8i

    •select ename, d.deptno from emp e, dept d where e.deptno = d.deptno (+);

    Oracle9i

    select ename, Dept.deptno from emp LEFT OUTER JOIN Dept

    ON emp.deptno = Dept.deptno

    RIGHT OUTER JOIN

    在RIGHT OUTER JOIN中返回的是表中所有右边的行,甚至在被连接的表中没有对应的情况下也如此。

    返回右表中的所有行,即使右表中有不符合条件的记录,也会在查询结果

    中显示。

    Oracle8i

    select last_name, d.dept_id from employees e, departments d where e.department_id(+) = d.department_id;

    Oracle9i

    select last_name, d.dept_id from employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id;

    4.8 分组函数

    AVG ([DISTINCT|ALL]n) 求平均数

    SUM ([DISTINCT|ALL]n) 求和

    COUNT ({ *|[DISTINCT|ALL]expr}) 计数

    MAX ([DISTINCT|ALL]expr) 求最大值

    MIN ([DISTINCT|ALL]expr) 最小值

    STDDEV ([DISTINCT|ALL]x) 标准差

    VARIANCE ([DISTINCT|ALL]x) 方差

    group by语句的使用

    使用GROUP BY子句将表分成小组

    组函数忽略空值, 可以使用NVL,NVL2,COALESCE 等函数处理空值

    Having子句的使用

    Having子句的作用是对行分组进行过滤

    记录被分组

    使用组函数

    匹配HAVING子句的组被显示

    4.9 小结

    SELECT column, group_function

    FROM table

    [WHERE condition]

    [GROUP BY group_by_expression]

    [HAVING group_condition]

    [ORDER BY column];

    4.10 子查询

    4.10.1 查询规则

    I.子查询要用括号括起来

    Ii.将子查询放在比较运算符的右边

    Iii.子查询中不要加ORDER BY子句

    Iiii.对单行子查询使用单行运算符

    4.10.2子查询使用

       区别:1.当需要多个表中的数据时,需要进行多表查询,子查询只能返回单表数据

                   2.多表查询比子查询快

                   3.子查询功能强大

    嵌套子查询:嵌套的子查询是可以独立运行的,由内而外部的

    单行子查询:返回一行记录 ,使用单行记录比较运算符

     

    多行子查询:返回多行 ,使用多行比较运算符

     

    <ANY 指小于最大值

    >ANY 指大于最小值

    >ALL 指大于最大值

    <ALL 指小于最小值

    关联子查询:自外而内,2个查询之间的关联

    5.DML操作数据

    5.1 insert插入

    insert into 表名(字段名,...) values(值,...)

    insert into 表名  values(值,...)

    例如:

    INSERT INTO emp (empno, ename, job, 2 mgr, hiredate, sal, comm, 3 deptno) 4 VALUES (7196, 'GREEN', 'SALESMAN', 5 7782, SYSDATE, 2000, NULL, 6 10);

    插入时要一一对应,插入空值的,在对应的值那里写null

    5.2 update更新

    update 表名 set 字段名=值,...  [where ...]

    例如:

    UPDATE emp SET deptno = 20 WHERE empno = 7782;

    注意:修改记录时要注意不能违反完整性约束(比如插入部门时,一定是在部门表里有的部门才行)

    5.3 delete 删除

    delete [from] 表名 [where 条件]

    例如:

    DELETE FROM dept WHERE dname = 'DEVELOPMENT';

    注意:删除记录时要注意不能违反完整性约束

    6.事务

    开始于第一个执行的语句

    结束于:

    COMMIT 或 ROLLBACK

    DDL or DCL (grant/revoke) 语句

    某些错误,退出,或系统崩溃

    COMMIT和 ROLLBACK的优点

    保证数据一致性

    在数据永久性生效前重新查看修改的数据

    相关逻辑操作单元

    事务控制图:

     

    6.1提交或回滚前数据的状态:

    以前的数据可恢复.

    当前的用户可看到DML操作的结果.

    其他用户不能看到DML操作的结果.

    被操作的数据被锁住,其他用户不能修改这些数据

    6.2提交后数据的状态:

    数据的修改被永久写在数据库中.

    数据以前的状态永久性丢失.

    所有的用户都能看到操作后的结果.

    记录锁被释放,其他用户可操作这些记录.

    所有的 savepoints 被去掉.

    6.3回滚后数据的状态:

    语句将使所有的修改失效.

    修改的数据被回退.

    恢复数据以前的状态.

    行级锁被释放.

    6.4回退到某一标识

    使用语句产生一个标识,将事务分成几个阶段.

    可回退到标识指定的阶段.

    6.5 事务特性:

    提交:commit

    回滚:rollback

    设置回滚点:

      savepoint 点名

      rollback to 点名

    •1、原子性(atomicity):

    一个事务中包含的所有sql语句都是一个不可分割的单元。

    •2、一致性(consistency)

    事务必须确保数据库的状态是一致的。

    •3、隔离性(isolation)

    多个事务独立运行,彼此不影响。

    •4、持久性(durability)

    事务一旦提交,数据库的变化就会被永久保留下来。

    6.6 小结:

     

    7.Alter table语句

      7.1.增加字段

          alter table 表名 add 字段名 数据类型  [default 默认值]

      7.2.修改字段(数据类型以及默认值)

          alter table 表名 modify 字段名 数据类型 [default 默认值]

      7.3.修改字段名

          alter table 表名 rename column 旧列名 to 新列名

      7.4.删除字段

          alter table 表名 drop column 列名

    8.修改表及加注释

    8.1修改表名

    rename 旧表名 to 新表名

    8.2删除表

    drop table 表名

    8.3为字段加注释

    comment on column 表名.字段名  is '注释内容'

    8.4查看注释信息

    select * from user_col_comments;

    8.5为表添加注释

    comment on table 表名 is '注释内容'

    8.6查看注释信息

    select * from user_tab_comments;

    8.7删除表中数据

           truncate table 表名 :

    9.约束

    9.1.主键约束(primary key)

    9.2.唯一约束(unique)

    9.3.非空约束(not null)

    9.4.检查约束(check)

    9.5.外键约束(foreign key):父表,子表

    例如:列级约束

    create table person(

        pid number(18) primary key,

        name varchar2(20) unique,

        sex char(6) default 'male' check(sex='male' or 'female') ,

        birthday date not null

    );

    例如:表级约束

    create table person1(

        pid number(18),

        name varchar2(20),

        sex char(6) default 'male',

        birthday date not null,

        constraint person_pid_pk primary key(pid),

        constraint person_name_uq unique(name),

        constraint person_sex_ck check(sex in('male','female'))

    );

    其中:  default为默认值

                  Constraint为约束关键字

                  约束时not null不能放在前面

                  REFERENCES 外键约束的关键字

    使约束失效

    在ALTER TABLE 语句中执行DISABLE子句可使完整性约束失效

    使用 CASCADE 选项可使依赖的完整约束失效

    例如:

    ALTER TABLE emp 2 DISABLE CONSTRAINT emp_empno_pk CASCADE;

    使约束生效

    使用ENABLE子句将失效的约束生效.

    当使UNIQUE 或 PRIMARY KEY约束生效时,会自动创建 UNIQUE 或PRIMARY KEY 索引.

    例如:

    ALTER TABLE emp ENABLE CONSTRAINT emp_empno_pk;

    查看约束

    通过查看 USER_CONSTRAINTS 表可得到用户的所有约束.

    例如:

    SELECT constraint_name, constraint_type, search_condition FROM user_constraints WHERE table_name = 'EMP';

    10.视图

    10.1 为什么使用视图

    限制对数据的访问

    很容易的写成复杂的查询

    允许数据的独立性

    不同的视图可获得相同的数据

    10.2简单视图和复杂视图

     

    10.3创建视图

    CREATE VIEW empvu10(视图名)AS SELECT empno, ename, job

    FROM emp WHERE deptno = 10;

    10.4修改视图

    使用CREATE OR REPLACE VIEW 子句修改 视图 ,并为每列加别名.

    CREATE OR REPLACE VIEW empvu10

    (employee_number, employee_name, job_title)

    AS SELECT empno, ename, job

    FROM emp

    WHERE deptno = 10;

    在CREATE VIEW语句中列的别名的顺序是和子查询中一致的

    10.5 删除视图

    DROP VIEW view(视图名);

    删除视图并不删除基表中的数据.

    11.数据库对象

     

    11.1序列(sequence) --  一组有规律的数字

      11.1.1创建

        create sequence 序列名

      11.1.2序列的使用

        属性:

                 Nextval :序列下一个值

                        currval :current value 序列当前的值

        序列名.属性

    ps:当第一次使用序列的时候,只能先调用nextval

    create sequence 序列名

    [increment by n] --步长

    [start with n]  --初始值

    [maxvalue n]  --最大值

    [minvalue n]  --最小值

    [cache n]  --缓存,提前将n位序列存入,使用时节省效率;默认是20

    [cycle]  --循环

    11.1.3修改序列

    修改的规则:

    你必须是序列号的所有者并有ALTER权限.

    只有以后的序列号受影响.

    序列号可被删除并重建,以获得新的开始值.

    一些确认被执行. 例如:MAXVALUE不能小于当前序列号.

    11.1.4删除序列

    使用 DROP SEQUENCE 语句删除序列号

    DROP SEQUENCE dept_deptno(序列名);

    11.2索引(index)

    11.2.1创建索引

    可基于一列或多列创建索引

    CREATE INDEX index ON table (column[, column]...);

    11.2.2创建索引规则

    索引列应该经常在 WHERE 子句中,或是连接条件.

    此列值域比较广.

    此列包含大量空值.

    在 WHERE 子句或连接条件中经常一起使用的列.

    对大表查询的结果小于总数据的2~4% .

    下列的表不适合建索引:

    表很小

    列不经常在WHERE子句中使用

    对大表查询的结果大于总数据的2~4% .

    表经常被修改

    11.2.3删除索引

    DROP INDEX index(索引名);

    11.3 同义词(synonym)

    创建和删除同义词

    创建:CREATE SYNONYM d_sum 2 FOR dept_sum_vu;

    删除:DROP SYNONYM d_sum;

    11.4 小结

           数据库常用对象

     

  • 相关阅读:
    while($info = mysql_fetch_assoc($result))
    网站问题搜索
    call apply js
    函数和变量名为啥不能包含
    js 函数 理解
    smtp 4个点
    使用视频作为网页背景的技术探讨
    php表达式内含表达式
    hook_theme作用小思考
    php中引用&的真正理解-变量引用、函数引用、对象引用
  • 原文地址:https://www.cnblogs.com/zouyaoyao/p/8683815.html
Copyright © 2011-2022 走看看