Oracle-增删改查
2024-01-03 10:33:41
增删改
处理日期
oracle 处理date 类型 必须使用 to_date 函数或 sysdate
?oracle ? 与 mysql 处理 date 的区别 ? ? mysql 中的 date 类型 只 支持 年月日, 使用 '2000-10-01' ? oracle 中 date 类型 包含 年月日时分秒, ? 使用 to_date 函数 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? to_date('1999-10-15','yyyy-MM-dd') ?? ? oracle 获取当前系统日期 用 sysdate ? mysql 获取当前系统日期 用 now()
?语法: ?insert into 表名 (列1,列2,.....) ? values (值1,值2,....); ?? ?? ?? ?注意事项: ? ? a. ? 列的格式 必须与 值的 个数 相等 ? ? ?b. ? 值 必须 与 列定义的 数据类型 一致 ? ? ? ?数字 直接写, ? 字符 ?用 单引号括起来 ? 日期 ?用 to_date() 函数 或 sysdate ? ? ? ? ?c. ?oracle 中 自增 与 mysql 不同 , ? ? ?oracle 中 使用 序列 生成 自增 ? ? ? d. ?语法中的 列 可以不写, 但是 推荐 还是写
-- 批量 插入: (从已有的表 中将 部分信息插入到 当前表) insert select
-- 语法: -- insert into 表名1(列1,列2) select 列21,列22 from 表名2
insert into emp1(ename,borndate,depid)
select ename,borndate,depid from emp;
?--批量 插入: ?(从已有的表 中将 部分信息插入到 当前表) ? insert ?select ?? ?-- result : ? ? stuno,subno,examtime ?? ?create table abc( ? stuno VARCHAR2(50), ? subno number, ? examtime date ?) ?? ?? ?? ?insert into abc(stuno,subno,examtime) ?select stuno,subno,examtime from result; ?? ?-- ?select * from abc; ?? ?-- 删除 abc ?? ?drop table abc; ??
union
dual 确实是一张表.是一张只有一个字段,一行记录的表.(Oracle提供的最小的工作表,只有一行一列,具有某些特殊功用)。
习惯上,我们称之为'伪表'.因为他不存储主题数据.
?insert into subject ?SELECT 3,'c语言',1 FROM DUAL union ?SELECT 4,'go语言',1 FROM DUAL
?-- 修改 ---------(带条件) ? ? -- update 表名 set 列名=值,列名2=值2 where 条件 [and 条件2 ] ? ? -- 改全部表 数据 ? , 将 emp 的 sex 都改为 0 ?? ? ? -- 语法 : update 表名 set 列名=新值; ? ? ? select * from emp; ? ? update emp set sex='0'; ? ? ? -- 带1条件的修改: update 表名 set 列名=新值 where 条件; ? ? -- 将 员工编号为 1002 的员工 的性别 改为 1, ? ( 员工编号, 性别 --> emp) ? ? ? update emp set sex='1' where eno=1002; ? ? -- 将 员工编号为 1003 的 性别改为1 ,名字 改为 李四2; ? ? -- 修改 多列 ? -- 语法: update 表名 set 列名=值,列名2=值2,列名3=值3 where 条件; ? ? ? update emp set sex='1' , ename='李四2' where eno=1003 ? ? -- 将员工编号为 1006 且 性别为 0 的员工的 名字改为 lili, 出生日期为 2000-12-12 ? ? update emp set ename='lii' , borndate=to_date('2000-12-12','yyyy-mm-dd') ? ? where eno=1006 ?and sex='0' ; ? ? -- ? sql 中 且,并且 and ? ? 或,或者 or ? ? ? -- ?? ? -- 删除 ? ? (带条件--- 删除表的数据) ? ? -- ? 在 主从关系中, 先删 从表 再删主表 ? ? -- delete from 表名 ; ? -- 清空表,无数据 ,表结构依然在, ? ? -- delete from 表名 where 条件 [and 条件2]; ? --- 将符合条件的数据 删除 ? ? delete from emp ; ? ? ? delete from dept where depid=10; ? ? select * from emp; ? ? select * from dept; ? ? ?-- 删除表 ?? ?--语法: ?drop table 表名; ? ? ?-- 清空表,表里数据会清空,同时 表结构也会删除 ? ? drop table emp; ? ? -- ? insert ? delete ? update ? ? select ? ? -- 查询 ? ? ? ? -- 语法: select * from 表名 ? ; --- * 代表查询 全部列 ? ? select * from dept; ? ? ? --语法: ? select 列名1 from 表名; --- 查询部分列 ? ? select ename,sex from emp; ? ? -- 带条件查询 ? ? select depname from dept where depid =3; ? ? ? ? -- 查询 部门编号为2 的 员工信息 ? ? ? select * from emp where depid=2 ? ? ? -- 查询部门编号为2的员工姓名及性别 ? ? ? select ename,sex from emp where depid=2 ? ? -- 模糊查询 ? like ? ? ?-- 通配符: ? ? % 匹配任意字符 ? ? _ 下划线 只匹配单个字符 ? -- ? -- ? -- 查询 姓王的员工信息 , 王X ? 王XX 王XXX 王XXX ? ? ? ?select ?* ?from emp ?where ename ?like '王%'; ? ? ? ? -- 查询 姓名包含 四 字的员工信息, 四XX ? X四 ? XX四 ? ? select ?* ?from emp ?where ename ?like '%四%'; ? ? ? -- 查询 姓李 并且 名字为 2个字的 学生信息 李X ? ,李XX 就不对 ? ? -- ? ? select ?* ?from emp ?where ename ?like '李_'; ? ? -- 查询 姓李 并且 名字为 3个字的 学生信息 李X 不对 ,李XX ? ? ? ? select ?* ?from emp ?where ename ?like '李__'; ? ? ? ? -- 查询 员工编号为 1001 或 1002 或 1003 的员工姓名及性别 ? select ename ?,sex ? from emp ? where eno=1001 or eno = 1002 or eno=1003 ? ? -- ? in ? ? not in ? ? select ename ?,sex,eno ? from emp ? where eno in (1001,1002,1003) ? ? ? ? ? select ename ?,sex,eno ? from emp ? where eno not ?in (1001,1002,1003) ? ?? ?? ? -- 排序查询 ? ? ? 由小到大 叫 升序, 由大到小 叫 降序 ? ? -- order by 列名 ? desc (降序) asc (升序-- 默认的) ? ? -- 语法: select * from 表名 where 条件 order by 列名 desc [asc] ? ?? ?? ? -- 查询 部门编号为2 的员工信息, 并按照 员工编号进行 降序排列 ? ? select * ? from emp ? where depid=2 ? order by eno desc ; ? ? ? ? -- 查询 部门编号为2 的员工信息, 并按照 出生日期进行 降序排列 ? select * ? from emp ? where depid=2 ? order by borndate desc ; ?? ?? ?? ? select * ? from emp ? where depid=2 ? order by eno asc ?; ?? ?? ?? ? -- 去掉重复的数据 ? distinct ? ? -- ? select depid from emp ; ?? ? select ?distinct depid from emp ; ?? ?-- 查询 员工编号在 1001 与 1010 之间的员工信息 ? 员工编号 >=1001 且 员工编号 <= 1010 ?? ? -- 方法1: ? ?select * from emp where eno >=1001 and eno <= 1010; ?? ? -- 方法2: between and ? ? ?select * from emp where eno between 1001 and 1010; ? ? ?--select * from emp where eno between 1010 and 1001; ?-- 无语法错误,但是 无匹配数据 无意义 ?
? 语法: ? insert into 表名(列名1,列2, 列3,.....) ? select 值1,值2,值3,.... ?from dual ?union ? select 值1,值2,值3,.... ?from dual ? union ? ? ? ? ? select 值1,值2,值3,.... ?from dual ? union ? select 值1,值2,值3,.... ?from dual ? union ? select 值1,值2,值3,.... ?from dual ? ?? ?? ?? ?dual ? 表 是 oracle 特有的, 单行单列
?语法: ? ? ?update : ? ? ? ?update 表名 set 列=新值,列2=新值2,列3=新值3 ? ? ?[ where ? 子句 ] ? ? ? ? ? ? 如果update 时 没有 where 子句,则表里所有的数据都会被更新 ? ? delete: ? ? ? ? ? ? ? ? ? ?delete from 表名 [where 子句]; ? ? 如果在删除时 没有where 子句 ,则 delete from 会清除表里的数据
查询
基础查询
?查询全部列 : ?select * from 表名; ?查询 部分列: ? select 列名1,列名2,..... ?from 表名; ? 列的重命名 需要使用 as, 也可不写 ? ?select stuname as 姓名,phone 电话 from student;
条件查询
where 条件字句:检索数据中
符合条件
的值?带条件的查询 ? SELECT * from ?where 子句; ? ? ? ? ? ? ? ? 如果 where 有多个条件, 则 并且,且 用 and , 或,或者用 ?or?? ?-- 查询 student 的全部数据 ? select * from student; ? ? -- 查询 所有学生的 姓名与电话 ? select stuname,phone from student; ?-- 列 重命名 ? select stuname as 姓名,phone 电话 from student; ?? ?? ?-- 查询学号为 1001 的学生姓名与邮箱 ?? ? select stuname,email from student where stuno='1001'; ?? ?? ?-- 查询 性别为 女 (1) 的学生姓名 与出生日期 ?select stuname,borndate from student where sex=1; ?? ?? ?-- 查询 成绩在 80-90之间,参加 科目编号为1的 学生的学号 ?select stuno,score ?from result ?where score>=80 and score<=90 and subno=1 ??
模糊查询
? like ? ? ? % ? ? 任意字符 ? ? ? ? ? ? _ ? ? 任意一个字符??
聚合函数
聚合函数查询: 5个 , 只有一个结果 count(*) 统计个数 max(列名) 对这列求 最大值 min(列名) 对这列求最小值 sum(列名) 对这列求 求和 avg(列名) 对这列求 平均值
count(*) 与 count(列名) 与 count(1) 的区别
count() 统计所有的数据的个数 包括 空行 null count(列名) 如果这个列名的值为null 则 不会进行统计 count(1) 与 count() 等同
分组查询
分组查询
? select 聚合函数,被分组的列名 ? from 表名 ? [where 子句] ? group by 列名 ? [having 子句]
?-- 模糊 与 聚合的 练习 ?? ?-- 统计 名字中带有 丽 字的学生 个数 ?? ?select ?count(*) 学生个数 ?from student ?where stuname ?like '%五%'; ?? ?? ?select * from student; ?? ?? ?-- 求 科目编号为 1 的最高成绩 ?select max(score) 最高成绩, min(score) 最低成绩 ?from ? result ?where subno=1 ?? ?? ?select * from result; ?? ?? ?-- 求 参加了 科目编号为1 的考试的 总成绩与平均分 ?? ?? ?select sum(score) 总分, avg(score) 平均分 ?from ? result ?where subno=1 ?? ?? ?? ?? ?/* ? 1.统计一下年级编号为 2 的 年级一共开设多少门课 ? 2.统计一下 姓张的同学的个数 ? 3. 求 科目编号为 3 的 最高分 ? ? 4.将 学号为 1001 的学生的 姓名 改为 王丽丽, 邮箱为 uy@qq.com ? ? 5. 删除 学号为 1001的 科目编号为1 的成绩 ? ? 6. 统计 年级编号为1 的学生个数 ? ?? ?*/ ?? ?? ?select * from student; ?? ?-- 分组查询 ?select count(*) 女生个数 from student ?where sex=1; ?? ?select count(*) 男生个数 from student ?where sex=0; ?? ?--统计 男女个数 ?select count(*), sex ?from ? student ?group by sex ?? ?? ?? ?-- 统计 年级编号为 1 的 男女个数 ? ? -- ? 先 筛选 年级编号为1 的 , 然后在分组 , 因此 用 where ? -- ? where 是在分组前 进行数据的筛选 ?? ?select count(*), sex ?from ? student ?where gid=1 ?group by sex ?-- 分组练习 ?? ?-- 统计 各个年级的学生个数 ?? ?-- 统计 科目编号为1 ,成绩高于 90分的学生个数 ?? ?-- 统计 参加 各个科目的考试人数 ?? ?-- 统计 成绩高于80分的, 各个科目的考试人数 ?? ??
连接查询
?
? 内连接: ? inner join ?? ?外连接 ? left join /right join ?? ?内连接: tableA inner join tableB on 外键 ? ? ? ? tableA 与 tableB 在 内连接 地位 是 等价的, 谁在前谁在后 不影响 执行结果 ?? ?where 写法 ? ? 外连接: ? ? tableA left join tableB , tableA为主表,tableA里的全部数据都要显示,如果 匹配tableB 没有数据则以null填充 ? ? ? ? ? ? tableA right join tableB , tableB为主表,tableB里的全部数据都要显示,如果 匹配tableA 没有数据则以null填充
子查询
? -- 查询 一年级 的学生信息 ? -- inner join ? select stuname,phone,stuno ? from student s ?inner join grade g on s.gid=g.id ? where name='一年级'; ? ? ? ? --where 写法 ? ? ?select stuname,phone,stuno ? from student s ?, grade g ? ? where name='一年级' and s.gid=g.id ? ? -- 查询 一年级 的学生信息 ? -- 子查询 ? select stuname,phone,stuno ? from student s ? where gid in (select id from grade where name='一年级')
排序
? ? ? ? ? select 聚合函数,被分组的列名 ? from 表名 ? [where 子句] ? group by 列名 ? having 子句 ? order by 列名[desc]
其他
自增与序列
? 在oracle 有一张特殊的表 dual ?? ?dual 是oracle 中一个伪表, 利用这张表 可以查看序列(自增) ?查看 一个表达式的值,执行函数 ?dual 最经常用来 选择系统变量或查看一个表达式的值 ???/* 语法: create sequence 序列名(自己起) ? ? ? ? ? minvalue ? -- 最小值 ? maxvalue ? --最大值 ? start with -- 初始值 ,默认1 ? ? ? ? ? increment by -- 步长 ,增长量 ? nocycle ? -- 不循环 ? , cycle -- 循环 ? ? ? ? ? ? -- 如果不循环,当达到最大值时,继续产生会发生错误 ? --如果循环,当递增序列达到最大值时,循环到最小值, ? --如果循环,当递减序列达到最小值时,循环到最大值 ? cache ? -- 存放序列的内存块的大小,默认值为20 , nocache 不缓存 ?*/ ?? ?-- 1.创建 一个自增序列 ? create sequence seq_dept_deptno ? start with ?1 ? increment by 1 ? nocycle ? nocache ?? ?? ?-- 2. 使用 序列名.nextval 获得 值 ?insert into dept(depid,depname) ?? ?values(seq_dept_deptno.nextval,'其他部12'); ?? ?? ?? ??
分页
?-- ? 分页查询, 规定 ,每页显示2条 记录 , ? ROWNUM ?/* ?select * ?? ?from ( ? ? ? select A.*,ROWNUM rn ? ? ? from (select * from 分页的表的名字) A ? where ROWNUM<= 当前页*每页显示的条数 ? ? ? ) ?where rn>(当前页-1)*每页显示的条数; ?? ?*/ ? ?-- ? 第1页,每页显示 2条 ?select * ?from ( ? ? ? ?select A.*,ROWNUM rn ? ? ? ?from (select * from emp) A ? ?where ROWNUM<= 2 ? ? ? ?) ?? ?where rn>0; ?? ?-- 第二页 ,每页显示2条 ?? ?select * ?from ( ? ? ? ?select A.*,ROWNUM rn ? ? ? ?from (select * from emp) A ? ?where ROWNUM<= 4 ? ? ? ?) ?? ?where rn>2; ?? ??
文章来源:https://blog.csdn.net/ly121862/article/details/135355141
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!