关系型数据库:
- 表:存储数据(表格)
- 一个数据库可以有多张表
- 表:
- 列:列名代表这一列的单元格存储的内容的含义
- 行:一条记录
- eg
姓名 年龄 电话 aa 18 14357345553 bb 19 13309121212 表与表之间存在关系
-
SQL语句:进行数据库操作
Oracle数据库:
重量型,不是开源免费的,功能强大,适合比较大的项目使用
可以使用免费的XE版
其它关系型数据库:
eg:MySQL:轻量级,开源免费的,使用在中小型项目
客户端服务器端程序
- 我们直接使用的是客户端 客户端<->服务器端(管理软件)
- 客户端:
- SQLPLUS:命令行式的,自带的,前期练习基础使用
- Oracle提供的一个图形化客户端:SQLdeveloper
安装oracle XE版
注:
- 安装路径不能带中文,不能带空格
- 把杀毒软件先退出(推荐)
- 指定管理员口令:sys和system(基本使用推荐设置一个简单的口令就行)
基本使用
- SQLPlus基本使用
- 运行SQL命令行(Run SQL Command Line):客户端与服务器建立连接,要提供用户名和密码(口令)
- oracle是多用户的,自带两个管理员,SYS和SYSTEM(可大小写)
- 密码在安装时指定:
- system连接(命令可写一起,也可拆开):
- conn 用户名/口令
- conn 用户名 口令
- conn 用户名 口令
- sys连接:如果安装软件所在的电脑用户是当前用户,可以直接连接,不输入密码
- system连接(命令可写一起,也可拆开):
安装oracle后,会有两个服务自动开启:
- OracleService XE:监听客户端连接,一定要启动,默认自动启动,若开机启动失败,可自行启动
- OracleXETNSListenter:jdbc连接需要,一定要启动,默认自动启动,若启动失败,可自行启动
SYS和SYSTEM:管理员,做一些管理(DBA)
- SYS权限大于SYSTEM
- 基本的管理:一般使用SYSTEM
- SYS:权限最大
通常表的增删改查应该使用普通用户,可利用管理员创建
创建用户:
- create user 用户名 identified by 口令;
- 语句以分号结束
- 命令可以不加分号
Oracle是一个多用户的数据库,先要以某用户进行连接
每个用户可以通过管理员进行权限分配,刚创建的用户没有任何权限
连接数据库,创建一次回话,create session
授权(管理员操作):grant connect, resource to 用户名;
- connect和resource是两种角色,多个权限的集合,普通用户授予这两个权限
- Oracle中关键字不区分大小写,建议写大写
- 服务器要先把所有的小写关键字转换成大写,编译,执行,直接写大写,服务器变省去了小写转大写这一步
- 通常我们自己起的名字,如用户名等,一般习惯小写
SQL分类:
- DDL:数据定义语句
- CREATE:对象(表,序列,视图等)的创建
- ALTER:对象的修改
- CROP:对象的删除
- DML:数据操作语句
- 增:INSERT,删:DELETE,改:UPDATE
- 对表中数据的增删改
- 查询语句
- 查:SELECT
- DCL:权限控制语句
- GRANT:授权
- REVOKE:回收权限
表的创建
基本语法:
CREATE TABLE 表名(
列名 类型 默认值 约束,
....
列名 类型 默认值 约束 --最后一行结束不用逗号
);
相关知识:
- 命名规则
- 以字母开头
- 组成:字母,数字,下划线(_),$,#
- 长度:不能超过30个字符
- 不能使用数据库的关键字
- 同一个用户下不能出现同名的对象(表)
- 数据类型
- 文本型
- VARCHAR2:变长的文本型
- username VARCHAR2(100):最多可以存储100个字符,具体开辟的长度由实际内容决定
- 通常一个字母一个字节,汉字可能占多个(跟编码有关)
- CHAR:定长的文本型
- username CHAR(100):无论如何都会开辟100个字节空间,没占满的位置用空格填充
- VARCHAR2:变长的文本型
- 数值型
- NUMBER:整型,浮点型都可以表示
- age NUMBER(3):表示最多可以存储3位的整数
- weight NUMBER(4, 2):表示有2位小数,有效位为4位
- NUMBER:整型,浮点型都可以表示
- 日期型
- DATA
- 存储大数据量的类型
- BLOB:存储大量的进制数据,可以高达2GB,存储图片
- GLOB:存储大量的字符,可以高达2GB,存储小说等
- 注:完全可以选择把图图片存储在硬盘,把对应的路径存储到数据库
- 文本型
- 约束:CONSTRAINT(constraint)
- NOT NULL:非空约束
- 值不能没有,不能为空
- CHECK:检查约束
- 设定值只能取一个范围
- UNIQUE:唯一约束
- 列的值不能重复,可以有多个空 空,NULL:没有值
- PRIMARY KEY:主键约束
- 约束力:相当于非空+唯一,可以起到唯一标识记录
- 多个行之间因为有了主键,不会出现完全一样值得行
- 一个表最多只有一个主键
- 通常会给每个表加一个id之类的主键列,没有任何业务意义,只是为了保证能够区分每一行,又不会修改这个列,类似于流水号一样
- FOREIGN KEY:外键约束
- 作用:表之间的关联作用
- 某个表的某个列引用了另一个表的某个列
- 值只能取已存在表中的值或是是空
- 如果B表引用A表,要删除A表,必须先删除B表
- 被引用的列只能是主键列或唯一约束列
- NOT NULL:非空约束
创建表
需求,在刚创建的用户小创建一个表,用来存储学生的基本信息。例:id,name,sex,age,sno
Version1:
CREATE TABLE STUDENT(
id NUMBER(9) PRIMARY KEY,
name VARCHAR2(100) NOT NULL,
sex NUMBER(1) DEFAULT 0 CHECK(sex=0 OR sex=1),
age NUMBER(3),
sno NUMBER(9) UNIQUE NOT NULL
);
默认值:是指如果添加一行数据值对应的列不给值就取默认值 (default值)
Version2:
约束建议起合适的名字,而不要使用默认名字,这样出现问题容易发现:
CREATE TABLE STUDENT(
id NUMBER(9) CONSTRAINT student_id_pk PRIMARY KEY,
name VARCHAR2(100) CONSTRAINT student_name_nn NOT NULL,
sex NUMBER(1) DEFAULT 0 CONSTRAINT student_sex_ck CHECK(sex=0 OR sex=1),
age NUMBER(3),
sno NUMBER(9) CONSTRAINT student_sno_uk UNIQUE CONSTRAINT student_sno_nn NOT NULL
);
命名建议:表名_列名_约束简写
主键:pk
外键:fk
非空:nn或nk
唯一:uk
检查:ck
删除表命令:DROP TABLE 表名;
约束的分类
- 列级别约束
- 约束直接跟在列后面,一个约束只能修饰一个列
- 表级别约束
- 约束单独写一行
- 注:
- 除了非空的所有约束都可以作为表级别约束,又可以作为列级别约束
- 非空约束只能作为列级别约束
Version3:
把可以调整为表级别的约束进行调整
CREATE TABLE STUDENT(
id NUMBER(9),
name VARCHAR2(100) CONSTRAINT student_name_nn NOT NULL,
sex NUMBER(1) DEFAULT 0,
age NUMBER(3),
sno NUMBER(9) CONSTRAINT student_sno_nn NOT NULL,
CONSTRAINT student_id_pk PRIMARY KEY(id),
CONSTRAINT student_sex_ck CHECK(sex=0 OR sex=1),
CONSTRAINT student_sno_uk UNIQUE(sno)
);
/*行级别约束与列定义之间不能空行
行级别约束可以指定多个:
CONSTRAINT student_sno_uk UNIQUE(age, sno)
*/
查看当前用户下的所有表的名字:SELECT table_name FROM user_tables;
查看某个表结构:desc 表名;
优质数据库:要重复度(冗余)最小就可以存储完整信息
外键约束示例:
科目表创建
CREATE TABLE SUBJECT(
id NUMBER(7),
name VARCHAR2(100),
CONSTRAINT subject_id_pk PRIMARY KEY(id)
);
成绩表创建(引用成绩表和科目表)
CREATE TABLE grade(
id NUMBER(11),
stu_id NUMBER(9) CONSTRAINT grade_stu_id_fk REFERENCES student(id),
sub_id NUMBER(7),
score NUMBER(3),
CONSTRAINT grade_id_pk PRIMARY KEY(id),
CONSTRAINT grade_sub_id_fk FOREIGN KEY(sub_id) REFERENCES subject(id)
);
--行级别才写FOREIGN KEY,需要先有成绩表和学生表才能创建
表的数据添加:DML---INSERT
- 数据是一行一行添加的
- 一行代表一个记录
- 语法:
- INSERT INTO 表名 (列名1,......,列名n) VALUES(值1,值2.......,值n);
- eg:添加一个学生到学生表(id: 1, name: tom, age: 19, sex: 0, sno: 100)
INSERT INTO student(id, name, age, sex, sno) VALUES(1, 'tom', 19, 0, 100); COMMIT;
- eg:添加一个学生到学生表(id: 1, name: tom, age: 19, sex: 0, sno: 100)
- 如果所有的列都有给值,可以省略列名:INSERT INTO 表名 VALUES(值1,值2.......,值n);
- 每个值和表定义时的列顺序一一对应,每个值必须给出
- eg:(id:2, name: Lily, age: 18, sno: 10, sex=1)
INSERT INTO student VALUES(2, 'Lily', 1, 18, 101); COMMIT; --顺序需与表定义时的列顺序相同
- 注:
- 数值型常量,直接写
- 字符串常量(文本常量),用一对单引号括起来
- 对于DML操作后,需要确认提交—— COMMIT(提交后才真正添加进入表中)
- 第一种更好,可读性高,更灵活
- 插入完成需COMMIT
- 关键字,各种起的名字,不区分大小写
- 值是区分大小写的
- 查询一个表的全部数据:SELECT *FROM 表名;
- INSERT INTO 表名 (列名1,......,列名n) VALUES(值1,值2.......,值n);