-
初识数据库
-
什么是数据库技术
- 数据库技术所研究的问题就是如何科学地组织和存储数据,如何高效地获取和处理数据
-
SQL
- Structured Query Language结构化查询语言
- 专为数据库而建立的操作命令集,一种功能齐全的数据库语言
- 在使用SQL,只需做出“做什么”的命令,“怎么做”是不用使用者考虑的
-
DB,DBS,DBMS之间关系
-
数据 Data
- 对客观事物的符号表示,数据是数据库中存储的基本对象
- 为了存储和处理,将事物特征抽象出来组成一个记录
- 学生档案中的学生记录
- (崔半仙,男,2000,上海,计算机系,2018)
- 数据的形式不能完全表达其内容
- 数据的解释
- 崔半仙是个大学合适呢个,2000年出生,上海人,2018年考入计算机系
-
数据库 DB
- 长期存储在计算机内的、有组织的、可共享的数据集合
- 数据库中的数据按一定的数据模型组织、描述和存储
- 具有较小的冗余度、较高的数据独立性和易扩展性,并可为各个用户共享
-
数据库管理系统 DBMS
- 位于应用程序与存储数据的之间的一层数据管理软件
- 基础软件,一个大型复杂的软件系统
- 用途
- 科学地组织和存储数据
- 高效地获取和维护数据
- 主要功能
- 数据库的定义功能
- 在SQL语言中——DDL语言(数据库定义语言),提供了三个语句:creat(创建)、alter(修改)、drop(删除),操作的对象是数据库中的基本架构—表
- 数据库中存储的各种各样的数据以表的形式来组织和存放的
- 数据库的操作功能
- 借助于SQL语言——DML(数据库操作语言),实现对数据库中存储的数据进行增删改查的操作(insert、delete、update、select)
- 数据库的保护功能
- 数据库的数据恢复、数据库的并发控制、数据完整性控制和数据安全性控制
- 数据库的维护功能
- 数据库中表结构和数据的维护功能
- 数据库的数据导入、转换、存储、数据库性能监控
- 数据库的定义功能
-
优点
- 相互关联的数据的集合
- 较少的数据冗余
- 程序与数据相互对立
- 保证数据的安全、可靠、正确
- 数据可以并发使用并能保证一致性
-
数据库系统 DBS
- 一般由数据库DB、数据库管理系统DBMS(及其开发工具)、应用系统、数据库管理员DBA和用户构成
- 发展经历
-
网状数据库 层次数据库 关系数据库 数据组织方式 网状模型 层次模型 关系模型 架构 图形结构 树形结构 表 - 关系型数据库
- 信息:指的是数据经过加工处理后所获取的有用知识,信息也是以某种形式来表示的
- 信息的分类——信息的三种世界
- 现实世界:存在于人脑之外的客观世界
- 信息世界(观念世界):现实世界在人们头脑中的反映
- 数据世界:信息世界的产物在计算机中的表示
- 实体-联系 模型
- 实体:客观事物在信息世界中称为实体(Entity),是现实世界中任何可区分、识别的事物
- 属性:描述实体或者联系的性质或特征的数据项
- 联系
- 反映事物内部或事物之间的关联集合
- 常见的实体联系:一对一、一对多和多对多
-
-
-
关系模型
-
关系的基本概念
- 关系:一个关系就是一张二维表,通常将一个没有重复行、重复列的二维表看成一个关系,每个关系都有一个关系名
- 元组:二维表的每一行在关系中称为元组,在MySQL中,一个元组就是一个记录
- 属性:表中的列,也叫做字段
- 域:属性的取值范围。(列的取值范围)
- 关键字:关系中能唯一区分、确定不同元组的属性或属性集合(列,一个列或多个列看作是关键字)唯一、不重复、不能为空。
- 主键(主关键字):针对一个表中某个列来说,假如一个表中的某个列设置为主键,那么这个列就一定要求:唯一、不重复、不为空
- 外键:针对两个表来说的,加强表与表之间的联系。
-
关系模式
- 对关系的描述称为关系模式格式为:关系名(属性名1,属性名2,...,属性名n)
-
关系的基本特点
- 关系必须规范化,属性不可再分割
- 在同一关系中不允许出现相同的属性名
- 在同一关系中元组的顺序可以任意
- 在同一关系中属性的顺序可以任意
-
关系运算
- 选择
- 从关系模式中找出满足给定条件的元组组成新的关系
- (从行的角度进行的运算)
- 投影
- 从关系模式中执行若干属性组成新的关系
- (从列的角度进行的运算)
- 连接
- 从两个关系的笛卡尔积中选取属性间满足一定条件的元组,组成新的关系
- 选择
-
-
关系的完整性约束
-
实体完整性
- 主属性值(主关系键的值)不能取空值
-
参照完整性(引用完整性)
-
- 从表参照主表—>从表所做的操作,必须询问主表的意见,主表有的,才能做对应操作;主表没有,就不能进行操作
- 从表中列不是随便参照主表的某个列,必须要求参照主表的这个列必须是主键或唯一约束
-
-
域完整性(用户定义完整性)
- 限制某个列的取值要求,把取值固定在一个有效的集合范围
-
-
三范式
-
关系模式的规范化
- 关系模式要满足的条件成为规范化形式,简称范式
- 目的:为了消除存储异常,减少数据冗余,保证数据的完整性和存储效率,一般规范为3NF即可
-
第一范式 1NF
- 如果关系R的所有属性均为简单属性,即每个属性都是不可再分的,则称R满足第一范式
-
第二范式 2NF
- 如果关系R满足第一范式,且每一个非主键字段完全依赖于主键,则称R满足第二范式
-
第三范式
- 如果关系R满足第二范式,其非主键字段之间不存在依赖关系,则称R满足第三范式
- 一个基本的关系型数据库要满足第一范式;
- 一个完整的关系型数据库要满足第三范式
-
-
ER图
- E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型
- 实体:矩形
- 属性:椭圆
- 联系:菱形
-
MySQL数据库的使用
-
常见数据库
- Oracle
- 应用广泛、功能强大,分布式数据库系统
- 可移植性号
- MySQL
- 开源、免费、与PHP组成经典的LAMP组合
- 快速的、可靠的和易于使用
- SQL Server
- Web上最流行的用于存储数据的数据库
- 易用性好但只能在Windows上运行
- Oracle
- 查看现有的数据库
- show databases;
- 创建数据库
- 格式:create database 数据库的名字;
- 删除自己的shujuku
- drop database 库名;
-
-
-
数据库建表原则和方式
-
MySQL数据类型分类
-
数值
- 整数类型:int
- 小数类型:decimal
- 小数格式:decimal(总长度,小数位)
- decimal(5,2) 要求传递过来的数据总长为5位,小数位2位 eg123.45
-
日期/时间
- 日期和时间类型位DATETIME、DATE、TIMESTAMP、TIME和YEAR
- 每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用零值
-
-
字符串(字符)类型
- CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、SET
- CHAR 字符串的长度——定长
- VARCHAR 字符串的长度——变长
-
-
数据库建表方式和原则
-
表的创建语法
- Create table 表名( 属性名1 数据类型 [约束条件], 属性名2 数据类型 [约束条件], 属性名3 数据类型 [约束条件] );
- []括号内容为可选内容
- 最后一个属性后没有逗号
-
数据库中注释
- 单行注释 -- 注释内容
- 多行注释 、*/多行注释内容 、*
-
删除表
- drop table 表名;
- 删除多个表
- drop table 表名1,表名2...
-
修改表
- 添加列(属性)
- alter table 表名 add 属性名 数据类型;
- 删除列(属性)
- alter table 表名 drop 属性名;
- 修改属性
- alter table 表名 modify 属性名 数据类型;
- 修改字段名
- alter table 表名 change 就字段名 新字段名 数据类型;
- 添加列(属性)
-
显示表结构
- desc 表名;
-
实例 create datbase MYDB;
-- 先切换数据库,准确切换到要操作的数据库
use mydb;
-- 创建表 student(学号,姓名,年龄,性别)
Create table student( 学号 varchar(10) 姓名 varchar(15),
年龄 int,
性别 char(2) );
--创建员工信息表 员工编号 姓名 工资小数5,2 入职日期datetime
Create table 员工信息表( 员工编号 varchar(7) 姓名 varchar(15),
工资 decimal(5,2),
入职日期 datetime );
-- 删除student表
drop table student;
-- 删除员工信息表
drop table 员工信息表;
-- 给student表添加专业 字符串7
alter table student add 专业 varchar(7);
-- 给student表添加一个出生地 char(10)
alter table student add 出生地 char(10);
-- 删除student表中出生地
alter table student drop 出生地;
-- 更改student表中学号为整型
alter table student modify 学号 int;
-- 把员工信息表中员工编号改成工号
alter table 员工信息表 change 员工编号 工号 varchar(7);
--查看student表结构
desc student;
-
数据的完整性
-
存储在数据库中的数据应该保持准确性和可靠性。
-
-
实体完整性
-
对关系中的记录唯一性
-
定义表中的所有行能唯一的标识
-
表中主属性(字段)不能为Null且不能有相同值
-
一般用主键、唯一索引、unique关键字来实现
-
主键约束
-
主关键字primary key是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录
-
一个表中有且只有一个主键约束
-
创建表时指定主键
-
添加主键约束
-
建表时是直接添加
-
Create table 表名( 列名1 数据类型 primary key,
列名2 数据类型
);
-- 主键约束的名字写法:PK_列名
Create table 表名( 列名1 数据类型,
列名2 数据类型,
constraint 主键约束的名字 primary key(列名1)
);
Create table 表名( 列名1 数据类型,
列名2 数据类型,
primary key(列名1)
);
-
- 针对已经存在的表,添加主键约束
-
alter table 表名 modify 列名 数据类型 primary key;
alter table 表名 add primary key(列名); alter table 表名 add costraint 主键约束的名字 primary key(列名);
-
-
- 删除主键约束
- alter table 表名 drop primary key;
-
- 联合主键
- 把两个列看成是一个整体,这个整体不为空、唯一、不重复
- 创建表的同时创建联合主键
-
-- 主键约束的名字写法:PK_列名
Create table 表名( 列名1 数据类型,
列名2 数据类型,
constraint 主键约束的名字 primary key(列名1,列名2)
);
Create table 表名( 列名1 数据类型,
列名2 数据类型,
primary key(列名1,列名2)
);
-
- 针对已经存在的表
-
alter table 表名 add primary key(列名1,列名2); alter table 表名 add costraint 主键约束的名字 primary key(列名1,列名2);
-
-
唯一约束
- 指定table的列或列组合不能重复,保证数据的唯一性
- 不允许出现重复的值,但可以为多个null
- 同一个表可以有多个唯一约束,多个列组合的约束
- 如果不给唯一约束名称,就默认和列明相同
- MySQL会给唯一约束的列上默认创建一个唯一索引
- 添加唯一约束
- 创建表的同时创建
-
-- 唯一约束的名字写法:UN_列名
Create table 表名( 列名1 数据类型,
列名2 数据类型,
constraint 唯一约束的名字 unique(列名1),
constraint 唯一约束的名字 unique(列名2)
);
Create table 表名( 列名1 数据类型 unique,
列名2 数据类型 unique,
列名3 数据类型
);
-
- 针对已存在的表
- alter table 表名 add unique(列名1[,列名2]);
- 创建表的同时创建
- 删除唯一约束
- alter table 表名 drop index 唯一约束的名字
-
-
域完整性
- 对数据表中字段属性的约束
- 由确定表结构时所定义的字段的属性决定的
- 限制数据类型、缺省值、规则、约束、是否为空
- 域完整性可以确保不会输入无效的值
-
默认约束
- default
- 当默认约束来修饰某个列的时候,修饰的列即使不写数据也会默认一个值
- 创建表的同时创建
-
Create table 表名( 列名1 数据类型 default ‘字符串类型或者日期类型的默认值’,
列名2 数据类型 default 数值,
列名3 数据类型
);
-
-
针对已经存在的表
-
alter table 表名 modify 列名 数据类型 default '值',
-
-
删除默认约束
-
alter table 表名 modify 列名 数据类型,
-
-
非空约束
-
not null
-
在创建表的同时创建
-
-- 主键约束的名字写法:PK_列名
Create table 表名( 列名1 数据类型 not null,
列名2 数据类型 not null,
列名3 数据类型
);
-
- 针对已经存在的表创建
- alter table 表名 modify 列名 数据类型 not null,
- 删除非空约束
- alter table 表名 modify 列名 数据类型,
-
-
参照完整性
- 表与表之间的数据参照引用
- 使用外键约束实现
- 外键约束
- 外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系
- 表的外键值必须在主表中能找到
- 当主表的记录被从表参照时,主表的记录将不允许删除
- 如果要删除数据,需要先删除从表中依赖该记录的数据
- 创建表的同时创建外键约束
-
主表
Create table 表名(
列名1 数据类型 primary key,
列名2 数据类型
);
从表 FK_列表
Create table 表名(
列名1 数据类型,
列名2 数据类型,
constraint 外键约束的名字 foreign key(从表的列名) reference 主表表名1(列名1)
);
!!
关于引用的列的要求:从表的列和主表的列,列明可以不一样,但是这两个列的数据类型和内容必须保持一致
-
- 针对已经存在的表添加
- alter table 从表表名 constraint 外键约束的名字 foreign key(从表的列名) reference 主表表名1(主表列名);
- 删除外键约束
- alter table 表名 drop foreign key 外键约束的名字;
-
-
-
使用标准SQL增删改
-
SQL语言
- 一种数据库查询和设计语言
- 使得数据库可以通过命令行的方式而非图形化界面的方式对表进行增删改查等操作
- SQL是一门独立的语言,在开发语言中可以嵌入SQL语言对数据库进行操作
-
DDL语句
- 数据库定义语言
- create 创建库表
- alter 修改表
- drop 删除库表
-
DML语言
- 数据库操作语言,对表中数据的操作
- insert 插入(增)
- delete 删除(删)
- update 更新(改)
-
DML-INSERT
- 对表进行新增记录
- 插入的值和列要保持一一对应
-
insert into 表名(列名1,列名2,...) values(值1,值2,...); insert into 表名 values(值1,值2,...); insert into 表名 values(值1,值2,...),(值1,值2,...),(值1,值2,...),...;
-
DML-DELETE
-
对表的数据进行删除
-
和drop区别
-
delete仅限于把表中数据给删除,表还留着
-
drop是把表和数据一并删除
-
-
delete from 表名; 把整个表中的数据全部删除 delete from 表名 where 条件; 根据条件删除 and 多个条件同时满足
or 多个条件只需要满足其中一个
-
-
DML-UPDATE
-
对表的数据进行修改
-
update 表名 set 列名=值; update 表名 set 列名1=值1,列名2=值2....; update 表名 set 列名=值 where 条件;
-
-
查询数据
-
SELECT语句
- select 列名 form 表名;
- select 列名1,列名2,... form 表名;
- * 所有
- 使用关键词DISTINCT查询
- select distinct 列名 from 表名;
- 使用别名查询
- select 列名 '别名' from 表名;
- select 列名1 '别名1',列名2 '别名2',... from 表名;
- select 列名 as '别名' from 表名;
- select 列名1 as '别名1' ,列名2 as '别名2' ,... from 表名;
- 选择查询
- 一般查询都不是对全表所有行的查询,用到where子句
- select 列名 from 表名 where 条件;
- 比较搜索条件
- 比较运算符
- 逻辑运算符
- and 连接多个条件 必须同时满足
- or 连接多个条件 只需要满足其中一个
- 比较运算符
- 范围搜索条件
- 范围搜索返回介于两个指定值之间的所有值
- 包括范围 between
- 排除范围 not between
- 列表搜索条件
- in 关键字使用户可以选择和列表中的任意值匹配的行
- select 列名 from 表名 where 列名 in(值1,值2,..);
- 搜索条件中的字符匹配符
- like 关键字搜索与指定模式匹配的字符串、日期或时间值。
- select 列名 from 表名 where 列名 like '字符模式';
- 涉及空值的查询
- 空值NULL在数据库中表是不确定的值
- 判断某个值是否为NULL值,不能使用普通的比较运算符
- 判断取值为空的语句: 列名 is NULL
- 判断取值不为空的语句: 列名 is not NULL
- 聚合函数
- sum([DISTINCT]<列名>)——计算列总和
- avg([DISTINCT]<列名>)——计算列平均值
- max([DISTINCT]<列名>)——计算列最大值
- min([DISTINCT]<列名>)——计算列最小值
- count(*)——统计表中元组个数
- count([DISTINCT]<列名>)——统计列值个数
- select 聚合函数 from 表名;
- MySQL的行数限定
- select 列名 from 表名 limit [指定开始查询的行,] nums;
- select * from student limit 1,3;
- 数据分组
- group by 语句用于结合合计函数,根据一个或多个列对结果集进行分许
- select 列名,聚合函数 from 表名 group by 列名;
- 分组
- 先查询结果(先统计处相关的总数或者总和)
- 再进行分组(根据某个列来进行分组)
- having通常和group by子句一起使用,相当于一个用于组的where子句
- having子句可以包含聚合函数,但where不可以
- 排序
- order by 语句用于对指定的结果集进行排序
- order by 语句默认升序
- 降序排序可以使用 desc 关键字
- select * from 成绩表 order by 成绩 [desc];
-
-
MySQL函数
-
字符串函数
- length 可以返回字符串的字节长度
- char_length 返回字符串的长度
- MySQL数据库中一个汉字占3个字节,一个字母占1个字节
- mid 可以从某个位置获取某个长度的字符(不是字节)
- mid(原始字符串,截取的开始位置,截取的长度)
-
数值函数
- round(原始数据,保留的小数位)
- round(原始数据) 只保留整数部分
- least(值1,值2,...) 求最小的数字
- greatest(值1,值2,...) 求最大的数字
-
日期时间函数
- now() 获取日期和时间
- current_date() 获取日期
- current_time() 获取时间
- to_days(日期值) 将日期转换成总天数
- dayofyear(日期值) 求该年已过的天数
- week(日期值) 已过的周数
-
控制流函数
- if 有三个参数,第一个参数为空输出第三个参数,否则输出第二个参数
- if(布尔表达式,参数1,参数2)
- if(null,参数1,.参数2)
- ifnull 有两个参数,第一个参数为空输出第二个参数,否则输出第二个
- ifnull(参数1,参数2)
- ifnull(null,参数1)
- if 有三个参数,第一个参数为空输出第三个参数,否则输出第二个参数
-
表连接
- 前提:有时候所需的数据不止在一张表中,需要多个表做结合的查询,用连接实现
-
内部连接
- 内部连接是比较常用的一种数据连接查询方式
-
表连接的实现是通过where关键字进行
select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2,...
from 表名1,表名2
where 表名1.列名1=表名2.列名1;
[group by 列名]
[having 分组的条件]
[order by 列名] asc [desc]
表连接的实现是通过inner join on进行
select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2,...
from 表名1 [inner] join 表名2
on 表名1.列名1=表名2.列名1;
注意:如果查询的这个列两个表都有,在写的过程中列前面一定加表名;如果查询的这个列只属于一个表中的,直接写列名
进行表连接的列,列名可以不一致,但数据类型和值要保持一致
-
inner join on又划分为两个类
-
等值连接 指条件中只包含等号“=”,没有其他符号
-
非等值连接 指条件中除了等号外,还有其他符号
-
-
select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2,表名3.列名1,表名3.列名2,表名4.列名1,表名4.列名2,......
from 表名1,表名2,表名3,表名4
where 表名1.列名1=表名2.列名1 and 表名2.列名1=表名3.列名1 and 表名3.列名1=表名.列名1;
select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2,...
from 表名1 [inner] join 表名2
on 表名1.列名1=表名2.列名1 inner join 表名3
on 表名2.列名2=表名3.列名2;
-
外部连接
- 外部连接会返回FROM子句中提到的至少一个表或视图中的所有行
- 外部连接分为左外部连接、右外部连接
- 左外部连接
- 对连接条件中左边的表不加限制
- 返回左表的所有行
- 右外部连接
- 对连接条件中右边的表不加限制
- 返回右表的所有行
- 在from后 先写的是左表 后写的是右表
- 左外部连接
-
select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2,...
from 表名1 left outer join 表名2
on 表名1.列名1=表名2.列名1;
-- 返回左表的所有内容,如果在右表中没有匹配到,对应位置显示null
select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2,...
from 表名1 right outer join 表名2
on 表名1.列名1=表名2.列名1;
-- 返回右表的所有内容,如果在左表中没有匹配到,对应位置显示null
-
子查询
- 子查询在其他查询结果的基础上提供了一种有效的方式表示where子句的条件
- 子查询可以嵌套在select、insert、update、delete语句中
- 子查询的select查询总是用圆括号括起来
-
select 列名 from 表名 where 列名 in(select查询语句);
-
eg. select 列名 from 表名 where 列名 in(select 列名 from 表名 where 列名 in(select 列名 from 表名 where 条件));
-
eg. select 列名 from 表名 where 列名 in(select 列名 from 表名 where 条件);
-
-
注意事项:
-
where 后面条件要什么,子查询就查什么
-
什么情况优先考虑子查询?
-
题上给出的条件没有明显的提示结果
-
例:查询计算机系学生选修了哪些课程?问:计算机系学生有哪些?
-
-
where后面要用到聚合函数当条件
-
聚合函数不能直接写,就可以借助查询语句把聚合函数的结果查出
-
例:成绩大于平均成绩 where grade>(select avg(garade)from sc——> where grade>78
-
-
-
-
子查询分两种
-
嵌套子查询
-
子查询中还包含其他的子查询
-
select(select(select(select)))
-
-
相关子查询
-
单值子查询
-
只返回一个值,然后将一列值与查询返回的值进行比较
-
-
-
使用insert 和 select 语句添加数据
-
在insert语句中使用select子句可以将一个或多个表或视图中的值添加到另一个表总。使用select子句还可同时插入多行
-
insert into 表名 select查询语句
-
-
通过select语句生成的结果集,再结合insert语句,可以把结果集插入到指定的表中,这种方法用于插入的数据不确定(通常多于一条),并且具有一些特性
-
-
使用update和select语句(子查询)结合
-
update 表名 set 列名 where 列名 in(select语句)
-
-
删除语句
-
select from 表名 where 列名 in(select语句)
-
-
-
-
视图
-
视图view定义
- 视图是基于某个查询结果的虚表
- 其作用是方便用户对数据的操作
-
创建 create 视图
- create view 视图名字 as select查询语句;
-
修改视图
- 视图中不符合要求的数据或是错误的数据,可以使用update语句进行修改
- 对视图进行增删改的操作,原表数据也会受影响
- alter view 视图名字 as select查询语句;
- 插入数据: insert into 视图名字 values(值1,值2,...);
- 修改数据:update 视图名字 set 列名=值 where 条件;
-
删除视图
- drop view;
- 删除视图数据:delete from 视图的名字 where 条件;
-
-
索引
-
索引定义
- MySQL的索引是对数据库表中一个或多个列的值进行排序的结构。索引有助于更快的获取信息。是用来定位的。
- 对表中的列是否创建索引,以及创建何种索引,对于查询的响应速度会有很大差别。创建了索引的列几乎是立即响应,而不创建索引的列则需要较长时间的等待。
- 在数据库系统中创建索引主要有以下作用:
- 加快数据检索;(定位)
- 保证数据的唯一性;(唯一约束)
- 实现表与表之间的参照完整性;
- 在使用GROUP BY、ORDER BY子句进行查询时,利用索引可以减少排序和分组的时间。
- 缺点
- 索引需要占用磁盘空间
- 当对表中的数据进行增加、删除和修改时,索引也要动态维护,降低了数据的维护速度
-
索引分类
-
创建create索引
-
删除索引
-
-
Oracle数据库实例
-
数据库实例
- Oracle数据库中的表与数据
- 实例 = 表 + 数据
-
数据库实例的开启与关闭
-
sys 超级系统管理员 完成
-
开启
- 只有数据库实例开启之后,我们才能访问数据库里面的内容
- 启动过程分三步:启动实例、加载数据库和打开数据库
-
STARTUP [nomount | mount | open | force] nomount:表示启动实例不加载数据库
mount:表示启动实例,加载数据库并保持数据库的关闭状态
open:表示启动实例,加载并打开数据库,这个是默认选项
force:表示终止实例并重新启动数据库
-
关闭
- 把数据库关闭,不再开放表与数据
- 关闭过程分三步:关闭数据库、卸载数据库和关闭Oracle实例
-
SHUTDOWN [normal | transactional | immediate | about] normal:表示正常方式关闭数据库
transactional:表示在当前所有的活动事务被提交完毕后,关闭数据库
immediate:表示在尽可能短的时间内立即关闭数据库
abort:表示以终止的方式关闭数据库
-
-
数据库实例的增删改
-
insert
-
update
-
delete
-
事务的数据库就会发生改变
-
事务提交工作 commit 提交之后,之前所作的所有操作才会生效
-
-
用户切换
-
普通用户切换:conn 用户名/密码;
-
sys用户切换:conn 用户名/密码 as sysdba;
-
-
-
SQLPlus应用
-
SQL Plus与数据库的交互
- SQL*Plus工具主要用来进行数据查询和数据处理。利用SQL*Plus可将SQL和Oracle专有的PL/SQL结合起来进行数据查询和处理。SQL*Plus工具具备以下功能
- 定义变量,编写SQL语句
- 插入、修改、删除、查询,以及执行命令和PL/SQL语句。比如,执行show parameter命令
- 格式化查询结构、运算处理、保存、打印机输出等。
- 显示任何一个表的字段定义,并实现与用户进行交互
- 完成数据库的几乎所有管理工作。比如,维护表空间和数据表
- 运行存储在数据库中的子程序或包
- 以sysdba身份登录数据库实例,可以实现启动/停止数据库实例
- 在sqlplus中,使用其他用户连接
- 例如:之前见到过的sys或system用户
- 语法:conn 用户名/密码 [as sysdba]
- 注意:如果现在连接的是超级管理员(sys),则在连接的最后必须写上as sysdba
- Show user:显示当前正在连接的用户是哪一个
- 查询操作( select ):select列名 | * from 表名;
- SQL*Plus工具主要用来进行数据查询和数据处理。利用SQL*Plus可将SQL和Oracle专有的PL/SQL结合起来进行数据查询和处理。SQL*Plus工具具备以下功能
-
SQL环境设置
- 设置每行显示的长度(一行所显示的最多字符总数)∶
- set linesize长度;
- 修改每页显示记录的长度(从顶部标题至页结束之间的行数)∶
- set pagesize行数;
- 在测试中,使用最多的查看表的结构:
- desc 表名称
- 设置每行显示的长度(一行所显示的最多字符总数)∶
-
常用SQL表
- (Oracle数据类型)列的类型主要有
- Number(7,2):表示的是谁,小数占2位,整数占5位,总共7位
- Date:表示日期
- Varchar(n):表示的字符串,n为字符串长度
- Number(n):表示的是数字,n为数字的长度
- (Oracle数据类型)列的类型主要有
-
连接符查询结果
- 连接符: || 把字符串和表中查询的数据做一个拼接
- 例如
- 要求查询出雇员的编号,姓名,工作,按照以下格式显示︰
- 编号是:7369的雇员,姓名是:SMITH工作是:CLERK
- select "编号是:' |[empno || '的雇员,姓名是:' |[ ename |l '.工作是:'ll job from emp;
- 在查询过程中对列进行计算,运算功能:求出雇员的姓名及年薪
- select ename,sal*12 年薪 from emp;
- 查询出所有工作种类(是否要去重复)
- select distinct job from emp;
- 指定别名查询
- select empno 编号,ename 姓名,job 工作 from emp;
-
-
SQL
-
SQL语言特点
- 1.集合性
- SQL的集合性允许一条SQL语句的结果作为另一条SQL语句的输入.
- 统一性
- 查询数据
- 在表中插入,修改,删除记录
- 建立修改和删除数据对象
- 控制对数据和数据对象的读写
- 保证数据库一致性和完整性
- 易于移植性
- 1.集合性
-
SQL语言的分类
- 数据查询语言(DQL)
- 用于检索数据库中的数据,主要是select语句
- 数据操纵语言(DML)
- 主要包括insert, update,delete三条语句
- 数据定义语言(DDL)
- 用于建立,修改,删除数据库对象。create, alter, drop
- 数据控制语言(DCL)
- 用于执行权限授予和权限收回操作。grant , revoke
- 事务控制语言(TCL)
- 用于维护数据的一致性。
- commit:用于提交对数据库的更改,
- rollback用于取消对数据库的更改,
- savepoint设置保存点。
- 数据查询语言(DQL)
-
用户模式
- 在Oracle数据库中,为了方便管理用户所创建的数据库对象(表,索引,视图等),引入了模式概念,这样某个用户所创建的数据库对象就都属于用户模式。
- 模式︰是一个数据库对象的集合。
- 模式为一个数据库用户所有,并且具有与该用户相同的名称,比如SYSTEM模式,SCOTT模式等。
- 在一个模式内部不可以直接访问其他模式的数据库对象,即使在具有访问权限的情况下,也需要指定模式名称才可以访问其他模式的数据库对象。
- 模式对象∶是由用户创建的逻辑结构,用于存储或引用数据,比如(表,视图,索引等)
- 模式与模式对象之间关系是拥有与被拥有的关系。
-
实例模式SCOTT
- Oracle提供SCOTT模式的目的,就是为了给用户提供一些实例表和数据来展示Oracle数据库的一些特性。
- SCOTT模式拥有的模式对象都是数据表(EMP,DEPT,SALGRADE,BONUS)
- 连接scott用户,密码是tiger
- SQL> conn scott/tiger
- SQL> select * from tab;
-
检索数据
- 用户对表或视图的操作就是检索数据,使用select语句实现
-
select {[ distinct] 列名..}
from 表名
[where 条件]
[group by 列名]
[having 选择条件]
[order by 列名]
-
-
简单查询
- 只包含select子句和from子句的查询
- 检索所有的列 *
- 案例1:查询dept表中所有的数据
- select * from dept;
- 案例2:查询表dept和salgrade
- select * from dept,salgrade;
- 案例1:查询dept表中所有的数据
- 检索指定的列
- 案例3:在SCOTT模式下,检索emp表中指定列(job,ename,empno)
- select empno,ename,job from emp;
- rowid:行标识符,是Oracle数据库内部使用的隐藏行
- 案例4:检索emp表指定的列job和ename,还包括rowid伪列
- select rowid,ename,job from emp;
- 案例4:检索emp表指定的列job和ename,还包括rowid伪列
- 案例3:在SCOTT模式下,检索emp表中指定列(job,ename,empno)
- 带有表达式的select子句
- 案例5∶检索emp表的sa列,把其值调整为原来的1.1倍
- select sal原有的工资,sal*(1+0.1)现有工资from emp;
- 案例5∶检索emp表的sa列,把其值调整为原来的1.1倍
- 为列指定别名
- select列名别名 from表名
- select列名as "别名" from表名;
- 案例6∶检索emp表的指定列(empno,ename,job),并使用as关键字为这些列指定中文别名(员工编号,员工名称,职务)
- select empno as"员工编号".,ename as "员工姓名".job as "职务"from emp;
- select empno as员工编号,ename as员工姓名,job as职务from emp;
-
条件查询
- select 列名 from 表名 where 条件;
- 例︰查询工资高于1200的有哪些人?
- select * from emp where sal>1200;
- all只有与所有元素的比较值都为true的情况下,才返回数据的查询行。
- select列名 from表名where列名比较运算符all(值1,值2,值3....);
- 把括号里面的值同时全部满足
- 案例:使用all关键字过滤工资(sal)同时不等于3000,950,800的员工记录
- select * from emp where sal !=all(3000,950,800);
- 在进行比较筛选时,字符串和日期值必须使用单引号标识
- 判空操作
- 内容为空 is null
- 内容不为空 is not null
- 多个条件之间用 and
- 满足其中一个条件 or
- Oracle中对数据的大小写是区分的。
- 查询SMITH员工的个人信息
- select * from emp where ename='SMITH';
- 查询SMITH员工的个人信息
- 列表搜索
- 条件在列表内
- where列名in(值1,值2...)
- 要求查询出姓名是SMITH,ALLEN,KING的雇员信息
- select * from emp where ename in('SMITH ALLEN"', 'KING');
- 不在列表内格式:
- where列名not in(值1,值2.--)
- 要求查询出雇员编号不是7369,7499,7521的雇员的具体信息
- select * from emp where empno not in(7369,7499,7521);
- 条件在列表内
- 指定范围查询的过滤语句:between...and ...
- select 列名|* from 表名 where 列名 between 最小值 and 最大值
- 模糊查询 like
- 匹配符:%代表任意长度的字符_代表一个字符格式 :
- where 列名 like ‘字符匹配符'
- 例︰查询出所有雇员姓名中第二个字母包含“M"的雇员信息
- select * from emp where ename like '_M%";
- not like不要匹配到的内容
- 例∶查询出不要雇员姓名中第二个字母包含"L"的雇员信息
- select * from emp where ename not like '_L %";
- 例∶查询出不要雇员姓名中第二个字母包含"L"的雇员信息
- like 还可以进行日期的匹配操作
- 例∶查询雇佣日期包含81的雇员信息
- select * from emp where hiredate like '%81%"
- 例∶查询雇佣日期包含81的雇员信息
-
排序查询
-
使用order by子句排序 asc:升序 默认
desc:降序
-
例1∶要求按照工资由低到高排序
-
select * from emp order by sal,
-
-
例2∶检索emp表中所有的数据,并按照部门编号,员工编号降序来排序。
-
select * from emp order by deptno asc,empno desc;
-
-
-
分组查询
-
select 列名,聚合函数
from 表名
group by 列名;
-
注意!select后可以写列名,但写的这个列必须是分组的列
-
案例1∶在emp表中,通过分组的方式计算每个部门的平均工资
-
select deptno, avg(sal)平均工资 from emp group by deptno;
-
-
在分组过程中,如果有聚合函数当条件,可以放在having之后。
-
案例2∶在emp表中,先通过分组的方式计算出每个部门的平均工资,然后通过having过滤掉平均工资大于2000的记录信息
-
select avg(sal)平均工资from emp group by deptno having avg(sal)<=2000:
-
-
-
多表关联查询
-
内连接
-
两种表连接的方式和mysq的写法要求是一模一样的。
-
where:
select表名.列名
from表名1,表名2,表名3...
where表名1.列=表名2.列and表名2.列=表名3.列.......on:
select表名.列名
from表名1 inner join表名2
on表名1.列=表名2.列inner join表名3 on表名2.列=表名3.列...; -
内连接的查询特征∶
-
只有两个表中的数据互相匹配到的情况下,才会有查询结果
-
案例∶在Scott模式下,通过deptno列来关联emp和dept表,并检索这两个表中相关字段的信息。empno(empno,ename) dept(dname)
-
select empno,ename,dname
from emp e ,dept d
where e.deptno=d.deptno; -
select empno,ename,dname
from emp inner join dept
on emp.deptno=dept.deptno;
-
-
-
-
外连接:
-
至少会返回一个表的所有行
-
左连接left outer join返回的是左表的所有行
-
右连接right outer join返回的是右表的所有行
-
完全连接full outer join返回的是两个表的所有行
-
先写的是左表,后写的是右表I
-
案例:实现emp和dept表的外部连接
-
左连接
-
select empno,ename,dname
from emp left outer join dept
on emp.deptno=dept.deptno; -
右连接
-
select empno,ename,dname
from emp right outer join dept
on emp.deptno=dept.deptno; -
完全连接
-
select empno,ename,dname
from emp full outer join dept
on emp.deptno=dept.deptno;
-
- 自然连接 natural join 自动匹配两个表中具有相同名称的列
-
-
- 用户对表或视图的操作就是检索数据,使用select语句实现
-