sql笔记(原创,2012年根据教材《数据库系统概论》做的笔记)

数据定义语言DDL :  create   drop     alter      自动提交
数据查询语言        :  select
数据操纵语言DML:  insert   update   delete     需要自己提交  即,增删改需要提交。
数据控制语言DCL :  grant    revoke                自动提交
事务控制语言TC   :  commit  rollback

目录:
一、数据定义
二、数据查询:select
三、数据操纵:增删改
四、事务控制
五、数据控制
六、数据库的完整性
七、关系数据库理论


一、数据定义   
1 创建表 CREATE  TABLE
   方式一:
  create table emp(
        empno number(5)  primary key,
        ename varchar2(6)  not null,
        job varchar2(10),
        hiredate date default sysdate,
        sex varchar2(6) constraint sex_chk check(sex in(‘男’,’女’)),
        sal number(4) default 1000,
        phone varchar2(12) constraint punm_uq unique
        deptno number(3) references dept(deptno)  --外码能不能这样定义?
   );
 方式二:
 create table emp2 as select * from emp; --最简单的数据备份的方法
 创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面。
2 Oracle 10g 基本数据类型
  char    定长字符串,默认长度1B
  varchar 变长字符串,必须指明最大字节数
  number(5)
  number(5,2) 总共5位,2位小数
  date    日期类型
3 修改表 ALTER TABLE
  添加表的列 alter table emp add sex varchar2(6);
  删除表的列 alter table emp drop column sex;
  修改表的列 alter table emp modify sal number(7,2);--修改类型,精度,default.
                       alter table emp modify ename not null;--添加not null约束
                       alter table emp modify ename null;--删除ename列的not null约束
                       alter table emp modify ename varchar2(20);--将emp表ename字段的长度改为20
  添加约束:
         添加关键约束   alter table emp add constraint emp_pk primary key(empno);
         添加外键约束   alter table emp add constraint e_fk_d foreign key(deptno) references dept(deptno);
         添加check约束  alter table emp add constraint sex_ck check(sex in(‘男’,’女’));
         添加unique约束 alter table emp add constraint ename_uq unique(ename);
  删除约束:
         删除主键约束   alter table emp drop constraint emp_pk;
         删除外键约束   alter table emp drop constraint e_fk_d;
         删除check 约束 alter table emp drop constraint sex_ck;
         删除unique约束alter table emp drop constraint ename_uq;
4 删除表 DROP  TABLE
  drop table emp;--连同表的定义一起删除
5 建立视图 CREATE TABLE
   create view emo_name_job as
     select empno,ename,job from emp;
6 使用视图
  视图可以进行更新操作,只不过很少这么用。对视图的更新最终转化为对基本表的更新
7 删除视图
  drop view emo_name_job;
8 建立索引
  create index ename_idx on emp(ename);
9 删除索引
  drop index ename_idx;
二、数据查询SELECT  
1 查询全部列
  Select  *  from  emp ;
2 查询部分列
  select  empno,ename  from  emp;
3 删除重复的列
  select  distinct  deptno  from  emp;--删除结果中重复的列
  select  distinct  sal,deptno  from  emp;--删除结果中组合重复的列
4 使用别名:空格或AS
  select  sal*12  n1  from  emp;
  结果:
        N1
---------
       9600
  Select  sal*12  as  n2  from  emp;
  结果:
N2
---------
       9600
  select sal*12  “n3” from emp;
  结果:
N3
---------
       9600
  select sal*12  as “n4” from emp;
  结果:
N4
---------
       9600
5 字符串连接:||
  连接的字符串要用单引号引上。

select ename||’的部门是’ 部门 , deptno from emp;
  结果:
      部门              DEPTNO
-------------------------------------------------
SMITH的部门是         20
ALLEN的部门是         30
WARD的部门是         30
若连接的字符串本身含有单引号,则用两个单引号表示一个单引号。
Select ename||’’’s deptno:’ 姓名,deptno from emp;
  姓名               DEPTNO
------------------------------------------------------
SMITH's deptno:           20
ALLEN's deptno:           30
WARD's deptno:           30
6、条件查询 WHERE
   比较条件  =  >  <  >=  <=  <>或!=
   确定集合  in  not in
   确定范围  between and  not between and
   字符匹配  like  not like
   空值测试  is null  is not null
   逻辑条件  and  or  not

   例:查询工资为800和1600的员工名称和部门
   select ename,deptno from emp where sal in(800,1600);
   结果:
      ENAME         DEPTNO
-------------------------------------------
SMITH            20
ALLEN            30

   空值测试用is null,不能用=null
例:select empno,ename,comm,deptno from emp where mgr is null;
结果:
EMPNO   ENAME   COMM   DEPTNO
-------------------------------------------------------------
   7839    KING               10

   通配符%表示任意个字符,_表示一个字符。一个汉字占两个字符。若要查询的字符串本身就含有通配符%或_,则需要用转义字符。
   例:查询姓欧阳且全名为三个汉字的员工姓名。
        select ename from emp where ename like ‘欧阳_ _’;
   例:查询姓名中第二个字是鹏的员工的姓名。
        Select ename from emp where ename like ‘_ _鹏’;
   例:查询以’ab_’开头的员工姓名
        Select ename from emp where ename like ‘ab\ _’ escape ‘\’;
   例:查询以’ab\_’开头的员工姓名
        Select ename from emp where ename like ‘ab\$_’ escape ‘$’;
7.排序 ORDER BY
  升序 asc
  降序 desc
  例1:按照雇佣日期降序排列员工
Select empno,ename,hiredate from emp order by hiredate;
结果:
     EMPNO ENAME      HIREDATE
----------------------------------------------------
      7369 SMITH      17-12月-80
      7499 ALLEN      20-2月 -81
      7521 WARD      22-2月 -81
      7566 JONES      02-4月 -81
      7698 BLAKE      01-5月 -81
      7782 CLARK      09-6月 -81
      7844 TURNER     08-9月 -81
  例2:按照job升序,ename降序排列emp表
     select empno,ename,job from emp order by job,ename desc;
    结果:
          EMPNO   ENAME    JOB
         ----------------------------------------------
  7788      SCOTT    ANALYST
          7902      FORD     ANALYST
          7369      SMITH    CLERK
          7934      MILLER   CLERK
          7900      JAMES    CLERK
          7876      ADAMS   CLERK
          7566      JONES    MANAGER
          7782      CLARK    MANAGER
          7698      BLAKE    MANAGER
8、组函数
8.1 组函数的一般使用
COUNT(*)      
COUNT(deptno)  COUNT(distinct deptno)
SUM(sal)        SUM(distinct sal)
MAX(sal)        MAX(distinct sal)
MIN(sal)         MIN(distinct sal)
AVG(sal)         AVG(distinct sal)
没有COUNT(DISTINCT *)的写法,因为本身行与行就不能重复。
COUNT 函数所用的列包含空值时,空值行被忽略。
例1.select count(*) from emp;
结果:
  COUNT(*)
-----------------
        14
   例2. select avg( distinct deptno) from emp;
   结果:
AVG(DISTINCT  DEPTNO)
-----------------------------------
             20
   例3.  select avg(deptno) from emp;
结果:
AVG(DEPTNO)
-----------------------------------
   22.1428571
8.2 组函数嵌套
Select max(avg_sal) from
     (select avg(sal) avg_sal,deptno from emp
        group by deptno
);
   相当于:
Select max(avg(sal)) from emp
  group by deptno;
9 分组GROUP BY
  例:查询每个部门的最高工资
      select MAX(sal),deptno from emp
        Group by deptno;
  结果:
       MAX(SAL)   DEPTNO
---------------------------------------
        2850       30
        3000       20
        5000       10
注意:出现在select列表中的字段要么出现在组函数中,要么出现在group by子句中。如:
      select ename,avg(sal) from emp; 错误
      select ename,avg(sal) from emp group by empno; 错误
      select empno,avg(sal) from emp group by empno; 正确
10 HAVING子句
  有having子句时必须有group by 子句,having子句用于对分组之后的结果进行筛选。
  例:检索平均工资大于2000的部门,显示部门、平均工资。
      select avg(sal),deptno from emp
         group by deptno
         having avg(sal)>2000;
  结果:
AVG(SAL)     DEPTNO
-------------------------------------
       2175         20
2916.66667      10
11 连接查询
11.1 内连接
表达方式1:
select empno,emp.deptno,loc
from emp,dept
where emp.deptno=dept.deptno;
表达方式2:
   select empno,emp.deptno,loc
    from emp join dept on emp.deptno=dept.deptno;
11.2 外连接
     在连接查询中,如果表中的一些行在其他表中不存在匹配行,内连接查询结果中删除原表中的这些行,外连接结果中保留这些行。
左外连接:left join on
右外连接:right join on
全外连接:full join on
11.3 交叉连接
连接查询不使用连接条件,即笛卡尔乘积。一般不使用。
如,select empno,loc from emp,dept;
11.4 自连接
   例:查询员工及其领导的姓名
   select e1.ename,e2.ename
      from emp e1,emp e2
      where e1.mgr=e2.empno;
   结果:
  ENAME      ENAME
------------------------------------
FORD       JONES
SCOTT      JONES
TURNER     BLAKE
ALLEN      BLAKE
WARD       BLAKE
JAMES      BLAKE
12 子查询
13 SQL函数
   数值函数
   abs(x):求x的绝对值  select abs(-88) from dual;
   mod(x,y):返回x除以y的余数 select mod(10,4) from dual;
   round(x,y):返回对x的第y位的四舍五入结果。注意位数。
select round(15.51),round(15.49),round(15.51,1),
round(15.51,0),round(15.51,-1)from dual;
       结果:
ROUND(15.51)ROUND(15.49)ROUND(15.51,1)ROUND(15.51,0)ROUND(15.51,-1)
------------------------------------------------------------------------------------------------------------
        16         15           15.5          16            20
   trunc(x,y):返回对x的第y位进行截断的结果。
       select trunc(15.51),trunc(15.49),trunc(15.51,1),
trunc(15.51,0),trunc(15.51,-1) from dual;
       结果:
   TRUNC(15.51) TRUNC(15.49) TRUNC(15.51,1) TRUNC(15.51,0) TRUNC(15.51,-1)
  -------------------------------------------------------------------------------------------------------------
        15         15           15.5          15           10
   字符函数
   ascII():返回字符串首个字母的ASCII码  select ascii(‘x’) from dual;
   chr(x):返回ASCII码为x的字符   select chr(65) from dual;
   lower():把字符转成小写  select empno,lower(job) “job” from emp;
   upper():把字符转成大写  select upper(‘liu’) from dual;
   initcap():把字符串中每个单词的第一个字母变成大写,其他字母小写
          SQL> select initcap('MY name is LIUPENGCHENG') from dual;
结果:My Name Is Liupengcheng
   concat(x,y):连接字符串 select concat(‘good’,’morning’) from dual;
   substr(x, n):对字符串x进行截取,从第n个位置开始,n为负数是从后数
   substr(x,n,m):对字符串x进行截取,从第n个位置开始,一共截m个
   instr(x, y,n,m);返回子串y在x中的位置,n可以指定起始位置,m可以指定第几次出现的位置,mn可省
   lpad(x,n,y):在字符串x的左边补充字符串y,得到总长为n的字符串,y可省
           select empno,lpad(ename,10,'*') from emp;
结果: EMPNO   LPAD(ENAME,10,'*')
------------------------------------------------
                  7369       *****SMITH
                  7499       *****ALLEN
                  7521       ******WARD
                  7566       *****JONES
   length(x): 用于返回表达式中的字符数,注意返回的是NUMBER
   nvl(expr1,expr2):若expr1不为null,返回expr1;若为null,返回expr2
          select ename,sal+comm from emp;--错误,为null的行运算后仍为null
          select ename,sal+vul(comm,0) “月总收入” from emp;--正确
   nvl2(expr1,expr2,expr3):若expr1不为null,返回expr2;若为null,返回expr3
          select ename,nvl2(comm,sal+comm,sal) “月总收入” from emp;

   日期时间函数
   sysdate:返回系统的当前日期  select sysdate from dual;       
   转化函数
   to_char
   to_date

三 数据操纵  增删改  
1 插入 INSERT
方式一:插入元组
  insert into emp values(7777,'liu','clerk',7369,sysdate,500,300,30);正确
  insert into emp values(7777,'liu','clerk',7369,sysdate,500,null,30);正确
  insert into emp values(7777,'liu','clerk',7369,sysdate,500,,30);错误,确实表达式
  insert into emp(empno,ename,job,mgr,hiredate,sal,deptno)
  values(9999,'liu','clerk',7369,sysdate,800,20);         正确
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno)
  values(9999,'liu','clerk',7369,sysdate,800,20),
(9999,'liu','clerk',7369,sysdate,800,20)          错误,不能多个value
方式二:插入子查询结果
insert into dept_age(sdept,avg_age)
  select sdept,AVG(sage) from student group by sdept;
2 删除 DELETE
  删除记录并不能释放ORACLE里被占用的数据块表空间,它只把那些被删除的数据块标成unused。如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间,truncate操作不可回退。
  方式一:
  delete from emp where deptno=20;
  delete from emp;--删除表的所有记录,删除时不释放表占用的空间,可roolback
truncate table emp;--删除表的所有记录,快,释放表,段占用的空间,不可roolback
方式二:带有子查询
delete from emp where sal>(select avg(sal) from emp);
3 更改 UPDATE
  方式一:
  update emp set sal=sal*2,comm=comm+100 where deptno=20;
  方式二:带有子查询
  update emp set sal=(select avg(sal) from emp);

四 事务控制 
  事务:transaction.事务是对一个或多个表中数据进行的一组DML操作(增删改),作为一个单元来处理。事务要么全做,要么全不做。
  事务开始于应用程序的第一条DML语句。
1 提交事务   COMMIT
2 撤销事务   ROLLBACK
3 设置保留点 SAVEPOINT
4 隐式处理事务
  当执行DDL语句时,Oracle系统会自动提交事务
  当执行DCL语句时,Oracle系统会自动提交事务
  当正常退出(EXIT)时,Oracle系统会自动提交事务
当非正常退出(叉掉或断电等),Oracle会自动撤销事务

五 数据控制 



六 数据库的完整性 
   在执行DML时有可能破坏数据库的完整性。
1 实体完整性
主属性唯一且不能为空
2 参照完整性
  外码要么为空,要么为其他表的主码
  违反的情况:主表中删除记录
              主表中修改记录
              从表中插入记录
              从表中修改记录
3 用户自定义的完整性

七 关系数据库理论 
1第一范式
  要有主键,列不可分
2 第二范式
  不存在部分依赖
3 第三范式
  不存在传递依赖

八 SQL*PLUS 
   SQL*PLUS是Oracle的一个客户端,当然也有专门的Oracle客户端,如poad,PLSQL Developer等。SQL命令主要用来对数据库进行操作,而SQL*PLUS命令主要用来设置查询结果的显示格式,设置一些环境选项。
1 启动方法
  方式一:
      开始-程序中启动
  方式二:
      命令行方式打开。运行-cmd-sqlplus-用户名:system-口令:abc
  方式三:当Oracle没有安装成功是可以直接通过网页的方式使用别人的。
      通过网页执行。httP://127.0.0.1:5560/isqlplus
2 连接命令
  conn system/abc as sysdba;
  conn scott/tiger;
3 解开scott账户
  alter user scott account unlock;
4 断开连接
  disc--断开当前的连接,但是不退出SQLPLUS环境
5 退出
  QUIT或EXIT—退出SQLPLUS环境
6 查看表结构
方式一:DESC EMP;//在pl/sql developer 中不能使用
方式二:select * from user_tab_columns where table_name=’EMP’;//在pl/sql
developer中能使用
7 执行PL/SQL程序
SQL*PLUS中执行PL/SQL程序需要在最后一句的下一行输入“/”
8 显示当前连接用户
show user
9 编辑命令
当输入SQL命令时,SQL*PLUS将其保存在内部缓冲区中,这个内部缓冲区称为SQL缓冲区。
SQL缓冲区只保存一条SQL命令,当输入新的SQL命令时,原来保存的SQL命令就被删除。用户可以利用SQL缓冲区在不重新输入命令的情况下,编辑、运行上一次执行的SQL命令。
除LIST命令以外,其他编辑命令都是针对当前行的;当前行不一定是最后一行;可以先用带一个参数的LIST命令选择当前行。
在SELECT命令尾部输入的分号(;)没有显示,因为SQL*PLUS并不把它保存在SQL缓冲区中。
LIST:显示缓冲区的所有行
LIST *:用于显示当前行
LIST N:用于显示第n行
LIST M N:显示从第m行到第n行
LIST LAST:用于显示最后一行
APPEND:将制定的文本追加到SQL缓冲区的当前行的末尾
CHANGE/ENAME:删除缓冲区中当前行的内容ENAME
CHANGE/NAME/ENAME:将当前行中的name改为ename
N:等价于 LIST N,用于显示第n行
INPUT:在当前行的后面新增加一行或多行
INPUT WHERE DEPTNO=20:增加一个新行,内容为:where deptno=20
DEL:删除当前行
EDIT:启动记事本编辑缓冲区的内容
RUN或’/’:执行缓冲区的SQL语句或PL/SQL语句
CLEAR BUFFER:删除缓冲区的内容
10 交互式命令
   &:用来表示输入,字符串需要加单引号
     select * from emp where job='&job' and sal=&sal;


猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/80471330