数据库中表关系
表与表之间一般存在三种关系,即一对一,一对多,多对多关系。
一对多:一对多关系是建立在两张表之间的关系。 一个表中的一条数据可以对应另一个表中的多条数据。记住:外键永远在多方。外键允许重复,允许含有空值。
一对一:是建立在一对多的基础之上,外键可以在任何一方,需要让外键一方具备唯一约束。
多对多:需要建立一个中间表,中间表里建立两个列,然后需要用这两个列作为这个表的联合主键,然后每个列在作为外键参照各自的表的主键
SQL 语言
什么是SQL?
结构化查询语言(Structured Query Language)简称 SQL(发音:sequal['si:kwəl]),是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
SQL 能做什么?
SQL 面向数据库执行查询
SQL 可从数据库取回数据
SQL 可在数据库中插入新的记录
SQL 可更新数据库中的数据
SQL 可从数据库删除记录
SQL 可创建新数据库
SQL 可在数据库中创建新表
SQL 可在数据库中创建存储过程
SQL 可在数据库中创建视图
SQL 可以设置表、存储过程和视图的权限
SQL标准
SQL 是 1986年 10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了 SQL 正式国际标准。1989 年 4 月,ISO 提出了具有完整性特征的 SQL89 标准,1992年 11月又公布了 SQL92 标准,在此标准中,把数据库分为三个级别:基本集、标准集和完全集。在 1999 年推出 99版标准。最新版本为 SQL2016 版。比较有代表性的几个版本:SQL86、SQL92、SQL99。除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展!
SQL语言结构
数据查询语言(DQL:Data Query Language)
其语句, 也称为“数据检索语句”, 用以从表中获得数据, 确定数据怎样在应用程序给出。关键字 SELECT 是 DQL(也是所有 SQL)用得最多的动词,其他 DQL 常用的关键字有WHERE,ORDER BY,GROUP BY 和 HAVING。这些 DQL 关键字常与其他类型的 SQL 句一起使用。select......from.....where.....查询数据
数据操作语言(DML:DataManipulation Language)
其语句包括动词 INSERT,UPDATE 和 DELETE。它们分别用于添加,修改和删除表中的行。
insert.......插入一条数据
update.....更新一条数据
delete......删除一条数据
事务处理语言(TCL:Transaction Control Language)
它的语句能确保被 DML 语句影响的表的所有行及时得以更新。
commit.....事物提交
rollback....事物回滚
savepoint..设置回滚点
数据控制语言(DCL:Data Control Language)
它的语句通过 GRANT 或 REVOKE 获得许可,确定单个用户和用户组对数据库对象的访问。
grant...授予用户权限
revork..撤销用户权限
数据定义语言(DDL:Data Definition Language)
定义数据库对象语言,其语句包括动词 CREATE 和 DROP 等。
create.....创建数据库对象
drop.......删除数据库对象
arter......修改数据库对象
rename.....修改数据库对象名称
Oracle中的HR 用户介绍
HR 用户是 Oracle 自带的一个示例用户。在该用户下提供了可供我们练习数据库操作时所使用的表与数据。
DQL 语言:
编写基本SELECT语句
SELECT 语句的作用是从数据库中返回信息。
列选择(投影操作)
能够使用 SELECT 语句的列选择功能选择表中的列,这些列是我们想要用查询返回
的。当我们查询时,可在选择查询的表中指定的列。
行选择(选择操作)
能够使用 SELECT 语句的行选择功能选择表中的行,这些行是我们想要用查询返回
的。能够使用不同的标准限制所看见的行。
连接(多表操作)
能够使用 SELECT 语句的连接功能来集合数据,这些数据虽然被存储在不同的表中,
但是我们可以通过连接查询到该数据。
SELECT语句基本结构
SELECT *|{[DISTINCT] column|expression [alias],...} FROM table;
SELECT 确定哪些列。
FROM 确定哪张表。
基本 SELECT 语句
在最简单的形式中,SELECT 语句必须包含下面的内容:
一个 SELECT 子句,指定被显示的列
一个 FROM 子句,指定表,该表包含 SELECT 子句中的字段列表
在语法中
SELECT 是一个或多个字段的列表
* 选择所有的列
DISTINCT 关键字表示禁止重复
column|expression 选择指定的字段或表达式
alias 给所选择的列不同的标题
FROM table 指定包含列的表
选择操作(投影操作)
选择所有列
SELECT * FROM table;
选择指定的列
SELECT columnName,columnName FROM table;
语句语法要求
• SQL 语句对大小写不敏感
• SQL 语句可以写成一行或多行
• 关键字不能简写或分开折行
• 子句通常放在不同的行
• 缩进用于增强可读性
SELECT语句中的算术表达式
用算术运算符创建数字和日期数据的表达式。(+ - * /)
注意:如果对日期进行计算,我们只能对 DATE 和 TIMESTAMP 数据类型使用加和
减操作。
运算符的优先级
• 乘法和除法比加法和减法的优先级高
• 相同优先级的运算符从左到右计算
• 圆括号用于强制优先计算,并且使语句更清晰
定义空值
空值是一个未分配的、未知的,或不适用的值
空值不是 0,也不是空格
空值
如果一行中的某个列缺少数据值,该值被置为空值。空值和 0 或者空格不相同。0 是
一个数字,而空格是一个字符。任何数据类型的列都可以包含空值。可是,某些约束,如,
NOT NULL 和 PRIMARY KEY,防止在列中使用空。
算术表达式中的空值
包含空值的算术表达式计算结果为空。
定义列别名
列别名:
• 改变列标题的名字
• 紧跟在列名后面 – 在列名和别名之间可以有选项 AS 关键字
• 如果别名中包含有空格、或者特殊字符、或者大小写敏感,要求用双引号在 SELECT 列表中的列名后面指定别名,列名和别名之间用空格分开。默认情况下别名标题用大写字母显示。如果别名中包含空格或者特殊字符(例如 # 或 &),或者大小写敏感,将别名放在双引号 (“”) 中。
连字运算符
• 连接列或者字符串到其它的列
• 用两个竖线表示 (||)
• 构造一个字符表达式的合成列
我们能够用连字运算符 (||) ,进行列与列之间、列与算术表达式之间或者列与常数值之间的连接,来创建一个字符表达式。连字运算符两边的列被合并成一个单个的输出列。
文字字符串
文字字符串是包含在 SELECT 列表中的一个字符串,一个数字或者一个日期
• 日期和字符的文字字符串值必须用单引号括起来
• 每个文字字符串在每行输出一次
文字字符串不是列名或别名。对每个返回行打印一次。任意格式文本的文字字符串能够被包含在查询结果中,并且作为 SELECT 列表中的列处理。日期和字符文字 必须 放在单但引号 (' ') 中;数字不需要。
去除重复行
在 SELECT 语句中用 DISTINCT 关键字除去相同的行。
注:为了在结果中除去相同的行,在 SELECT 子句中的 SELECT 关键字后面紧跟 DISTINCT 关键字。
约束和排序数据:
用选择限制行
SELECT *|{[DISTINCT] column|expression [alias],...} FROM table [WHERE condition(s)] ;
WHERE 子句跟着 FROM 子句
WHERE 限制查询满足条件的行
condition 由列名、表达式、常数和比较操作组成限制选择的行
你能够用 WHERE 子句限制从查询返回的行。一个 WHERE 子句包含一个必须满足的条件,WHERE 子句紧跟着 FROM 子句。如果条件是 true,返回满足条件的行。WHERE 子句能够比较列值、文字值、算术表达式或者函数,WHERE 子句由三个元素组成:
列名
比较条件
列名、常量或值列表
字符串和日期
• 字符串和日期的值放在单引号中
• 字符值区分大小写,日期值是格式敏感的
• 日期的默认格式是 DD-MON-RR
• 中文版 Oracle 与英文版 Oracle 对于日期的月份格式有区别。中文版的用 1月 英文版为月份的简写如:January Jan.
在 WHERE 子句中字符串和日期必须包含在单引号 (‘ ’) 中。但是,数字常数不应该包含在单引号中。所有的字符搜索是大小写敏感的。Oracle 数据库以内部数字格式存储日期,表示为:世纪、年、月、日、小时、分和秒。默认的日期显示是 DD-MON-RR。
使用 BETWEEN 条件
BETWEEN 条件: 可以用 BETWEEN 范围条件显示基于一个值范围的行。指定的范围包含一个下限和一个上限。BETWEEN … AND …实际上是由 Oracle 服务器转变为 AND条件: (a >= 下限) AND (a <= 上限), 所以使用 BETWEEN … AND … 并没有性能的提高,只是逻辑上简单。
使用 IN 条件
IN 条件:用 IN 条件在指定的一组值中进行选择。IN ( ... ) 实际上是由 Oracle 服务器转变为一组 OR 条件:a = value1 OR a = value2 OR a = value3,所以使用 IN ( ... ) 并没有得到性能的提高,只是逻辑上简单。
使用 LIKE 条件
• 使用 LIKE 条件执行有效搜索串值的通配符搜索
• 搜索条件既可以包含文字也可以包含数字:
% 表示零个或多个字符
_ 表示一个占位符
LIKE 条件:我们也许不总能知道要搜索的确切的值,但能够选择那些用 LIKE 条件匹配一个字符模板的行。字符模板匹配运算涉及通配符查询。有两个符号 % 和 _ 可以用来构造搜索串。
ESCAPE:可以用 ESCAPE 标识符搜索实际的 % 和 _ 符号。使用 ESCAPE 选项,该选项指定换码符是什么。如果你想要搜索包含‘SA_’的字符串可以使用 ESCAPE 对\表示该符号为转义符号。LIKE '%SA\_%' ESCAPE '\';
使用 NULL 条件
NULL 条件:NULL 条件中包括 IS NULL 条件和 IS NOT NULL 条件。IS NULL 条件用于空值测试。空值的意思是难以获得的、未指定的、未知的或者不适用的。因此,不能用 = 判断,因为 null 不能等于或不等于任何值。IS NOT NULL 测试不是空值。