目录,更新ing,学习Java的点滴记录
目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录
前言
- 本篇内容基于Oracle数据库的内容,其中Sql语言的编写运行都在基于Oracle数据库,所以小伙伴如果需要的话,可以先了解这一篇
一丶SQL语言基础
1 什么是SQL
结构化查询语言
(Structured Query Language)简称 SQL,是一种数据库查询和程序设计语言
,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名(.sql)
。
2 SQL能做什么
- SQL 面向数据库执行查询
- SQL 可从数据库取回数据
- SQL 可在数据库中插入新的记录SQL
- 可更新数据库中的数据SQL
- 可从数据库删除记录
- SQL 可创建新数据库
- SQL 可在数据库中创建新表SQL
- 可在数据库中创建存储过程SQL
- 可在数据库中创建视图
- SQL 可以设置表、存储过程和视图的权限
- 以及等等…
3 SQL标准
- SQL 是 1986 年 10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着, 国际标准化组织(ISO)颁布了 SQL 正式国际标准。1989 年 4 月,ISO 提出了具有完整性特征的 SQL89 标准,1992 年 11 月又公布了 SQL92 标准,在此标准中,把数据库分为三个级别:基本集、标准集和完全集。在 1999 年推出 99 版标准。最新版本为 SQL2016 版。
- 比较有代表性的几个版本:SQL86、SQL92、
SQL99
。版本之间是可以实现向下兼容的,比如你使用的数据库支持SQL99标准,那么92,86这些都可以兼容,后面示例中使用的是Oracle11g,支持SQL99标准 - 除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展.比如使用Oracle编写的含有私有扩展的语句移植到MySQL中就无法执行
4 SQL语言结构
数据查询语言
(DQL:Data Query Language)
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。关键字 SELECT
是 DQL(也是所有 SQL)用得最多
的动词,其他 DQL 常用的关键字有WHERE,ORDER BY,GROUP BY 和 HAVING
。这些 DQL 关键字常与其他类型的 SQL 语句一起使用。
比如:select…from…where 查询数据数据操作语言
(DML:Data Manipulation Language)
其语句包括动词INSERT,UPDATE 和 DELETE
。它们分别用于添加,修改和删除
表中的行。
insert…插入一条数据
update…更新一条数据
delete…删除一条数据事务处理语言
(TCL:Transaction Control Language)
事务非常重要,它的语句能确保被DML 语句
影响的表的所有行及时得以更新
最容易理解的就是转账案例:A要向B转1000元,那么A的账户中需要减少1000元,B的账户需要增加1000元,这两个动作必须是要么都成功,要么都失败
,也就是说比如A账户余额多于1000,B账户存在,那么这两个动作不出意外都可以完成.但是当A账户余额小于1000,那么两个动作都不能执行成功.
commit…事务提交
rollback…事务回滚
savepoint…设置回滚点数据控制语言
(DCL:Data Control Language)
它的语句通过GRANT 或 REVOKE
获得许可,确定单个用户和用户组对数据库对象的访问。
grant…授予用户权限
revork…撤销用户权限数据定义语言
(DDL:Data Definition Language)
定义数据库对象
(表,视图,序列,索引等等)语言,其语句包括动词CREATE 和 DROP
等。
create…创建数据库对象
drop…删除数据库对象
arter…修改数据库对象
rename…修改数据库对象名称
二丶Oracle中的HR用户介绍
1 HR用户介绍
- HR 用户是 Oracle 自带的一个示例用户。在该用户下提供了可供我们练习数据库操作时所使用的表与数据。
2 使用HR用户步骤
- 通过sys或者system用户登录(这里用到了PL/SQL Developer工具,不熟悉的建议先看一下Oracle这篇文章有谈到Oracle中的用户)
- 在Users文件夹下找到HR并设置登录密码,右键Edit编辑
- 切换到HR用户登录
- 查看该目录下表结构
- 新建一个Sql程序窗口查询一下看看效果,通过选中表,右键编辑或者查询就可以了解表结构和表数据了
三丶DQL语言
1 编写基本select语句
- select语句作用:从数据库中查询信息。
我们可以设定条件来进行查询,最终查询到的结果集并不会影响实际存储的数据
1) 列选择(投影操作)
以查询一张表为例,一张表中可以有很多列,但是我们可能只关心其中某几列的数据,在select语句中我们可以自己指定要查询的是哪几列,并在执行查询时只返回我们指定的列
2) 行选择(选择操作)
以一张表为例,一行就是一条完整的数据,当数据非常大时,我们关注的可能就不是每一条数据了,比如我们可能只需要从10W条数据中拿出100条来分析,这就可以通过select语句的行选择功能来实现
3) 连接(多表操作)
能够使用 SELECT 语句的连接功能来集合数据,这些数据虽然被存储在不同的表中, 但是我们可以通过连接查询到该数据。 - 语句基本结构(基本的,后面还会集合where,group by等增加内容)
说明:
1) SELECT 是一个或多个字段的列表
2) * 选择所有的列
3) DISTINCT 关键字表示禁止重复
4) column|expression 选择指定的字段或表达式
5) alias 给所选择的列不同的标题
6) FROM table 指定包含列的表
在最简单的形式中
,SELECT 语句必须包含下面的内容:一个 SELECT 子句,指定被显示的列,一个 FROM 子句,指定表,该表包含 SELECT 子句中的字段列表 - 选择操作(投影操作)
1) 选择表中所有列
select * from 表名;
2) 选择表中指定列
select 列名1,列名2,… from 表名;
- SQL语句语法要求
•SQL 语句对大小写不敏感
•SQL 语句可以写成一行或多行(规范的写成多行可以增加可读性)
•关键字不能简写或分开折行
•子句通常放在不同的行
•缩进用于增强可读性 - select语句中算术表达式
1) 作用:用算术运算符创建数字和日期数据的表达式.(加减乘除),如果对日期进行计算,只能对Date和timestamp数据类型使用+和-操作
2) 优先级
乘除大于加减 同等优先级从左向右计算 括号可以用于强制计算,并且使语句更加清晰
3) 使用counties表做演示
a. countries原数据
b. 让region_id增加100后数据,额外发现:查询到的第二列的列名是我们算术表达式的名字
,后面我们会使用给列起别名的方式让它显示的更直观一些,比如某个表有个列为月薪,我们使用算术表达式:月薪乘以12 来表示年薪,如果不起别名的话,最终显示的列名是(月薪乘以12),我们可以通过别名来改变对列的称呼
- 定义空值
1) 空值是一个未分配的,未知的或者不适用的值,空值不是0也不是空格
,当我们创建表时,如果一个字段设置为可以为空,当向表中插入数据时,如果未指定该字段的值,默认就是空
2) 如果一行中的某个列缺少数据值,该值被置为空值。空值和 0 或者空格不相同。0 是一个数字,而空格是一个字符
。任何数据类型的列都可以包含空值
。可是,某些约束,如,NOT NULL 和 PRIMARY KEY,防止在列中使用空
。
3) 算术表达式中的空值
包含空值的算术表达式计算结果为空
4) 示例
先查看一下employees表,发现里面的commission_pct一列都是空值,我们拿它来进行计算
从上面结果可以清晰看出,对于含空值的数据进行算术运算,不论加减乘除结果都为空
- 定义列别名
1) 列别名介绍
a. 改变列标题的名字
b. 定义时需要紧跟在列名后面(或者使用as关键字
来声明)
c. 如果别名中有空格,特殊字符或者大小写敏感,必须使用双引号
d. 如果多个列需要起别名,相互之间用逗号隔开就可以
2) 在 SELECT 列表中的列名后面指定别名,列名和别名之间用空格分开
。默认情况下, 别名标题用大写字母显示
。如果别名中包含空格或者特殊字符(例如 # 或 &),或者大小写敏感,将别名放在双引号 (“”) 中。
3) 演示
- 连字运算符
1) 介绍
•连接列或者字符串到其它的列
•用两个竖线表示 ||
•构造一个字符表达式的合成列
我们能够用连字运算符 (||) ,进行列与列之间、列与算术表达式之间或者列与常数值之间
的连接,来创建一个字符表达式。连字运算符两边的列被合并成一个单个的输出列
2) 演示
- 文字字符串
1) 介绍
•文字字符串是包含在 SELECT 列表中的一个字符串,一个数字或者一个日期
•日期和字符的文字字符串值必须用单引号括起来
•每个文字字符串在每行输出一次
2) 文字字符串不是列名或别名。对每个返回行打印一次。任意格式文本的文字字符串能够被包含在查询结果中,并且作为 SELECT 列表中的列
处理。日期和字符文字 必须 放在单但引号 (’ ') 中;数字不需要。
3) 示例
- 去除重复行
1) 介绍
在 SELECT 语句中用DISTINCT 关键字
除去相同的行。为了在结果中除去相同的行, 在 SELECT 子句中的 SELECT 关键字后面紧跟 DISTINCT 关键字。可以指定特定的列去重
2) 示例
2 使用where子句约束数据
-
用选择限制行(使用where子句)
1)格式
:
2)说明:
a. where子句是紧跟着from子句的
b. where限制查询满足条件的行
c. condition表示某个条件,只有符合该条件的行才能够被返回到结果集中显示,不满足条件的数据将不会被查出,通常由3部分组成:列名,比较条件,(列名,常量或值列表)
3) 示例
-
关于查询条件中的字符串和日期
1) 使用where子句设置查询条件时难免会遇到字符串或者日期作为条件,比如查询一个表中部门为xxx的员工编号,而这个部门名称xxx通常由字符串保存
a. 字符串和日期的值要放在单引号内
b. 字符值区分大小写,日期值是格式敏感的
c.日期的默认格式是 DD-MON-RR(日-月-年,如11-10-05表示2005年10月11日)
d. 中文版 Oracle 与英文版 Oracle 对于日期的月份格式有区别。中文版的用 1 月 英文版为月份的简写如:January Jan.
2) 在 WHERE 子句中字符串和日期必须包含在单引号 (‘ ’) 中
。但是,数字常数不应该包含在单引号中
。所有的字符搜索是大小写敏感的。
3) 示例
-
比较条件—条件运算符
1) 条件运算符符号表 (不等于也可使用 != 和 ^= 来表示
)
2) 示例
-
比较条件—其他比较条件
1) 符号表
2) 使用between条件
a. BETWEEN 条件:可以用 BETWEEN 范围条件显示基于指定范围的行
。指定的范围包含一个下限和一个上限。BETWEEN … AND …实际上是由 Oracle 服务器转变为 AND 条件:(a >= 下限) AND (a <= 上限),所以使用 BETWEEN … AND … 并没有性能的提高,只是逻辑上简单。
b. 示例
3) 使用in条件
a. IN 条件:用 IN 条件在指定的一组值中进行选择
。IN ( … ) 实际上是由 Oracle 服务器转变为一组 OR 条件:a = value1 OR a = value2 OR a = value3,所以使用 IN ( … ) 并没有得到性能的提高,只是逻辑上简单。
b. 示例
4) 使用like条件
a. 使用 LIKE 条件执行有效搜索串值的通配符搜索
,换句话说就是模糊搜索,搜索条件既可以包含文字也可以包含数字:% 表示零个或多个字符, _ 表示一个占位符
b. 示例
c. 此外,%和_这两个符号也有可能出现在数据库中的字段中,如果我们要查询的字段中确实包含这两个字符,并且我们不能让数据库将这两个符号识别为通配符该怎么做呢?使用escape标识符
来解决,escape标识符可以让我们搜索实际的%和_符号,我们只需要指定换码符是什么就可以了
,换码符可以是任意符号,比如你要搜索"ab_c",正常使用like的话,他可以匹配到"abcc","ab3c"等等,如果用\表示换码符再加上escape指定后变成了: ‘ab_c’ escape ‘’ ,那么该字符串就只能匹配"ab_c"了
5) 使用null条件
a. NULL 条件:NULL 条件中包括IS NULL 条件和 IS NOT NULL 条件
。IS NULL 条件用于空值测试。空值的意思是难以获得的、未指定的、未知的或者不适用的。因此,不能用 = 判断,因为 null 不能等于或不等于任何值。IS NOT NULL 测试不是空值。
b. 示例
-
逻辑条件
1) 符号表
2) 使用and逻辑条件
a. AND:AND 要求两个条件同时为真。
b. 示例
3) 使用or逻辑条件
a. OR:OR 操作要求两者之一为真即可。
b. 示例
4) 使用not逻辑条件
a. NOT:取反。NOT 运算符也可以用于另一个 SQL 运算符,例如,BETWEEN、LIKE、IN 和 NULL 。
b. 示例
-
条件优先规则
1) 优先顺序表
2) 优先规则:优先规则定义表达式求值和计算的顺序,表中列出了默认的优先顺序。你可以用圆括号括住你想要先计算的表达式来覆盖默认的优先顺序
3) 示例
3 使用order by子句排序数据
- 作用
使用order by子句可以指定查询到的结果集按照一定的顺序显示,比如按照某个字段升序或者降序等等
ASC:升序排序,默认
;DESC: 降序排序
ORDER BY 子句:用于对结果集进行排序处理
,提供了升序排序(ASC)与降序排序(DESC)如果不指定排序规则默认为升序排
序。在排序中也可以使用没有包括在 SELECT 子句中的列
进行排序。如果未使用 ORDER BY 子句,排序次序就未定义
,并且 Oracle 服务器可能对于相同查询的两次执行取回行的顺序不同。 - 语法
ORDER BY 子句在 SELECT 语句的最后
ORDER BY 后侧指定需要排序列,列可以指定多个 - 升序规则
1) 对于数字值,小的值在前面显示—例如,1–999。
2) 对于日期,早的日期在前面显示—例如,01-1-92 在 01-1-95 前面
3) 对于字符值,依字母顺序显示—例如,A 第一,Z 最后。
4) 对于空值,升序排序时显示在最后,降序排序时显示在最前面 - 示例
1) 指定单个列排序
2) 指定多个列排序
多列排序:可以用多列排序查询结果。在 ORDER BY 子句中,多个指定的列名之间用逗号分开。如果想要对某个列倒序排序需则在该列名后面指定 DESC。比如order by(列1,列2),此时就会先按照列1进行排序,对于列1相同的行
,再依据列2的排序结果显示最终结果
- 到现在为止,select语句执行顺序
from子句–>where子句—>select子句—>order by子句
4 Oracle函数
- 函数介绍
1) 什么是函数
函数:是数据库产品中提供的能够处理查询结果
的方法。
函数能够用于下面的目的:
a. 执行数据计算(常见)
b. 修改单个数据项
c. 格式化显示的日期和数字(常见)
d. 转换列数据类型
e. 函数有输入参数,并且总有一个返回值。
2) 函数类型
a.单行函数
:这些函数仅对单个行进行运算,并且每行返回一个结果。
b.多行函数(聚合函数)
:这些函数能够操纵成组的行,每个行组给出一个结果,这些函数也被称为组函数。(本篇没有做介绍,后续会更新SQL后续篇章)
3) 函数语法
function_name(arg1,arg2, )
a. function_name:是函数的名字。
b. arg1, arg2:是由函数使用的任意参数。参数可以是一个列名、用户提供的常数、变量值、或者一个表达式。 - 单行函数
1) 特性
•作用于每一个返回行,每行返回一个结果
•可能需要一个或多个参数
•可以修改结果集的数据类型
•可以嵌套
•可能返回一个与参数不同类型的数据值
•能够用在 SELECT、WHERE 和 ORDER BY 子句中
2) 分类
3) 分类说明
字符函数
:接受字符输入,可以返回字符或者数字值
数字函数
:接受数字输入,返回数字值
日期函数
:对 DATE 数据类型的值进行运算 (除了 MONTHS_BETWEEN 函数返回一个数字,所有日期函数都返回一个 DATE 数据类型的值。)
转换函数
:从一个数据类型到另一个数据类型转换一个值
通用函数
:NVL,NVL2,NULLIF,COALSECE,CASE,DECODE 单行函数--->
字符函数
1) 介绍:单行字符函数接受字符数据作为输入,既可以返回字符值也可以返回数字值。
2) 分类
3) 大小写处理函数
a. LOWER:转换大小写混合的字符串为小写字符串。
b. UPPER:转换大小写混合的字符串为大写字符串。
c. INITCAP:将每个单词的首字母转换为大写,其他字母为小写。
大小写处理函数需要一个参数,参数类型为字符串类型
,返回一个字符串。
示例:
4) 字符处理函数
单行函数--->
数字函数
单行函数--->
日期处理函数
1) 日期的使用
a. sysdate函数:SYSDATE 是一个日期函数,它返回当前数据库服务器的日期和时间。
b. 用日期计算
c. 算术运算
2) 日期函数
单行函数--->
数据类型转换函数
1) 隐式数据类型转换
a. 当源数据的类型和目标数据的类型不同的时候,如果没有转换函数,就会发生隐式转换,也称自动转换。
b. 隐式转换的最大问题就是转换时会导致索引的无效,进而可能导致全表扫描。当表的数据量很大的时候,产生会很大的性能问题。比如说,VARCHAR2 和 NVARCHAR2 隐式数据类型转换导致的性能问题。
2) 显式数据类型转换
通过数据库中的转换函数完成数据类型的转换。
a. to_char():日期转为字符
b. to_char():数字转为字符
c. to_number():字符转为数字
d. to_date():字符转为数字
单行函数--->
通用函数
1) 通用函数:可用于任意数据类型,并且适用于空值。
- 条件表达式
1) 在SQL语句中提供了if-them-else逻辑的使用
2) 两种用法
1. case表达式
2. decode函数
3) case表达式
a.
b. CASE 表达式:CASE 表达式可以让你在 SQL 语句中使用 IF-THEN-ELSE 逻辑。如果没有 WHEN … THEN和 ELSE 子句存在,Oracle 返回 else_expr.所有的表达式 ( expr、comparison_expr 和 return_expr)必须是相同的数据类型
,
c. 示例
4) decode函数
a.
b. DECODE 函数:DECODE 函数以一种类似于在多种语言中使用的 IF-THEN-ELSE 逻辑的方法判断一个表达式。 DECODE 函数在比较表达式 (expression) 和每个查找 (search) 值后,如果表达式与查找相同,返回结果。如果省略默认值,当没有查找值与表达式相匹配时返回一个空值。
c. 示例