ORACLE学习笔记之增删改查(一)

    科技2024-03-28  91

    文章目录

    第一章 数据库基础1.1、数据库基本概念1.2、数据库的分类1.3、E-R模型(Entry-Relation)1.4、SQL语句分类 第二章、查询基础3.1、简单的select语句3.2、使用算术表达式 + - / *3.3、连接运算符 ||3.4、使用字段别名 as3.5、空值 is null3.6、去除重复行 distinct3.7、查询结果排序 order by asc(desc)3.8、比较运算符 > < (!= or <>) between and3.9、in操作 not in3.10、模糊查询 like3.11、逻辑运算符 or and not3.12、练习 第三章 单行函数3.1、字符函数3.2、数值函数3.3、日期函数 第四章、分组函数4.1、count()4.2、avg(),max(),min(),sum()4.3、GROUP BY子句4.4、having子句4.5、分组函数嵌套4.6、练习 第五章、多表查询5.1、笛卡尔集(Cross Join)5.2、等值连接(Equijoin)(Natural join..on)5.3、非等值连接(Non-Equijoin)5.4、自连接(Self join)5.5、左外联接(Left Outer Join )5.6、右外联接(Right Outer Join)5.7、满外联接(Full Outer Join)5.8、集合操作


    第一章 数据库基础

    1.1、数据库基本概念

    数据库(Database, DB)数据库管理系统(Database Management System, DBMS)数据库管理员(Database Administrator, DBA) 数据库系统( Database System, DBS )

    1.2、数据库的分类

    关系型数据库

    关系型数据库把复杂的数据结构,归结为简单的二维表形式存储 我们所有的操作也是建立在一张或者多张表,可以对表格进行数据的分类、合并、连接…

    常见的关系型数据库

    ORACLE 甲骨文 使用广泛、大型公司、产品免费、服务收费、稳定、安全 "ORACLE 8I/9I "ORACLE 10g/11g gird 网格计算、提高访问速度,目前主流 "ORACLE 12c cloudMySQL MYSQL AB 开源 中小型公司 sun公司收购 社区版免费 企业版收费SQLSserver 微软开发DB2 IBM 图形 非关系型数据库 NoSQL 不仅仅是SQL键值形式存储的数据库 RedisHBase 列存储MongoDB 文档型

    1.3、E-R模型(Entry-Relation)

    E-R模型三要素:实体、关系、属性实体间联系(1:1)(1:n)(n:m)

    1.4、SQL语句分类

    DML语句(数据操作语言)Insert、Update、 Delete、MergeDDL语句(数据定义语言)Create、Alter、 Drop、TruncateDCL语句(数据控制语言)Grant、Revoke事务控制语句Commit、Rollback、Savepoint

    第二章、查询基础

    3.1、简单的select语句

    3.2、使用算术表达式 + - / *

    3.3、连接运算符 ||

    3.4、使用字段别名 as

    3.5、空值 is null

    3.6、去除重复行 distinct

    3.7、查询结果排序 order by asc(desc)

    3.8、比较运算符 > < (!= or <>) between and

    3.9、in操作 not in

    3.10、模糊查询 like

    % 表示零或多个字符 _ 表示一个字符

    3.11、逻辑运算符 or and not

    3.12、练习

    --选择在部门30中员工的所有信息 Select * from emp where deptno=30; --列出职位为(MANAGER)的员工的编号,姓名 Select empno,ename from emp where job = „Manager‟; --找出奖金高于工资的员工 Select * from emp where comm>sal; --找出每个员工奖金和工资的总和 Select sal+nvl(comm,0),ename from emp; --找出部门10中的经理(MANAGER)和部门20中的普通员工(CLERK) Select * from emp where (deptno=10 and job=‟MANAGER‟) or (deptno=20 and job=‟CLERK‟); --找出部门10中既不是经理也不是普通员工,而且工资大于等于2000的员工 Select * from emp where deptno=10 and job not in(„MANAGER‟,‟CLERK)and sal>=2000; --找出有奖金的员工的不同工作 Select distinct job from emp where comm is not null and comm>0 --找出没有奖金或者奖金低于500的员工 Select * from emp where comm<500 or comm is null; --显示雇员姓名,根据其服务年限,将最老的雇员排在最前面 select ename from emp order by hiredate ;

    第三章 单行函数

    3.1、字符函数

    大小写控制 lower() upper() select lower('HelloWorld') 转小写, upper('HelloWorld') 转大写 from dual; 首字母大写 initcap select Initcap('hello world') 首字母大写 from dual 字符连接函数 concat 等同于|| select concat('hello','world') from dual; 求母字符串中的某个子串 substr select substr('Hello World',3) from dual; 从第三位开始截取 select substr('Hello World',3,4) from dual; -- 从第三位开始截取,截取四位 **字符数和字节数 length 和 lengthb ** Select length('China') 字符数 , Lengthb('China') 字节数 from dual; instr 查找子串在母串中的位置 select instr('hello world','o') from dual; select instr('hello world','ll') from dual; 去掉字符串前后指定的字符 select trim('H' from 'Hello World') from dual; 替换函数 replace select replace('Hello World','l','*') from dual;

    3.2、数值函数

    round() 四舍五入trunc() 截断mod() 求余 Select round(45.458,2) 四舍五入, trunc(45.458,2) 截断, mod(1600,300) 求余 from dual;

    3.3、日期函数

    查看当前系统时间

    select Sysdate From Dual;

    时间转换成字符 to_char()

    select to_char(Sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

    显示昨天,今天,明天

    select sysdate-1,sysdate,sysdate+1 from dual;

    员工信息,显示工龄(天)

    select empno,ename,sysdate-hiredate from emp;

    员工信息,工龄按天,星期,月显示

    select empno,ename, sysdate-hiredate 天, (sysdate-hiredate)/7 星期, (sysdate-hiredate)/30from emp; --不准确

    months_between 两个日期相差的月数

    select (sysdate-hiredate)/30 方式一, months_between(sysdate,hiredate) 方式二 from emp;

    加月份 add_months

    select add_months(sysdate,1) from dual;

    某个日期当月的最后一天 last_day

    select last_day(sysdate) from dual;

    next_day 下一个查询日的日期

    select next_day(sysdate,'星期五') from dual;

    对日期进行四舍五入

    select round(sysdate,'MONTH'),round(sysdate,'YEAR')from dual;

    对日期截断

    select trunc(sysdate,'MONTH'),trunc(sysdate,'YEAR')from dual;

    第四章、分组函数

    4.1、count()

    如果数据库表的没有数据,count(*)返回的不是null,而是0

    4.2、avg(),max(),min(),sum()

    4.3、GROUP BY子句

    出现在SELECT列表中的字段或者出现在order by 后面的字段,如果不是包含在分组函数中,那么该字段必须同时在GROUP BY子句中出现。

    包含在 GROUP BY子句中的字段则不必须出现在SELECT列表中。

    可使用where字句限定查询条件

    可使用Order by子句指定排序方式

    如果没有GROUP BY子句,SELECT列表中不允许出现字 段(单行函数)与分组函数混用的情况。

    select empno, sal from emp; //合法 select avg(sal) from emp; //合法 select empno, initcap(ename), avg(sal) from emp; //非法

    不允许在 WHERE子句中使用分组函数。

    select deptno, avg(sal) from emp where avg(sal) > 2000 group by deptno; // 不合法

    4.4、having子句

    select deptno, job, avg(sal) from emp where hiredate >= to_date('1981-05-01','yyyy-mm-dd') group by deptno,job having avg(sal) > 1200 order by deptno,job;

    4.5、分组函数嵌套

    select max(avg(sal)) from emp group by deptno;

    4.6、练习

    --分组统计各部门下工资>500的员工的平均工资、 Select avg(sal) from emp where sal>500 group by deptno ; --统计各部门下平均工资大于500的部门 select deptno,avg(sal) from emp group by deptno having avg(sal)>500 ; --算出部门30中得到最多奖金的员工奖金 Select max(comm) from emp where deptno = 30 ; --算出部门30中得到最多奖金的员工姓名 select ename from emp where comm = (select max(comm) from emp where deptno=30); --算出每个职位的员工数和最低工资 Select job,min(sal),count(*) from emp group by job; --列出员工表中每个部门的员工数,和部门no Select count(*),deptno from emp group by deptno; --得到工资大于自己部门平均工资的员工信息 select * from emp e1,(select deptno,avg(sal) as avgsal from emp group by deptno) e2 where e1.deptno=e2.deptno and e1.sal > e2.avgsal;

    第五章、多表查询

    5.1、笛卡尔集(Cross Join)

    select * from emp,dept;

    5.2、等值连接(Equijoin)(Natural join…on)

    select empno, ename, sal, emp.deptno, dname from emp, dept where emp.deptno = dept.deptno;

    5.3、非等值连接(Non-Equijoin)

    select ename,empno,grade from emp,salgrade where sal between losal and hisal;

    5.4、自连接(Self join)

    select e.empno,e.ename,m.empno,m.ename from emp e,emp m where e.mgr = m.empno; select e.empno,e.ename,m.empno,m.ename from emp e,emp m where m.mgr = e.empno;

    5.5、左外联接(Left Outer Join )

    select s.sid,s.sname,s1.sid,s1.sname from student s,student1 s1 where s.sid=s1.sid(+); select empno,ename,dname from emp left outer join dept on emp.deptno = dept.deptno;

    5.6、右外联接(Right Outer Join)

    select s.sid,s.sname,s1.sid,s1.sname from student s,student1 s1 where s.sid(+)=s1.sid; select empno,ename,dname from emp right outer join dept on emp.deptno = dept.deptno;

    5.7、满外联接(Full Outer Join)

    select empno,ename,dname from emp full outer join dept on emp.deptno = dept.deptno;

    5.8、集合操作

    · UNION:并集,所有的内容都查询,重复的显示一次

    · UNION ALL:并集,所有的内容都显示,包括重复的

    · INTERSECT:交集:只显示重复的

    · MINUS:差集:只显示对方没有的(跟顺序是有关系的)

    首先建立一张只包含20部门员工信息的表: CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20 ;

    1、 验证UNION及UNION ALL

    UNION:

    SELECT * FROM emp UNION SELECT * FROM emp20 ;

    使用此语句重复的内容不再显示了

    UNION ALL:

    SELECT * FROM emp UNION ALL SELECT * FROM emp20 ;

    重复的内容依然显示

    2、 验证INTERSECT

    SELECT * FROM emp INTERSECT SELECT * FROM emp20 ;

    只显示了两个表中彼此重复的记录。

    3、 MINUS:返回差异的记录

    SELECT * FROM emp MINUS SELECT * FROM emp20 ;

    只显示了两张表中的不同记录

    满链接也可以用以下的方式来表示:

    select t1.id,t2.id from table1 t1,table t2 where t1.id=t2.id(+) union select t1.id,t2.id from table1 t1,table t2 where t1.id(+)=t2.id
    Processed: 0.013, SQL: 8