【Oracle入门到删库跑路-03】基础入门:SQL基础语法

109 阅读6分钟

SQL语言概述

SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系型数据库的标准语言。Oracle数据库完全支持SQL标准,并在此基础上进行了扩展。

SQL语言分类

  1. DDL(Data Definition Language)数据定义语言

    • 用于定义和管理数据库对象(如表、索引、视图等)
    • 包括:CREATE、ALTER、DROP、TRUNCATE等命令
  2. DML(Data Manipulation Language)数据操作语言

    • 用于操作数据库中的数据
    • 包括:INSERT、UPDATE、DELETE、SELECT等命令
  3. DCL(Data Control Language)数据控制语言

    • 用于控制数据库的访问权限和安全
    • 包括:GRANT、REVOKE等命令
  4. TCL(Transaction Control Language)事务控制语言

    • 用于管理数据库事务
    • 包括:COMMIT、ROLLBACK、SAVEPOINT等命令

SQL语句基本规则

  1. SQL关键字不区分大小写(SELECT、select、Select效果相同)
  2. 对象名称默认不区分大小写,除非用双引号括起来
  3. 语句结束符可以是分号(;)或斜杠(/)
  4. 注释使用--(单行)或/* */(多行)

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 数据类型

字符类型

  1. CHAR(n):固定长度字符串,最大2000字节
  2. VARCHAR2(n):可变长度字符串,最大4000字节
  3. NCHAR(n):固定长度Unicode字符串
  4. NVARCHAR2(n):可变长度Unicode字符串
  5. CLOB:大文本对象,最大4GB
  6. NCLOB:大Unicode文本对象

数值类型

  1. NUMBER(p,s):数值类型,p为精度,s为小数位数
  2. INTEGER:整数类型
  3. FLOAT:浮点数类型
  4. BINARY_FLOAT:32位浮点数
  5. BINARY_DOUBLE:64位浮点数

日期时间类型

  1. DATE:日期时间类型,包含世纪、年、月、日、时、分、秒
  2. TIMESTAMP:时间戳类型,包含年、月、日、时、分、秒、纳秒
  3. TIMESTAMP WITH TIME ZONE:带时区的时间戳
  4. TIMESTAMP WITH LOCAL TIME ZONE:带本地时区的时间戳
  5. INTERVAL YEAR TO MONTH:年月间隔
  6. INTERVAL DAY TO SECOND:日时间隔

其他类型

  1. BOOLEAN:布尔类型(仅在PL/SQL中使用)
  2. RAW:原始二进制数据
  3. BLOB:二进制大对象
  4. 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数据库支持的各种数据类型和约束。掌握这些基础知识是进行数据库操作的前提。

练习题

  1. 创建一个学生表,包含学号、姓名、性别、出生日期、专业等字段,并添加适当的约束
  2. 向学生表中插入几条测试数据
  3. 更新某个学生的专业信息
  4. 删除某个学生记录
  5. 为学生表添加一个邮箱字段,并设置唯一约束
  6. 编写一个事务,包含多个操作,并演示回滚到保存点的效果