-- 查询表的所有数据 select * from 表名;
SELECT * FROM emp;--查询表中指定字段的值 select 字段名1,字段名2 from 表名
SELECT empno,ename FROM emp;--给查询结果中的字段使用别名,最规范的是 as "别名",别名中没有特殊字符双引号可以不写
SELECT empno 员工编号,ename "员工姓名",job AS 工作,mgr AS "领导编号" FROM emp;--连接符 ||'' 字段名||'字符1'||字段名
注意: 一个拼接好的链接在结果集中是作为一个新的字段显示,可以使用别名优化
SELECT empno||'的姓名是'||ename AS ename,job FROM emp;-- 去重,使用distinct select distinct 字段名,字段名 from 表名
注意: 去除重复的规则是按照行进行去重的。多行数据完全相同取其一
多字段去重是去掉多字段完全一样的数据
SELECT DISTINCT job,mgr FROM emp;
SELECT JOB,MGR FROM EMP;-- 排序 单字段
--desc 降序排序,asc 升序排序,默认升序
-- 多字段排序(先按照第一个字段排序,第一个字段相同的情况下再按照第二个字段排序)
SELECT * FROM emp ORDER BY empno ASC;
SELECT * FROM emp ORDER BY empno,ename;-- 字段的逻辑运算
注意:字段必须是数值类型
SELECT empno,ename,job,sal*2+1000,sal+comm FROM emp;
1.2.2 使用where 子句筛选查询
-- 查询所有的员工的工资信息
SELECT empno,ename,sal+comm AS 薪资 FROM emp;-- 查询SMITH的个人信息
SELECT * FROM emp WHERE ename='SMITH';-- 查询SMITH的工资信息
SELECT empno,ename,sal+comm AS 薪资 FROM emp WHERE ename='SMITH';-- 查询工资大于1000的员工信息
SELECT * FROM emp WHERE sal>1000;-- 查询工资不等于3000的员工信息
SELECT * FROM emp WHERE sal<>3000 ORDER BY sal;-- 查询入职日期在81年之后的员工信息
oracle 默认的日期格式为日月年
SELECT * FROM emp WHERE hiredate>='01-1月-1981' ORDER BY hiredate;
SELECT * FROM emp WHERE hiredate>=to_date('1981/01/01','yyyy/MM/dd') ORDER BY hiredate;-- 多条件筛选(where子句)-- 查询工资在2000-3000之间的工资
SELECT * FROM emp WHERE sal>=2000 AND sal<3000;
使用 BETWEEN AND 进行两头筛选
SELECT * FROM emp WHERE sal BETWEEN 2000 AND 3000;-- 查询工作为salesman,anlyst,manager的员工信息
-- or关键字,进行条件的删选
-- in 关键字
SELECT * FROM emp WHERE job='SALESMAN' OR JOB='ANALYST' OR JOB='MANAGER' ORDER BY JOB
SELECT * FROM emp WHERE job in('SALESMAN','ANALYST','MANAGER') ORDER BY JOB
-- 查询姓名中包含s的,以s开头的 ,以s 结尾的,第二个字符为A的
-- 包含s的
SELECT * FROM emp WHERE ename LIKE '%S%';-- 以s 开头的
SELECT * FROM emp WHERE ename LIKE 'S%';-- 以s 结尾的
SELECT * FROM emp WHERE ename LIKE '%S';-- 第二个字符为A的(_是任意一个字符的意思,%是任意多个字符的意思)
SELECT * FROM emp WHERE ename LIKE '_A%';-- 名字中带有_的(使用转义字符 ecsape,escape 可以把普通字符转换为转移字符,转移字符可以把特使字符变为普通字符 )
SELECT * FROM emp WHERE ename LIKE '%/_%' ESCAPE '/';-- 查询有津贴的员工信息
-- and 关键字,筛选的是符合所有条件的数据
SELECT * FROM emp WHERE comm IS NOT NULL AND comm>0;
2 第二天oracle数据库学习
2.1 ORACLE 函数学习(单行函数,多行函数,转换函数,其他函数)
2.1.1 单行函数(字符函数,日期函数 )
-- 字符函数(lower,upper,initcap,ltrim,rtrim,translate,replace,insetr,substr,concat)
-- 查询所有员工信息,员工姓名小写显示。
SELECT LOWER(ename) AS ename,e.* FROM emp e
-- 查询所有员工信息,员工姓名首字母大写显示。
SELECT INITCAP(ename) AS 首字母大写的名字 FROM emp;
SELECT Lower('Adadsfdas') AS 小写,UPPER('adwerwr') AS 大写,LTRIM('xyszddd','xy') AS 左截取,RTRIM('adsdsdadd','add') AS 右截取,translate('jack','abcd','1234') AS 翻译,REPLACE('jack and jue','j','bl') 替换,Instr('worldwide','d') 所在位置,CONCAT('Hello','World') FROM dual;--数值函数
SELECT ABS(-15) AS 绝对值,CEIL(44.778) AS 向上取整,SIN(1.571),COS(0),FLOOR(100.2) AS 向下取整,POWER(4,2) AS 幂次,MOD(10,3) AS 取余,ROUND(100.256,2) AS 四舍五入,Trunc(100.256,2) AS 阶段,SQRT(4) AS 平方 FROM dual;-- 日期函数
SELECT months_between('04-11月-05','11-1月-01') AS 月份区间,add_months('06-1月-2019','13') AS 几个月后,next_day('01-1月-2020','星期四') AS 最近的下个星期,last_day ('16-4月-2020') AS 当月最后一天,ROUND(to_date('01-6月-03'),'YEAR') AS 按月,ROUND(to_date('01-6月-03'),'MONTH') AS 按日,ROUND(to_date('01-6月-03'),'DAY') AS 按星期,trunc(to_date('06-2月-03'),'YEAR') AS 截取年,trunc(to_date('06-2月-03'),'MONTH') AS 截取月,trunc(to_date('06-2月-03'),'DAY') AS 截取日 FROM dual;
2.1.2 多行函数(max,min,avg,sum,count)
多行函数不能和字段混合使用,除非分组,多行函数不能和单行函数混合使用,除非分组
-- 对查询的数据进行统计
-- 查询员工的最高工资
SELECT MAX(sal) FROM emp;
SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);-- 查询员工的最低工资
SELECT * FROM emp WHERE sal=(SELECT min(sal) FROM emp);-- 查询员工的平均工资
SELECT AVG(sal) FROM emp;-- 查看员工的所有工资之和
SELECT SUM(sal) FROM emp
-- 查询公司的员工数量
SELECT COUNT(*) FROM emp
-- 查询有津贴的员工人数(值为null count不会计数)
SELECT COUNT(comm) FROM emp;-- 查询公司有多少工作种类
SELECT COUNT(DISTINCT job) FROM emp;
2.1.3 转换函数(to_number,to_char,to_date)
-- 字符转化为数字char-------->number
SELECT to_number('123')+2 FROM dual;-- 数字转字符number--->char-- 指定显示格式
--9表示位置占位,例如999,999,999 会将数字按照三个一组使用都好隔开
-- L表示人名币符号,$表示美元符号
-- 其中0也可进行占位分组,但是如果真实数据位数不足,会使用0进行补位
SELECT to_char(123456789,'$999,999,999') FROM dual;
SELECT to_char(123456789,'L999,999,999') FROM dual;-- 查询工作大于2000的员工信息
-- 数值和字符之间的转换是可以隐式的
SELECT * FROM emp WHERE sal>to_number('2000');-- 日期和字符的互转】
-- 字符转换为日期
CHAR------>date
TO——date('','日期格式')1 字符必须符合日期格式
2 oracle 默认的转换格式为日月年
3 常用日期格式yyyy/mm/dd yyyy-mm-dd
-- 查询员工入职日期在82年后的信息
SELECT * FROM emp WHERE hiredate>to_date('1982-01-01','yyyy/mm/dd');-- 日期转换为字符
一般是新增数据使用to_data,查询数据使用to_char
-- 使用to_char('要转换的日期')1 如果不指定转换格式,则使用默认格式日月年
SELECT TO_char(hiredate) FROM emp;-- 使用默认格式将日期转换为字符
SELECT TO_char(hiredate,'yyyy/mm/dd') FROM emp;
2.1.4 其他函数(NVL NVL2,DECODE)
NVL():NVL(字段名,值)--- 如果字段名不为null,则返回字段名的值,否则返回值的值
NVL2():NVL2(字段名,处理一,处理二)
如果字段名不为null,则返回处理一的值,否则返回处理二的值
DECODE()DECODE(字段名,值1,处理1,值2,处理2,值3,处理3,公共处理)
如果字段名的值和条件值相同,则执行对象的处理,如果没有则执行公共处理
-- 查询员工的工资信息
SELECT ename,job,sal FROM emp
-- 查询员工的薪水信息
SELECT ename,job,sal+NVL(comm,0) FROM emp;
SELECT ename,job,NVL2(comm,sal+comm,sal) FROM emp;-- 显示员工的职称
SELECT ename,job,DECODE(job,'MANAGER','经理','PRESIDENT','董事长','SALESMAN','普通员工','其他员工') FROM emp;
2.2 分组查询学习
GROUP BY 分组字段名
注意:使用分组后,在select 语句只允许出现分组字段和多行函数
如果是多字段分组,则先按照第一字段分组,然后每个小组继续按照第二字段继续分组
在where子句中不允许出现多行
分组筛选使用having,HAVING 中可以使用多行函数
HAVING 针对分组进行分组后的筛选,允许使用多行函数
HAVING 必须和分组一起使用,不允许单独使用
WHERE 和having 的比较:
WHERE 子句不允许出现多行函数,having可以
WHERE 子句和having 子句都可以通过字段直接筛选,但是where的执行效率更高
WHERE 执行顺序 from,WHERE,GROUP BY,SELECT,order by
HAVING 书信 FROM,GROUP by,SELECT,HAVING,ORDER BY
结论: 在分组语句中,使用where 进行字段级别的筛选,使用having 进行多行函数的筛选
查询不同部门的最高工资
SELECT * FROM emp ORDER BY deptno,sal;
SELECT deptno,MAX(sal),COUNT(*) FROM emp GROUP BY deptno;
查询不同岗位的员工数
SELECT job,COUNT(*) FROM emp GROUP BY job;
查询不同部门的不同工作岗位数
SELECT deptno,job,COUNT(*) FROM emp GROUP BY deptno,job;
查询不同部门的不同岗位的且人数大于1的信息
SELECT deptno,job, FROM emp GROUP BY deptno,job HAVING COUNT(*)>1;
查询部门号大于10的不同部门的不同工作的不同岗位的人数
SELECT deptno,job,COUNT(*) FROM emp GROUP BY deptno,job HAVING deptno>10 ORDER BY deptno;
查询不同部门的不同工作岗位的人数
SELECT deptno,job,COUNT(*) FROM emp GROUP BY deptno,job HAVING COUNT(*)>1 ORDER BY deptno;
2.3 数据库的增删改
注意:增加,删除,修改的数据不会立马进入数据库的写入,还需手动对数据进行提交,如果数据有问题可以回滚
--增加数据
INSERT INTO 表名(字段名1,字段名2,,)VALUES(值1,值2,值3,值4);
注意: 主键必须有值,允许字段为空的字段可以不给值
插入的值和字段必须一一对应
如果是全字段插入,则可以省略字段名
INSERT INTO dept VALUES('','','',);-- 在部门表中新增一个部门信息,内容为:编号 50,名称 LOL学院,地址 北京
-- 主键:非空的唯一的字段可以设置为主键
-- 在一张表中,某个字段的值是非空唯一的,将此字段设置为主键
-- 主键的作用是唯一的标识一条数据
INSERT INTO dept(deptno,dname,loc)VALUES(50,'LOL学员','北京');
INSERT INTO dept(deptno,dname,loc)VALUES(70,'吃鸡学员','');
SELECT * FROM dept;-- 删除数据
--delete from 表名; 删除表中的所有数据
-- delete from 表名 where 删除筛选;删除指定数据
truncat TABLE 表名,删除表中的所有数据,执行效率高于delete;
DELETE FROM dept WHERE deptno=50;
truncat TABLE dept;-- 跟新数据
UPDATE 表名 SET 字段名=新的值,字段名=新的值 字段的值全部改为新的值
UPDATE 表名 SET 字段名=新的值,字段名=新的值 WHERE 条件 符合条件的值改为新的值
UPDATE dept SET dname='java学院',loc='上海' WHERE deptno=50;
2.4 数据的备份
-- 表级别备份
-- 全部备份 create table 表名 as select * from 备份表名,
注意: 只会备份表的结构和表的数据,约束不会备份
CREATE TABLE deptBak AS SELECT * FROM dept;-- 全部备份
SELECT * FROM deptBak;-- 部分备份
-- 数据整体插入
INSERT INTO 表名 SELECT * FROM 表名
注意: 查询语句结果的字段必须和插入表名的字段数数量和类型一致
CREATE TABLE 新表 AS SELECT 字段名1,字段名2 FROM 备份表
DELETE FROM deptBak;
CREATE TABLE deptBak2 AS SELECT deptno,dname FROM dept;
INSERT INTO deptBak SELECT * FROM dept;
SELECT * FROM deptBak;
3 第三天oracle数据库学习
3.1 多表联合查询
当需要获取的数据分布在多张表中,考虑使用联合查询
-- sql92
-- 笛卡尔积
SELECT * FROM emp,dept;
结果的数量为所用表的数量的乘积
-- 等值链接
--先做表的笛卡尔积,再筛选,筛选条件为等值筛选
-- 查询员工姓名,工作,薪资,部门名称
注意:如果是公共字段,则需要声明表名
可以给表名使用别名
SELECT ename,job,sal,dname FROM emp,dept WHERE emp.deptno=dept.deptno
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno
SELECT e.ename,e.job,e.sal,e.ename FROM emp e,dept d WHERE e.deptno=d.deptno
-- 不等值链接
查询员工姓名,工作,工资,工资等级
SELECT e.ename,e.job,e.sal,s.grade FROM emp e,salgrade s WHERE e.sal>=s.losal AND e.sal <=s.hisal;
SELECT * FROM salgrade FOR UPDATE;-- 自链接
查询员工姓名,工作,工资,上级领导
SELECT e1.ename,e1.job,e1.mgr,e2.ename FROM emp e1,emp e2 WHERE e1.mgr=e2.empno;-- 外链接
-- 左外链接(加在右边,显示对左边字段没有值的数据)
查询员工姓名,工作,工资,部门名称及没有部门的员工信息
SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno(+);-- 右外链接
查询员工姓名,工作,工资,部门名称及没有部门的员工信息
SELECT * FROM emp e,dept d WHERE e.deptno(+)=d.deptno;-- sql99
注意: 依然可以给表添加别名
如果使用on 或者using 关键字进行结果筛选
OUT 关键字可以不写
依然可以使用having 排序,分组等
-- 笛卡尔积:使用 cross join 关键字
SELECT * FROM emp CROSS JOIN dept;
查询员工姓名,工作,薪资,部门名称
-- 筛选
-- 自然链接 关键字 Natural join
--1底层先笛卡尔积,然后按照所有同名同值字段自动筛选
缺点: 如果想按照字段名不同,值相同进行筛选怎么办
如果想按照部分字段进行筛选怎么办
SELECT * FROM emp NATURAL JOIN dept
--解决1 使用using 关键字 inner join useing()
作用:指明使用指定的字段对联合查询的结果进行等值筛选,指明的字段必须是两表的同名同值
SELECT * FROM emp INNER JOIN dept USING(deptno,ename);-- 解决2 使用关键字 on
注意:普通筛选条件使用where ,好处:SQL 语句的阅读性变强
SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno WHERE sal>2000;-- 外连接
左外连接(LEFT)-- 查询员工姓名,工作,工资,部门名称及没有部门的员工信息
SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;
右外连接
-- 查询员工姓名,工作,工资,部门名称及没有部门的员工信息
SELECT * FROM emp e right JOIN dept d ON e.deptno=d.deptno;
全外链接
SELECT * FROM emp e FULL OUTER JOIN dept d ON e.deptno=e.deptno
-- 自链接
查询员工姓名,工作,工资,上级领导
SELECT * FROM emp e1 INNER JOIN emp e2 ON e1.mgr=e2.empno
-------------------------------------------------------------------------
三表联合查询
--创建city表
SELECT * FROM city;-- 给city 表增加数据
INSERT INTO city VALUES(1,'商丘','历史文明的古都');
INSERT INTO city VALUES(2,'邯郸','历史文明的古都');
INSERT INTO city VALUES(3,'洛阳','历史文明的古都');
INSERT INTO city VALUES(4,'开封','历史文明的古都');-- 将部门表中的loc 字段设置为城市表的城市编号
SELECT * FROM dept;
UPDATE dept SET loc='1' WHERE deptno=50;
UPDATE dept SET loc='2' WHERE deptno=40;
UPDATE dept SET loc='3' WHERE deptno=30;
UPDATE dept SET loc='4' WHERE deptno=20;
UPDATE dept SET loc='4' WHERE deptno=10;-- 完成三表联合查询
sql92实现
特点 :易于书写,难于阅读
-- 缺点 92的sql 语句结构不清
用法 SELECT 内容
FROM 表名1,表名2
WHERE 条件(普通条件,链接条件)
GROUP BY
HAVING 多行函数筛选
ORDER BY
查询员工信息及部门名称及所在城市信息并且员工的工资大于2000或者有奖金
SELECT * FROM emp e,dept d,city c WHERE (e.deptno=d.deptno AND d.loc=c.cid AND e.sal>2000) OR (e.deptno=d.deptno AND d.loc=c.cid AND e.comm IS NOT NULL);
sql95 实现
查询员工信息及部门名称及所在城市信息并且员工的工资大于2000或者有奖金
特点:难于编写,易于阅读
使用 SELECT * FROM 表名1
INNER JOIN 表名2 ON
链接条件1
INNER JOIN 表名3 ON
链接条件2
WHERE 普通条件
GROUP BY
HAVING
ORDER BY
SELECT *
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
INNER JOIN CITY C
ON D.LOC = C.CID
WHERE e.sal>2000 OR e.comm IS NOT NULL
ORDER BY e.ename
-- 多行子查询
-- 使用:子查询的结果至于一个字段但是字段有n个值,考虑使用子查询其实就是关键字
-- 关键字:1 any 任意
--2 ALL 所有
--3 in 任意存在 not in 没有一个存在
-- 查询工资高于任意一个clerk的所有员工信息
SELECT * FROM emp WHERE sal>(SELECT MAX(sal) FROM emp WHERE job='CLERK');
SELECT * FROM emp WHERE sal> ANY (SELECT sal FROM emp WHERE job='CLERK');-- 查询工资高于所有salesman的员工信心
SELECT * FROM emp WHERE sal>ALL (SELECT SAL FROM emp WHERE job='CLERK')-- 查询部门20中的同部门10的雇员工作一样的雇员信息
SELECT * FROM emp WHERE job IN (SELECT job FROM emp WHERE deptno=10) AND deptno=20;
4 第四天oracle数据库学习
4.1 数据库表约束理解
--二维表创建的约束学习
-- 问题1:学号重复依然会添加
INSERT INTO student VALUES (1,'关晓彤',18,'女','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');
INSERT INTO student VALUES (1,'关晓彤',18,'女','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');--问题2:竟然可以没有名字
INSERT INTO student VALUES (1,'',18,'女','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');--问题3:年龄竟然可以超过200岁
INSERT INTO student VALUES (1,'',200,'女','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');--问题4:性别竟然可以为任意字符
INSERT INTO student VALUES (1,'',200,'哈哈','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');--问题5:qq 号竟然可以重复
INSERT INTO student VALUES (1,'',200,'哈哈','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');-- 解决
CREATE TABLE student(
sno NUMBER(10),--PRIMARY KEY
sname VARCHAR(100),--not null
sage NUMBER(3),--check(sage<150 and sage>0)
ssex CHAR(4),--check(ssex='男' or ssex='女')
sfav VARCHAR2(500),
sbirth DATE,
sqq VARCHAR2(30),--unique
-- CONSTRAINT pk_student_sno PRIMARY KEY(sno)-- CONSTRAINT ck_student_sname check(sname is not null)-- CONSTRAINT ck_student_sage check(sage<150 and sage>0)-- CONSTRAINT ck_student_sage check(ssex='男' or ssex='女')--CONSTRAINT un_student_sqq unique(sqq))-- 主键约束
-- 非空约束
-- 检查约束
-- 唯一约束
-- 问题1:添加主键 主键特点:非空唯一
-- 使用:直接在创建表的字段后使用 primary key
-- 在创建表语句最后面使用 CONSTRAINT pk_表名_字段名 PRIMARY KEY(字段名)-- 在表创建完成之后使用 alert table 表名 add CONSTRAINT pk_表名_字段名 PRIMARY KEY(字段名)-- 删除主键约束约束 alert table 表名 add CONSTRAINT pk_表名_字段名 PRIMARY KEY(字段名)-- 问题2:添加非空约束
-- 使用:直接在创建表的字段后使用 not null
-- 在创建表语句最后面使用 CONSTRAINT ck_student_sname check(sname is not null)-- 在表创建完成之后使用 alter table add CONSTRAINT ck_student_sname check(sname is not null)-- 删除主键约束约束 alter table drop CONSTRAINT ck_student_sname check(sname is not null)-- 问题3:添加检查约束
-- 使用:直接在创建表的字段后使用 check(sage<150 and sage>0)-- 在创建表语句最后面使用 CONSTRAINT ck_student_sage check(sage<150 and sage>0)-- 在表创建完成之后使用 alter table add CONSTRAINT ck_student_sage check(sage<150 and sage>0)-- 删除主键约束约束 alter table drop CONSTRAINT ck_student_sname check(sage<150 and sage>0)-- 问题4:添加检查约束
-- 使用:直接在创建表的字段后使用 check(ssex='男' or ssex='女')-- 在创建表语句最后面使用 CONSTRAINT ck_student_ssex check(ssex='男' or ssex='女')-- 在表创建完成之后使用 alter table add CONSTRAINT ck_student_ssex check(ssex='男' or ssex='女')-- 删除主键约束约束 alter table drop CONSTRAINT ck_student_ssex check(ssex='男' or ssex='女')-- 问题5:添加唯一约束
-- 使用:直接在创建表的字段后使用 unique
-- 在创建表语句最后面使用 CONSTRAINT un_student_sqq unique(sqq)-- 在表创建完成之后使用 alter table add CONSTRAINT un_student_sqq unique(sqq)-- 删除主键约束约束 alter table drop CONSTRAINT un_student_sqq unique(sqq)-- 外键约束
-- 创建学生表
CREATE TABLE student(
sno NUMBER(10) PRIMARY KEY,
sname VARCHAR2(100) NOT NULL,
sage NUMBER(3)CHECK(sage>0 AND sage<150),
ssex CHAR(4)CHECK(ssex ='男' OR ssex ='女'),
sfav VARCHAR2(500),
sqq VARCHAR2(30) UNIQUE,
cno NUMBER(10)--REFERENCES clazz(cno)--constraints fk_student_cno foreign key (con) references clazz(con));
DROP TABLE student
INSERT INTO student VALUES(1,'张三001',18,'男','唱歌',65789000,1);
INSERT INTO student VALUES(2,'张三002',18,'男','唱歌',65789001,1);
INSERT INTO student VALUES(3,'李四001',18,'男','唱歌',65789003,1);
INSERT INTO student VALUES(4,'李四002',18,'男','唱歌',65789004,1);-- 问题:竟然可以在学生表中插入一个不存在的班级
INSERT INTO student VALUES(5,'李四003',18,'男','唱歌',65789005,3);
SELECT * FROM student;-- 创建班级
CREATE TABLE clazz(
cno NUMBER(10) PRIMARY KEY,
cname VARCHAR2(100) NOT NULL,
cdesc VARCHAR2(300))
INSERT INTO clazz VALUES(1,'java高级就业班','6666');
INSERT INTO clazz VALUES(2,'python高级就业班','33333');
ALTER TABLE clazz RENAME COLUMN con TO cno;-- 查询学生及其班级信息
SELECT * FROM student s ,clazz c WHERE s.cno=c.con
-- 解决:添加外键约束\
--作用:在子表中插入的数据在父表中不存在,则会自动报错
--概念:当一张表中的某个字段的值需要依赖另外一张表的某个字段的值,需要外键约束
-- 其中主动依赖的表称为子表,被依赖的表称为父表,外键加在子表中
-- 使用:
----在子表的字段后直接使用 references 父表名(父表的字段名)---- 在创建表语句的最后面使用 constraints fk_student_cno foreign key (con) references clazz(con)---- 在创建表完成之后使用 alter table student add constraints fk_student_cno foreign key (con) references clazz(con)---- 删除外键约束 alter table student drop constraints fk_student_cno foreign key (con) references clazz(con)\
--时机:一般选取父表的主键做为子表的外键
-- 缺点:
--1 无法直接删除父表的数据,除非级联删除
-- 级联删除:在添加外键约束时,使用关键字 on delete cascade
--当删除父表语句时,自动删除子表相关的所有数据
缺点 :无法保留子表的历史数据
使用关键字on delete SET NULL
使用级联删除时,将子表中的依赖字段的值设置为 NULL
-- 注意:子表依赖字段不能添加非空约束
删除班级1的信息
DELETE FROM clazz WHERE cno=1;
4.2 二维表的维护
--添加新的字段
ALTER TABLE student ADD sphone NUMBER(11);
ALTER TABLE 表名 ADD 字段名 字段类型
SELECT * FROM student;--修改原有的字段
--修改字段名
ALTER TABLE student RENAME COLUMN sphone TO phone
ALTER TABLE 表名 RENAME COLUMN 旧的字段名 TO 新的字段名
--修改字段类型
ALTER TABLE student MODIFY sphone VARCHAR2(11)
ALTER TABLE 表名 MODIFY 字段名 字段类型
-- 删除字段
ALTER TABLE student DROP COLUMN phone
ALTER TABLE 表名 DROP COLUMN 字段名
-- 删除表
DROP TABLE student
DROP TABLE 表名
-- 修改表名
remane 表名1 TO 表名2
4.3 ORACLE的其他知识
-oracle 的序列,视图,索引
--Oracle 的分页查询
--oracle 的数据库的备份
--oracle 的图形化界面操作
--------------------------------------oracle 的序列学习
--创建序列
--使用: create sequence 序列名
CREATE SEQUENCE cc;
SELECT cc.currval FROM dual;
SELECT cc.nextval FROM dual;--特点1:默认开始是没有值的,也就是指针指在了没有值的位置
--特点2:序列名.nextval每次执行都会自增一次,默认步长为1--特点3:序列名.currval 查看当前序列的值。开始是没有的
--作用:作为主键使用,动态的获取主键的值,这样新增数据的时候极大的避免了主角按冲突的问题
--创建自定义序列
CREATE SEQUENCE aa START WITH 5 INCREMENT BY 2 MAXVALUE 1000 CACHE 10-- 创建测试表
CREATE TABLE teacher(
tid NUMBER(10) PRIMARY KEY,
tname VARCHAR(100) NOT NULL
)
INSERT INTO teacher VALUES(cc.nextval,'张三');-- 删除序列
DROP SEQUENCE 序列名
----------------------------------------------------------------------------------使用索引
--作用:提升查询效率
--使用索引:create index 索引名 on 表名(字段名)
CREATE INDEX index_teacher_tid ON teacher(tid)--特点显示的创建,隐式的创建
--注意:oracle 会自动给表的主键创建索引
-- 删除索引
DROP INDEX 索引名
----------------------------------------------------------------------------------- 视图
--使用视图
-- 创建视图:
-- 注意:视图的创建必须拥有dba 权限
CREATE VIEW stu AS SELECT sno,sname,sage FROM student
CREATE VIEW 视图名 AS SELECT 内容
--视图的特点
--1 保护真实表,隐藏重要的字段的数据,保护数据
--2 在视图中的操作必会映射到真实表中
--3 可以收手动开启只读模式
CREATE VIEW stu2 AS SELECT sno,sname,sage FROM studen WITH READ ONLY
--删除视图: drop view 视图名