SQL语言概述
SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系型数据库的标准语言。Oracle数据库完全支持SQL标准,并在此基础上进行了扩展。
SQL语言分类
-
DDL(Data Definition Language)数据定义语言
- 用于定义和管理数据库对象(如表、索引、视图等)
- 包括:CREATE、ALTER、DROP、TRUNCATE等命令
-
DML(Data Manipulation Language)数据操作语言
- 用于操作数据库中的数据
- 包括:INSERT、UPDATE、DELETE、SELECT等命令
-
DCL(Data Control Language)数据控制语言
- 用于控制数据库的访问权限和安全
- 包括:GRANT、REVOKE等命令
-
TCL(Transaction Control Language)事务控制语言
- 用于管理数据库事务
- 包括:COMMIT、ROLLBACK、SAVEPOINT等命令
SQL语句基本规则
- SQL关键字不区分大小写(SELECT、select、Select效果相同)
- 对象名称默认不区分大小写,除非用双引号括起来
- 语句结束符可以是分号(;)或斜杠(/)
- 注释使用--(单行)或/* */(多行)
3.2 DDL数据定义语言
创建表(CREATE TABLE)
-- 基本语法
CREATE TABLE table_name (
column1 datatype [CONSTRAINT],
column2 datatype [CONSTRAINT],
...
);
-- 示例:创建员工表
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25) NOT NULL,
email VARCHAR2(25) NOT NULL UNIQUE,
phone_number VARCHAR2(20),
hire_date DATE NOT NULL,
job_id VARCHAR2(10) NOT NULL,
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
manager_id NUMBER(6),
department_id NUMBER(4)
);
修改表结构(ALTER TABLE)
-- 添加列
ALTER TABLE employees ADD (
bonus NUMBER(8,2)
);
-- 修改列
ALTER TABLE employees MODIFY (
salary NUMBER(10,2)
);
-- 删除列
ALTER TABLE employees DROP COLUMN bonus;
-- 重命名列
ALTER TABLE employees RENAME COLUMN phone_number TO contact_number;
删除表(DROP TABLE)
-- 删除表(不可恢复)
DROP TABLE employees;
-- 删除表并放到回收站(可恢复)
DROP TABLE employees FLASHBACK;
截断表(TRUNCATE TABLE)
-- 清空表中所有数据(不可恢复,但保留表结构)
TRUNCATE TABLE employees;
3.3 DML数据操作语言
插入数据(INSERT)
-- 插入完整记录
INSERT INTO employees VALUES (
100, 'Steven', 'King', 'SKING', '515.123.4567',
TO_DATE('1987-06-17', 'YYYY-MM-DD'), 'AD_PRES',
24000, NULL, NULL, 90
);
-- 插入指定列的数据
INSERT INTO employees (
employee_id, first_name, last_name, email,
hire_date, job_id, salary, department_id
) VALUES (
101, 'Neena', 'Kochhar', 'NKOCHHAR',
TO_DATE('1989-09-21', 'YYYY-MM-DD'), 'AD_VP',
17000, 90
);
-- 批量插入数据
INSERT ALL
INTO employees VALUES (102, 'Lex', 'De Haan', 'LDEHAAN', '515.123.4569', TO_DATE('1993-01-13', 'YYYY-MM-DD'), 'AD_VP', 17000, NULL, 100, 90)
INTO employees VALUES (103, 'Alexander', 'Hunold', 'AHUNOLD', '590.423.4567', TO_DATE('1990-01-03', 'YYYY-MM-DD'), 'IT_PROG', 9000, NULL, 102, 60)
SELECT * FROM dual;
更新数据(UPDATE)
-- 更新单个记录
UPDATE employees
SET salary = 18000
WHERE employee_id = 101;
-- 更新多个字段
UPDATE employees
SET salary = 18500, commission_pct = 0.1
WHERE employee_id = 101;
-- 更新多个记录
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 60;
删除数据(DELETE)
-- 删除特定记录
DELETE FROM employees
WHERE employee_id = 102;
-- 删除多个记录
DELETE FROM employees
WHERE department_id = 60;
-- 删除所有记录(谨慎使用)
DELETE FROM employees;
3.4 DCL数据控制语言
授权(GRANT)
-- 授予用户查询权限
GRANT SELECT ON employees TO user1;
-- 授予用户增删改查权限
GRANT SELECT, INSERT, UPDATE, DELETE ON employees TO user1;
-- 授予用户所有权限
GRANT ALL ON employees TO user1;
-- 授予用户角色
GRANT CONNECT, RESOURCE TO user1;
撤销权限(REVOKE)
-- 撤销用户查询权限
REVOKE SELECT ON employees FROM user1;
-- 撤销用户所有权限
REVOKE ALL ON employees FROM user1;
3.5 TCL事务控制语言
提交事务(COMMIT)
-- 提交当前事务,永久保存更改
COMMIT;
回滚事务(ROLLBACK)
-- 回滚当前事务,撤销所有未提交的更改
ROLLBACK;
-- 回滚到保存点
ROLLBACK TO savepoint_name;
设置保存点(SAVEPOINT)
-- 设置保存点
SAVEPOINT sp1;
-- 在保存点之间执行操作
INSERT INTO employees VALUES (104, 'Bruce', 'Ernst', 'BERNST', '590.423.4568', TO_DATE('1991-05-21', 'YYYY-MM-DD'), 'IT_PROG', 6000, NULL, 103, 60);
SAVEPOINT sp2;
UPDATE employees SET salary = 6500 WHERE employee_id = 104;
-- 回滚到第一个保存点
ROLLBACK TO sp1;
3.6 数据类型
字符类型
- CHAR(n):固定长度字符串,最大2000字节
- VARCHAR2(n):可变长度字符串,最大4000字节
- NCHAR(n):固定长度Unicode字符串
- NVARCHAR2(n):可变长度Unicode字符串
- CLOB:大文本对象,最大4GB
- NCLOB:大Unicode文本对象
数值类型
- NUMBER(p,s):数值类型,p为精度,s为小数位数
- INTEGER:整数类型
- FLOAT:浮点数类型
- BINARY_FLOAT:32位浮点数
- BINARY_DOUBLE:64位浮点数
日期时间类型
- DATE:日期时间类型,包含世纪、年、月、日、时、分、秒
- TIMESTAMP:时间戳类型,包含年、月、日、时、分、秒、纳秒
- TIMESTAMP WITH TIME ZONE:带时区的时间戳
- TIMESTAMP WITH LOCAL TIME ZONE:带本地时区的时间戳
- INTERVAL YEAR TO MONTH:年月间隔
- INTERVAL DAY TO SECOND:日时间隔
其他类型
- BOOLEAN:布尔类型(仅在PL/SQL中使用)
- RAW:原始二进制数据
- BLOB:二进制大对象
- BFILE:外部二进制文件
3.7 约束
主键约束(PRIMARY KEY)
-- 创建表时定义主键
CREATE TABLE departments (
department_id NUMBER(4) PRIMARY KEY,
department_name VARCHAR2(30) NOT NULL
);
-- 或者使用命名约束
CREATE TABLE departments (
department_id NUMBER(4),
department_name VARCHAR2(30) NOT NULL,
CONSTRAINT pk_departments PRIMARY KEY (department_id)
);
外键约束(FOREIGN KEY)
-- 创建表时定义外键
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
department_id NUMBER(4) REFERENCES departments(department_id)
);
-- 或者使用命名约束
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
department_id NUMBER(4),
CONSTRAINT fk_emp_dept FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
唯一约束(UNIQUE)
-- 创建表时定义唯一约束
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
email VARCHAR2(25) UNIQUE NOT NULL
);
-- 或者使用命名约束
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
email VARCHAR2(25) NOT NULL,
CONSTRAINT uk_emp_email UNIQUE (email)
);
检查约束(CHECK)
-- 创建表时定义检查约束
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
salary NUMBER(8,2) CHECK (salary > 0),
commission_pct NUMBER(2,2) CHECK (commission_pct BETWEEN 0 AND 1)
);
-- 或者使用命名约束
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
CONSTRAINT ck_emp_salary CHECK (salary > 0),
CONSTRAINT ck_emp_commission CHECK (commission_pct BETWEEN 0 AND 1)
);
非空约束(NOT NULL)
-- 创建表时定义非空约束
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
last_name VARCHAR2(25) NOT NULL
);
3.8 本章小结
本章介绍了SQL语言的基本语法,包括DDL、DML、DCL和TCL四大类命令,以及Oracle数据库支持的各种数据类型和约束。掌握这些基础知识是进行数据库操作的前提。
练习题
- 创建一个学生表,包含学号、姓名、性别、出生日期、专业等字段,并添加适当的约束
- 向学生表中插入几条测试数据
- 更新某个学生的专业信息
- 删除某个学生记录
- 为学生表添加一个邮箱字段,并设置唯一约束
- 编写一个事务,包含多个操作,并演示回滚到保存点的效果