Oracle(四)

第七章 Specifying Variables at Runtime
第八章 Overview of Data Modeling and Database Design
第九章 Creating Tables
第十章 Oracle Data Dictionary

第七章:运行时参数

sql语句中的值,我们可以使用一个参数来代替,然后每次运行的时候都可以重新输入这个值。

例如:
select last_name,salary,dept_id
from s_emp
where id=&id;

select last_name,salary,dept_id
from s_emp
where last_name=&name;

select last_name,salary,dept_id
from s_emp
where last_name=’&name’;

select last_name,salary,dept_id
from s_emp
where
salary>&a
and
salary<&b;

select last_name,salary,dept_id
from s_emp
where &con;

select last_name,salary,dept_id
from s_emp
&cons;

注意:&变量名 表示使用这个oracle定义的变量,如果这个变量之前没有定义过,那么这个时候会让你重写输入这个变量的值.
如果之前有定义过,那么就是要之前定义过的值

define undefine accept prompt命令
例如:
命令def可以定义一个变量
定义变量: def A=s_emp
查看定义的变量: def
取消定义的变量: undef A

然后变量A之前定义过,那么这里会之前替换为之前定义的值
select id,last_name,salary
from &A;

accept命令也可以定义一个变量,而且变量的值需要用户再次输入
例如:
accept A
回车之前需要用户再次输入变量A的值
之后可以使用def命令来查看刚刚定义的A变量

prompt可以在用户输入的时候显示一个提示信息:
例如:
accept name prompt '请输入name变量的值: ’

hide可以隐藏用户的输入内容不被看见
例如:
accept name prompt '请输入name变量的值: ’ hide

注意:这些定义的都是临时变量,sqlplus退出后重新登录进来就没有了

第八章:数据建模和数据库设计

软件开发的步骤可大致分为:
1.需求分析
2.系统设计
3.编码实现
4.系统测试
5.运行维护

系统设计中一个重要的环节就是数据库设计

数据库设计的时候需要先进行数据建模(实体关系图 E-R图)

数据建模的依据就是前期所做的需求分析

数据建模

1.Model of system in client’s mind
2.Entity model of client’s model
3.Table model of entity model
4.Tables on disk

实体-关系图
实体-关系图(Entity Relationship Diagram),也称为E-R图,提供了表示实体、属性和关系的方法,用来描述现实世界的概念模型。

构成E-R图的基本要素是实体、属性和关系

实体(Entity):实体用来表示具有相同特征和性质的事物(类似于java的类),实体由实体名和实体属性来表示。

属性(Attribute):实体所具有的某一特性,一个实体可以有若干个属性

关系(Relationship):实体彼此之间相互连接的方式称为关系。一般可分为以下 3 种类型:
一对一关系 (1 ∶ 1)
一对多关系 (1 ∶ N)
多对多关系 (M ∶ N)

may-be 和 must-be
在实体与实体之间的关系中,都会存在着may-be和must-be这俩种情况,例如:
系统中有顾客和订单俩个实体(1:N关系),一个顾客对应多个订单,一个订单对应一个顾客,
而且一个顾客可以(may be)没有订单和他对应,一个订单一定(must be)会有顾客和它对应.

ER图中符号的表示
1) # : 唯一, 以后可能表示为主键
2) * : 非空
3) o : 可有可无
4) 虚线: may be 顾客这边虚线,顾客可能没有订单
5) 实线: must be 订单这边实线,订单一定是属于某个客户。
6) 竖杠(|): 代表要强制在(|)一方建立一个联合主键,将对方ID拿过来做联合主键
7) 伞状图标代表多的一方,不是伞状图标则代表一的一方

数据库设计
数据建模完成之后,可以把ER图转换成数据中的表
1.实体的名字转换为表的名字
2.实体的属性转换为表中的列
3.具有唯一特点的属性设置为表中的主键
4.根据实体之间的关系设置为表中某列为外键列(主外键关联)
注意:第四步主要是:实体关系—>表关系

设计关系数据库时,遵从不同的规范要求,才能设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,
各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有六种范式:
第一范式(1NF)
第二范式(2NF)
第三范式(3NF)
巴斯-科德范式(BCNF)
第四范式(4NF)
第五范式(5NF,又称完美范式)

注:满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了

第一范式:
一个表中,每个列里面的值是不能再分割的.
例如:我们设计的表中有一个列是:爱好
这个列的值可能会是这样:足球篮球乒乓球
但是这值是可以再分割的:足球、篮球、乒乓球
所以这种设计是不满足第一范式

第二范式:
第二范式是在满足第一范式的基础上
表中的非主键列都必须依赖于主键列
例如:
订单表: 订单编号 是主键
订单编号 订单名称 订单日期 订单中产品的生产地
这几个非主键列中,产品生产地是不依赖于订单编号的,所以这种设计是不满足第二范式

第三范式:
第三范式是在满足第二范式的基础上
表中的非主键列都必须直接依赖于主键列,而不能间接的依赖.
(不能产生依赖传递)
例如:
订单表: 订单编号 是主键
订单编号 订单名称 顾客编号 顾客姓名

顾客编号依赖于订单编号,顾客姓名依赖于顾客编号,从而顾客姓名间接的依赖于订单编号,那么这里产生了依赖传递,所以这个设计是不满足第三范式的

了解主键和外键
主键:
1.能做主键的列必要满足非空唯一的特点
2.只要满足非空唯一的任何列都可以做主键
3.可以让表中一个有意义的列做主键,比如说学号,它既表示学生学号又作为表中的主键,因为这个列满足非空唯一的条件
4.也可以找一个没有意义的列做主键,就是用来唯一标识一行记录的
5.我们可以让多个列联合在一起做表中的主键,那么它就是联合主键,要求这几个列的值联合在一起是非空唯一的

外键:
1.表中的某一个列声明为外键列,一般这个外键列的值都会引用于另外一张表的主键列的值
(有唯一约束的列就可以,不一定非要引用主键列)
2.另外一张表的主键列中出现过的值都可以在外键列中使用,没有出现过的值,都不能使用
3.外键列值也可以为空的,前提是这个外键列在表中不做主键,因为我们也可以把表中的外键列当做主键来使用
(只有满足非空唯一的要求就可以)
4.如果把B表中的联合主键的值引用到A表中做外键,因为是俩个列在B表中做联合主键,那么A表引用过来的时候也要
把俩个列的值都引用过来,那么它们在A表中就会作为一个联合外键出现

第九章:建表

建表的格式
create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束
);

create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束,
表级约束1,
表级约束2
);

根据以上格式,可以看出,建表过程中,需要以下几种东西:
1.关键字
2.表名
3.列名
4.数据类型
5.约束
6.固定格式
其中,约束分为列级约束(因为是跟在列的声明后面写的)和表级约束(因为是在全部列声明完之后写的),
列级约束和表级约束都是对列中的值进行约束的,例如:列的值不能为空,列的值必须是唯一的等等
注:列级约束也称为行级约束

同时,列级约束和表级约束都是可选的,也就是都可以写也可以不写。例如:
create table 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
列名4 数据类型
);

表名的要求:
1.必须是字母开头
2.必须是1-30个字符之间的长度
3.表名中只能出现A–Z, a–z, 0–9, _, $, #
4.不能和数据库中已有对象的名字重复
5.不能是数据库中的关键字

列的常用数据类型
1.char
2.varchar
3.varchar2
4.number
5.date
其他类型 BLOB CLOB
BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的

char varchar varchar2的区别及特点
1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的
2.CHAR的效率比VARCHAR2的效率稍高。
3.VARCHAR是数据库标准的字符类型
4. VARCHAR2是Oracle自己开发了一个数据类型VARCHAR2
5. VARCHAR2将数据库中varchar列可以存储空字符串的特性改为存储NULL值。
6.Oracle建议使用VARCHAR2而不是VARCHAR

列的约束
列的约束就是对这个列中的值的要求
1.主键约束 PRIMARY KEY primary key
2.外键约束 FOREIGN KEY foreign key
3.唯一约束 UNIQUE unique
4.非空约束 NOT NULL not null
5.check约束 CHECK check

列级约束/行级约束:在列的后面直接加上的约束
create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束
);

表级约束:在所有列声明以后加的约束
create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束,
表级约束1,
表级约束2
);

建表实例
例如1:
//普通的建表例子
create table student(
id number primary key,
name varchar2(20) not null,
age number,
birthday date
);

drop table student;

例如2:
//使用四种列级约束 主键约束 非空约束 唯一约束 check约束
create table student(
id number primary key,
name varchar2(100) not null,
email varchar2(100) unique,
gender char(1) check(gender in(‘f’,‘m’)),
age number,
birthday date
);

drop table student;

例如3:
//使用列级约束 声明 外键约束
create table t_customer(
id number primary key,
name varchar2(20) not null
);

create table t_order(
id number primary key,
content varchar2(200) not null,
customer_id number references t_customer(id)
);
drop table t_order;
drop table t_customer;

注意:订单表中的外键列customer_id的值,是引用自顾客表t_customer中的主键列id的值
1.这时候直接删除顾客表是不行的,因为t_customer的主键列的值被别的表给引用了.
2.我们可以先删除订单表t_order,然后再删除t_customer就可以了
3.如果非要想直接删除到顾客表t_customer,就需要使用下面的语句:
drop table t_customer cascade constraints;
4.该语句表示,删除t_customer表的同时,也级联删除与表相关的约束,外键约束没有了,这个表自然可以被删除掉
5.cascade是级联的意思

例如4:
//使用表级约束
create table student(
id number,
name varchar2(20) not null,
age number,
email varchar2(100),
gender char,
primary key(id),
unique(email),
check(gender in(‘f’,‘m’))
);

drop table student;

注:非空约束(not null)不能声明成表级约束

例如5:
//使用表级约束 声明 外键约束
create table t_customer(
id number primary key,
name varchar2(200) not null
);

create table t_order(
id number primary key,
content varchar2(200) not null,
customer_id number,
foreign key(customer_id) references t_customer(id)
);

drop table t_order;
drop table t_customer;

例如6:
//使用表级约束 声明 联合唯一约束
create table student(
id number primary key,
class varchar2(50) not null,
name varchar2(50) not null,
unique(class,name)
);

drop table student;

注意:学生的班级和学生的名字联合起来必须是唯一的(联合唯一)
注意:联合唯一约束必须使用表级约束来声明

例如7:
//使用表级约束 声明 联合主键
create table t_customer(
id number,
name varchar2(50),
primary key(id,name)
);

drop table t_customer;

例如8:
//使用表级约束 声明 联合外键
create table t_customer(
id number,
name varchar(50),
primary key(id,name)
);

create table t_order(
id number,
price number not null,
customer_id number,
customer_name varchar(50),
foreign key(customer_id,customer_name) references t_customer(id,name)
);

drop table t_order;
drop table t_customer;

表级约束和列级约束对比
1.表级约束和列级约束所写的位置不一样
2.not null约束不能用表级约束来声明
3.表级约束和列级约束声明语法稍有所不同
4.如果要声明的约束为联合主键、联合外键、联合唯一的时候,就一定要用表级约束.

constraint关键字
1.constraint是约束的意思
2.建表的时候可以给约束起一个名字,这个名字起的规律一般会是:表名_列名_约束类型
3.如果没有给约束起名字,那么系统也会给这个约束起一个默认的名字,这不过这个默认的名字对我们来说并不友好
(我们看不懂)
4.将来我们可以根据我们之前给约束起好的名字而找到这个约束,然后进行修改

例如1:
//列级约束 起约束名字
create table student(
id number constraint student_id_pk primary key,
name varchar2(100) constraint student_name_nn not null,
email varchar2(100) constraint student_email_un unique,
gender char(1) constraint student_gender_ck check(gender in(‘f’,‘m’)),
age number,
birthday date
);

drop table student;

例如2:
//表级约束 起约束名字
create table t_customer(
id number,
name varchar2(20) not null,
age number,
email varchar2(100),
gender char,
constraint cus_id_pk primary key(id),
constraint cus_email_un unique(email),
constraint cus_gender_ck check(gender in(‘f’,‘m’))
);

create table t_order(
id number,
price number not null,
customer_id number,
constraint order_cid_fk foreign key(customer_id) references t_customer(id)
);

drop table t_order;
drop table t_customer;

特殊的建表:建立一张表和s_dept一模一样
例如1:
//s_dept的表结构和表中的数据全部复制过来
create table test1
as
select * from s_dept;
或:
create table test1
as
select * from s_dept
where 1=1;

例如2:
//只拿来s_dept的表结构,没有数据
create table test2
as
select * from s_dept
where id=10;
where 1=0;

例如3:
//只复制表中某几个列以及数据
create table test3
as
select id,last_name,salary from s_emp;

ON DELETE CASCADE
on delete cascade
这个语句是在建表中,声明外键约束的时候一个可选项,我们后面的DML章节中再进一步讨论

第十章:数据字典

作用:帮助用户了解当前数据库的一些信息或是对象的信息或是用户的信息.
1.数据字典在数据库被创建时创建的。
2.数据字典中的数据被数据库服务器自动更新和维护

常见的数据字典(它们都是视图)
USER开头的视图里面存放着用户自己拥有的对象
ALL开头的视图存放着用户有权限查看的对象
DBA开头的视图存放着数据库所有的对象
V$开头的视图存放数据库运行的一些性能属性数据

1、以user开头的数据字典: 包含当前用户所拥有的相关对象信息。
//查询用户拥有的所有表的名字
select table_name from user_tables;

//查询用户对象表,找出对象类型是TABLE类型的对象名字
//table view sequence index synonym等都是oracle中的对象
//注意字符串的值是区分大小写的
select object_name
from user_objects
where object_type = upper(‘table’);

//查询用户对象表,找出对象类型都有哪些
select distinct object_type
from user_objects;

//查询出s_emp表中的列及其对应的约束名字
select constraint_name, column_name
from user_cons_columns
where table_name = ‘S_EMP’;

//查询出s_emp表中的约束名字
select constraint_name
from user_constraints
where table_name = ‘S_EMP’;
2、以all开头的数据字典: 包含当前用户有权限访问的所有对象的信息
//查到当前用户有权限访问的对象
select table_name from all_tables;
3、以dba开头的数据字典: 包含数据库所有相关对象的信息。
//只能是有dba权限的用户查询,能查到数据库中所有对象
select table_name from dba_tables; (sys system)

其他视图:DICTIONARY
dictionary视图中只有俩列:
TABLE_NAME表示当前表的名字
COMMENTS表示对这个表的描述

SQL> desc dictionary
名称
-----------------------------------------

TABLE_NAME
COMMENTS

select *
from dictionary
where table_name=‘USER_TABLES’;

select *
from dictionary
where table_name=‘ALL_TABLES’;

select table_name
from dictionary
where table_name like ‘USER%’;

select table_name
from dictionary
where table_name like ‘ALL%’;

select table_name
from dictionary
where table_name like ‘V$%’;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle中,可以通过使用JOIN语句来关联多张表。比如,可以使用INNER JOIN、LEFT JOIN、RIGHT JOIN或FULL JOIN来实现不同类型的连接操作。引用提到了一个例子,使用了JOIN语句将emp表和dept表进行了关联,通过e.deptno = d.deptno这个条件进行匹配。这样可以获取到符合条件的empno、ename、deptno和dname字段的结果集。 另外,还可以使用connect by语句进行递归查询。引用提到了一个例子,通过connect by语句可以查询出指定时间段所横跨的日期,并将其作为主表,然后再与其他表进行关联查询。 需要注意的是,在某些情况下,可能存在某些表中的数据在其他表中不存在的情况。比如,引用中提到的dept表中的deptno值为40的数据在emp表中没有对应的数据,但在右连接中可以完全显示dept表中的数据。 总结起来,Oracle中可以通过JOIN语句和connect by语句来关联多张表,从而获取到需要的结果集。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Oracle多表关联查询](https://blog.csdn.net/xutao_ccu/article/details/84986009)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [oracle 左连接表关联查询示例](https://blog.csdn.net/weixin_42502419/article/details/116316849)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值