Java数据库学习:SQL语言(一)

目录,更新ing,学习Java的点滴记录

  目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录

前言

  1. 本篇内容基于Oracle数据库的内容,其中Sql语言的编写运行都在基于Oracle数据库,所以小伙伴如果需要的话,可以先了解这一篇

一丶SQL语言基础

1 什么是SQL

  1. 结构化查询语言(Structured Query Language)简称 SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名(.sql)

2 SQL能做什么

  1. SQL 面向数据库执行查询
  2. SQL 可从数据库取回数据
  3. SQL 可在数据库中插入新的记录SQL
  4. 可更新数据库中的数据SQL
  5. 可从数据库删除记录
  6. SQL 可创建新数据库
  7. SQL 可在数据库中创建新表SQL
  8. 可在数据库中创建存储过程SQL
  9. 可在数据库中创建视图
  10. SQL 可以设置表、存储过程和视图的权限
  11. 以及等等…

3 SQL标准

  1. SQL 是 1986 年 10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着, 国际标准化组织(ISO)颁布了 SQL 正式国际标准。1989 年 4 月,ISO 提出了具有完整性特征的 SQL89 标准,1992 年 11 月又公布了 SQL92 标准,在此标准中,把数据库分为三个级别:基本集、标准集和完全集。在 1999 年推出 99 版标准。最新版本为 SQL2016 版。
  2. 比较有代表性的几个版本:SQL86、SQL92、SQL99。版本之间是可以实现向下兼容的,比如你使用的数据库支持SQL99标准,那么92,86这些都可以兼容,后面示例中使用的是Oracle11g,支持SQL99标准
  3. 除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展.比如使用Oracle编写的含有私有扩展的语句移植到MySQL中就无法执行

4 SQL语言结构

  1. 数据查询语言(DQL:Data Query Language)
     其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。 关键字 SELECT是 DQL(也是所有 SQL)用得最多的动词,其他 DQL 常用的关键字有WHERE,ORDER BY,GROUP BY 和 HAVING。这些 DQL 关键字常与其他类型的 SQL 语句一起使用。
     比如:select…from…where 查询数据
  2. 数据操作语言(DML:Data Manipulation Language)
     其语句包括动词INSERT,UPDATE 和 DELETE。它们分别用于添加,修改和删除表中的行。
     insert…插入一条数据
     update…更新一条数据
     delete…删除一条数据
  3. 事务处理语言(TCL:Transaction Control Language)
    事务非常重要,它的语句能确保被DML 语句影响的表的所有行及时得以更新
     最容易理解的就是转账案例:A要向B转1000元,那么A的账户中需要减少1000元,B的账户需要增加1000元,这两个动作必须是要么都成功,要么都失败,也就是说比如A账户余额多于1000,B账户存在,那么这两个动作不出意外都可以完成.但是当A账户余额小于1000,那么两个动作都不能执行成功.
     commit…事务提交
     rollback…事务回滚
     savepoint…设置回滚点
  4. 数据控制语言(DCL:Data Control Language)
     它的语句通过GRANT 或 REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。
     grant…授予用户权限
     revork…撤销用户权限
  5. 数据定义语言(DDL:Data Definition Language)
     定义数据库对象(表,视图,序列,索引等等)语言,其语句包括动词 CREATE 和 DROP 等。
     create…创建数据库对象
     drop…删除数据库对象
     arter…修改数据库对象
     rename…修改数据库对象名称

二丶Oracle中的HR用户介绍

1 HR用户介绍

  1. HR 用户是 Oracle 自带的一个示例用户。在该用户下提供了可供我们练习数据库操作时所使用的表与数据。

2 使用HR用户步骤

  1. 通过sys或者system用户登录(这里用到了PL/SQL Developer工具,不熟悉的建议先看一下Oracle这篇文章有谈到Oracle中的用户)
    Java数据库学习:SQL语言(一)_第1张图片
  2. 在Users文件夹下找到HR并设置登录密码,右键Edit编辑
    Java数据库学习:SQL语言(一)_第2张图片
    Java数据库学习:SQL语言(一)_第3张图片
  3. 切换到HR用户登录
    Java数据库学习:SQL语言(一)_第4张图片
  4. 查看该目录下表结构
    Java数据库学习:SQL语言(一)_第5张图片
  5. 新建一个Sql程序窗口查询一下看看效果,通过选中表,右键编辑或者查询就可以了解表结构和表数据了
    Java数据库学习:SQL语言(一)_第6张图片
    Java数据库学习:SQL语言(一)_第7张图片
    Java数据库学习:SQL语言(一)_第8张图片

三丶DQL语言

1 编写基本select语句

  1. select语句作用:从数据库中查询信息。我们可以设定条件来进行查询,最终查询到的结果集并不会影响实际存储的数据
     1) 列选择(投影操作)
      以查询一张表为例,一张表中可以有很多列,但是我们可能只关心其中某几列的数据,在select语句中我们可以自己指定要查询的是哪几列,并在执行查询时只返回我们指定的列
     2) 行选择(选择操作)
      以一张表为例,一行就是一条完整的数据,当数据非常大时,我们关注的可能就不是每一条数据了,比如我们可能只需要从10W条数据中拿出100条来分析,这就可以通过select语句的行选择功能来实现
     3) 连接(多表操作)
      能够使用 SELECT 语句的连接功能来集合数据,这些数据虽然被存储在不同的表中, 但是我们可以通过连接查询到该数据。
  2. 语句基本结构(基本的,后面还会集合where,group by等增加内容)
    SELECT *|{[DISTINCT] column|expression [alias],...} FROM table;
     说明:
      1) SELECT 是一个或多个字段的列表
      2) * 选择所有的列
      3) DISTINCT 关键字表示禁止重复
      4) column|expression 选择指定的字段或表达式
      5) alias 给所选择的列不同的标题
      6) FROM table 指定包含列的表
     在最简单的形式中,SELECT 语句必须包含下面的内容:一个 SELECT 子句,指定被显示的列,一个 FROM 子句,指定表,该表包含 SELECT 子句中的字段列表
  3. 选择操作(投影操作)
     1) 选择表中所有列
      select * from 表名;
      Java数据库学习:SQL语言(一)_第9张图片
     2) 选择表中指定列
       select 列名1,列名2,… from 表名;
      Java数据库学习:SQL语言(一)_第10张图片
  4. SQL语句语法要求
     •SQL 语句对大小写不敏感
     •SQL 语句可以写成一行或多行(规范的写成多行可以增加可读性)
     •关键字不能简写或分开折行
     •子句通常放在不同的行
     •缩进用于增强可读性
  5. select语句中算术表达式
     1) 作用:用算术运算符创建数字和日期数据的表达式.(加减乘除),如果对日期进行计算,只能对Date和timestamp数据类型使用+和-操作
     2) 优先级
      乘除大于加减 同等优先级从左向右计算 括号可以用于强制计算,并且使语句更加清晰
     3) 使用counties表做演示
      a. countries原数据
      Java数据库学习:SQL语言(一)_第11张图片
      b. 让region_id增加100后数据,额外发现:查询到的第二列的列名是我们算术表达式的名字,后面我们会使用给列起别名的方式让它显示的更直观一些,比如某个表有个列为月薪,我们使用算术表达式:月薪乘以12 来表示年薪,如果不起别名的话,最终显示的列名是(月薪乘以12),我们可以通过别名来改变对列的称呼
      Java数据库学习:SQL语言(一)_第12张图片
  6. 定义空值
     1) 空值是一个未分配的,未知的或者不适用的值,空值不是0也不是空格,当我们创建表时,如果一个字段设置为可以为空,当向表中插入数据时,如果未指定该字段的值,默认就是空
     2) 如果一行中的某个列缺少数据值,该值被置为空值。空值和 0 或者空格不相同。0 是一个数字,而空格是一个字符任何数据类型的列都可以包含空值。可是,某些约束,如,NOT NULL 和 PRIMARY KEY,防止在列中使用空
     3) 算术表达式中的空值
      包含空值的算术表达式计算结果为空
     4) 示例
      先查看一下employees表,发现里面的commission_pct一列都是空值,我们拿它来进行计算
      Java数据库学习:SQL语言(一)_第13张图片
      Java数据库学习:SQL语言(一)_第14张图片
      从上面结果可以清晰看出,对于含空值的数据进行算术运算,不论加减乘除结果都为空
  7. 定义列别名
     1) 列别名介绍
      a. 改变列标题的名字
      b. 定义时需要紧跟在列名后面(或者使用as关键字来声明)
      c. 如果别名中有空格,特殊字符或者大小写敏感,必须使用双引号
      d. 如果多个列需要起别名,相互之间用逗号隔开就可以
     2) 在 SELECT 列表中的列名后面指定别名,列名和别名之间用空格分开。默认情况下, 别名标题用大写字母显示。如果别名中包含空格或者特殊字符(例如 # 或 &),或者大小写敏感,将别名放在双引号 (“”) 中。
     3) 演示
      Java数据库学习:SQL语言(一)_第15张图片
      Java数据库学习:SQL语言(一)_第16张图片
  8. 连字运算符
     1) 介绍
      •连接列或者字符串到其它的列
      •用两个竖线表示 ||
      •构造一个字符表达式的合成列
      我们能够用连字运算符 (||) ,进行列与列之间、列与算术表达式之间或者列与常数值之间的连接,来创建一个字符表达式。连字运算符两边的列被合并成一个单个的输出列
     2) 演示
    Java数据库学习:SQL语言(一)_第17张图片
    Java数据库学习:SQL语言(一)_第18张图片
  9. 文字字符串
     1) 介绍
      •文字字符串是包含在 SELECT 列表中的一个字符串,一个数字或者一个日期
      •日期和字符的文字字符串值必须用单引号括起来
      •每个文字字符串在每行输出一次
     2) 文字字符串不是列名或别名。对每个返回行打印一次。任意格式文本的文字字符串能够被包含在查询结果中,并且作为 SELECT 列表中的列处理。日期和字符文字 必须 放在单但引号 (’ ') 中;数字不需要。
     3) 示例
       Java数据库学习:SQL语言(一)_第19张图片
  10. 去除重复行
     1) 介绍
      在 SELECT 语句中用DISTINCT 关键字除去相同的行。为了在结果中除去相同的行, 在 SELECT 子句中的 SELECT 关键字后面紧跟 DISTINCT 关键字。可以指定特定的列去重
     2) 示例
      Java数据库学习:SQL语言(一)_第20张图片
      Java数据库学习:SQL语言(一)_第21张图片

2 使用where子句约束数据

  1. 用选择限制行(使用where子句)
     1) 格式:
      在这里插入图片描述
     2)说明:
      a. where子句是紧跟着from子句的
      b. where限制查询满足条件的行
      c. condition表示某个条件,只有符合该条件的行才能够被返回到结果集中显示,不满足条件的数据将不会被查出,通常由3部分组成:列名,比较条件,(列名,常量或值列表)
     3) 示例
      Java数据库学习:SQL语言(一)_第22张图片

  2. 关于查询条件中的字符串和日期
     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) 示例
      Java数据库学习:SQL语言(一)_第23张图片

  3. 比较条件—条件运算符
     1) 条件运算符符号表 (不等于也可使用 != 和 ^= 来表示)
      Java数据库学习:SQL语言(一)_第24张图片
     2) 示例
      Java数据库学习:SQL语言(一)_第25张图片

  4. 比较条件—其他比较条件
     1) 符号表
      Java数据库学习:SQL语言(一)_第26张图片
     2) 使用between条件
      a. BETWEEN 条件:可以用 BETWEEN 范围条件显示基于指定范围的行。指定的范围包含一个下限和一个上限。BETWEEN … AND …实际上是由 Oracle 服务器转变为 AND 条件:(a >= 下限) AND (a <= 上限),所以使用 BETWEEN … AND … 并没有性能的提高,只是逻辑上简单。
      b. 示例
      Java数据库学习:SQL语言(一)_第27张图片
     3) 使用in条件
      a. IN 条件:用 IN 条件在指定的一组值中进行选择。IN ( … ) 实际上是由 Oracle 服务器转变为一组 OR 条件:a = value1 OR a = value2 OR a = value3,所以使用 IN ( … ) 并没有得到性能的提高,只是逻辑上简单。
      b. 示例
      Java数据库学习:SQL语言(一)_第28张图片
     4) 使用like条件
      a. 使用 LIKE 条件执行有效搜索串值的通配符搜索,换句话说就是模糊搜索,搜索条件既可以包含文字也可以包含数字:% 表示零个或多个字符, _ 表示一个占位符
      b. 示例
      Java数据库学习:SQL语言(一)_第29张图片
      Java数据库学习:SQL语言(一)_第30张图片
      c. 此外,%和_这两个符号也有可能出现在数据库中的字段中,如果我们要查询的字段中确实包含这两个字符,并且我们不能让数据库将这两个符号识别为通配符该怎么做呢?使用escape标识符来解决,escape标识符可以让我们搜索实际的%和_符号,我们只需要指定换码符是什么就可以了,换码符可以是任意符号,比如你要搜索"ab_c",正常使用like的话,他可以匹配到"abcc","ab3c"等等,如果用\表示换码符再加上escape指定后变成了: ‘ab_c’ escape ‘’ ,那么该字符串就只能匹配"ab_c"了
      Java数据库学习:SQL语言(一)_第31张图片
     5) 使用null条件
      a. NULL 条件:NULL 条件中包括IS NULL 条件和 IS NOT NULL 条件。IS NULL 条件用于空值测试。空值的意思是难以获得的、未指定的、未知的或者不适用的。因此,不能用 = 判断,因为 null 不能等于或不等于任何值。IS NOT NULL 测试不是空值。
      b. 示例
      Java数据库学习:SQL语言(一)_第32张图片
      Java数据库学习:SQL语言(一)_第33张图片

  5. 逻辑条件
     1) 符号表
      Java数据库学习:SQL语言(一)_第34张图片
     2) 使用and逻辑条件
      a. AND:AND 要求两个条件同时为真。
      b. 示例
      Java数据库学习:SQL语言(一)_第35张图片
     3) 使用or逻辑条件
      a. OR:OR 操作要求两者之一为真即可。
      b. 示例
      Java数据库学习:SQL语言(一)_第36张图片
     4) 使用not逻辑条件
      a. NOT:取反。NOT 运算符也可以用于另一个 SQL 运算符,例如,BETWEEN、LIKE、IN 和 NULL 。
      b. 示例
      Java数据库学习:SQL语言(一)_第37张图片

  6. 条件优先规则
     1) 优先顺序表
      Java数据库学习:SQL语言(一)_第38张图片
     2) 优先规则:优先规则定义表达式求值和计算的顺序,表中列出了默认的优先顺序。你可以用圆括号括住你想要先计算的表达式来覆盖默认的优先顺序
     3) 示例
      Java数据库学习:SQL语言(一)_第39张图片
      Java数据库学习:SQL语言(一)_第40张图片

3 使用order by子句排序数据

  1. 作用
     使用order by子句可以指定查询到的结果集按照一定的顺序显示,比如按照某个字段升序或者降序等等
     ASC: 升序排序,默认;DESC: 降序排序
     ORDER BY 子句:用于对结果集进行排序处理,提供了升序排序(ASC)与降序排序(DESC)如果不指定排序规则默认为升序排序。在排序中也可以使用没有包括在 SELECT 子句中的列进行排序。如果未使用 ORDER BY 子句,排序次序就未定义,并且 Oracle 服务器可能对于相同查询的两次执行取回行的顺序不同。
  2. 语法
     ORDER BY 子句在 SELECT 语句的最后
     ORDER BY 后侧指定需要排序列,列可以指定多个
  3. 升序规则
     1) 对于数字值,小的值在前面显示—例如,1–999。
     2) 对于日期,早的日期在前面显示—例如,01-1-92 在 01-1-95 前面
     3) 对于字符值,依字母顺序显示—例如,A 第一,Z 最后。
     4) 对于空值,升序排序时显示在最后,降序排序时显示在最前面
  4. 示例
     1) 指定单个列排序
      Java数据库学习:SQL语言(一)_第41张图片
     2) 指定多个列排序
      多列排序:可以用多列排序查询结果。在 ORDER BY 子句中,多个指定的列名之间用逗号分开。如果想要对某个列倒序排序需则在该列名后面指定 DESC。比如order by(列1,列2),此时就会先按照列1进行排序,对于列1相同的行,再依据列2的排序结果显示最终结果
      Java数据库学习:SQL语言(一)_第42张图片
  5. 到现在为止,select语句执行顺序
      from子句–>where子句—>select子句—>order by子句

4 Oracle函数

  1. 函数介绍
     1) 什么是函数
      函数:是数据库产品中提供的能够处理查询结果的方法。
      函数能够用于下面的目的:
       a. 执行数据计算(常见)
       b. 修改单个数据项
       c. 格式化显示的日期和数字(常见)
       d. 转换列数据类型
       e. 函数有输入参数,并且总有一个返回值。
      Java数据库学习:SQL语言(一)_第43张图片
     2) 函数类型
      a. 单行函数:这些函数仅对单个行进行运算,并且每行返回一个结果。
      b. 多行函数(聚合函数):这些函数能够操纵成组的行,每个行组给出一个结果,这些函数也被称为组函数。(本篇没有做介绍,后续会更新SQL后续篇章)
      Java数据库学习:SQL语言(一)_第44张图片
     3) 函数语法
      function_name(arg1,arg2, )
      a. function_name:是函数的名字。
      b. arg1, arg2:是由函数使用的任意参数。参数可以是一个列名、用户提供的常数、变量值、或者一个表达式。
  2. 单行函数
     1) 特性
      •作用于每一个返回行,每行返回一个结果
      •可能需要一个或多个参数
      •可以修改结果集的数据类型
      •可以嵌套
      •可能返回一个与参数不同类型的数据值
      •能够用在 SELECT、WHERE 和 ORDER BY 子句中
     2) 分类
      Java数据库学习:SQL语言(一)_第45张图片
     3) 分类说明
      字符函数:接受字符输入,可以返回字符或者数字值
      数字函数:接受数字输入,返回数字值
      日期函数:对 DATE 数据类型的值进行运算 (除了 MONTHS_BETWEEN 函数返回一个数字,所有日期函数都返回一个 DATE 数据类型的值。)
      转换函数:从一个数据类型到另一个数据类型转换一个值
      通用函数:NVL,NVL2,NULLIF,COALSECE,CASE,DECODE
  3. 单行函数--->字符函数
     1) 介绍:单行字符函数接受字符数据作为输入,既可以返回字符值也可以返回数字值。
     2) 分类
      Java数据库学习:SQL语言(一)_第46张图片
     3) 大小写处理函数
      Java数据库学习:SQL语言(一)_第47张图片
      a. LOWER:转换大小写混合的字符串为小写字符串。
      b. UPPER:转换大小写混合的字符串为大写字符串。
      c. INITCAP:将每个单词的首字母转换为大写,其他字母为小写。
      大小写处理函数需要一个参数,参数类型为字符串类型,返回一个字符串。
      示例:
      Java数据库学习:SQL语言(一)_第48张图片
     4) 字符处理函数
      Java数据库学习:SQL语言(一)_第49张图片
      Java数据库学习:SQL语言(一)_第50张图片
      Java数据库学习:SQL语言(一)_第51张图片
      Java数据库学习:SQL语言(一)_第52张图片
      Java数据库学习:SQL语言(一)_第53张图片
  4. 单行函数--->数字函数
    Java数据库学习:SQL语言(一)_第54张图片
    Java数据库学习:SQL语言(一)_第55张图片
  5. 单行函数--->日期处理函数
     1) 日期的使用
      a. sysdate函数:SYSDATE 是一个日期函数,它返回当前数据库服务器的日期和时间。
      b. 用日期计算
      Java数据库学习:SQL语言(一)_第56张图片
      c. 算术运算
      Java数据库学习:SQL语言(一)_第57张图片
     2) 日期函数
      Java数据库学习:SQL语言(一)_第58张图片
      Java数据库学习:SQL语言(一)_第59张图片
  6. 单行函数--->数据类型转换函数
    Java数据库学习:SQL语言(一)_第60张图片
     1) 隐式数据类型转换
      a. 当源数据的类型和目标数据的类型不同的时候,如果没有转换函数,就会发生隐式转换,也称自动转换。
      b. 隐式转换的最大问题就是转换时会导致索引的无效,进而可能导致全表扫描。当表的数据量很大的时候,产生会很大的性能问题。比如说,VARCHAR2 和 NVARCHAR2 隐式数据类型转换导致的性能问题。
     2) 显式数据类型转换
       通过数据库中的转换函数完成数据类型的转换。
      Java数据库学习:SQL语言(一)_第61张图片
      a. to_char():日期转为字符
      Java数据库学习:SQL语言(一)_第62张图片
      Java数据库学习:SQL语言(一)_第63张图片
      Java数据库学习:SQL语言(一)_第64张图片
      b. to_char():数字转为字符
      Java数据库学习:SQL语言(一)_第65张图片
      Java数据库学习:SQL语言(一)_第66张图片
      c. to_number():字符转为数字
      Java数据库学习:SQL语言(一)_第67张图片
      Java数据库学习:SQL语言(一)_第68张图片
      d. to_date():字符转为数字
      Java数据库学习:SQL语言(一)_第69张图片
  7. 单行函数--->通用函数
     1) 通用函数:可用于任意数据类型,并且适用于空值。
    Java数据库学习:SQL语言(一)_第70张图片
    Java数据库学习:SQL语言(一)_第71张图片
  8. 条件表达式
     1) 在SQL语句中提供了if-them-else逻辑的使用
     2) 两种用法
      1. case表达式
      2. decode函数
     3) case表达式
      a. Java数据库学习:SQL语言(一)_第72张图片
      b. CASE 表达式:CASE 表达式可以让你在 SQL 语句中使用 IF-THEN-ELSE 逻辑。如果没有 WHEN … THEN和 ELSE 子句存在,Oracle 返回 else_expr.所有的表达式 ( expr、comparison_expr 和 return_expr) 必须是相同的数据类型
      c. 示例
      Java数据库学习:SQL语言(一)_第73张图片
     4) decode函数
      a.
    在这里插入图片描述
      b. DECODE 函数:DECODE 函数以一种类似于在多种语言中使用的 IF-THEN-ELSE 逻辑的方法判断一个表达式。 DECODE 函数在比较表达式 (expression) 和每个查找 (search) 值后,如果表达式与查找相同,返回结果。如果省略默认值,当没有查找值与表达式相匹配时返回一个空值。
      c. 示例
      Java数据库学习:SQL语言(一)_第74张图片

你可能感兴趣的:(Java)