Day20_数据库(一)

时间:2020-09-20
本文章向大家介绍 Day20_数据库(一),主要包括 Day20_数据库(一)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Day20_数据库(一)

关系数据库

  • 采用关系(二维表)结构储存与管理数据
  • 采用结构化查询语言(SQL)作为客户端程序数据库服务器件沟通的桥梁
  • 目前的数据库技术

非关系型数据库

Not Only SQL数据库

SQL语言的分类

DQL(数据查询语言)

select

查看emp表中所有数据:

select * from emp;

给属性名起别名:

select name 员工姓名,job 工作,sal*12+3000 年薪,deptno 部门编号 from emp;

select name as 员工姓名,job as 工作,sal*12+3000 as 年薪,deptno as 部门编号 from emp;

select name as "员工 姓名",job as "工作",sal*12+3000 as "年薪",deptno as "部门编号" from emp;

注意:当别名中有空格时,不可以省略双引号。

结果拼接:

select '我的名字是:' ename '我的岗位是:' job as "自我介绍" from amp;

查询部门编号:

---不去重
select deptno from emp;
---针对deptno去重
select distinct deptno from emp;
---针对deptno,sal组合去重
select distinct deptno,sal from emp;
---针对deptno去重后,根据deptno升序输出(默认升序输出)
select distinct deptno from emp order by deptno asc;
---针对deptno去重后,根据deptno降序输出
select distinct deptno from emp order by deptno desc;

查询员工的年薪

select sal*12 from emp order by sal*12;
---别名
select sal*12 年薪 from emp order by sal*12;
---按别名排序
select sal*12 年薪 from emp order by 年薪;
select deptno,sal*12 年薪 from emp order by deptno asc,sal*12 desc;

条件查询

---查询Allen的全部信息
select * from emp where ename="Allen";
---查询Allen的姓名,职位,部门编号
select ename,job,deptno from emp where ename="Allen";
---查询工资超过1000的员工
select * from emp where sal>1000;
---查询工资不等于1000的员工
select * from emp where sal<>1000;
---查询有津贴的员工
select * from emp where comm is not null;
---查询无津贴的员工
select * from emp where comm is null;
---查询入职时间是2010/7/1的员工
select * from emp where hiredate ='1-7月-2010';
---查询工资在1000-2000的员工
select * from emp where sal>=1000 and sal<=2000;
select * from emp where sal between 1000 and 2000;
---查询职务是CLERK或者MANAGER或者SALESMAN的员工的信息
select * from emp where jod='CLERK' or job='MANAGER' or job='SALESMAN';
select * from emp where jod on ('CLERK','MANAGER','SALESMAN');
---查询名字中带S的员工的信息,%表示0-n个字符
select * from emp where ename like '%S%';
---查询名字中第一个字母是S的员工的信息
select * from emp where ename like 'S%';
---查询名字中最后一个字母是S的员工的信息
select * from emp where ename like '%S';
---查询名字中第二个字母是L的员工的信息
select * from emp where ename like '_L%';
---更改一下数据库中的数据
select * from emp for update;
---查询名字中带_的员工的信息,但此句不可用
select * from emp where ename like '%_%';
---查询名字中带_的员工的信息,不一定必须是\,可以是任何字符,习惯上用\
select * from emp where ename like '%\_%' escape '\';

注意:‘and’运算符的优先级比‘or’高,为防混淆可以加括号。

单行函数

单行函数与多行函数的区别:

单行:对每一条数据做处理,例如将每个员工的姓名全部大写

多行:对多行数据操作,例如求平均工资

dual:伪表,方便操作

字符函数

数值函数

日期函数

转换函数

数值型--->字符型

---小数位不够4位的补零
select to_char(1234.56,'9999.9999') from dual;
---数前加美元符号
select to_char(1234.56,'$9999.9999') from dual;
---数前加本地货币符号
select to_char(1234.56,'L9999.9999') from dual;
---数中加逗号分隔符
select to_char(1234.56,'L9,999.9999') from dual;

日期--->字符型

select sysdate from dual;
select to_cahr(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

字符型--->数值型

select to_number('1234.56','9999.999')from dual;

字符型--->日期

select to_date('19990804','YYYY-MM-DD') from dual;
---计算现在出生了多少天
select sysdate-todate('20000229','YYYY-MM-DD') from dual;
---向上取整
select ceil(sysdate-todate('20000229','YYYY-MM-DD')) from dual;

其他函数

---计算员工的收入,但此句有问题,一旦其中一项位null,结果即为null
select sal+comm from emp
---计算员工的收入,nvl(a,b):如果a为null,那么按照b来计算
select sal+nvl(comm,0) from emp
---计算员工的收入,nvl2(a,b,c):如果a为null,执行c,否则执行b
select sal+nvl2(comm,sal+comm,sal) from emp
---显示别称
select decode(jod,'CLERK','店员','SALESMAN','销售员','PERSIDENT','董事长','普通员工');

多行函数

---求出员工的工资的总和,平均数,最大工资,最小工资
---sum(),avg()只适用于数值类型:
select sum(sal),avg(sal),max(sal),min(sal),sum(sal)/count(*) from emp;
---count,如计算某一个属性,则空数据不计入
select count(deptno) from emp;
---多行函数不能和字段和单行函数组合一起使用

group by分组

---显示所有员工的最高工资,人数
select max(sal), count(*) from emp;
---显示每个部门的最高工资,人数
select max(sal), count(*) from emp group by deptno;
---多行函数和字段组合在一起,要想能够运行通过,那么这个字段只能是分组的那个字段!
---下面这句可以运行
select max(sal), count(*),deptno from emp group by deptno;
---下面这句不可以运行
select max(sal), count(*),ename from emp group by deptno;
---求出每个工作岗位的员工薪水最大值,每组人数
select job,max(sal),count(*) from emp group by job;
---求出每个工作岗位的员工薪水最大值,每组人数
select lower(job),max(sal),count(*) from emp group by lower(job);
select upper(job),max(sal),count(*) from emp group by upper(job);
---显示每个部门的不同岗位人数
select deptno,upper(job),count(*) from emp group by deptno,upper(job);
---显示每个部门的人数
select count(*),deptno from emp group by deptno;
---显示部门编号大于20的部门的人数
---方式1:先把大于20的部门全部过滤出来,然后对结果进行分组
select count(*),deptno from emp where deptno>20 group by deptno;

Having

---方式2:先分组,后过滤
---分组和过滤执行不用分前后的,一般先分组,后过滤
---语句执行顺序from,where,group by,having(select,order by同时进行)
select count(*),deptno from emp group by deptno having deptno>20 ;
---显示部门人数超过4人的部门人数
select deptno,count(*) from emp group by deptno having count(*)>4;
---工资最小值小于2000的职位
select upper(job),min(sal) from emp group by upper(job) having min(sal)<2000
---平均工资大于1200的部门和工作搭配组合
select upper(job),upper(deptno),avg(sal) from emp group by upper(deptno),upper(job) having avg(sal)>2000
---统计人数小于4的部门的平均工资
select upper(deptno),count(*),avg(sal) from emp group by upper(deptno) having count(*)<4
---统计各部门的最高工资,排除最高工资小于3000的部门
select upper(deptno),max(sal) from emp group by upper(deptno) having max(sal)>=3000

DML(数据操作语言)

insert

---增加数据
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (8888,'lili','CLERK',7566,to_date('1981/9/28','YYYY-MM-DD'),1800,null,20)
---插入全部字段时,values前的内容可以省略,否则不可省略
insert into emp values (8888,'lili','CLERK',7566,to_date('1981/9/28','YYYY-MM-DD'),1800,null,20)
---添加数据时,不可为空的数据必须不能为空,可为空的数据自由选择
---此数据库中empno不可为空,其他可选
insert into emp (empno,ename,job,mgr) values (8888,'lili','CLERK',7566)

---此种方式创建表,只是字段,数据过去了(约束,索引等都没有过去),一般可用于数据库备份
create table test01 as select * from emp

---此种方式创建表,只是表的结构,字段过去了,数据没有带过去
create table test02 as select * from emp where 1>2

update

---修改数据
update emp set ename="ALLENS",sal=1800 where empno=7499

delete

---删除某行数据,from可以省略
delete emp where empno=7521
delete from emp where empno=7521
---删除部门
delete emp where deptno=30

DDL(数据定义语言)

  • create、alter、drop

DCL(数据控制语言)

  • grant、revoke

高级查询

---笛卡尔积:其中有很多无效数据
select * from emo,dept;
---等值连接
select * from emp,dept where emp.deptno=dept.deptno;
---给表起别名
select * from emp e,dept d where e.deptno=d.deptno;
---查询表中部分字段
select ename,mgr,comm from emp e,dept d where e.deptno=d.deptno;
---查询表中部分字段,如果是公共字段的话,前面必须加上所属的表
select ename,mgr,comm,d.deptno from emp e,dept d where e.deptno=d.deptno;
---最好在每个字段前都加上所属的表:效率会更高
select e.ename,e.mgr,e.comm,d.deptno from emp e,dept d where e.deptno=d.deptno;

---非等值连接
---查询员工的工资等级
select * from emo e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal;

---等值连接---内连接:deptno不是空的情况下,才进行相连
select * from emp,dept where emp.deptno=dept.deptno;
---外连接:有的部门没有员工
---右外连接
select * from emp e,dept d where e.depto(+)=d.deptno;
---外连接:有的员工没有部门
---左外连接
select * from emp e,dept d where e.depto=d.deptno(+);
---自连接
---查询员工的姓名,员工的部门领导的姓名
select a.ename 员工的姓名,b.ename 部门领导的姓名 from emp a,emp b where a.mgr=b.empno;
---三表查询
---查询员工的姓名,员工的部门编号,员工部门所在的位置
select e.ename,e.deptno,c.cname from emp e,dept d,city c where e.deptno=d.deptno and d.loc=c.cid;

---两张表进行关联
---92语法:笛卡尔积
select * from emp,dept;
---99语法
select * from emp cross join dept;
---过滤掉无效数据
---92语法:利用内连接(等值连接)
select * from emp e,dept d where e.deptno=d.deptno;
---99语法
select * from emp natural join dept;
---区别:在92语法中,emp表中的deptno和dept表中的deptno最后都会显示出来,
---但是在99语法中,两个字段会合成一个字段展示
---下面语句比较特殊,在选择公共字段时,92语法必须加所属表,在99语法中,不可以加所属表
select d.deptno from emp e,dept d where e.deptno=d.deptno;
select deptno from emp natural join dept;
---自然连接,连接两张表中所有的相同字段
---比如两张表emp和dept中有两个相同字段,deptno,a
---92语法
select * from emp e and dept d where e.deptno=d.deptno and e.a=d.a
---99语法
select * from emp natural join dept;
---99语法中,通过指定的某个字段连接两张表
select * from emp inner join dept using (deptno);

---将表dept和city连接
---92语法
select * from dept d,city c where d.loc=c.cid;
---99语法
select * from dept d innner join city c on (d.loc=c.cid)
---on后面的是两张表连接的条件
---可否给这个表加上过滤条件:
select * from dept d inner join city c on (d.loc=c.cid and deptno>30)
select * from dept d inner join city c on (d.loc=c.cid) where deptno>30
---上面两句均可运行,但是推荐用第二句,因为on后面最好加连接条件,where后加过滤条件

---外连接
---92语法
---左外连接
select * from emp e,dept d where e.deptno=d.deptno(+);
---右外连接
select * from emp e,dept d where e.deptno(+)=d.deptno;
---99语法
---左外连接
select * from emp e left join dept d on e.deptno=d.deptno;
---右外连接
select * from emp e right join dept d where e.deptno=d.deptno;

---92没有全外连接,下面这句话报错
select * from emp e,dept d where e.deptno(+)=d.deptno(+);
---99全外连接
select * from emp e full join dept d on e.deptno=d.deptno;

---三表连接
---92语法
select * from emp e,dept d,city c where e.deptno=d.deptno and d.loc=c.cid;
---99语法
select * from emp e jion dept on e.deptno=d.deptno join city on d.loc=c.cid;

原文地址:https://www.cnblogs.com/gaoyao/p/13701162.html