ORACLESQL培训资料.ppt
ORACLE数据库教程,培训内容简介,1、sql概念与分类2、数据定义语言(DDL)3、DML(Data Manipulation Language,数据操作语言)4、数据查询语言(DQL:Data Query Language)5、函数6、约束与索引,好的学习方法就是用最简单的方法,学到尽可能多的知识,-毁人不倦语录,系统环境及知识准备,系统环境Oracle数据库9i或以上版本安装PL/SQL Developer数据库集成开发工具,建议使用英文版知识准备对于PL/SQL Developer的使用有一定了解,知道如何登录Oracle,如何使用command和SQL窗口的操作。对于SQL基础知识篇(SQL-001)中的知识有一定的了解。,SQL部分,1、概念:结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;2、SQL语言基本分类:1)数据定义语言(DDL):包括:create table、alter table、drop table等;2)DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据。DML包括:INSERT:用于增加数据到数据库;UPDATE:用于从数据库中修改现存的数据 DELETE:用于从数据库中删除数据。,SQL部分,3)数据查询语言(DQL:Data Query Language):其语句,也称为数据检索语句,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。4)DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。DCL包括:ALTER PASSWORD GRANT REVOKE CREATE SYNONYM,SQL部分,5)事务处理语言(TPL):它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK6)指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作,SQL部分,3、基本语法3.1.createCreate tableCreate sequenceCreate view(后面讲)Create index(后面讲),SQL部分,3.1.1Create table(建表)语法:CREATE TABLE table_name(column_name1 data_type,column_name2 data_type,.);,SQL部分,表名和列的命名规则 1)必须以字母开头 2)长度不能超过30个字符 3)不能使用oracle的保留字 4)只能使用如下字符 A-Z,a-z,0-9,$,#等 Oracle中字段的数据类型字符型 char 最大2000个字节 定长 char(10)张三后面添加6个空格把10个字节填满 varchar2 范围 最大4000个字节 变长char 查询的速度极快浪费空间,查询比较多的数据用。varchar2 节省空间(oralce中基本都用这个)数字 number 范围-10的38次方到10的38次方,可以是整数也可以是小数 number(4)最大表示四位整数-9999到9999 number(5,2)表示5为有效数字 2为小数的一个小数-999.99到999.99,SQL部分,日期 date 包含年月日和时分秒 7个字节图片 blob 二进制大对象 图像/声音 4GCreate table例子:创建一个员工表create table dengxianglei_EMP(empno NUMBER(4),-员工号 ename VARCHAR2(10),-员工姓名 job VARCHAR2(9),-职位 mgr NUMBER(4),-上级领导 hiredate DATE,-入职日期 sal NUMBER(7,2),-工资 comm NUMBER(7,2),-奖金 deptno NUMBER(2)部门编号);create table dengxianglei_DEPT(deptno NUMBER(2)not null,dname VARCHAR2(14),loc VARCHAR2(13);-为后面准备,SQL部分,CREATE SEQUENCE(创建序列)创建序列:CREATE SEQUENCE 序列名INCREMENT BY nSTART WITH nMAXVALUE/MINVALUE n|NOMAXVALUECYCLE|NOCYCLECACHE n|NOCACHE;create sequence cux_store_limit_t_sminvalue 1-默认是1maxvalue 2147483647-默认9999999999999999999999999999start with 20000-默认1increment by 1-默认1CYCLE-默认循环cache 10;-默认20create sequence CUX_store_limit_T_S;(也可以这样建),SQL部分,3.1.2 dropDrop table table_name;Drop SEQUENCE seq_name;Drop index index_name;Drop view view_name;,SQL部分,3.1.3 alter添加字段(学生所在班级classid)(添加add)alter table student add(classid number(2);修改字段的长度(修改modify)alter table student modify(xm varchar2(12);删除一个字段 alter table student drop column sal;字段如何改名字-先删除 a)alter table student drop column sal;-再添加 b)alter table student add(salary number(7,2);表名修改 rename student to stu;,SQL部分,3.2.DML3.2.1.insert(插入数据)-所有字段都插入insert into dengxianglei_EMPvalues(CUX_store_limit_T_S.Nextval,小红,会计,5,sysdate,2000,500,20);,SQL部分,部分字段插入insert into dengxianglei_EMP(empno,ename,job,mgr,sal,comm,deptno)values(CUX_store_limit_T_S.Nextval,小明,会计,null,-空值 2000,500,20);,SQL部分,3.2.2 UPDATE-将员工号为1的员工名字改为小胡UPDATE DENGXIANGLEI_EMP TSET T.ENAME=小胡,T.sal=5000WHERE T.EMPNO=1;3.2.3 delete-删除员工号为2的员工信息删除delete from DENGXIANGLEI_EMP Twhere t.empno=2;delete from DENGXIANGLEI_EMP;删除表中所有记录,表结构还在,写日志,可以恢复,速度慢drop table DENGXIANGLEI_EMP;删除表结构和数据truncate table DENGXIANGLEI_EMP;删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快,SQL部分,3.3 DQL(数据查询语言,sql最主要的部分)Select查询语法:SELECT“栏位名”FROM“表格名”;Distinct(去重)Where(条件)And orInnot inBetween andselect*from dengxianglei_EMP twhere t.empno between 4 and 7;LikeOrder byCount,SQL部分,Union union allIntersectMinusselect*from dengxianglei_EMP t where t.empno=5intersectselect*from dengxianglei_EMP t where t.empno=6;select*from dengxianglei_EMP t where t.empno=5unionselect*from dengxianglei_EMP t where t.empno=5;select*from dengxianglei_EMP t where t.empno=5union allselect*from dengxianglei_EMP t where t.empno=5;select*from dengxianglei_EMP t where t.empno=6minusselect*from dengxianglei_EMP t where t.empno=5;,SQL部分,Group by、havingselect t.sal from dengxianglei_EMP t group by t.sal having t.sal=2000;Exists not existsselect*from dengxianglei_EMP o where exists(select x from dengxianglei_dept t where t.deptno=o.deptno);DecodeDecode(a,b,c,d);decode(a,b,c,d,e)Caseselect t.ename,case t.ename when 小红 then sal*1 when 小明 then sal*2 else sal end new_sal from dengxianglei_emp t;,SQL部分,表连接(多表查询)笛卡尔积(a表记录条数*b表记录条数)select*from dengxianglei_emp,dengxianglei_dept;规定:多表查询的条件是 至少不能少于 表的个数-1 才能排除笛卡尔集(如果有N张表联合查询,必须得有N-1个条件,才能避免笛卡尔集合)SELECT e.ename,e.sal,d.dname FROM dengxianglei_emp e,dengxianglei_dept d WHERE e.deptno=d.deptno;自连接(内联),SQL部分,左连接、右连接 select 属性列表 from 表1 lift/right outer join 表2 on 表1.属性=表2.属性;左连接查询(可以查询出表1所有的记录,表2中匹配的记录)右连接查询(可以查询出表2所有的记录,表1中匹配的记录)复合条件连接查询查询 select 属性列表 from 表1 lift/right outer join 表2 on 表1.属性=表2.属性 where 属性名=;(on写连接条件when中写其他条件)习惯用法(oracle)Select*from A,BWHERE A.NO=B.NO(+)(右链接,可以查询出A所有的记录,B中匹配的记录)Select*from A,BWHERE A.NO(+)=B.NO(左链接,可以查询出B所有的记录,A中匹配的记录)例子(后面给出),SQL部分,子查询子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询select*from dengxianglei_emp dewhere de.deptno in(select dd.deptno from dengxianglei_dept ddwhere dd.dname=业务部);select*from dengxianglei_EMP o where exists(select x from dengxianglei_dept t where t.deptno=o.deptno);,SQL部分,多列select*from dengxianglei_emp de where(de.empno,de.ename)=(select d.empno,d.ename from dengxianglei_emp d where d.empno=5);分页查询(重点)-分析函数分页(这个用得多效率稍差)select a.*from(select de.*,row_number()over(order by de.empno desc)rn from dengxianglei_emp de)a where a.rn 1 and a.rn2;,SQL部分,函数,SQL部分,约束(CONSTRAINT)NOT NULL 在没有做出任何限制的情况下,一个栏位是允许有 NULL 值得。如果我们不允许一个栏位含有 NULL 值,我们就需要对那个栏位做出 NOT NULL 的指定。CREATE TABLE Customer(SID integer NOT NULL,Last_Name varchar(30)NOT NULL,First_Name varchar(30);SID 和 Last_Name 这两个栏位是不允许有 NULL 值,而 First_Name 这个栏位是可以有 NULL 值得。,SQL部分,UNIQUE UNIQUE 限制是保证一个栏位中的所有资料都是有不一样的值。CREATE TABLE Customer(SID integer Unique,Last_Name varchar(30),First_Name varchar(30);SID 栏位不能有重复值存在,而 Last_Name 及 First_Name 这两个栏位则是允许有重复值存在。,SQL部分,CHECKCHECK 限制是保证一个栏位中的所有资料都是符合某些条件。CREATE TABLE Customer(SID integer CHECK(SID 0),Last_Name varchar(30),First_Name varchar(30);SID 拦只能包含大于 0 的整数。,SQL部分,主键(Primary Key)简单来说非空且唯一主键可以在建置新表格时设定(运用 CREATE TABLE 语句),或是以改变现有的表格架构方式设定(运用 ALTER TABLE)。CREATE TABLE Customer(SID number PRIMARY KEY,Last_Name varchar(30),First_Name varchar(30);alter table dengxianglei_emp add primary key(empno);,SQL部分,外来键(Foreign Key)举例来说,假设我们有两个表格:一个 emp(子表)表格,里面记录了所有员工的资料;另一个 dept(父表)表格,里面记录了所有部门的资料。在这里的一个限制,就是所有的员工的部门号,都一定是要跟在 dept表格中存在。在这里,我们就会在 emp表格中设定一个外来键,而这个外来键是指向 dept表格中的主键。语法:CREATE TABLE ORDERS(Order_ID integer primary key,Order_Date date,Customer_SID integer references CUSTOMER(SID),Amount double);,SQL部分,alter table dengxianglei_dept add primary key(deptno);ALTER TABLE dengxianglei_emp ADD FOREIGN KEY(deptno)REFERENCES dengxianglei_dept(deptno);-deptno是dengxianglei_emp表中的主键insert into dengxianglei_emp values(1,小红,业务,1,sysdate,10000,1000,50);-违反约束insert into dengxianglei_emp values(1,小红,业务,1,sysdate,10000,1000,20);-成功,SQL部分,索引语法:-普通索引CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME)-唯一索引CREATE unique INDEX“INDEX_NAME”ON“TABLE_NAME”(COLUMN_NAME)-唯一索引-联合索引CREATE INDEX“INDEX_NAME”ON“TABLE_NAME”(COLUMN_NAME1,COLUMN_NAME2.)-联合索引其实设置主键是系统默认给该字段添加唯一索引create index index_emp on dengxianglei_emp(ename);删除索引Drop index index_name;,SQL部分,创建视图视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表。视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。create or replace view dengxianglei_emp_v asselect*from dengxianglei_emp;,