一、DB和DBMS
二、关系数据库简介
三、表的概念
四、Oracle数据库概述
五、结构化查询语言
1.数据定义语言(DDL)Data Definition Language
2.数据操作语言(DML)Data Manipulation Language
3.事务控制语言(TCL)Transaction Control Language
4.数据查询语言(DQL) Data Query Language
5.数据控制语(DCL)Data Control Language
Oracle官网下载
一、远程登录数据库服务器
!--1.新建—个用户
CREATE USER C##username IDENTIEIED BY 12345;
--2.创建一个表空间
CREATE TABLBSPACE mydatabase DATAZILE 'e:\mywork\oracle\mydatabase.dbf' SIZE 2048M;
--3.将表空间分配给创建的用户,要重新启动一下数据厍
ALTER USER C##username DEFAULT TABLESPACE mydatabase;
--4.为创建的用户分配对应的权限
GRANT
connect,resource, create indextype,create job, create sequence, create session,create table,create view, create procedure ,unlimited tablespace,insert any table
TO
C##username;
--5.测试
SELECT sysdate FROM dual;
一、NUMBER
二、CHAR
三、VARCHAR2
四、DATE
一、CREATE语句
CREATE TABLE [schema.]table_name(
column_name datatype[DEFAULT expr][.…]
);
二、DESC语句(查看表结构)
DESC table_name;
三、DEFAULT语句
四、NOT NULL
一、修改表名
RENAME old_name To new_name;
二、增加列
ALTER TABLE table_name ADD
(column datatype [DEFAULT expr][, columndatatype.….])
三、删除列
ALTER TABLE table _name DROP](column);
四、修改列
ALTER TABLE table_name MODIFY
(column datatype [DEFAULT expr][, column datatype...])
INSERT INTO table _name[(column[, column...])]VALUES(value[, value..]);
UPDATE table_name
SET column = value [, column = value]...[WHERE condition];
DELETE [FROM] table_name [WHERE condition];
一、CHAR和VARCHAR2类型
表示字符串数据类型,用来在表中存放字符串信息,比如姓名、职业、地址等
CHAR存放定长字符,即存不满补空格;VARCHAR2存放变长字符,存多少占用多少。
二、CHAR和VARCHAR2的存储编码
默认单位是字节,可指定为字符
每个英文字符占用一个字节,每个中文字符按编码不同,
占用2-4个字节
三、CHAR和VARCHAR2的最大长度
CHAR最大取值为2000字节
最多保存2000个英文字符,1000个汉字(GBK)
VARCHAR2最大取值为4000字节
最多保存4000个英文字符,2000个汉字(GBK)
CHAR可以不指定长度,默认为1,VARCHAR2必须指定长度
四、LONG和CLOB类型
五、函数CONCAT和“II"
六、函数LENGTH
七、函数UPPER、LOWER和INITCAP
八、函数TRIM、LTRIM、RTRIM
九、函数LPAD、RPAD
十、SUBSTR
SELECT
SUBSTR('Doctor Who travels in TARDIS',8, 25)
FROM DUAL;
十一、INSTR
一、NUMBER §表示整数
二、NUMBER (P,S)表示浮点数
三、NUMBER的变种数据类型
内部实现是NUMBER,可以将其理解为NUMBER的别名,目的是多种数据库及编程语言兼容
四、ROUND
五、TRUNC
六、MOD
MOD(m, n):返回m除以n后的余数
七、CEIL和FLOOR
一、DATE
二、TIMESTAMP
CREATE TABLE test(
c1 DATE,
c2 TIMESTAMP);
三、SYSDATE
四、SYSTIMESTAMP
五、日期转换函数
1.TO_DATE·
YY | 2位数字的年份 |
---|---|
YYYY | 4为数字的年份 |
MM | 2位数字的月份 |
MON | 简拼的月份 |
MONTH | 全拼的月份 |
DD | 2位数字的天 |
DY | 周几的缩写 |
DAY | 周几的全拼 |
HH24 | 24小时制的小时 |
HH12 | 12小时制的小时 |
MI | 显示分钟 |
ss | 显示秒 |
2.TO CHAR
SELECT ename,
TO_CHAR(hiredate, 'YYY"年" MM"月"DD"日"')
FROM emp;
六、日期常用函数
1.LAST DAY
2.ADD MONTHS
3.MONTHS BETWEEN
4.NEXT DAY
5.LEAST、GREATEST
SELECT LEAST(SYSDATE, '10-10月-08') FROM DUAL;
一、NULL的含义
二、NULL条件查询
SELECT * FROM student WHERE gender IS NULL;
三、非空约束
CREATE TABLE student
(id NUMBER(4),
name CHAR(20),
gender CHAR(1) NOT NULL);
四、空值函数
1.NVL
2.NVL2
一、FROM子句
SELECT <*, column [alias], ...> FROM table;
二、使用别名
三、WHERE子句
--查询职员表中薪水低于2000元的职员信息
SELECT ename, sal FROM emp
WHERE sal < 2000;
--查询职员表中不属于部门10的员工信息(!=等价于<>)
SELECT ename, sal, job FROM emp
WHERE deptno != 10;
--查询职员表中在2002年1月1号以后入职的职员信息,比较日期类型数据
SELECT ename, sal, hiredate FROM emp
WHERE hiredate > to_date('2002-1-1','YYYY-MM-DD');
四、使用AND ,OR关键字
五、使用LIKE条件(模糊查询)
SELECT ename, job FROM emp
WHERE ename LIKE'_A%;
六、使用IN和NOT IN
--查询职位是MANAGER或者CLERK的员工
SELECT ename, job FROM emp
WHERE job IN ('MANAGER','CLERK");--查询不是部门10或20的员工
SELECT ename, job FROM emp WHERE deptno NOT IN (10,20);
七、BETWEEN…AND…
八、使用IS NULL和IS NOT NULL
九、使用ANY和ALL条件
> ANY:大于最小
< ANY:小于最大
> ALL:大于最大
> <ALL:小于最小
--例子
SELECT empno, ename, job, sal, deptnoFROM emp
WHERE sal> ANY (3500,4000,4500);
十、查询条件中使用表达式和函数
--查询条件中使用函数
select ename, sal, job from emp where ename = UPPER('rose');
--查询条件中使用表达式
select ename, sal, job from emp where sal * 12 >100000;
一、使用DISTINCT过滤重复
--查询员工的部门编码
SELECT deptno FROM emp;
--查询员工的部门编码,去掉重复值
SELECT DISTINCT deptno FROM emp;
--查询每个部门的职位,去掉重复值
SELECT DISTINCT deptno, job FROM emp;
二、排序
1.使用ORDER BY 子句
SELECT <*, column [alias], ...>
FROM table
[WHERE condition(s)]
[ORDER BY column [ASC |DESC]];
SELECT empno, ename, mgr FROM emp
WHERE deptno = 10 ORDER BY mgr;
降序排列,必须指明
SELECT ename, sal FROM emp
ORDER BY sal DESC;
2.多个列排序
--对职员表中的职员排序,先按照部门编码正序排列,再按照薪水降序排列
SELECT ename, deptno, sal FROM emp
ORDER BY deptno ASC, sal DESC;
一、什么是聚合函数
二、MAX和MIN
--获取机构下的最高薪水和最低薪水,参数是数字
SELECT MAX(sal)max_sal, MIN(sal) min_salFROM emp;
--最早和最晚的入职时间,参数是日期
SELECT MAX(hiredate) max_hire, MIN(hiredate)min_hire
FROM emp;
三、AVG和SUM
--获得机构下全部职员的平均薪水和薪水总和
SELECT AvG(sal) avg_sal, SuM(sal) sum_sal FROM emp;
四、COUNT
--获取职员表中一共有多少名职员记录
SELECT COUNT(*) total num FROM emp;
--获得职员表中有多少人是有职位的(忽略没有职位的员工记录)
SELECT COUNT(job) total job FROM emp;
一、GROUP BY子句
SELECT <*, column [alias], ....>
FROM table [WHERE condition(s)]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column [ASC | DESC]] ;
二、HAVING子句
--查询每个部门的最高薪水,只有最高薪水大于4000的记录才被输出显示
SELECT deptno,MAX(sal) max_sal FROM empGROUP BY deptno HAVING MAX(sal) >4000;
一、关联的概念
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
二、笛卡尔积
SELECT COUNT(*)FROM emp;--14条记录
SELECT COUNT(*)FROM dept; --4条记录
SELECT emp.ename, dept.dname
FROM emp, dept;--56条记录
一、内连接
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.dep;
--JOIN连接两表,ON连接条件
SELECT e.ename, d.dname
FROM emp e JOIN dept d
ON(e.deptno = d.deptno);
二、外连接
--左外连接,以坐标为主表,该表记录都要查询出来,不满足连接条件的记录则来自右刚表的字段值全部为null
SELECT e.ename,e.sal,e.job,e.deptno,d.dname
FROM emp e LEFT OUTER JOIN dept d
ON(e.deptno = d.deptno)
--右外连接
SELECT e.ename,e.sal,e.job,e.deptno,d.dname,d.loc
FROM emp e RIGHT OUTER JOIN dept d
ON(e.deptno = d.deptno)
--全外连接
SELECT e.ename ,e.sal,e.job,e.deptno,d.dname , d.loc
FROM emp e FULL OUTER JOIN dept d
ON(e.deptno = d.deptno)
一、自连接
--查看公司每个员工的名字以及其领导的名字
SELECT e.ename , m.ename
FROM emp e, emp m
WHERE e.mgr=m.empno
--
SELECT e.ename, m.ename
FROM emp e LEET OUTER JOIN emp m
ON(e.mgr=m.empno)
一、子查询在WHERE子句中
--查找和SCOTT同职位的员工: 先执行子查询,得到结果后再进行主查询
SELECT e.ename, e.job
FROM emp e
WHERE e.job =
(SELECT job FROM emp WHERE ename = 'SCOTT');
--查找薪水比整个机构平均薪水高的员工
SELECT deptno, ename, sal
FROM emp e
WHERE sal> (SELECT AVG(sal) FROM emp;
二、如果子查询返回多行,主查询中要使用多行比较操作符
--查询出部门中有SALESMAN但职位不是SALESMAN的员工的信息:子查询的结果是多个值
SELECT empno, ename, job.sal, deptno
FROM emp
WHERE deptno lN
(SELECT deptno FROM emp WHERE job = 'SALESMAN'")
AND job <> 'SALESMAN';
三、在子查询中需要引用到主查询的字段数据
--列出来那些有员工的部门信息
SELECT deptno, dname FROM dept d
WHERE EXISTS
(SELECT * FROM emp e
WHERE d.deptno = e.deptno);
四、子查询在HAVING子句中
--查询列出最低薪水高于部门30的最低薪水的部门信息
SELECT deptno,MIN(sal) min_sal
FROM emp
GROUP BY deptno
HAVING MIN(sal)>
(SELECT MIN(sal) FROM emp WHERE deptno = 30);
五、子查询在FROM部分
--查询出薪水比本部门平均薪水高的员工信息 子查询当作表一样使用
SELECT e.deptno, e.ename, e.sal
FROM emp e,
(SELECT deptno, AVG(sal) avg sal FROM empGROUP BY deptno) x
WHERE e.deptno = x.deptno
and e.sal > x.avg_sal
ORDER BY e.deptno;
一、ROWNUM
SELECT ROWNUM, empno, ename, sal
FROM emp;
SELECT ROWNUM, empno, ename, sal
FROM emp
WHERE rownum <= 3;
--ROWNU是在从表中查询出—条记录时,为该记录在这个字段上生成行号
--因此我们不能在查询过程中使用ROHNUM作为过滤条件
--通过子查询解决
--在分页查询是,我们要确定行号的范围时,可以用如下公式来确定范围
--参数项:1:页数,用n表示第几页 2:每页要显示的条目数,用pageSize表示一页显示多少条记录
--开始行号计算公式:(n-l) *pageSize+l
--结束行号计算公式:pagesize*n
--例如:—页显示20条(pagesize:20)显示第三页(n=3)
--开始行号:(3-1) *20+1 41条开始
--结束行号:20*3 60条结束
一、DECODE函数基本语法
DECODE (expr,search1, result1[, search2, result2..][default])
--查询职员表,根据职员的职位计算奖励金额,当职位分别是’MANAGER’、’ANALYST'、'SALESMAN'时,奖励金额分别是薪水的1.2倍、1.1倍、1.05倍,如果不是这三个职位,则奖励金额取薪水值
SELECT ename, job, sal,
DECODE(job,
'MANAGER',sal * 1.2,
'ANALYST',sal * 1.1,
'SALESMAN',sal * 1.05,
sal
) bonus
FROM emp;
--和DECODE函数功能相似的有CASE语句,实现类似于if-else的操作。
SELECT ename, job, sal,
CASE job
WHEN 'MANAGER' THEN sal * 1.2
WHEN 'ANALYST' THEN sal * 1.1
WHEN 'SALESMAN' THEN sal * 1.05
ELSE sal END
bonus
FROM emp;
二、DECODE函数在分组查询中的应用
SELECT DECODE(job,
"ANALYST', 'VIP',
'MANAGER','VIP',
'OPERATION') job,
COUNT(1) job_cnt
FROM emp
GROUP BY DECODE(job, 'ANALYST','VIP','MANAGER','VIP, 'OPERATION');
SELECT deptno, dname, loc
FROM dept
ORDER BY
DECODE(dname, ' OPERATIONS ',1,' ACCOUNTING',2,'SALES ,3);
一、ROW_NUMBER
ROW_NUMBER() OVER(
PARTITION BY col1 ORDER BY col2)
--场景:按照部门编码分组显示,每组内按职员编码排序,并赋予组内编码
SELECT deptno, ename, empno,
ROW_NUMBER()
OVER (PARTITION BY deptno ORDER BY empno)
AS emp_id
FROM emp;
二、RANK
RANK() OVER(
PARTITION BY col1 ORDER BY col2)
--场景:按照部门编码分组,同组内按薪水倒序排序,相同薪水则按奖金数正序排序,并给予组内等级,用Rank ID表示
SELECT deptno, ename, sal, comm,RANK() OVER (PARTITION BY deptno
ORDER BY sal DESC, comm) "Rank_ID" FROM emp;
三、DENSE RANK
DENSE_RANK() OVER(
PARTITION BY col1 ORDER BY col2)
一、UNION、UNION ALL
SELECT statement1
[UNION | UNION ALL | INTERSECT |MINUS]
SELECT statement2;
二、UNION、UNION ALL
--合并职位是’MANAGER’的员工和薪水大于2500的员工集合,查看两种方式的结果差别
SELECT ename, job, sal FROM emp
WHERE job = 'MANAGER'
UNION
SELECT ename, job, sal FROM emp
WHERE sal >2500;
SELECT ename, job, sal FROM emp
WHERE job = 'MANAGER'
UNION ALL
SELECT ename, job, sal FROM emp
WHERE sal >2500;
三、INTERSECT
--显示职位是’MANAGER’的员工和薪水大于2500的员工的交集
SELECT ename, job, sal FROM emp
WHERE job = 'MANAGER'
INTERSECT
SELECT ename, job, sal FROM emp
WHERE sal > 2500;
四、MINUS
--列出职位是MANAGER但薪水低于2500的员工记录
SELECT ename, job, sal FROM emp
WHERE job = 'MANAGER'
MINUS
SELECT ename, job, sal FROM emp
WHERE sal >= 2500;
一、ROLLUP、CUBE和GROUPING SETS
GROUP BY ROLLUP(a, b, c)
GROUP BY CUBE(a, b, c)
GROUP BY GROUPING SETS ( (a), (b))
1.ROLLUP
--假设有表test,有a、b、c、d四个列。
SELECT a,b,c,SUM(d)FROM test GROUP BY ROLLUP(a,b,c)
--等价于:
SELECT a,b.c,SUM(d)FROM test GROUP BY a,b,c
UNION ALL
SELECT a,b,null,SUM(d)FROM test GROUP BY a,b
UNION ALL
SELECT a,null,null,SUM(d)FROM test GROUP BY a
UNION ALL
SELECT null,null,null,sum(d) FROM test
2.CUBE
3.GROUPING SETS
--基于视图查询数据
SELECT empno, ename, sal, deptno FROM v_emp_10
--创建视图
CREATEOR REPLACE VIEw v_emp_10
AS
SELECT empno id , ename name , sal salary ,deptn
FROM emp
WHERE deptno = 10;
DESC v_emp_10
SELECT id, name, salary, deptno FROM v_emp_10
一、对视图进行DML操作
二、创建具有CHECK OPTION约束的视图
CREATE [OR REPLACE] VIEW view_name[(alias[, alias...])]
AS subquery
[WITH CHECK OPTION];
三、创建具有READ ONLY约束的视图
CREATE [OR REPLACE] VIEW view_ name[(alias[, alias..])]
AS subquery
[WITH READ ONLY];
CREATE OR REPLACE VIEW v_emp_10
AS
SELECT empno, ename, sal, deptno FROM emp
WHERE deptno = 10
WITH READ ONLY;
--对只读视图执行DML操作,失败
INSERT INTO v_emp_10 VALUES(1258, 'DONNA',3000,10);
--ERROR位于第1行:
--ORA-01733:此处不允许虚拟列
--或:ORA-42399:无法对只读视图执行DML 操作
四、通过查询user_views获取相关信息和视图相关的数据字典:
SELECT object_name FROM user_objects
WHERE object type = 'VIEW";
五、创建复杂视图(多表关联)
--创建一个视图V_EMP_SALARY,把职员表的数据按部门分组,获得每个部门的平均薪水、薪水总和、最高薪水和最低薪水
CREATE VIEW vemp_salary
AS
SELECT d.dname, avg(e.sal) avg_sal, sum(e.sal) sum_sal,
max(e.sal) max_sal, min(e.sal) min_sal
FROM emp e join dept d
ON e.deptno = d.deptno
GROUP BY d.dname;
六、删除视国
七、序列
1.什么是序列
2.创建序列
CREATE SEQUENCE [schema.]sequence_name
[ START WITH i] [ INCREMENT BY j]
[MAXVALUE m | NOMAXVALUE ]
[ MINVALUE n |NOMINVALUE ]
[ CYCLE | NOCYCLE ][ CACHE p | NOCACHE ]
3.序列可生成的最大值是m,最小值是n
4.使用序列
--创建一个序列,起始数据是100,步进是10
--当序列被创建后,第一个序列值将是100,将要生成的序列号分别是110、120、130等
CREATE SEQUENCE emp seq
START WITH 100
INCREMENT BY 10;
SELECT emp_seq.NEXTVAL FROM DUAL;
INSERT INTO emp(empno, ename)
VALUES(emp_seq.NEXTVAL, 'donna');
SELECT empno, ename FROM emp
WHERE ename = 'DONNA';
SELECT emp_seq.CURRVAL FROM DUAL;
5.删除序列
一、索引的原理
二、创建索引
创建索引的语法:
CREATE [UNIQUE] INDEX index_name
ON table(column[, column.…]);
-- index_name表示索引名称
-- table表示表名
-- column表示列名,可以建立单列索引或复合索引
-- UNIQUE表示唯一索引
CREATE INDEX idx_emp_ ename ON emp(ename);
CREATE INDEX idx emp job_sal ON emp(job, sal);
SELECT empno, ename, sal, job FROM emp
ORDER BY job, sal;
三、创建基于函数的索引 。
CREATE INDEX emp_ename_upper_idx
ON emp(UPPER(ename));
SELECT * FROM emp
WHERE UPPER(hame)= 'KING";
四、修改和删除索引
ALTER INDEX index name REBUILD;
ALTER INDEX idx emp ename REBUILD;
五、合理使用索引提升查诲效率
一、约束的作用
二、约束的类型
三、非空约束
1.建表时添加非空约束
2.修改表时添加非空约束
ALTER TABLE employees
MODIFY (eid NUMBER(6) NOT NULL);
3.取消非空约束
ALTER TABLE employees
MODIFY (eid NUMBER(6) null):
四、唯一性约束
1.什么是唯一性约束
五、主键约束
1.主键的意义
2.主键选取的原则
六、外键约束
1.外键约束的意义
2.添加外键约束
--先建表,在建表后建立外键约束条件
CREATE TABLE employees4(
eid NUMBER(6),
name VARCHAR2(30),
salary NUMBER(7,2),
deptno NUMBER(4)
);
ALTER TABLE employees4
ADD CONSTRAINT employees4_deptno_fk
FOREIGN KEY (deptno) REFERENCES dept(deptno);
3.外键约束对一致性的维护
4.外键约束对性能的降低
5.关联不一定需要外键约束
七、检查约束
1.什么是检查约束