思路流程
--进入环境
C:\Users\Administrator>sqlplus /nolog
--使用指定账号/密码进入环境
C:\Users\Administrator>sqlplus kaifamiao/kaifamiao
--指定用户以指定的角色连接数据库
SQL> connect sys/Oracle2021 as sysdba
--创建新用户并指定密码
SQL> create user kfm identified by kfm ;
--为用户授权
SQL> GRANT connect , resource TO kfm;
--删除用户
SQL> DROP USER malajava CASCADE ;
--断开连接
SQL> disconnect
--连接新用户
SQL> connect kfm/kfm
--查看当前用户
show user ;
-- 查询当前用户所拥有的表
SQL> SELECT tname FROM tab ;
--删除该用户下的所有表
select 'drop table '||table_name||';' as sqlscript from user_tables;
--在此命令之后开始复制 命令行文本
SQL> spool SQL01.txt
-- 查询系统当前时间
SQL> SELECT sysdate FROM dual ;
--显式 commit 事务 同一个会话中,一个事务终结意味着另一个事务开启
SQL> commit ;
-- 使用 start 执行脚本
SQL> start D:/kfm/table/demobld_zh_cn.sql
-- 使用 @ 执行脚本导入数据
SQL> @ D:/kfm/table/summit2_zh_cn.sql
--创建t_citizens表
SQL> CREATE TABLE t_citizens (
name varchar2(10) NOT NULL,
id varchar2(17) NOT NULL
);
-- 创建 t_departments 表
SQL> CREATE TABLE t_departments (
2 id NUMBER(5) ,
3 name VARCHAR2(20) ,
4 CONSTRAINT t_departments_id_pk PRIMARY KEY(id)
5 );
--添加主键
SQL> ALTER TABLE t_citizens ADD CONSTRAINT PK_id PRIMARY KEY(id);
--添加外键
ALTER TABLE t_id_cards ADD CONSTRAINT FK_ID FOREIGN KEY(id) REFERENCES t_citizens(id);
-- 联合主键
SQL> CREATE TABLE t_scores (
2 sid NUMBER(10) ,
3 cid NUMBER(10) ,
4 exam_time DATE ,
5 score NUMBER(4,1) ,
6 CONSTRAINT t_scores_sid_fk FOREIGN KEY (sid) REFERENCES t_students( id ) ,
7 CONSTRAINT t_scores_cid_fk FOREIGN KEY (cid) REFERENCES t_courses( id ) ,
8 CONSTRAINT t_scores_pk PRIMARY KEY(sid,cid,exam_time)
9 );
-- 创建表时指定约束
SQL> CREATE TABLE t_users (
2 id NUMBER(10) ,
3 username VARCHAR2(20) NOT NULL UNIQUE ,
4 password VARCHAR2(20) NOT NULL ,
5 PRIMARY KEY (id)
6 );
-- 建表后追加约束 MODIFY 或 ADD
SQL> ALTER TABLE t_customers MODIFY ( username CONSTRAINT t_customers_username_nn NOT NULL );
SQL> ALTER TABLE t_customers ADD CONSTRAINT t_customers_username_uk UNIQUE ( username );
SQL> ALTER TABLE t_customers ADD CONSTRAINT t_customers_id_pk PRIMARY KEY ( id );
--如果指定约束时未设置约束名,则Oracle会自动生成以 SYS_C 为前缀的约束名
SQL> SELECT table_name , constraint_name , constraint_type FROM user_constraints WHERE lower(table_name) = 't_users' ;
-- 通过查询数据字典来查看约束信息
SQL> DESC user_constraints ;
-- 查询某张表中各个列的约束及其约束类型
SQL> SELECT x.table_name , x.column_name , x.constraint_name , y.constraint_type
2 FROM user_constraints y JOIN user_cons_columns x ON x.table_name = y.table_name AND x.constraint_name = y.constraint_name
3 WHERE lower(x.table_name) = 't_users' ;
-- 通过查询 将查询结果插入到 myemp3 表中 -- insert .... select ...
SQL> INSERT INTO myemp3 ( id , name , job , salary ) SELECT empno , ename , job , sal FROM emp ;
SQL> INSERT INTO myemp3 SELECT * FROM myemp3 ;
-- 通过查询来创建表(CTAS) 将搜索结果生成表
SQL> CREATE TABLE myemp1 AS SELECT * FROM emp ;
SQL> CREATE TABLE myemp3 AS SELECT empno AS id , ename AS name , job , sal AS salary FROM emp WHERE sal > 2000 ;
-- 使用 rename ... to ... 重命名表
SQL> RENAME t_departments TO t_depts ;
-- 使用 ALTER TABLE .... RENAME TO ... 重命名表
SQL> ALTER TABLE t_employees RENAME TO t_emps ;
--使用脚本更改表的名字
--脚本内容
SELECT x.table_name , x.column_name , x.constraint_name , y.constraint_type
FROM user_constraints y JOIN user_cons_columns x ON x.table_name = y.table_name AND x.constraint_name = y.constraint_name
WHERE lower(x.table_name) = '&tableName' ;
--SQL
SQL> @constraint.sql
输入 tablename 的值: t_students
原值 3: WHERE lower(x.table_name) = '&tableName'
新值 3: WHERE lower(x.table_name) = 't_students'
-- 查看自己的表
SQL> SELECT table_name FROM user_tables ;
-- 删除表 DROP
SQL> DROP TABLE t_emps ;
-- 查看回收站(刚被删除的表)
SQL> show recyclebin
-- 恢复被删除的表 flashback
SQL> flashback table t_emps to before drop ;
-- 截断表 TRUNCATE 比delete一行一行删除数据 高效
SQL> TRUNCATE TABLE myemp3 ;
-- 截取表 (获取表结构)
SQL> CREATE TABLE myemp4 AS SELECT empno AS id , ename AS name , job FROM emp WHERE 1 = 2 ;
-- 添加列 ADD
SQL> ALTER TABLE t_employees
2 ADD ( gender CHAR(6) , hiredate DATE ) ;
-- user_tables表 中有哪些列(查看表结构)
SQL> DESC user_tables ;
-- 删除列 DROP
SQL> ALTER TABLE t_employees DROP ( gender , hiredate );
-- 修改列名 RENAME
SQL> ALTER TABLE t_employees RENAME COLUMN hiredate TO ru_zhi_ri_qi ;
-- 修改列的宽度和类型 MODIFY
SQL> ALTER TABLE t_employees
2 MODIFY ( gender VARCHAR2(6) );
-- 批量插入 MySQL 中的批量插入在 Oracle 中是不支持的
SQL> INSERT ALL
2 INTO myemp4 ( id , name , job ) VALUES ( 1001 , 'awei' , 'enginner' )
INTO myemp3 (id,name,job,salary) VALUES ( 5005 , 'zegnzihao', 8002 )
4 INTO myemp4 ( id , name , job ) VALUES ( 3003 , 'laiyu' , 'enginner' )
5 SELECT 1 FROM dual ;
-- 使用 INSERT INTO 插入数据
SQL> INSERT INTO emp VALUES ( 1001 , 'awei' , 'enginner' , null , null , 8000 , null , null );
SQL> INSERT INTO emp ( empno , ename , job , sal ) VALUES ( 2002 , '姜禹志' , '攻城狮' , 8000 );
-- 插入单引号 ''
SQL> INSERT INTO emp ( empno , ename ) VALUES ( 3003 , 'a''wei' );
-- 更新数据 UPDATE .. SET..
SQL> UPDATE myemp4 SET name = '赵威' , job = '软件工程师' WHERE id = 1001 ;
-- 将字符串描述的日期转换为DATE类型
SQL> SELECT to_date( '2021-12-30' , 'YYYY-MM-DD' ) FROM dual ;
-- 删除数据
SQL> DELETE FROM emp ;
-- 借助 rowid 删除重复的数据
SQL> DELETE FROM myemp3 e WHERE e.rowid > ( SELECT min(x.rowid) FROM myemp3 x WHERE x.id = e.id );
-- 设置列宽(仅限SQL*Plus环境)
SQL> set linesize 120 ;
-- 设置每页显示的行数
SQL> set pagesize 20 ;
-- 设置字符列的宽度:
SQL> COLUMN dummy FORMAT a5 ;
-- 设置整数列的宽度
SQL> column salary format 9999 ;
-- 设置浮点数列的宽度
SQL> column commission_pct format 99.9 ;
--写入 file afiedt.buf
SQL> edit
--调用file afiedt.buf里的命令
SQL> /
-- 连接字符串 concat
SQL> SELECT id , concat( first_name , concat( ' ' , last_name ) ) FROM s_emp ;
SQL> SELECT id , first_name || ' ' || last_name FROM s_emp ;
--取别名 AS
SQL> SELECT id 编号 , first_name || ' ' || last_name AS 姓名 FROM s_emp ;
--求 列的长度 length
SQL> SELECT id 编号 , length( first_name || ' ' || last_name ) AS 姓名长度 FROM s_emp ;
-- 处理空值 NVL
SQL> SELECT empno , ename , job , sal , NVL( mgr , 0 ) FROM emp ;
-- 数值 转 字符串 TO_CHAR
SQL> SELECT empno , ename , job , sal , NVL( TO_CHAR( mgr ) , 'BOSS' ) FROM emp ;
-- 将大写转为小写 lower (小写转大写 upper)
SQL> SELECT empno , lower(ename) ename , lower(job) job , sal
2 FROM emp ;
--运算符优先级 not > and > or
--聚合函数 max、min、avg、sum、count 模运算mod(7,3)求余
SQL> SELECT max(sal) , min(sal) , avg(sal) , sum(sal) , count(*) FROM emp ;
--分组 group by 组函数不能出现在 GROUP BY 子句中
SQL> SELECT max(sal) , min(sal) , avg(sal) , sum(sal) , count(*) FROM emp GROUP BY deptno ;
--非单组分组函数 需在 group by 之后
SQL> SELECT deptno , max(sal) , min(sal) , avg(sal) , sum(sal) , count(*) FROM emp GROUP BY deptno ;
-- 筛选条件 where 组函数不能出现在 WHERE 子句
SQL> SELECT deptno , max(sal) , min(sal) , avg(sal) , sum(sal) , count(*)
2 FROM emp
3 WHERE deptno IS NOT NULL
4 GROUP BY deptno ;
--排序 order by 能否用 别名 需看执行顺序
SQL> SELECT deptno , max(sal) maxsal , min(sal) , avg(sal) , sum(sal) , count(*)
2 FROM emp
3 WHERE deptno IS NOT NULL
4 GROUP BY deptno
5* ORDER BY maxsal
--结束命令行文本复制
SQL> spool off
学习流程
--在此命令之后开始复制 命令行文本
SQL> spool SQL01.txt
-- 用指定用户以指定的角色连接数据库
SQL> connect sys/Oracle2021 as sysdba
-- 创建新用户并指定密码
SQL> CREATE USER malajava IDENTIFIED BY malajava ;
-- 为用户授权
SQL> GRANT connect , resource TO malajava ;
-- 断开连接
SQL> disconnect
-- 用新用户连接
SQL> connect malajava/malajava
-- 查看当前用户
SQL> show user ;
-- 删除用户
SQL> DROP USER malajava CASCADE ;
--结束命令行文本复制
SQL> spool off
-- 查询当前用户所拥有的表
SQL> SELECT tname FROM tab ;
-- user_tables表 中有哪些列(查看表结构)
SQL> DESC user_tables ;
-- 查询系统当前时间
SQL> SELECT sysdate FROM dual ;
-- 查询 dual表 中所有的数据
SQL> SELECT * FROM dual ;
-- 使用 start 执行脚本
SQL> start D:/kfm/table/demobld_zh_cn.sql
-- 使用 @ 执行脚本导入数据
SQL> @ D:/kfm/table/summit2_zh_cn.sql
-- 设置列宽(仅限SQL*Plus环境)
SQL> set linesize 120 ;
-- 设置每页显示的行数
SQL> set pagesize 20 ;
-- 设置字符列的宽度:
SQL> COLUMN dummy FORMAT a5 ;
-- 设置整数列的宽度
SQL> column salary format 9999 ;
-- 设置浮点数列的宽度
SQL> column commission_pct format 99.9 ;
--写入 file afiedt.buf
SQL> edit
--调用file afiedt.buf里的命令
SQL> /
-- 连接字符串 concat
SQL> SELECT id , concat( first_name , concat( ' ' , last_name ) ) FROM s_emp ;
SQL> SELECT id , first_name || ' ' || last_name FROM s_emp ;
--取别名 AS
SQL> SELECT id 编号 , first_name || ' ' || last_name AS 姓名 FROM s_emp ;
--求 列的长度 length
SQL> SELECT id 编号 , length( first_name || ' ' || last_name ) AS 姓名长度 FROM s_emp ;
-- 处理空值 NVL
SQL> SELECT empno , ename , job , sal , NVL( mgr , 0 ) FROM emp ;
-- 数值 转 字符串 TO_CHAR
SQL> SELECT empno , ename , job , sal , NVL( TO_CHAR( mgr ) , 'BOSS' ) FROM emp ;
-- 将大写转为小写 lower (小写转大写 upper)
SQL> SELECT empno , lower(ename) ename , lower(job) job , sal
2 FROM emp ;
--运算符优先级 not > and > or
--聚合函数 max、min、avg、sum、count 模运算mod(7,3)求余
SQL> SELECT max(sal) , min(sal) , avg(sal) , sum(sal) , count(*) FROM emp ;
--分组 group by 组函数不能出现在 GROUP BY 子句中
SQL> SELECT max(sal) , min(sal) , avg(sal) , sum(sal) , count(*) FROM emp GROUP BY deptno ;
--非单组分组函数 需在 group by 之后
SQL> SELECT deptno , max(sal) , min(sal) , avg(sal) , sum(sal) , count(*) FROM emp GROUP BY deptno ;
-- 筛选条件 where 组函数不能出现在 WHERE 子句
SQL> SELECT deptno , max(sal) , min(sal) , avg(sal) , sum(sal) , count(*)
2 FROM emp
3 WHERE deptno IS NOT NULL
4 GROUP BY deptno ;
--排序 order by 能否用 别名 需看执行顺序
SQL> SELECT deptno , max(sal) maxsal , min(sal) , avg(sal) , sum(sal) , count(*)
2 FROM emp
3 WHERE deptno IS NOT NULL
4 GROUP BY deptno
5* ORDER BY maxsal
-- 创建 t_departments 表
SQL> CREATE TABLE t_departments (
2 id NUMBER(5) ,
3 name VARCHAR2(20) ,
4 CONSTRAINT t_departments_id_pk PRIMARY KEY(id)
5 );
-- 查看自己的表
SQL> SELECT table_name FROM user_tables ;
-- 通过查询来创建表(CTAS) 将搜索结果生成表
SQL> CREATE TABLE myemp1 AS SELECT * FROM emp ;
SQL> CREATE TABLE myemp3 AS SELECT empno AS id , ename AS name , job , sal AS salary FROM emp WHERE sal > 2000 ;
-- 截取表 (获取表结构)
SQL> CREATE TABLE myemp4 AS SELECT empno AS id , ename AS name , job FROM emp WHERE 1 = 2 ;
-- 添加列 ADD
SQL> ALTER TABLE t_employees
2 ADD ( gender CHAR(6) , hiredate DATE ) ;
-- 修改列名 RENAME
SQL> ALTER TABLE t_employees RENAME COLUMN hiredate TO ru_zhi_ri_qi ;
-- 修改列的宽度和类型 MODIFY
SQL> ALTER TABLE t_employees
2 MODIFY ( gender VARCHAR2(6) );
-- 删除列 DROP
SQL> ALTER TABLE t_employees DROP ( gender , hiredate );
-- 使用 rename ... to ... 重命名表
SQL> RENAME t_departments TO t_depts ;
-- 使用 ALTER TABLE .... RENAME TO ... 重命名表
SQL> ALTER TABLE t_employees RENAME TO t_emps ;
-- 删除表 DROP
SQL> DROP TABLE t_emps ;
-- 查看回收站(刚被删除的表)
SQL> show recyclebin
-- 恢复被删除的表 flashback
SQL> flashback table t_emps to before drop ;
-- 截断表 TRUNCATE 比delete一行一行删除数据 高效
SQL> TRUNCATE TABLE myemp3 ;
-- DML: 数据操纵语言 INSERT 、UPDATE 、DELETE
-- 使用 INSERT INTO 插入数据
SQL> INSERT INTO emp VALUES ( 1001 , 'awei' , 'enginner' , null , null , 8000 , null , null );
SQL> INSERT INTO emp ( empno , ename , job , sal ) VALUES ( 2002 , '姜禹志' , '攻城狮' , 8000 );
--显式 commit 事务 同一个会话中,一个事务终结意味着另一个事务开启
SQL> commit ;
-- 插入单引号 ''
SQL> INSERT INTO emp ( empno , ename ) VALUES ( 3003 , 'a''wei' );
-- 通过查询 将查询结果插入到 myemp3 表中 -- insert .... select ...
SQL> INSERT INTO myemp3 ( id , name , job , salary ) SELECT empno , ename , job , sal FROM emp ;
SQL> INSERT INTO myemp3 SELECT * FROM myemp3 ;
-- 批量插入 MySQL 中的批量插入在 Oracle 中是不支持的
SQL> INSERT ALL
2 INTO myemp4 ( id , name , job ) VALUES ( 1001 , 'awei' , 'enginner' )
INTO myemp3 (id,name,job,salary) VALUES ( 5005 , 'zegnzihao', 8002 )
4 INTO myemp4 ( id , name , job ) VALUES ( 3003 , 'laiyu' , 'enginner' )
5 SELECT 1 FROM dual ;
-- 更新数据 UPDATE .. SET..
SQL> UPDATE myemp4 SET name = '赵威' , job = '软件工程师' WHERE id = 1001 ;
-- 删除数据
SQL> DELETE FROM emp ;
-- 借助 rowid 删除重复的数据
SQL> DELETE FROM myemp3 e WHERE e.rowid > ( SELECT min(x.rowid) FROM myemp3 x WHERE x.id = e.id );
SQL> -- 实体完整性: 主键的各个列都不能为空
SQL> -- 参照完整性: 外键要么为空,要么一定是被参照表中的主键的某个值
SQL> -- 域完整性: 属性或属性组的取值必须满足当前属性或属性组已经定义的约束条件
SQL> -- 自定义完整性: 属性或属性组的取值必须满足用户自定义的约束条件
-- 创建表时指定约束
SQL> CREATE TABLE t_users (
2 id NUMBER(10) ,
3 username VARCHAR2(20) NOT NULL UNIQUE ,
4 password VARCHAR2(20) NOT NULL ,
5 PRIMARY KEY (id)
6 );
-- 通过查询数据字典来查看约束信息
SQL> DESC user_constraints ;
--如果指定约束时未设置约束名,则Oracle会自动生成以 SYS_C 为前缀的约束名
SQL> SELECT table_name , constraint_name , constraint_type FROM user_constraints WHERE lower(table_name) = 't_users' ;
-- 查询某张表中各个列的约束及其约束类型
SQL> SELECT x.table_name , x.column_name , x.constraint_name , y.constraint_type
2 FROM user_constraints y JOIN user_cons_columns x ON x.table_name = y.table_name AND x.constraint_name = y.constraint_name
3 WHERE lower(x.table_name) = 't_users' ;
-- 建表后追加约束 MODIFY 或 ADD
SQL> ALTER TABLE t_customers MODIFY ( username CONSTRAINT t_customers_username_nn NOT NULL );
SQL> ALTER TABLE t_customers ADD CONSTRAINT t_customers_username_uk UNIQUE ( username );
SQL> ALTER TABLE t_customers ADD CONSTRAINT t_customers_id_pk PRIMARY KEY ( id );
-- 联合主键
SQL> CREATE TABLE t_scores (
2 sid NUMBER(10) ,
3 cid NUMBER(10) ,
4 exam_time DATE ,
5 score NUMBER(4,1) ,
6 CONSTRAINT t_scores_sid_fk FOREIGN KEY (sid) REFERENCES t_students( id ) ,
7 CONSTRAINT t_scores_cid_fk FOREIGN KEY (cid) REFERENCES t_courses( id ) ,
8 CONSTRAINT t_scores_pk PRIMARY KEY(sid,cid,exam_time)
9 );
--使用脚本更改表的名字
--脚本内容
SELECT x.table_name , x.column_name , x.constraint_name , y.constraint_type
FROM user_constraints y JOIN user_cons_columns x ON x.table_name = y.table_name AND x.constraint_name = y.constraint_name
WHERE lower(x.table_name) = '&tableName' ;
--SQL
SQL> @constraint.sql
输入 tablename 的值: t_students
原值 3: WHERE lower(x.table_name) = '&tableName'
新值 3: WHERE lower(x.table_name) = 't_students'
-- 将字符串描述的日期转换为DATE类型
SQL> SELECT to_date( '2021-12-30' , 'YYYY-MM-DD' ) FROM dual ;