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
- Understanding delete
- objC与js通信实现--WebViewJavascriptBridge
- 简单易学的机器学习算法——岭回归(Ridge Regression)
- QQ空间(日志、说说、个人信息)python爬虫源码(一天可抓取 400 万条数据)
- 文本分类实战: 机器学习vs深度学习算法对比(附代码)
- ReactJS分析之入口函数render
- 简单易学的机器学习算法——SVD奇异值分解
- AngularJS源码分析之依赖注入$injector
- 使用yield进行异步流程控制
- 【Java提高十七】Set接口集合详解
- 如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析
- 使用ETag进行session的降级
- 关于oracle中的反连接(r3笔记第95天)
- 用Python爬取网易云音乐的用户评论文本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Centos7.4 zabbix3.4.7源码安装的方法步骤
- CentOS7环境搭建python3以及与python2实现共存的方法
- centos7.0安装离线JDK1.8方法详解
- ubuntu中swap(虚拟内存)设置方法
- 详解Linux监控重要进程的实现方法
- CentOS环境下安装Redis3.0及phpredis扩展测试示例
- 使用Apache commons-cli包进行命令行参数解析的示例代码
- 详解如何在Ubuntu 16.04上增加Swap分区
- Mac本地文件上传到CentOS云服务器方法
- linux中把.c的文件编译成.so文件
- Ubuntu16.04 中 locate文件查找命令
- Ubuntu 16.04与Apache虚拟主机配置的步骤详解
- Linux删除目录下的文件的10种方法小结
- 利用Linux防火墙隔离本地欺骗地址的方法详解
- 视图在SQL中的作用是什么,它是怎样工作的?