oracle 基本使用

这篇博客详细介绍了Oracle数据库的基本使用,包括安装配置、SQL查询、表的操作、PL/SQL编程等内容。涵盖了从简单的数据查询、条件运算符到复杂的子查询、多表查询、存储过程和触发器的创建。此外,还提到了动态SQL、异常处理以及如何创建定时任务。
摘要由CSDN通过智能技术生成

oracle基本使用

安装配置相关

下载破解包,直接exe安装,一些常用命令(cmd)
sqlplus /nolog
SQL> conn / as sysdba;
SQL> alter user scott account unlock;(解锁)
SQL> GRANT RESOURCE ,CONNECT TO SCOTT;(给权限)
CONNECT角色:仅具有创建SESSION的权限
RESOURCE角色:仅具有创建CLUSTER,INDEXTYPE,OPERATOR,PROCEDEURE,SEQUENCE,TABLE,TRIGGER,TYPE的权限。
PL/SQL链接别的电脑上的oracle需配置tnsnames.ora文件

条件查询和运算符

SQL(Structured Query Language), 是一种结构化的查询语言简称。
主要是对数据库中数据进行分析、统计、处理、存储等操作。
SQL语句不区分大小写!但是在查某个值的时候,值要区分大小写!

/*
– 1.查询结构
SELECT *|列名|表达式 – * 表示表的所有列名称;多个列或者多个表达式用逗号分隔
FROM 表名|结果集 – 查看的对象为表或者结果集
WHERE 条件 – 多个条件用and/or/not 连接
GROUP BY 列名 – 多个列用逗号分隔
HAVING 条件 – 多个条件用and/or/not 连接
ORDER BY 列名 [ASC/DESC] – ASC 升序(默认),DESC 降序

*/

– 1.查询结构(不涉及分组计算)
SELECT *|列名|表达式 – * 表示表的所有列名称;多个列或者多个表达式用逗号分隔
FROM 表名|结果集 – 查看的对象为表或者结果集
WHERE 条件 – 多个条件用and/or/not 连接
ORDER BY 列名 [ASC/DESC] – ASC 升序(默认),DESC 降序

【注意】:SELECT 和 FROM 是必须要有的, 其它关键字看题目需求使用!

-- 查看所有列
SELECT * 
  FROM student_info;
-- 查看学号和姓名
SELECT sno,sname
  FROM student_info;
-- 查看学号为6的学生信息
SELECT *
  FROM student_info
 WHERE sno=6;
-- 查看学号为6且专业为统计学
SELECT *
  FROM student_info
 WHERE sno=6 AND major='统计学';
-- 查看在2014年之后毕业的学生信息,按照毕业时间从前往后排序
SELECT *
  FROM student_info
 WHERE graduated_year>2014
 ORDER BY graduated_year;
-- 查看在2014年之后毕业的学生信息,按照毕业时间从前往后排序,毕业时间相同的按照性别降序排
SELECT *
  FROM student_info
 WHERE graduated_year>2014
 ORDER BY graduated_year ASC, sex DESC;  -- 默认排序为asc升序
 


练习:查询在2014年后毕业的,专业不为统计学的学生学号、姓名和专业,并按照毕业年份升序排列,年份一样的按照性别降序排列。

– 2.表和字段的别名
【用途】多表查询时候简化表名长度,字段给别名便于理解查询含义
– 字段给别名可以加AS 也可以不加AS, 表给别名不能加AS
SELECT sno AS 学号,sname AS 姓名 FROM STUDENT_INFO e; – 学号为sno别名,姓名为sname别名,s 为表STUDENT_INFO的别名
– 当select中含有*, 以及其它字段或表达是, 一定要用表名.* 或者表别名.*
SELECT e., sysdate AS 当前时间 FROM STUDENT_INFO e; – sysdate为系统日期函数, 看做一个表达式, 可以直接在select 中用
SELECT STUDENT_INFO.
, sysdate AS 当前时间 FROM STUDENT_INFO;

– 3.虚拟表
SELECT 10/2 FROM DUAL;
SELECT 1 AS 数字1, ‘1’ AS 字符1 FROM DUAL;

– 4.操作符(熟悉emp 和 dept表)
算术运算,关系运算,和逻辑运算


SELECT sno,
2+3,
6-4,
3*6,
5/2
FROM student_info;

关系运算:> >= = < <= <> !=
SELECT *
FROM student_info
WHERE sno>=3 AND sno<=6;

逻辑运算: NOT>AND>OR
SELECT (CASE WHEN 1=1 OR 1=3 AND 1=2 THEN 1
ELSE 2
END) AS FLAG
FROM DUAL;

– 5.NULL操作(’’,NULL)
在查询条件中NULL值用IS NULL作条件,非NULL值用 IS NOT NULL做条件
空值的一些特性:
1、空值跟任何值进行算术运算,得到的结果都为空值
2、空值跟任何值进行关系运算,得到的结果都为不成立
3、空值不参与任何聚合运算
4、排序的时候,空值永远是最大的
– 查询奖金为空
SELECT * FROM EMP WHERE COMM IS NULL;
– 1
SELECT e.*, COMM+100, SAL + COMM FROM EMP e;
– 2
SELECT * FROM EMP WHERE COMM<>0;
– 3
SELECT COUNT(COMM) FROM EMP;
– 4
SELECT * FROM EMP ORDER BY COMM ASC;

– 6.IN 操作
查询出工作职责是’SALESMAN’或者’PRESIDENT’或者’ANALYST’的员工信息。
SELECT ename,job FROM emp WHERE job = ‘SALESMAN’ OR job = ‘PRESIDENT’ OR job = ‘ANALYST’;
SELECT ename,job FROM emp WHERE job IN (‘SALESMAN’,‘PRESIDENT’,‘ANALYST’);

– 7.BETWEEN…AND…(包含边界从小到大顺序)
查询列值包含在指定区间内的行,包含边界。
查询工资大于等于1500且小于等于2000的员工信息。
SELECT *
FROM emp
WHERE sal >=1500 AND sal <=2000;

SELECT *
  FROM emp
 WHERE sal BETWEEN 1500 AND 2000;
 
查询工资在1500到2000之间的员工信息
SELECT *
  FROM emp
 WHERE sal >1500 AND sal <2000;
 
-- 查询不到值
SELECT *
  FROM emp
 WHERE sal BETWEEN 2000 AND 1500;

– 8.LIKE模糊查询(对字符串)
字符匹配操作可以使用通配符’%‘和’_’:
%:代表零个或多个字符。
:代表任意一个字符。
SELECT * FROM student_info WHERE sname LIKE ‘张%’;
SELECT * FROM student_info WHERE sname LIKE '张晓
’;

练习:查询员工名称第二个字母为A, 最后一个字母为S的员工的姓名、工资。

合函数和分组查询

– 1.查询结构(包含分组计算)
SELECT – 5
FROM – 1
WHERE – 2
GROUP BY – 3 字段或表达式(多个字段或表达式用逗号隔开)
HAVING – 4 一般为聚合函数表达式, 前面要有GROUP BY,多个表达式用OR或者AND隔开
ORDER BY – 6

– 2.聚合函数
聚合函数:聚合函数同时可以对多行数据进行操作,并返回一个结果。
聚合函数与group by 使用(字段需要分组,聚合函数必须要跟group by 联用)
注意:SELECT 中除了聚合函数包裹的内容,其它字段必须包含于group by 后面的字段,SELECT 只是选取聚合后的字段和值

AVG	     平均值
SUM	     求和
MIN、MAX 最小值、最大值
COUNT	 统计个数

-- 计算员工表的总体平均工资、总工资、总人数、工龄最大和最小的入职日期
SELECT AVG(sal) AS 平均工资,
	   SUM(sal) AS 总工资,
	   COUNT(empno) AS 总人数,
	   MIN(hiredate) AS 最早入职日期,
	   MAX(hiredate) AS 最晚入职日期
  FROM emp;
  
  
-- 计算各个部门员工的平均工资、总工资、总人数、工龄最大和最小的入职日期
     SELECT deptno AS 部门员,
     AVG(sal) AS 平均工资,
     SUM(sal) AS 总工资,
     COUNT(DISTINCT empno) AS 总人数,
     MIN(hiredate) AS 工龄最大入职日期,
     MAX(hiredate) AS 工龄最小入职日期
     FROM emp
     GROUP BY deptno;



-- 聚合函数运算问题(count对列时,有空值的列不会计数)  
SELECT COUNT(*),    --15
	   COUNT(1),    --15
	   COUNT(1000), --15
	   COUNT(COMM)  --4
  FROM EMP;
  


-- 例题:
-- 统计班级男女人数
SELECT SEX,COUNT(sno) FROM STUDENT_INFO GROUP BY SEX;                              
-- 统计班级在2014年后毕业的男女人数
SELECT SEX,COUNT(sno) FROM STUDENT_INFO WHERE GRADUATED_Y>2014 GROUP BY SEX;       
-- 统计班级在2014年后毕业的男女人数,只显示人数大于2的情况
SELECT sex AS 性别,
	   COUNT(sno) AS 人数   -- select中非聚合的字段必须包含于group by 的字段中
  FROM student_info
 WHERE graduated_year>2014
 GROUP BY sex
HAVING COUNT(sno)>2        -- 不能用  人数>2
 ORDER BY sex DESC;        -- 可以用  性别 DESC
 
-- 以下错误
SELECT sex AS 性别,
       graduated_year AS 毕业年月,       -- group by 的字段中没有graduated_year, 并且graduated_year 没有被聚合函数运算
	   COUNT(sno) AS 人数                -- group by 的字段中没有sno, 但是sno 被聚合函数运算(语句可行)
  FROM student_info
 WHERE graduated_year>2014
 GROUP BY sex
HAVING COUNT(sno)>2        -- 不能用  人数>2
 ORDER BY sex DESC;        -- 可以用  性别 DESC
 
 
  
/*
-- 数字为执行顺序
    SELECT       -- 5
FROM         -- 1
WHERE        -- 2
GROUP BY     -- 3                                   
HAVING       -- 4                  
ORDER BY     -- 6
*/

练习:1.按部门和工作分组,求平均工资
2.查询EMP表中员工人数大于3的所在部门的部门编号及对应的人数
3.查询EMP表中各部门工资大于2000的员工人数,并且按人数从高到低排列
4.查询EMP表中排除10号部门,员工人数大于2的所在部门的部门编号,及对应的人数
5.工资在1500到2850之间,除了10号部门的各部门员工平均工资和总人数
6.查找部门员工最高工资在1500到2850之间,除了10号部门的各部门平均工资和人数

子查询和集合运算

– 1.子查询
子查询在SELECT、UPDATE、DELETE语句内部可以出现SELECT语句。
1.单行子查询:不向外部返回结果,或者只返回一行结果。
2.多行子查询:向外部返回零行、一行或者多行结果。
– 单行查询和多行查询
SELECT * FROM EMP WHERE EMPNO=7369; – 单行
SELECT * FROM EMP WHERE DEPTNO=10; – 多行

-- 单行子查询
SELECT * FROM EMP WHERE SAL = (SELECT SAL FROM EMP WHERE EMPNO=7369);     -- 单行结果"=",并且字段要对应
-- 多行子查询
SELECT * FROM EMP WHERE SAL IN (SELECT SAL FROM EMP WHERE DEPTNO=10) AND DEPTNO <> 10;   -- 单行结果"IN",并且字段要对应

-- 查询EMP表中每个部门的最低工资的员工信息(尝试练习)
SELECT * FROM EMP WHERE (deptno,sal) IN (SELECT deptno, MIN(sal) AS min_sal FROM EMP GROUP BY deptno);  -- 可以多列对应
  

练习:查询出dept表中销售部(SALES)下面的员工姓名、工作、工资。(子查询)

– 2.集合运算(a={1,2,3} , b={2,3,4})
交集:INTERSECT – 两者共有部分
并集(去重): UNION
并集(不去重):UNION ALL
补集:MINUS – 前者有后者无
当使用集合操作的时候,要注意:
1.查询所返回的列数以及列的类型必须匹配,列名可以不同。
2.只有UNION ALL不会去重。其他三个都需要排序后去重,性能比较差

例题:
1.求员工表和部门表中的共有的部门编号
SELECT DEPTNO
  FROM EMP
INTERSECT
SELECT DEPTNO
  FROM DEPT;
  
2.求员工表或者部门表中所包含的部门编号(不去重)
SELECT DEPTNO
  FROM EMP
 UNION ALL 
SELECT DEPTNO
  FROM DEPT;

3.求员工表或者部门表中所包含的部门编号(去重)
SELECT DEPTNO
  FROM EMP
 UNION
SELECT DEPTNO
  FROM DEPT;

4.求部门表中不在员工表中的部门编号
SELECT DEPTNO
  FROM DEPT
 MINUS
SELECT DEPTNO
  FROM EMP;
-- 
SELECT deptno 
  FROM EMP
MINUS
SELECT deptno
  FROM DEPT;

– 3.去重(DISTINCT, GROUP BY, UNION, ROWID)

客户编号 身份证号

id(唯一) 有重复值

只保留身份证号最大的一条记录,其他记录删除

1 330823198901222111
1 330823198901222112
1 330823198901222113 1 330823198901222113
2 330823198901222113
2 330823198901222114
2 330823198901222115 2 330823198901222115

delete from 表 where 身份证号 not in (select max(身份证号) from 表 group by id )

1 330823198901222111
1 330823198901222112
1 330823198901222113 1 330823198901222113 AAATi0AAEAAAL3wAAA
1 330823198901222113 1 330823198901222113 AAATi0AAEAAAL3wAAB 1 330823198901222113 AAATi0AAEAAAL3wAAB
2 330823198901222113
2 330823198901222114
2 330823198901222115 2 330823198901222115 AAATi0AAEAAAL3wAAC
2 330823198901222115 2 330823198901222115 AAATi0AAEAAAL3wAAD 2 330823198901222115 AAATi0AAEAAAL3wAAD

delete from 表 where 身份证号 not in (select max(身份证号) from 表 group by id )

delete from 表 where rowid not in (select max(rowid) from 表 group by 身份证号)

1 330823198901222111
2 330823198901222112
3 330823198901222113 AAATi0AAEAAAL3wAAA
4 330823198901222113 AAATi0AAEAAAL3wAAB
5 330823198901222113 AAATi0AAEAAAL3wAAC
6 330823198901222114
7 330823198901222115 AAATi0AAEAAAL3wAAA
8 330823198901222115 AAATi0AAEAAAL3wAAB

delete from 表 where rowid not in (select MIN(rowid) from 表 group by 身份证号)

delete from 表 where 身份证号 not in (select max(身份证号) from 表 group by id )

delete from 表 where rowid not in (select max(rowid) from 表 group by 身份证号)

-- 查看部门编号(去重)
SELECT DISTINCT DEPTNO,job, FROM EMP;
SELECT deptno FROM emp GROUP BY deptno;
-- DISTINCT 只能出现在最前,不能一个字段去重一个字段不去重
-- 错误1
SELECT JOB,
	   DISTINCT DEPTNO
  FROM EMP;
-- 错误2
SELECT DISTINCT JOB,
	   DISTINCT DEPTNO
  FROM EMP;

数据发散:多表关联容易造成数据重复或者冗余,
1、列出必要的字段
2、distinct,group by 对子结果集去重后再关联
3、注意表之间的查询条件关联

-- 三种等价去重
-- 性能最好
SELECT deptno,job
  FROM emp
 GROUP BY deptno,job;
-- 性能其次
SELECT DISTINCT deptno,job
  FROM emp;
-- 性能很差
SELECT deptno,job
  FROM emp
UNION
SELECT deptno,job
  FROM emp;

多表查询

– 连接查询(重点)
包括内联接(inner join 1种)和外联接(outer join 3种)
(1)内连接(inner join):inner可省略
内连接写法1(标准写法)
SELECT
FROM 表名1
JOIN 表名2
ON 表名1.字段1=表名2.字段1 – 等值连接
AND 表名1.字段2>=表名2.字段2 – 不等连接
OR …;

	内连接写法2(非标准写法)
	SELECT
	  FROM 表名1,表名2
	 WHERE 表名1.字段1=表名2.字段1      -- 等值连接
	   AND 表名1.字段2>=表名2.字段2     -- 不等连接
		OR ...;
	   
	   
	   
	-- 查询员工信息及其部门信息
	SELECT *                     -- E.*,D.*  / DEPTNO -- 指向对象才行
	  FROM DEPT E 
	  JOIN EMP D                 -- 两张表调换顺序无关
		ON E.DEPTNO = D.DEPTNO;  -- 顺序无关 D.DEPTNO=E.DEPTNO
	-- oracle
	SELECT *
	  FROM EMP E, DEPT D
	 WHERE E.DEPTNO=D.DEPTNO;


	练习: 1.查询部门名称为'SALES'的员工编号、姓名、部门编号及其部门信息
		  2.查看7369员工的员工名称和部门名称
		
		
  
(2)左外连接(left outer join): outer可省略
	 left join 跟表的前后顺序有关
	 左外连接写法1(标准写法)
	 SELECT
	   FROM 表名1                     -- 主表    
	   LEFT JOIN 表名2                -- 从表
		 ON 表名1.字段1=表名2.字段1   -- 等值连接
	    AND 表名1.字段2>=表名2.字段2  -- 不等连接
		 OR ...;
		


	 左外连接写法2(非标准写法)
	 SELECT
	   FROM 表名1,表名2
	  WHERE 表名1.字段=表名2.字段(+);
	  
	  
	-- 查询部门名称为'SALES'部门的信息及其对应的员工信息
	SELECT *
	  FROM DEPT D             -- 主表信息全部展示(关联不上的也要展示)
	  LEFT JOIN EMP E         -- 从表只显示关联得上的信息
		ON D.DEPTNO=E.DEPTNO;
	 WHERE D.DNAME='SALES';   -- WHERE 是对关联后的结果集的过滤
	注意:	
	SELECT *
	  FROM DEPT D             -- 主表信息全部展示(关联不上的也要展示)
	  LEFT JOIN EMP E         -- 从表只显示关联得上的信息
		ON D.DEPTNO=E.DEPTNO
	   AND D.DNAME='SALES';   -- and 是限定关联的条件,不会过滤主表数据
	-- oracle	
	SELECT *
	  FROM DEPT D, EMP E
	 WHERE D.DEPTNO=E.DEPTNO(+)
	   AND D.DNAME='SALES'; 
	  
		
(3)右外连接(right outer join): outer可省略
(4)全外连接(full outer join): outer可省略
	-- FULL JOIN
	SELECT E.*,D.*
	  FROM EMP E
	  FULL JOIN DEPT D
		ON E.DEPTNO=D.DEPTNO;

	-- 错的
	SELECT E.*,D.*
	  FROM EMP E, DEPT D
	 WHERE E.DEPTNO(+)=D.DEPTNO(+); 
	 
练习:1.查询各部门名称及其对应的人数
	  2.查询各部门名称及对应的经理名称
	  3.查询EMP表中每个部门的最低工资的员工信息
	  4.查询员工名称及其直接上级的名称

表的连接方式有哪几种

数据类型;表的DDL和DML操作

DDL(数据定义语言):CREATE/ALTER/DROP /TRUNCATE + 对象类型 + 对象名称
DML(数据操作语言):INSERT INTO/UPDATE/DELETE + 表名

数据库建模:建表
电商行业:
业务建模–>领域建模—>逻辑建模–>物理建模

1.业务建模:熟悉业务相关模块,理清业务主线

商品基本信息(商品基本信息维护)/采购模块(采购下单,营运部收货)/销售模块(收银,库存)/财务模块(结算,收款,对账)

2.领域建模:理清每个模块的流程

商品基本信息维护:录入供应商信息,录入商品基本信息,

采购模块(采购下单,营运部收货):选供应商–>选商品信息—>确认商品定价—>确认商品订货数量–>采购下单–>发送订单给供应商
—>供应商送货到门店或仓库—>收货部确认收货–>生成收货验收单—>生成结算信息

3.逻辑建模:列出每个模块的实体内容
商品信息:商品编号、商品名称
供应商信息:供应商编号、供应商名称
订单信息:

4.物理建模:建表

商品信息表:
CREATE TABLE ITEM
(
ITEM_NO NUMBER(8), --商品编号
ITEM_NAME VARCHAR2(50), --商品名称
SUP_NO NUMBER(5) --供应商
SELL_PRICE NUMBER(12,2) --售价
ENTER_PRICE NUMBER(12,2) --进价
ITEM_SEC_CAT NUMBER(5) --商品子类
ITEM_QTY NUMBER(12,2) --商品数量
ITEM_WEIGHT NUMBER(12,2) —重量
CREATE_DATE DATE,
CREATE_USER VARCHAR2(10),
UPDATE_DATE DATE,
UPDATE_USER VARCHAR2(10)
)

CREATE TABLE SUPPLIER
(
SUP_NO NUMBER(5), --供应商编号
SUP_NAME VARCHAR2(50), --供应商名称
SUP_CONTACT VARCHAR2(10), --联系人
MOBILE_PHONE VARCHAR2(11), --移动电话
OFFICE_PHONE VARCHAR2(15), --办公室电话
FAX_PHONE VARCHAR2(15), – 传真
ADDRESS VARCHAR2(200),

CREATE_DATE DATE,
CREATE_USER VARCHAR2(10),
UPDATE_DATE DATE,
UPDATE_USER VARCHAR2(10)

)

CREATE TABLE ORDER_HEAD
()
CREATE TABLE ORDER_DETAIL
()
CREATE TABLE CATEGORY
()

/--------------DDL---------------------/

– 1.CREATE 创建表
(1)直接创建表
CREATE TABLE 表名
(列名1 数据类型 [,
列名2 数据类型]…
);
– 加注释
COMMENT ON TABLE 表名 IS ‘表注释名’ ;
COMMENT ON COLUMN 表名.列名1 IS ‘字段注释名’;

-- 创建表	 
CREATE TABLE t_stu_info
(sno   NUMBER(10),
 sname VARCHAR2(20),
 cdate DATE
 );
-- 加注释
COMMENT ON  TABLE t_stu_info  IS '学生信息表' ;                  
COMMENT ON COLUMN t_stu_info.sno IS '学号';
COMMENT ON COLUMN t_stu_info.sname IS '姓名';
COMMENT ON COLUMN t_stu_info.cdate IS '创建日期';

问答:列举出oracle,sql server,mysql的常用数据类型:
clob 大文本
blob 二进制,主要保存图片信息

-- 数据类型
1.数字型   NUMBER        -- 默认最大为38位长度整数
		   NUMBER(10)    -- 最大长度为10的整数
		   NUMBER(8,2)   -- 整数最大长度为6位,小数长度为2位
2.字符型   CHAR          -- 默认1位长度的字符
		   CHAR(10)      -- 最大长度为10的字符,输入值不满10位,后面补空格
		   VARCHAR2(10)  -- 最大长度为10的字符,输入值不满10位,后面不会填充
3.日期型   DATE          -- 后面不要加括号(可以到时分秒)
		   TIMESTAMP


       oracle            sql server             MYSQL

1.数字型 NUMBER DECIMAL DECIMAL
NUMBER(10) DECIMAL(10) DECIMAL(10)
NUMBER(8,2) DECIMAL(8,2) DECIMAL(8,2)

2.字符型 CHAR CHAR CHAR
CHAR(10) CHAR(10) CHAR(10)
VARCHAR2(10) VARCHAR(10) VARCHAR(10)

3.日期型 DATE DATETIME DATETIME
DATE
TIMESTAMP TIMESTAMP TIMESTAMP

(2)根据结果集创建表
CREATE TABLE 表名 AS SELECT 语句;        

-- 间接创建
CREATE TABLE t_emp_cp AS SELECT * FROM EMP;            -- 拷贝表结构和数据(不带索引约束等)
CREATE TABLE t_emp_cp1 AS SELECT * FROM EMP WHERE 1=2; -- 拷贝表结构(不带索引约束等)

– 3.ALTER 更改表结构
– 【修改列数据类型】 ALTER TABLE 表名 MODIFY 列名 新的数据类型;
/*修改的列没有数据时,可以随便更改类型;修改的列有数据时,
– 【修改表名】 ALTER TABLE 表名 RENAME TO 新表名;
ALTER TABLE t_stu_info RENAME TO t_stu_info_cp;

– 4.DROP 删除表对象
– DROP TABLE 表名;
DROP TABLE t_stu_info_cp;

– 5.TRUNCATE(对象是表) 删除表数据
– TRUNCATE TABLE 表名; 不能跟where, 清空整张表数据, 不会将清除的数据写入日志
TRUNCATE TABLE t_stu_info;

/---------------DML--------------------/

– 1.INSERT INTO 插入数据到表中
/只能在同一种类型上增加长度/
ALTER TABLE t_stu_info MODIFY sno VARCHAR2(20);
– 【修改列名】 ALTER TABLE 表名 RENAME COLUMN 旧列名 TO 新列名;
ALTER TABLE t_stu_info RENAME COLUMN sno TO snumber;
– 【增加列】 ALTER TABLE 表名 ADD 列名 数据类型;
ALTER TABLE t_stu_info ADD sex CHAR(2);
– 【删除列】 ALTER TABLE 表名 DROP COLUMN 列名;
ALTER TABLE t_stu_info DROP COLUMN sex;
CREATE TABLE T_COURSE_WXP (
CNO NUMBER(10),
CNAME VARCHAR2(20),
CDATE DATE
);
*/
– INSERT INTO 表名(列名1,列名2,……) VALUES (值1,值2……)
INSERT INTO T_COURSE(CNO,CNAME,CDATE) VALUES (1,‘语文’,SYSDATE);
INSERT INTO T_COURSE VALUES (2,‘数学’,DATE’2019-08-19’);
INSERT INTO T_COURSE(CNO,CNAME) VALUES (3,‘英语’);
INSERT INTO T_COURSE SELECT 4,‘科学’, TO_DATE(‘2020-04-08’,‘YYYY-MM-DD’) FROM DUAL;

– 2.UPDATE 更新表数据
– UPDATE 表名 SET 列名1=值, 列名2=值,…… WHERE 条件
UPDATE T_COURSE SET CNAME=‘政治’, CDATE=SYSDATE WHERE CNO=3;

UPDATE EMP E SET JOB = (SELECT JOB FROM EMP_2 E2 WHERE E.EMPNO = E2.EMPNO)

UPDATE T1 

SET T1.FMONEY = (select T2.FMONEY from t2 where T2.FNAME = T1.FNAME)
WHERE EXISTS(SELECT 1 FROM T2 WHERE T2.FNAME = T1.FNAME);

MERGE INTO EMP E1
USING (SELECT EMPNO,JOB FROM EMP_2) E2
ON (E1.EMPNO = E2.EMPNO)
WHEN MATCHED THEN
UPDATE SET E1.JOB = E2.JOB

–更新记录
CREATE TABLE EMP_NEW as select * from emp
CREATE TABLE EMP_BAK as select * from emp

1、将EMP_NEW中多出来的记录更新到EMP_BAK
2、将EMP_NEW中与EMP_BAK相同的员工中更新过的记录信息同步到EMP_BAK

MERGE INTO EMP_BAK E1
USING (SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM EMP_NEW) E2
ON (E1.EMPNO = E2.EMPNO)
WHEN MATCHED THEN
UPDATE SET E1.JOB = E2.JOB,
– E1.EMPNO = E2.EMPNO, --主键不用更新
E1.ENAME = E2.ENAME,
E1.MGR = E2.MGR,
E1.HIREDATE = E2.HIREDATE,
E1.SAL = E2.SAL,
E1.COMM = E2.COMM,
E1.DEPTNO = E2.DEPTNO
WHEN NOT MATCHED THEN INSERT
(E1.EMPNO,E1.ENAME,E1.JOB,E1.MGR,E1.HIREDATE,E1.SAL,E1.COMM,E1.DEPTNO)
VALUES (E2.EMPNO,E2.ENAME,E2.JOB,E2.MGR,E2.HIREDATE,E2.SAL,E2.COMM,E2.DEPTNO)

– 3.DELETE 删除表数据
– DELETE FROM 表名 WHERE 条件; 删除的数据可以从日志中找回
DELETE FROM T_COURSE WHERE CNO=4;

--MERGE的灵活应用:
--若数据量大时,MERGE删除比DELETE好。

–删除10部门的员工信息
–第一种写法
DELETE FROM EMP WHERE DEPTNO =10 ;
–MERGE INTO 写法
MERGE INTO EMP E
USING (SELECT * FROM EMP WHERE DEPTNO = 10) S
ON (S.EMPNO = E.EMPNO)
WHEN MATCHED THEN
UPDATE SET E.COMM = E.COMM DELETE WHERE 1 = 1;

注意:DROP/DELETE/TRUNCATE的区别(语言类型不同/删除数据是否可跟条件/执行效率/是否可从日志恢复)
DROP 是DDL语句,用于删除一个对象;
DELETE 是DML语句,主要是针对表数据删除, 可以通过条件删除数据, 删除的数据可以从日志中找回,效率低;
TRUNCATE 是DDL语句,主要是针对表数据删除, 不能跟where 条件, 不会将清除的数据写入日志,效率高;

注意事项:
1、删除数据,更新数据之前,先备份表;
2、删除、更新之前,先查询记录,确认无误。

概念:
数据字典:系统数据字典一般以USER_开头
SELECT * FROM USER_TABLES WHERE TABLE_NAME =UPPER(‘t_emp_dept’)

-- 工作中用的比较多
INSERT INTO 表名 SELECT * FROM 结果集; 

练习:先创建一张表, 将emp表的员工编号、员工姓名和其所在的部门编号、部门名称插入到表中
/*
CREATE TABLE t_emp_dept(
empno number(20),
ename varchar2(20),
deptno number(10),
dname varchar2(20)
);

INSERT INTO T_EMP_DEPT
(EMPNO, ENAME, DEPTNO, DNAME)
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E
JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

SELECT * FROM T_EMP_DEPT;
*/

–复制表:
1.复制表及表数据,不复制主键,索引,约束
CREATE TABLE EMP1 AS SELECT * FROM EMP;
SELECT * FROM EMP1;

2.删除表中数据
DELETE FROM EMP1; --整表删除,会生成删除日志
DELETE FROM EMP1 WHERE EMPNO =7369; --可删除多条记录或者指定记录,会生成删除日志

SELECT * FROM EMP1 WHERE EMPNO =7369;
或者
TRUNCATE TABLE EMP1; --没有产生日志,整表删除

3.重新插入数据到复制表
方法1:
DROP TABLE EMP1;
CREATE TABLE EMP1 AS SELECT * FROM EMP;
方法2:
INSERT INTO EMP1 SELECT * FROM EMP;
INSERT INTO EMP1(字段1,字段2,…) SELECT 字段1,字段2,… FROM EMP; --列名不一致,指定列名

单行函数

Oracle常用单行函数有:
数字函数:对数字进行计算,返回一个数字。
日期函数:对日期和时间进行处理。
字符函数:对字符串操作。

– 1.数字函数
ABS(x) x绝对值 SELECT ABS(-2) FROM DUAL; – 2
MOD(x,y) x除以y的余数 SELECT MOD(7,3) FROM DUAL; – 1
POWER(x,y) x的y次幂 SELECT POWER(2,3) FROM DUAL; – 8
ROUND(x[,y]) x在第y位四舍五入(默认四舍五入到整数) SELECT ROUND(2.989),ROUND(2.989,2),ROUND(5.989,-1) FROM DUAL; – 3, 2.99, 10
TRUNC(x[,y]) x在第y位截断(默认截断到整数) SELECT TRUNC(2.989),TRUNC(2.989,2),TRUNC(5.989,-1) FROM DUAL; – 2, 2.98, 0
CEIL(x) 向上取整 SELECT CEIL(2.13), CEIL(2.00),CEIL(-2.13) FROM DUAL; – 3, 2, -2
FLOOR(x) 向下取整 SELECT FLOOR(2.89),FLOOR(3.00),FLOOR(-2.89) FROM DUAL; – 2, 3,-3

-- TRUNC配合日期使用
TRUNC(d[,fmt])和ROUND(d[,fmt])对日期处理:
TRUNC(d[,fmt]):
fmt: 'DD'       截取到当月的当天 
fmt: 'DDD'      截取到当月的当天(默认格式)
fmt: 'D'        截取到当周的第一天 
fmt: 'MM'       截取到当月的第一天 
fmt: 'Q'        截取到当季度的第一天
fmt: 'Y'        截取到当年的第一天
SELECT SYSDATE,
	 TRUNC(SYSDATE),
	 TRUNC(SYSDATE,'DD'),
	 TRUNC(SYSDATE,'DDD'),
	 TRUNC(SYSDATE,'D'),    -- 周日为本周第一天
	 TRUNC(SYSDATE,'MM'),   -- 可以写成'MONTH'
	 TRUNC(SYSDATE,'Q'),    
	 TRUNC(SYSDATE,'Y')     -- 可以写成'YEAR'
FROM DUAL;

– 2.日期函数
ADD_MONTHS(d,n),在某一个日期d上,加上指定的月数n,返回计算后的新日期。d表示日期,n表示要加的月数(n可以为负值)
SELECT ADD_MONTHS(SYSDATE, 1),
ADD_MONTHS(DATE’2019-08-30’, -6),
ADD_MONTHS(DATE’2020-08-30’, -6)
FROM DUAL;

LAST_DAY(d),返回指定日期当月的最后一天
SELECT LAST_DAY(SYSDATE),LAST_DAY(DATE'2019-08-30') FROM DUAL;

MONTHS_BETWEEN (date1, date2),用于计算date1和date2之间有几个月
SELECT MONTHS_BETWEEN(TO_DATE('2014-3-21', 'yyyy-mm-dd'), TO_DATE('2014-1-10', 'yyyy-mm-dd')) mon_diff FROM DUAL;


NEXT_DAY 取下一个日子
SELECT NEXT_DAY(SYSDATE,2) FROM DUAL ---取下一个2号的日期

注意:日期可以加减数字,表示加减多少天;日期减去日期表示相隔多少天;日期不能相加减
SELECT DATE'2019-08-30'+6,
       DATE'2019-08-30'-6,
	   DATE'2019-08-30'-DATE'2019-08-16'
  FROM DUAL;

练习:2019年7月22日的情况
1.当年的第一天和最后一天
SELECT TRUNC(DATE’2019-7-22’,‘Y’),ROUND(DATE’2019-7-22’,‘Y’)-1 FROM DUAL;
2.本月的第一天和最后一天
SELECT TRUNC(DATE’2019-7-22’,‘MM’),LAST_DAY(DATE’2019-7-22’)FROM DUAL;
3.本季的第一天和最后一天
SELECT TRUNC(DATE’2019-07-22’,‘Q’),ADD_MONTHS(TRUNC(DATE’2019-07-22’,‘Q’),3) -1 FROM DUAL;
4.当天为当年的第几天
SELECT DATE’2019-07-22’ - TRUNC(DATE’2019-07-22’,‘Y’) FROM DUAL;
5.本周的第一天和最后一天
SELECT TRUNC(DATE’2019-7-22’,‘D’) +1,ROUND(DATE’2019-7-22’,‘D’) +7 FROM DUAL;
6.当年一共有多少天
TRUNC(DATE’2019-07-22’,‘Y’) -1,
(ROUND(DATE’2019-07-22’,‘Y’) -1) - (TRUNC(DATE’2019-07-22’,‘Y’) -1)
FROM DUAL

– 3.字符函数
ASCII(x) 返回字符x的ASCII码。
CONCAT(x,y) 连接字符串x和y。(|| 也可以连接字符串)
LENGTH(x) 返回x的长度。
LENGTHB(x) 返回x的字节长度
LOWER(x) x转换为小写。
UPPER(x) x转换为大写。
REPLACE(x,old,new) 替换字符 – 在x中查找old,并替换为new。
TRANSLATE(x,from_string,to_string) 替换字符 – from_string 和 to_string 以字符为单位

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值