当前位置: 首页 > news >正文

Oracle数据库尚硅谷学习笔记

文章目录

  • Oracle数据库体系结构简介
  • 补充SQL初步
    • 导入sql文件
    • 别名
    • 连接符
    • distinct去重的坑
  • 过滤和排序数据
    • 日期格式
    • 比较运算
    • 其它比较运算符
    • 逻辑运算
    • 优先级
    • 排序
  • 单行函数
    • SQL中不同类型的函数
      • 单行函数
        • 字符
        • 数值
        • 日期
        • 转换
        • 通用
    • 使用条件表达式
    • 嵌套查询
  • 多表查询
    • 等值连接
    • 非等值连接
    • 左外连接
    • 满外连接
    • 自连接
  • 聚合分组函数
  • 子查询
  • 创建和管理表
    • 创建表
  • 数据处理
  • 约束
    • NOT NULL
    • 列约束和表约束
    • 添加或删除约束
  • 视图
    • 视图基础
    • Top-N分析
  • 其它数据对象
    • 序列
    • 索引
    • 同义词
  • 控制用户权限及练习
    • 授权
    • 收回对象权限
  • SET集合运算符
  • 高级子查询
    • 多列子查询
    • 在FROM 子句中使用子查询
    • 在 SQL 中使用单列子查询
    • 相关子查询
    • 使用 EXISTS 和 NOT EXISTS 操作符
    • 使用子查询删除和更新数据
    • 使用 WITH 子句

Oracle数据库体系结构简介

Oracle实例:是存在于物理内存上的一种数据结构,用来管理和访问Oracle数据库,由系统提供的多个后台进程和一个共享内存池组成,共享的内存池可以被所有进程访问

实际上oracle实例也就是平常所说的数据库服务

区别:实例可以操作任何数据库,任何时刻一个实例只能关联一个数据库;但是一个数据库可以被多个实例同时操作【RAC】

在双十一:同款商品可以被多个用户访问;单个用户只能操作一件商品

-- 插入 sql 文件
@d:/del_data.sql;
@d:/hr_cre.sql;
@d:/hr_popul.sql;

SQL语句主要分为三大类

种类含义
DML(Data Manipulation Language)数据库操纵语言:修改和查询数据记录INSERT,DELETE,UPDATE,SELECT
DDL(Data Manipulation Language)数据库定义语言:定义数据库的结构,创建,修改和删除CREATE TABLE,CREATE INDEX,DROP TABLE,DROP INDEX,ALTER TABLE(修改表结构,添加、删除和修改列长度)
DCL(Data Control Language)数据库控制语言:用来控制数据库的访问,GRANT授权,REVOKE撤销授权,COMMIT提交事务,ROLLBACK事务回退,SAVEPOINT设置保存点,LOCK锁定特定部分数据库

补充SQL初步

--查询表结构
desc employees;

在这里插入图片描述
算术运算符作用于时间(时间只能加减不能乘除)和数字

--查询前天,今天和明天日期
select sysdate-1, sysdate, sysdate+1
from dual;

NULL值:无效,为指定的值(并不是空格或者0)。凡是NULL值参与了运算,结果都是NULL

导入sql文件

@d:/xxx.sql

别名

--别名使用双引号,字符串是单引号
SELECT sysdate-1 AS "昨天", sysdate AS "今天", sysdate+1 AS "明天"
FROM dual

需要注意的是oracle中字符串是单引号,别名用的是双引号

连接符

和MySQL的 CONCAT(str1, str2)不同的是把列于列,列与字符连接在一起用 || 表示合成列

--oracle中拼接字符串时 "||"
SELECT EMPLOYEE_NAME || '`s ID is:' || EMPLOYEE_ID
FROM employee

distinct去重的坑

--查询出的字段需要数量上相对
SELECT last_name, distinct(department_id)
FROM employee

报错原因是 last_name 需要和 去重后的部门ID 数量相对应,否则就是表达式缺失

过滤和排序数据

WHERE 子句紧跟随在 FROM 后边

日期格式

  • 字符和日期要包含在单引号
  • 字符大小写敏感,日期格式敏感
  • 默认的日期格式是 DD-MON月-RR
--查询的日期格式
SELECT last_name, hire_date FROM employees WHERE hire_date = '7-6-1994'
--查询出的hire_date字段数据格式:1994/6/7 星期
SELECT last_name, hire_date FROM employees WHERE to_char(hire_date, 'yyyy-mm-dd') = '1994-06-07'

比较运算

操作符含义
<小于
<=小于等于
=等于
>=大于等于
>大于
!=不等于,也可以是<>

其它比较运算符

操作符含义
BETWEEN…AND…闭区间内的值
INT(SET)等于值列表中的一个
LIKE模糊查询
IS NULL空值
IS NOT NULL非空值
--模糊查询过程中转义字符问题:查询名字中含有"_"的员工
SELECT last_name, department_id, salary
FROM employees
WHERE last_name LIKE '%\_%a' EXCAPE ('\')

逻辑运算

操作符含义
AND
OR
NOT

优先级

优先级
1算术运算符
2连接运算符
3比较运算符
4IS [NOT] NULL,IN,LIKE
5[NOT] BETWEEN…AND…
6NOT
7AND
8OR

排序

  • 默认生升序asc,降序desc
  • 一级排序相同则会自动跳到二级排序

单行函数

SQL中不同类型的函数

单行函数

字符

在这里插入图片描述
大小写控制函数

--小写和大写
SELECT LOWER('hand-china.COM') AS "LOWER小写", UPPER('hand-china.COM') AS "UPPER大写", INITCAP('hand-china.COM') AS "INITCAP大驼峰"
FROM dual

字符控制函数

函数结果
CONCAT(‘Hello’, ‘World’)HelloWorld
SUBSTR(‘HelloWorld’, 2, 4)ello
LENGTH(‘HelloWorld’)10
INSTR(‘HelloWorld’, ‘W’)6
LPAD(salary, 10, ‘*’)******7500
RPAD(salary, 10, ‘*’)7500******
TRIM(‘H’ FROM ‘HelloHWorldH’)elloHWOrld
REPLACE(‘abcdab’, ‘b’, ‘m’)amcdam

数值

在这里插入图片描述

--日期或者数字进行截断
SELECT TRUNC(435.45, 1), TRUNC(435.45), TRUNC(435.45, -1)
435.4	435	   430

日期

在这里插入图片描述

--两个日期之间相差的天数
SELECT "title", "level", SYSDATE-"create_time" AS "WorkedDays" FROM cxf_44569;
--两个日期之间相差的月数
SELECT "title", "level", (SYSDATE-"create_time")/30 AS "WorkedDays1", MONTHS_BETWEEN(SYSDATE, "create_time")  AS "WOrkedDays2" FROM cxf_44569;
--指定月数加上月数,指定日期下一个星期对应的日期
SELECT ADD_MONTHS(SYSDATE, 2), ADD_MONTHS(SYSDATE, -3), NEXT_DAY(SYSDATE, '星期六') FROM dual;
--每个月的倒数第二天创建的题目信息
SELECT * FROM cxf_44569 WHERE "create_time" = LAST_DAY("create_time")-1;
--日期的四舍五入和截断
SELECT SYSDATE, ROUND(SYSDATE, 'MONTH'), ROUND(SYSDATE, 'MM'), TRUNC(SYSDATE, 'HH') FROM dual;

转换

在这里插入图片描述
在这里插入图片描述
TO_CHAR 和 TO_DATE

--日期转字符串
SELECT "title", TO_CHAR("create_time", 'yyyy"年"mm"月"dd"日"')
FROM cxf_44569
WHERE '2023年08月30日' != TO_CHAR("create_time", 'yyyy"年"mm"月"dd"日"')
--字符串转日期
SELECT "title", TO_CHAR("create_time", 'yyyy"年"mm"月"dd"日"')
FROM cxf_44569
WHERE "create_time" != TO_DATE('2023年08月31日', 'yyyy"年"mm"月"dd"日"')

在这里插入图片描述

TO_CHAR 和 TO_NUMBER
在这里插入图片描述
在这里插入图片描述

--按照数据本地货币格式查询
SELECT TO_NUMBER('¥001,234,567.89', 'L000,000,999.99')
FROM dual

在这里插入图片描述

货币类型符号需要相对应

通用

适用于任何数据类型,同时也适用于空值

  • NVL(expr1, expr2):expr1为NULL,则返回expr2
  • NVL2(expr1, expr2, expr3):expr1不为NULL则返回expr2;否则返回expr3
  • NULLIF(expr1, expr2):如果expr1和expr2相等,则返回NULL;否则返回expr1
  • COALESCE(expr1, expr2, …exprN):如果第一个表达式为NULL则返回第二个;如果第二个还为NULL,则返回第三个
--NUL查询奖金提成后的工资
SELECT employee_id, last_name, salary*12(1+NVL(commission_pct, 0)) FROM employees

使用条件表达式

在这里插入图片描述

--CASE xxx WHEN xxx END
SELECt employee_id, last_name, department_id, CASE department_id WHEN 10 THEN salary*1.1,WHEN 20 THEN salary*1.2,ELSE THEN salary*1.3 END AS "New_Salary"
FROM employee
WHERE department_id IN(10, 20, 30)--DECODE()
SELECt employee_id, last_name, department_id, DECODE(department_id, 10, salary*1.1,20, salary*1.2,30, salary*1.3) AS "NewSalary"
FROM employees
WHERE department_id IN(10, 20, 30)

嵌套查询

  • 单行函数可以嵌套查询
  • 嵌套函数的执行顺序是先内后外

多表查询

等值连接

两个表中的数据有有交集

--查询员工信息,部门信息,地址信息
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id, l.city
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id

非等值连接

两个表中的数据互不交集

--查询运功信息和工作信息【两个表没有关联关系】
SELECT e.employee_id, e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary BETWEEN j.lowest_sal
AND j.highest_sal

左外连接

--查询员工信息和部门信息
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+)
--查询员工信息和部门信息
SELECT e.last_name, e.department_id, d.department_name
FROM employees e LEFT OUTER JOIN departments d
WHERE e.department_id = d.department_id

满外连接

-- 有个员工没有部门ID,但满外连接也会把该员显示出来
SELECT e.last_name, e.department_id, d.department_name
FROM employees e FULL JOIN departments d
WHERE e.department_id = d.department_id

自连接

--查询员工及员工老板的信息
SELECT emp.last_name, manaer.last_name, manager.salary, manager.email
FROM employee emp, employee manager
WHERE emp.manager_id = manager.employee_id
AND TO_CHAR(emp.last_name) = 'chen'

聚合分组函数

SUM,AVG,MIN,MAX在统计字段的时候自动会舍去NULL值

--查询各个部门不同岗位的平均工资
SELECT department_id, job_id, AVG(salary)
FROM employees
GROUP BY department_id, job_id
--查询各部门平均工资大于6k的部门和部门平均工资
SELECT department_id, avg(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 6000
  • 如果要使用 WHERE 的话,需要紧跟 FROM 之后
  • 包含在 SELECT 中的一定要出现在 GROUP BY 之后;出现在GROUP BY 之后的不一定需要出现在 SELECT
  • WHERE 中不能使用聚合函数;HAVING 中可以使用聚合函数

子查询

--查询job_id与141号员工相同,但salary比143号员工多的员工信息
SELECT last_name, employee_id, salary
FROM employeee
WHERE job_id = (SELECT job_id FROM employee WHERE employee_id = 141) AND salary > (SELECT salary FROM employee FROM employee WHERE employee_id = 143)

在这里插入图片描述

--查询部门中工资比本部门平均工资高的员工号,姓名和工资
SELECT employee_id, last_name, salary
FROM employee e1
WHERE salary > (SELECT AVG(salary)FROM employee e2WHERE e1.employee_id = e2.employee_idGROUP BY department_id)

创建和管理表

在这里插入图片描述
在这里插入图片描述

--查询用户定义的表
SELECT * FROM user_tables
SELECT table_name FROM user_tables
--查询用户定义的数据对象
SELECT * FROM user_objects
SELECT DISTINCT object_type FROM user_objects
--查询用户定义的表,视图,同义词和序列
SELECT * FROM user_catalog

创建表

--白手起家
CREATE TABLE emp1 ( id NUMBER ( 10 ), name VARCHAR2 ( 25 ), hire_date TIMESTAMP, salary NUMBER ( 10, 2 ) )
--复制表结构+数据
CREATE TABLE emp2 AS SELECT
id,
name AS "n a m e",
hire_date,
salary 
FROMemp1;
--复制表结构
CREATE TABLE emp3 AS SELECT
id,
name AS "name",
hire_date,
salary 
FROMemp1 
WHERE1 = 2;

在这里插入图片描述

--白手起家
CREATE TABLE emp1 ( id NUMBER ( 10 ), name VARCHAR2 ( 25 ), hire_date TIMESTAMP, salary NUMBER ( 10, 2 ) )
--复制表结构+数据
CREATE TABLE emp2 AS SELECT
id,
name AS "n a m e",
hire_date,
salary 
FROMemp1;
--复制表结构
CREATE TABLE emp3 AS SELECT
id,
name AS "name",
hire_date,
salary 
FROMemp1 
WHERE1 = 2;
--新增一字段
ALTER TABLE emp1 ADD ( email VARCHAR ( 20 ) DEFAULT '无' );
--修改一个字段
ALTER TABLE emp1 MODIFY ( id NUMBER ( 15 ) );
--删除一个列
ALTER TABLE emp1 DROP email;
--重命名一个列
ALTER TABLE emp1 RENAME COLUMN sal TO "s a l";
--删除一个表
DROP TABLE emp3;
--清空表数据,但表结构还在【增删改可以回滚:DELETE可以回滚】
TRUNCATE TABLE emp2;
DELETE FROM emp2;
--修改表名
RENAME emp2 TO employees2;

数据处理

--插入一条数据
INSERT INTO emp1 ( id, name, hire_date, sal )
VALUES( 10001, '张三', SYSDATE, 10000 );
--从其它地方拷贝数据进行复制【不用 VALUES但需要子查询中的值列表与 INSERT 子句中的列表对应】
INSERT INTO emp1 ( id, name, hire_date, sal ) SELECT
id + 1,
name,
hire_date,
sal 
FROMemp1;
--更改数据:修改114号员工的工作和工资和205号员工相等
UPDATE emp1 
SET job_id = ( SELECT job_id FROM emp1 WHERE employee_id = 205 ) 
AND salary = ( SELECT salary FROM emp1 WHERE employee_id = 205 ) 
WHEREemployee_id = 114;
--删除部门名称含有Public字符的部门ID
DELETE 
FROMemp1 
WHEREdepartment_id = ( SELECT department_id FROM emp1 WHERE department_name LIKE '%Public%' );
--控制事务
DELETE FROM emp1 WHERE id = 1;
SAVEPOINT A;
DELETE FROM emp1 WHERE id=2;
SAVEPOINT B;
ROLLBACK TO SAVEPOINT A;
ROLLBACK;

约束

在这里插入图片描述

NOT NULL

CREATE TABLE emp
(id NUMBER ( 10 ) CONSTRAINT emp_id_pk PRIMARY KEY,name VARCHAR2 ( 20 ) CONSTRAINT emp_name_nn NOT NULL,salary NUMBER ( 10, 2 ),email VARCHAR2(20),CONSTRAINT emp_email_uk UNIQUE(email)
);

列约束和表约束

CREATE TABLE emp2
(--列级约束id NUMBER ( 10 ) CONSTRAINT emp2_id_pk FPRIMARY KEY,name VARCHAR2 ( 20 ) CONSTRAINT emp2_name_nn NOT NULL,salary NUMBER ( 10, 2 ) CONSTRAINT emp2_salary_ CHECK ( salary > 1500 AND salary < 30000 ) NOT NULL,email VARCHAR ( 20 ),deparment_id NUMBER ( 10 )--表级约束CONSTRAINT emp2_email_uk UNIQUE ( email )--唯一约束--主键约束-- CONSTRAINT emp2_id_pk FPRIMARY KEY(id),--外键约束CONSTRAINT emp2_dept_id_fk FOREIGN KEY ( department_id ) REFERENCES departments ( department_id ) ON DELETE CASCADE --级联删除-- CONSTRAINT emp2_dept_id_fk FOREIGN KEY(department_id) REFERENCES departments(department_id) ON DELETE SET NULL--级联置空
);
  • 对于 UNIQUE 的NOT NULL约束,则允许插入的数据为NULL不会违反唯一值约束
  • 对于 NOT NULL 只能添加在列级上

在创建表级外键约束的时候需要添加上 FOREIGN KEY 关键字

--列级约束
department NUMBER(10) CONSTRAINT emp2_dpt_id_fk REFERENCES dpt2(department_id)
--表级约束
CONSTRAINT FOREIGN KEY emp2_dpt_id_fk REFERENCES dpt2(department_id)

添加或删除约束

--NULL约束只能用MODIFY修改
ALTER TABLE emp2 MODIFY(sal NUMBER(10,2, NOT NULL));
--删除一个约束
ALTER TABLE emp2 DROP CONSTRAINT emp2_name_uk;
--添加一个约束【添加之前需要把符合当前数据】
ALTER TABLE emp2 ADD CONSTRAINT emp2_name_uk UNIQUE(name);
--无效化一个约束
ALTER TABLE emp2 DISABLE CONSTRAINT emp2_nmae_uk;
--有效化一个约束
ALTER TABLE emp2 ENABLE CONSTRAINT emp2_name_uk;
--查询约束
SELECT constraint_name, constraint_type, search_condition FROM user_constraints WHERE table_name = 'emp2';
--查询定义约束的列
SELECT constraint_name, column_name FROM user_cons_columns WHERE table_name = 'emp2';

视图

视图基础

在这里插入图片描述

--创建数据库
CREATE TABLE emp
( id NUMBER ( 10 ) CONSTRAINT emp_id_pk PRIMARY KEY,name VARCHAR2 ( 20 ) CONSTRAINT emp_name_nn NOT NULL,salary NUMBER ( 10, 2 ),email VARCHAR2(30),CONSTRAINT emp_email_uk UNIQUE(email)
);
--插入数据
INSERT INTO emp ( id, name, salary, email ) VALUES ( 1, '张三', 6000, 'zhangsan@qq.com' );
INSERT INTO emp ( id, name, salary, email ) VALUES ( 2, '李四', 7500, 'lisi@qq.com' );
INSERT INTO emp ( id, name, salary, email ) VALUES ( 3, '王五', 9000, 'wangwu@qq.com' );
INSERT INTO emp ( id, name, salary, email ) VALUES ( 4, '老六', 4500, 'laoliu@qq.com' );
INSERT INTO emp ( id, name, salary, email ) VALUES ( 5, '小七', 5500, 'xiaoqi@qq.com' );
INSERT INTO emp ( id, name, salary, email ) VALUES ( 6, '甲', 3500, 'jia@qq.com' );
INSERT INTO emp ( id, name, salary, email ) VALUES ( 7, '乙', 6500, 'yi@qq.com' );
INSERT INTO emp ( id, name, salary, email ) VALUES ( 8, '丙', 9500, 'bing@qq.com' );
INSERT INTO emp ( id, name, salary, email ) VALUES ( 9, '丁', 3500, 'ding@qq.com' );
INSERT INTO emp ( id, name, salary, email ) VALUES ( 10, '戊', 1500, 'wu@qq.com' );
INSERT INTO emp ( id, name, salary, email ) VALUES ( 11, '戎', 2500, 'rong@qq.com' );
--创建视图
CREATE VIEW emp_view AS
SELECT id, name, salary, email FROM emp;
--查询视图
SELECT * FROM emp_view;
--查询视图
SELECT * FROM emp_view;
--查询表【发现此时视图已经修改了表数据】
SELECT * FROM emp;
--还可以给视图字段更换别名
CREATE VIEW emp_view1 AS
SELECT id AS "ID", name AS "名称", salary AS "薪资", email AS "邮箱" FROM emp;
--修改视图
CREATE OR REPLACE VIEW emp_view1 AS
SELECT id AS "ID", name AS "名称", salary AS "薪资", email AS "邮箱" FROM emp;
--创建只读视图【此时就无法修改视图】
CREATE OR REPLACE VIEW emp_view1 AS SELECTid AS "ID",name AS "名称",salary AS "薪资",email AS "邮箱" 
FROMemp WITH READ ONLY;
--删除视图
DROP VIEW emp_view1;

在这里插入图片描述

  • 创建视图过程中使用了分组函数就是复杂视图
  • 复杂视图的 DML 无法进行操作

Top-N分析

SELECT ROWNUM, name, salary FROM
(SELECT name, salary FROM emp ORDER BY salary DESC)
WHERE ROWNUM <= 3;

在这里插入图片描述
对 ROWNUM 只能使用 “<” 或 “<=”,而用 “=”,“>”,“>=” 都将不能返回任何数据

--查找4~6之间的员工薪资
SELECT ROWNUM, name, salary FROM
(SELECT name, salary FROM emp ORDER BY salary DESC)
WHERE ROWNUM <= 6 AND ROWNUM >=4;

在这里插入图片描述

--查找4~6之间的员工薪资
SELECT rn, name, salary 
FROM( SELECT ROWNUM AS rn, name, salaryFROM(SELECT name, salary FROM emp ORDER BY salary DESC)) 
WHERE rn >= 4 AND rn <= 6;

其它数据对象

在这里插入图片描述

序列

在这里插入图片描述

--创建序列
CREATE SEQUENCE empseq
INCREMENT BY 1 --每次增长1
START WITH 1 --从1开始增长
MAXVALUE 100 --提供的最大值,NOMAXVALUE无限制
CYCLE --需要循环
CACHE 50; --不需要缓存登录
--使用之前一定要先获取下一个值【迭代器到11为止】
SELECT empseq.nextval FROM dual;
--获取当前值
SELECT empseq.currval FROM dual;
--使用序列
INSERT INTO emp(id, name, salary) VALUES(empseq.nextval, '戌', 1500, 'xu@qq.com');
--修改序列的增量,最大值,最小值,循环选项或是否装入内存
ALTER SEQUENCE empseq
INCREMENT BY 2
MAXVALUE 100
NOCYCLE
NOCACHE
--查看当前有哪些序列
SELECt sequence_name, min_value, max_value, increment_by, last_number FROM user_sequences;
--删除序列
DROP SEQUENCE empseq;
  • 修改序列只有后续插入的值才会改变
  • 改变序列的初始值只能通过删除序列之后重建序列的方法实现
  • 将序列值装入内存可以提高访问效率
  • 序列在下列情况下会出现 裂缝
    • 回滚
    • 系统异常
    • 多个表同时使用同一序列
  • 如果不将序列的值装入内存(NOCACHE),可使用表 USER_SEQUENCES 查看序列当前的有效值

索引

在这里插入图片描述

--删除序列
CREATE INDEX emp_id_index ON emp(id);

什么时候创建索引?

  • 列中数据值分布范围很广
  • 列经常在 WHERE 子句或连接条件中出现
  • 表经常被访问而且数据量很大,访问的数据大概占据数据总量的2%~4%

什么时候不要创建索引

  • 表很小
  • 表经常更新
  • 查询的数据大于2%~4%
  • 列不经常作为连接条件或出现在WHERE子句中

索引在查询的时候速度快了,但是插入速度也就慢了

同义词

使用同义词访问相同的对象

  • 方便访问其它用户对象
  • 缩短对象名字长度
--添加同义词
--添加同义词
CREATE SYNONYM e FOR emp;
SELECT * FROM e;
--删除同义词
DROP SYNONYM e;

控制用户权限及练习

授权

  • 数据库安全性
    • 系统安全性
    • 数据安全性
  • 系统权限:对于数据库的权限
  • 对象权限:操作数据库对象的权限

以下创建用户和赋予权限都是利用 SYSTEM 用户创建 cvter 用户

--创建用户【用户是cvter并不是C##cvter,因为oracle官网说明了创建用户之前需要加C##或者c##】
CREATE USER C##cvter IDENTIFIED BY qwe123
--修改密码
ALTER USER C##cvter IDENTIFIED BY ewq321;

创建用户之后应该赋予权限

  • 创建会话:CREATE SESSION
  • 创建表:CREATE TABLE
  • 创建视图:CREATE VIEW
  • 创建序列:CREATE SEQUENCE
  • 创建过程:CREATE PROCEDURE
--赋予权限
GRANT CREATE SESSION TO C##cvter;--远程登陆数据库权限
GRANT CREATE TABLE TO C##cvter;

在这里插入图片描述
在这里插入图片描述

创建用户表空间
用户拥有 CREATE TABLE 权限之外还需要发呢配相应的表空间才可以开辟存储空间用于创建表

--创建用户表空间
ALTER USER C##cvter QUOTA UNLIMITED ON users;--无限制表空间大小
ALTER USER C##cvter QUOTA 5M ON users;--限制表空间大小为5MB

创建角色并赋予权限

--创建角色
CREATE ROLE C##my_role;
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO C##my_role;
CREATE USER C##cvter02 IDENTIFIED BY qwe123;
GRANT C##my_role TO C##cvter02;

对象授权
还需要对新建的用户开放 system.empselect和update 权限而其它权限无法使用

--对象权限
GRANT select, update ON system.emp TO C##cvter;
--其它权限无法使用
DROP TABLE system.emp;

在这里插入图片描述
WITH GRANT OPTION 和 PUBLIC 关键字

--WITH GRANT OPTION 使用户同样具有分配权限的权利
GRANT select, update ON system.emp TO C##cvter WITH GRANT OPTION;
--向数据库中所有用户分配权限
GRANT select ON system.emp TO PUBLIC;

收回对象权限

在这里插入图片描述

--查询用户拥有的权限
SELECT * FROM user_tab_privs_recd;
--收回cvter的select和update权限
REVOKE select, update ON system.emp FROM C##cvter;

SET集合运算符

在这里插入图片描述

查询的数据列数和数据类型应该精准对应

UNION ALL 会返回全部的集合。而UNION会返回去重后的集合

高级子查询

多列子查询

--查询与141号或174号员工的manager_id和department_id相同的其他员工的employee_id, manager_id, department_id
SELECTemployee_id,manager_id,department_id 
FROMemployees 
WHERE(manager_id, department_id) IN ( SELECT manager_id, department_id FROM employees WHERE employee_id IN ( 141, 174 ) ) AND employee_id NOT IN ( 141, 174 );

在FROM 子句中使用子查询

--返回比本部门平均工资高的员工的last_name, department_id, salary及平均工资
SELECT last_name, department_id, salary, (SELECT AVG(salary) FROM employees e3 WHERE e1.department_id = e3.department_id GROUP BY department_id)
FROM employees e1
WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e1.department_id = e2.department_id GROUP BY department_id);SEELCT last_name, e1.department_id, e2.avg_sal ) FROM employees e1, (SELECT department_id, AVG(salary) avg_sal FROM employees GROUP BY department_id) e2 WHERE e1.department_id = e2.department_id;

在 SQL 中使用单列子查询

--显式员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800的department_id相同,则location为’Canada’,其余则为’USA’
SELECT employee_id, last_name,( CASE department_id WHEN ( SELECT department_id FROM departments WHERE location_id = 1800 ) THEN 'Canada' ELSE 'USA' END ) location 
FROMemployees;--查询员工的employee_id,last_name,要求按照员工的department_name排序
SELECT employee_id, last_name
FROM employees e
ORDER BY (SELECT department_name FROM departments d WHERE e.department_id = d.department_id);

相关子查询

在这里插入图片描述

--若employees表中employee_id与job_history表中employee_id相同的数目不小于2,输出这些相同id的员工的employee_id,last_name和其job_id
SELECT employee_id, last_name, job_id
FROM employees e1
WHERE 2 <= (SELECT COUNT(*) FROM job_history WHERE employee_id = e1.employee_id);

使用 EXISTS 和 NOT EXISTS 操作符

在这里插入图片描述
EXISTS

--查询公司管理者的employee_id, last_name, job_id, department_id信息
--方案一
SELECT e1.employee_id, e1.last_name, e1.last_name, e1.job_id, e1.department_id
FROM employees e1
WHERE e1.employee_id IN (SELECT manager_id FROM employees e2 WHERE e1.employee_id = e2.manager_id										  );
--方案二
SELECT DISTINCT e1.employee_id, e1.last_name, e1.last_name, e1.job_id, e1.department_id
FROM employees e1, employees e1
WHERE e1.employee_id = e2.manager_id;
--方案三
SELECT employee_id, last_name, job_id, department_id
FROM employees e1
WHERE EXISTS (SELECT 'A' FROM employees e2 WHERE e1.employee_id = e2.manager_id);

NO EXISTS

--查询departments表中,不存在于employees表中的部门的department_id和department_name
SELECT department_id, department_name
FROM departments d
WHERE (SELECT 'C'FROM employeesWHERE department_id = d.department_id);--差集
SELECT department_id, department_name
FROM departments d
MINUS
SELECT department_id, department_name
FROM employees

使用子查询删除和更新数据

--更新
UPDATE emp 
SET department_name = ( SELECT department_name FROM departments WHERE emp.department_id = department_id );
--删除
DELETE 
FROMemployees e 
WHEREemployee_id IN ( SELECT employee_id FROM emp_history WHERE employee_id = e.employee_id );

使用 WITH 子句

在这里插入图片描述

--查询公司中各部门的总工资大于公司中各部门的平均总工资的部门信息
WITH dept_sumsal AS ( SELECT department_name, SUM( salary ) sum_sal1, sumsal, FROM departments d, employees e WHERE d.department_id = e.department_id GROUP BY department_name ),
dept_avgsal AS (SELECT SUM(sum_sal)/COUNT(*) avg_sum_sal2 FROM dept_sumsal)
SELECT * FROM dept_sumal WHERE sum_sal1 > (SELECT avg_sum_sal2 FROM dept_avgsal) ORDER BY department_name;

相关文章:

Oracle数据库尚硅谷学习笔记

文章目录 Oracle数据库体系结构简介补充SQL初步导入sql文件别名连接符distinct去重的坑 过滤和排序数据日期格式比较运算其它比较运算符逻辑运算优先级排序 单行函数SQL中不同类型的函数单行函数字符数值日期转换通用 使用条件表达式嵌套查询 多表查询等值连接非等值连接左外连…...

CG MAGIC进行实体渲染后!分析渲染器CR和VR的区别之处!

新手小白来说&#xff0c;如何选择渲染器&#xff0c;都会提出疑问&#xff1f; 渲染效果图究竟用CR渲染器还是VR渲染器呢&#xff1f; 今天&#xff0c;CG MAGIC小编通过一个真实的项目场景&#xff0c;实例渲染之后&#xff0c;CR渲染器和VR渲染器区别有哪几点&#xff1f; 1…...

Ubuntu下Python3与Python2相互切换

参考文章&#xff1a;https://blog.csdn.net/Nicolas_shen/article/details/124144931 设置优先级 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 200...

【深度学习】实验07 使用TensorFlow完成逻辑回归

文章目录 使用TensorFlow完成逻辑回归1. 环境设定2. 数据读取3. 准备好placeholder4. 准备好参数/权重5. 计算多分类softmax的loss function6. 准备好optimizer7. 在session里执行graph里定义的运算 附&#xff1a;系列文章 使用TensorFlow完成逻辑回归 TensorFlow是一种开源的…...

2023-09-04 Linux 让shell编译脚本里面设置的环境变量改变kernel里面驱动文件的宏定义值方法,我这里用来做修改固件版本

一、原生的读取版本接口是/proc/version&#xff0c;我这里需要提供获取固件版本号的api给app&#xff0c;因为版本号会经常需要修改&#xff0c;如果每次都到kernel下修改比较麻烦&#xff0c;我这里是想在编译脚本里面对版本号进行修改&#xff0c;这样方便一点。 二、主要修…...

Python操作Excel实战:Excel行转列

# 1、原始数据准备 样例数据准备 地区1m2-5m6-10m11-20m21-40m地区单价计费单位费用最小值费用最大值北京13012011010090     天津13012011010090     石家庄13012011010090     保定140130120110100     张家口170150130120110     邢台1401201101…...

java实现迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供一种方法来顺序访问一个聚合对象&#xff08;如列表、集合、数组等&#xff09;中的元素&#xff0c;而不暴露聚合对象的内部表示。迭代器模式通常包括以下角色&#xff1a;迭代器&a…...

C++day7模板、异常、auto关键字、lambda表达式、数据类型转换、STL、list、文件操作

作业 封装一个学生的类&#xff0c;定义一个学生这样类的vector容器, 里面存放学生对象&#xff08;至少3个&#xff09; 再把该容器中的对象&#xff0c;保存到文件中。 再把这些学生从文件中读取出来&#xff0c;放入另一个容器中并且遍历输出该容器里的学生。 #include …...

【校招VIP】产品分析之活动策划宣传

考点介绍&#xff1a; 产品的上线运营是非常重要的。应该来说好的产品都是运营出来的&#xff0c;在一运营过程中难免会依靠策划活动来提高产品知名度、用户数。用户粘度等等指标一&#xff0c;如何策划一个成功的活动就显得非常重要。 产品分析之活动策划宣传-相关题目及解析…...

node基础之一:fs 模块

概念&#xff1a;文件的创建、删除、重命名、移动、写入、读取等 const fs require("fs");// 写入 fs.writeFile("./demo.txt", "hello", (err) > {}); fs.writeFileSync();// 追加 fs.appendFile("./demo.txt", "hello&quo…...

如何快速搭建母婴行业的微信小程序?

如果你想为你的母婴行业打造一个独特的小程序&#xff0c;但没有任何编程经验&#xff0c;别担心&#xff01;现在有许多小程序制作平台提供了简单易用的工具&#xff0c;让你可以轻松地建立自己的小程序。接下来&#xff0c;我将为你详细介绍搭建母婴行业小程序的步骤。 首先&…...

【科普向】Jmeter 如何测试接口保姆式教程

现在对测试人员的要求越来越高&#xff0c;不仅仅要做好功能测试&#xff0c;对接口测试的需求也越来越多&#xff01;所以也越来越多的同学问&#xff0c;怎样才能做好接口测试&#xff1f; 要真正的做好接口测试&#xff0c;并且弄懂如何测试接口&#xff0c;需要从如下几个…...

阿里云2核4G服务器5M带宽5年费用价格明细表

阿里云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS&#xff0c;轻量2核4G4M带宽服务器297元一年&#xff0c;2核4G云服务器ECS可以选择计算型c7、c6或通用算力型u1实例等&#xff0c;买5年可以享受3折优惠&#xff0c;阿腾云分享阿里云服务器2核4G5M带宽五年费用表&…...

【图解RabbitMQ-2】图解JMS规范与AMQP协议是什么

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...

springboot整合mybatis实现增删改查(xml)--项目阶段1

目录 一、前言 二、创建项目 创建MySQL数据库和表 创建springboot项目 本文总体代码结构图预览 三、编写代码 &#xff08;一&#xff09;新建实体层属性类 &#xff08;二&#xff09;新建数据层mapper接口 &#xff08;三&#xff09;新建mapper的映射SQL&#xff08…...

springboot文件上传异步报错

因为迁移的生产环境&#xff0c;在新的服务器发生了之前没有遇到的问题&#xff0c;这种问题是在异步文件上传的时候才会出现 错误信息如下 16:17:50.009 ERROR c.w.einv.minio.service.impl.MinioFileServiceImpl - 文件上传错误! java.io.FileNotFoundException: /applicati…...

error: unable to unlink old ‘.gitlab-ci.yml‘: Permission denied

#gitlab-runner 执行代码git pull origin xxx 更新时候报 error: unable to unlink old ‘.gitlab-ci.yml’: Permission denied 问题环境&#xff1a;centos 部署gitlab-runner 执行脚本方式 选的shell 产生问题的原因&#xff1a;gitlab-runner程序进程占用锁定了.gitlab-ci…...

AJAX学习笔记3练习

AJAX学习笔记2发送Post请求_biubiubiu0706的博客-CSDN博客 1.验证用户名是否可用 需求,用户输入用户名,失去焦点-->onblur失去焦点事件,发送AJAX POST请求,验证用户名是否可用 新建表 前端页面 WEB-INF下新建lib包引入依赖,要用JDBC 后端代码 package com.web;import jav…...

springboot实战(五)之sql业务日志输出,重要

目录 环境&#xff1a; 一、mybatis-plus之sql分析日志输出 1.配置 2.验证 3.高级输出方式 二、业务日志输出到文件 1.添加log4j2依赖 2.排除logback依赖 3.新增log4j2的配置文件 4.添加配置 5.启动测试 6.给日志请求加个id 6.1、过滤器filter实现 6.2、测试 6.3、…...

redis7.2.0 centos源码编译安装并设置开机自启动

下载源码包 wget https://github.com/redis/redis/archive/7.2.0.tar.gz tar -zxf 7.2.0.tar.gz 编译编码 编译编码 cd redis-7.2.0 make && make install 此时默认redis-server redis-cli等命令行安装到目录/usr/local/bin/目录中。 如果你想安装命令行到指定目录中你…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...