朋友工作的原因,端午节也没闲着,陪这个祸害整理了一下数据库的sql指令,并且整理配套的习题进行练习使用,我正好也没啥事,疫情的原因啥也干不了,就陪他整理一波,顺便薅一波羊毛,嘿嘿嘿
不过,因为真的是文字太多了,所以只展示一部分,需要完整文档以及sql文件的,关注公众号:Java架构师联盟,后台添加小助手获取吧
第一天:
第一节课:数据库基本概念学习
数据 书
其实就是表示信息的一种特殊符号的集合
例如:图片、txt、音频、视频等等
引入:互联网的发展交互的其实就是数据
数据库: 图书馆
把用来存储数据的东西称之为数据库。
数据库管理系统 应用程序 图书馆管理系统
将数据按照指定的方式存储到数据库中的系统称之为数据库管理系统
可以高效率的取出存储好的数据(重点)
数据库应用系统----给普通用户使用的,像淘宝网等
数据库系统
数据库管理员
数据库
数据库管理系统
数据库应用系统
用户
oradata:数据库相关信息
product:数据库管理系统的相关信息
bin:数据库管理系统软件的启动目录
jdbc:数据库和java连接所需的jar包
network:数据库管理系统所需网络配置目录
log目录:oracle异常日志信息存储目录
第二节课:常见数据库及数据库存储结构
数据库存储数据结构
网状结构
层次结构
二维表结构:
二维表结构可以清晰的将数据与数据之间的关系表述清楚
注意:
单纯的存储数据很简单,但是存储好的数据又要将数据之间的关系描述清楚
就会比较困难,所以采用二维表的结构存储数据会比较合理
数据库管理系统
oracle:大型数据库管理系统
mysql:中小型
DB2:中小型
Acess:小型
Sql Server:大型数据库
.....
oralce的历史介绍 参照PPT
第三节课:oralce的安装及oracle目录结构介绍及卸载
oracle的安装:
参照百度搜索“oracle11g安装图解”
全局数据库名:默认是orcl,是用来唯一标示数据库的名字
SID:在程序中唯一标示数据的名字
oracle的服务:(需要开启的服务)
orcaleServiceorcl:orcale启动服务
OracleOraDb11g_home1TNSListener:oracle监听器服务
OracleDBConsoleorcl:控制台服务
oracle账户:
sys:超级管理员
system:管理员
scott:普通用户 默认密码:root
oracle修改密码:
在cmd命令行中使用命令:sqlplus / as sysdba
然后使用命令:
alter user 用户名 identified by 新密码;
在cmd命令行中使用命令:sqlplus /nolog
然后使用命令:conn as sysdba
然后输入一个已知的用户名和密码
然后使用命令:
alter user 用户名 identified by 新密码;
新建用户:
必须使用System账户
第四节课:oracle目录及卸载
oracle的目录介绍:
oradata:数据库存储文件的目录
db_home:
network >admin:配置网络服务和监听器服务
jdk:oracle自带jdk
deinstall:卸载命令
jdbc:与java交互的jar包
oracle的卸载:
使用oracle自带的程序卸载
删除app目录
删除注册表
删除环境变量
第四节课:oracle的监听器及服务器配置
问题1:
我的电脑装了oralce,同桌怎么查看数据?
客户端:
针对普通用户使用的软件,主要是用来发送用户的请求。
服务器:
接受用户的请求,并处理用户的请求。
问题2:张三和李四都装了oracle,王五装了客户端,王五要访问张三,怎么访问?
ip
tcp
数据库全局名
端口号
问题3:
从服务器的角度观察,假如1000个请求过来,怎么区分那些是请求数据库的
监听器
第三方工具:plsql(不是客户端)
配置本地网络服务:(客户端)
第一种使用暴力方式直接操作:
修改:C:appAdministratorproduct11.2.0dbhome_1NETWORKADMIN nsnames.ora
ORCL = >网络服务名
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 服务器ip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
第二种方式:
使用图形界面:NCA
配置监听器:(服务器端)
常见问题:
配置监听器,计算机名必须是英文的
第一天的主要任务是安装数据库和配置数据库的网络服务,第二天正式进行sql语句的学习
===========================================================================================================================================
第二天:
第一节课:sql语言介绍
数据库表的介绍
emp表:员工表
dept表:部门表
salgrady:薪资水平表
Balance:
基本的查询语句:
知识点:
select * from 表名 查询表中所有的数据
select 字段名1,字段名2,..from 表名 查询指定字段的所有值,不同字段之间使用逗号隔开
使用算术表达式:select 字段名(运算符),字段名(运算符)...from 表名
案例:
select * from emp---查询所有员工信息
select ename,job,sal from emp--查询员工姓名,工作,薪资
查询所有员工一年的工资,以及每位员工年终3000后的所有薪资(不包括津贴)
select ename,job,sal*12,sal*12+3000 from emp 使用运算符
第二节课:
使用别名
as可以省略不写,如果有特殊字符获取空格使用双引号添加别名
select ename 姓名,job 工作,sal*12 年资,sal*12+3000 年薪 from emp 直接在字段后面添加别名
select ename "姓名",job 工作,sal*12 ’年资’,sal*12+3000 年薪 from emp 使用双引号添加别名,不能使用单引号
select ename as 姓名,job "工作",sal*12 年资,sal*12+3000 年薪 from emp 使用as关键字添加别名
select ename "姓 名",job 工作,sal*12 年资,sal*12+3000 年薪 from emp 如果别名中有空格或者其他特殊字符,使用双引号
使用链接符:
select ename,job,sal from emp;
select ename||job,sal from emp; 使用||符号进行字符链接
select ename||" 的工作是 "||job||" 并且月工资是 "||sal from emp; 字符链接,普通字符使用单引号
去除重复 distinct
select * from emp;
select job from emp--发现工作是重复的,而工作种类是需要去除重复的
问题:查看员工工作种类
select distinct job from emp 使用distinct关键字去除重复值
问题;怎么多字段去除重复
select distinct job,sal from emp; 多字段去除重复,去除的是重复的一整条信息
排序
知识点:
select 字段名,字段名...from 表名 order by 字段名
select *from 表名 order by 字段名
讲解:
--查询员工姓名,工作,薪资
select ename,job,sal from emp
--查询按照薪资排序的员工姓名,工作,薪资
select ename,job,sal from emp order by sal; 使用order by排序
select ename,job,sal from emp order by sal desc; 使用desc关键从大到小排序
select ename,job,sal from emp order by sal asc; 使用asc关键从小到大排序,默认是从小到大排序
select * from emp order by sal,ename 多字段作为排序条件的时候,优先按照第一个字段排序,然后依次按照其他字段排序。
select ename,job,sal 工资 from emp order by 工资 使用别名
select ename,job,sal from emp order by sal*12 使用算术表达式
第三节课:简单的where子句
使用where条件进行结果筛选
语法:select * from 表名 where 条件;注意:条件中字段值区分大小写,字段名不区分大小写,字段值使用单引号括起来
在where中使用算术表达式 = ,< , > ,>= ,<= ,<>
使用order by 对筛选结果进行排序,order by 出现在where后面
查看工资等于1250的员工信息
select * from emp where sal="1250"--筛选条件是个数字也可以使用单引号
查看工作等于CLERK的员工信息
select * from emp where job="CLERK"--在筛选条件中字段值如果是字符需要加上单引号
select * from emp where job="clerk"--在sql语句中字段的值是区分大小写的
select * from emp where JOB="CLERK"--在sql中字段是不区分大小写的
查看工资大于1250的员工姓名和工作
select ename,job ,sal from emp where sal>"1250" order by sal--使用order by 对筛选结果进行排序,order by 出现在where后面
查看工资大于等于2000的员工信息
select * from emp where sal>=2000;
查看工资小于等于2000的员工信息;
select * from emp where sal<=2000
查看工资不等于1500的员工信息
select * from emp where sal<>1500 order by sal
查看入职日期在81年后的员工信息
select * from emp where hiredate>"1981年12月31号"
select * from emp where hiredate>"1981/12/31"
select * from emp where hiredate>"31-12月-1981"--使用日期的默认格式查询符合要求的数据,日-月-年
第四节课:where子句使用关键字
使用where子句进行结果的筛选
知识点:where查询条件中使用关键字
and 用于多条件的与筛选:select * from 表名 where 条件 and 条件 and 条件....
or 用于多条件的或筛选: select * from 表名 where 条件 or 条件 or 条件....
in 用于多条件的或筛选: select * from 表名 where 字段名 in(值,值,值....)
like用于模糊查询: select * from 表名 where 字段名 like "%值%" 包含
is null 和is not null 用来判断字段是否为空 select * from 表名 where 字段名 is null
讲解: 在where子句中使用关键字(and, or ,like, is null,is not null,between and,)
--查询工资在2000-3000之间的员工信息
select * from emp where sal>=2000 and sal<=3000--使用and关键字进行"与"的多条件筛选;
select * from emp where sal between 2000 and 3000;--使用between and 关键字进行筛选;
--查询工作为SALESMAN,ANALYST,MANAGER的员工信息
select * from emp where job="SALESMAN" or job="ANALYST" or job="MANAGER"--使用or关键字进行"或"的多条件筛选
select * from emp where job in("SALESMAN","ANALYST","MANAGER");--使用in关键字进行"或"的多条件筛选
select * from emp where job="ANALYST"
--查询姓名中包含s的,以s开头的,以s结尾的,第二个字符为A的。
select * from emp where ename like "%S%";--使用like关键字,姓名中包含S的,%代表任意多个字符
select * from emp where ename like "S%";--使用like关键字,以S开头的
select * from emp where ename like "%S";--以S结尾的
select * from emp where ename like "_A%"--使用"_"指定位置包含指定字符的信息,"_"代表任意一个字符
--------------查询名字中包含下划线的用户信息
select * from emp where ename like "%A_%"escape "A";--使用escape关键字将普通字符设置成为转译字符。
--查询有津贴的员工信息
select * from emp where comm is not null;
select * from emp where comm is null;--查询没有津贴的员工信息
第五节课:函数学习
--查询工作为SALESMAN,MANAGER并且工资大于2500的员工信息
--1、使用小括号提升where筛选条件的执行优先级别
--2、and的优先级别高于or
select * from emp
select * from emp where job="SALESMAN" or job="MANAGER" and sal>2500
select * from emp where (job="SALESMAN" or job="MANAGER") and sal>2500
-----------------------------------------------------------------------------------------------------------
使用函数 单行函数 多行函数 转换函数 其他函数
--单行函数学习:不改变原始数据,只改变结果
---1、字符函数
select * from emp;
select INITCAP(ename) from emp;--initcap函数将首字母大写
select lower(ename)from emp;--lower 字母小写
select replace(ename,"S","M") from emp;--replace 替换
--2、数值函数--Math
----伪表 dual
select * from dual
select abs(-3) 绝对值,ceil(3.1415926)向上取整,floor(3.1415926)向下取整,power(2,3)幂,round(3.4)四舍五入 from dual
--3、日期函数
select months_between("13-12月-2016","13-10月-2016") from dual--months_between两个日期之间的月份数
第六节课:多行函数学习
多行函数 :
max: max(字段名) 返回此字段的最大值
min:min(字段名) 返回此字段的最小值
avg:avg(字段名) 返回平均值
sum:sum(字段名) 返回字段的和
count:count
--count(*),用来查询表中有多少条记录
--count(字段名),用来查询某个字段有值的个数
--count(distinct 字段名),可以先去除重复再计数。
注意:
--多行函数不能和普通字段直接出现在查询语句中,除非group by
--多行函数和单行函数不能直接出现在查询语句中,除非group by
查看员工的最高工资
select max(sal),ename from emp--多行函数不能和普通字段直接出现在查询语句中,除非group by
select max(sal),lower(ename) from emp--多行函数和单行函数不能直接出现在查询语句中,除非group by
select ename from emp
查看员工的最低工资
select min(sal) from emp
查看员工的平均工资
select avg(sal) from emp
查看所有的员工工资之和
select sum(sal) from emp
查询公司有多少员工
select * from emp
select count(*) from emp--使用count(*)来查看一张表中有多少条记录
查询有津贴的员工人数
select count(comm) from emp--使用count(字段名),查询该字段有值的记录数
select count(ename) from emp
查询公司有多少工作种类
select count(job) from emp
select count(distinct job) from emp
========================================================================================================================================
第三天:
第一节课:转换函数学习
转换函数:在转换的时候改变的是数据的类型,数据内容不会改变,可以指定格式。
to_number:将数字字符转换为数字类型的数值,to_number(数字字符)
to_char:将数字转换为字符类型,将日期转换为字符类型 to_char(数字/日期)
to_date:将字符类型的日期转换为日期类型: to_date(char)
--------------------------------------------------------------------------------------
number-->char 转换的时候使用的是默认格式,
select to_char(123) from dual--将数字转换为字符类型,使用to_char(number)
select sal, to_char(sal) from emp
number-->char 使用指定的格式
to_char(number,"格式"),格式:
$代表美元符,9代码数字占位。例如,L999,999,999表示三位一组的显示方式L代表人民币符号,0代表保留数字个数,不足使用0补充。
select to_char(sal),to_char(sal,"L999,999,999") from emp
select to_char(sal),to_char(sal,"L0000.00") from emp
char--->number to_number(数字字符)
select to_number("123") from dual
char--->date,转换的字符必须是日期格式的字符串,默认格式 dd-mm-yyyy
注意:因为字符串有很多,所以在字符转换为日期的时候,需要指定格式,因为日期是具备一定格式的字符组合。
字符转换为日期的时候,指定的格式为字符的日期顺序,无需指定间隔符。
yyyy:表示年 mm:表示月 dd表示日
select to_date("05-12月-2016") from dual;
select to_date("2016-05-12","yyyy-mm-dd") from dual--使用指定的格式将指定的日期字符串转换为日期
select to_date("12-05-2016","mm/dd/yyyy") from dual
date--->char
注意:因为日期本身就具备一定的格式在不是指定格式的情况下会默认使用dd-mm-yyyy格式显示数据
指定的格式会作为日期转换为字符串类型的显示格式存在。例如:
yyyy-mm-dd" ‘2016-12-05’
yyyy/mm/dd" "2016/12/05"
yyyy"年"mm"月"dd"日"" 2016年12月05日
select hiredate,to_char(hiredate) from emp--日期转换为字符的时候,不指定格式使用默认格式:dd-mm-yyyy
select hiredate,to_char(hiredate,"yyyy-mm-dd") from emp;--使用指定格式将日期转换为字符串类型
select hiredate,to_char(hiredate,"yyyy/mm/dd") from emp;--使用指定格式将日期转换为字符串类型
select hiredate,to_char(hiredate,"yyyy"年"mm"月"dd"日"") from emp;--使用指定格式将日期转换为字符串类型
查询入职日期在81年10月20日后的员工信息
第一种:自动转型
select * from emp where hiredate>"20-10月-1981"
第二种:将日期转换为字符串
select * from emp where to_char(hiredate,"yyyy-mm-dd")>"1981-10-20"
第三种:
select * from emp where hiredate>to_date("1981-10-20","yyyy/mm/dd")
第二节课:其他函数:
单行函数:lower
多行函数:min max sum avg count
转换函数:to_number to_char to_date
-----------------------------------------------------------------------------------------
其他函数:
nvl():nvl(字段名,执行)--相当于java中的if条件判断
nvl2():nvl2(字段名,值,值)--相当于java中的If(){}else{}判断
decode():decode(字段名,条件1,执行内容1,条件2,执行内容2,条件3,执行内容3,默认执行内容)
相当于java中if(){}else if(){}else if(){}...else{}
查询所有员工的月薪及姓名和工作
select * from emp
select ename,sal 基本工资,comm 绩效,sal+comm 月薪 from emp
select ename,sal 基本工资,comm 绩效,sal+nvl(comm,0)月薪 from emp
查询所有员工的月薪及姓名和工作
select ename,sal 基本工资,comm 绩效,nvl2(comm,sal+comm,sal)月薪 from emp
显示员工的职称
select ename,job,decode(job,"MANAGER","经理","SALESMAN","销售人员","普通员工") from emp
第三节课:使用group by分组
在多行函数中不能直接使用普通字段,除非group by
在多行函数中不能直接使用单行函数,除非group by
group by学习:
---1、使用group by进行数据分组 select 多行函数,分组字段 from 表名 group by 分组字段
---2、多字段进行分组的时候,按照字段顺序进行分组,第一条件分组完成后,继续使用其他条件依次分组。
---3、group by依然可以和order by 联合使用
---4、可以和单行函数联合进行分组,注意使用了单行函数那么在查询语句中必须也要使用
查询最高工资和员工数
select max(sal),count(*) from emp
查询不同部门的最高工资
select * from emp order by deptno
select deptno,max(sal) from emp group by deptno--使用group进行分组查询,分组的字段可以出现在查询中,其他字段依然不可以
查询不同工作岗位的员工数
select * from emp for update
select lower(job),count(*) from emp group by lower(job)--使用单行函数进行分组
查询不同部门的不同工作岗位的人数
select deptno,job ,count(*) from emp group by deptno,job--使用多字段组合进行分组
select deptno,job ,count(*) from emp group by deptno,job order by deptno
查询不同部门的不同工作岗位的并且人数大于1的信息t count(*) from emp where count(*)>3 group by deptno
selec
select deptno,job ,count(*) from emp where count(*)>1 group by deptno,job order by deptno
查询部门号大于10的不同部门的不同工作岗位的人数
select deptno,job ,count(*) from emp where deptno>10 group by deptno,job order by deptno
使用having进行分组后筛选
having学习:
--1、使用group by分组后在进行数据筛选的时候,where中不能出现多行函数,所以使用新的关键字having进行条件筛选
--2、where条件筛选的执行顺序:from-->where--->group -->select
--3、having条件筛选的执行顺序:from-->group by -->having-->select
--4、where的执行效率比having要高,能使用where的情况下尽量不要使用having
查询不同部门的不同工作岗位的并且人数大于1的信息
使用where语句进行筛选
where条件语句sql执行顺序:from-->where--->group -->select
select count(*) from emp where count(*)>1 group by deptno,job
使用having语句进行筛选
having条件语句的执行顺序:from-->group by -->having-->select
select deptno, count(*) from emp group by deptno having count(*)>5
select deptno,job ,count(*) from emp group by deptno,job having deptno>10 order by deptno
第四节课:插入数据学习及数据的备份
单表查询语句(select)
插入数据(insert)
语法规范 insert into 表名(字段1,字段2,字段3,....)values("值1","值2","值3".....)
主键:用来唯一标识一条数据的字段通常设置主键,主键是唯一不可以重复的
如果插入的数据是全字段数据,字段可以省略不写。部分字段,必须加上字段说明和字段值,但是主键不能为空
事务的提交:如果一个事件是由多个动作组成,只要有一个动作没有执行成功则自动将数据回滚到原始状态,此们技术称之为事务
保证数据的安全和完整
事物的提交:
使用第三放插件的提交按钮
使用commit语句
增加删除修改的数据sql语句执行完毕后,不会立马进入数据的写入
需要手动的对数据进行提交,如果数据有问题还可以回滚
select * from dept for update
在北京新建了一个名为LOL学院的新部门,请插入
insert into dept(deptno,dname,loc)values("50","lol学院","北京");
主键是唯一不可以重复的
insert into dept(deptno,dname,loc)values("50","教学部","北京");
如果插入的数据是全字段数据,字段可以省略不写。部分字段,必须加上字段说明和字段值,但是主键不能为空
insert into dept values("80","教学部","北京");
insert into dept values("90","教学部","北京");
insert into dept values(100","教学部","北京");
insert into dept values("110","教学部","北京");
创建数据的备份
(1)create table 表名 as 查询语句,创建的是和查询结果一样的表,查询结果是什么就会备份一个相同的表
(2)insert into 表名 查询语句,注意:查询出来的结果在结构上必须和插入数据的表相同,字段个数必须相同
(3)注意:备份表只有字段和数据相同,并不会备份约束。
备份完整的数据和表
select * from dept;
create table tdept as select * from dept;--备份dept表和数据,只能备份数据和字段
select * from tdept
备份完整表
create table tdept1 as select * from dept where 1>2--备份表,不备份数据。
备份部分数据和表.create table 表名 as 查询语句,创建的是和查询结果一样的表,查询结果是什么就会备份一个相同的表
create table tdept2 as select dname,loc from dept
select *from tdept2
给备份表添加数据 insert into 表名 查询语句,注意:查询出来的结果在结构上必须和插入数据的表相同,字段个数必须相同
select * from tdept1
insert into tdept1 select dname,loc from dept where deptno>40
select *from tdept2
insert into tdept2 select dname,loc from dept where deptno>40
第五节课:数据的更新和删除:
更新数据:update
语法结构:update 表名 set 字段名1="字段值1",字段名2="字段值2",...where 条件
将部门70的名字改为教学部2
update dept set dname="教学部2" where deptno="70"
update dept set dname="教学部2",loc="上海" where deptno="70"
select * from dept
删除数据:delete
1)删除语句:delete 表名 where 条件
--删除部门标号为70的数据
delete dept where deptno="70"---删除指定数据
select * from dept
delete tdept---清空表数据
truncate table tdept---清空表数据建议使用truncate关键字,但是此关键字不能回滚数据
===================================================================================================================================
关注公众号:Java架构师联盟,后台回复mysql获取数据库相关资料