Oracle超全SQL,细节狂魔
📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验 中国DBA联盟(ACDU)成员,目前从事DBA及程序编程😜😜😜 擅长Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。 ❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
# 前言
SQL每个人都要用,但是用来衡量产出的并不是SQL本身, 你需要用这个工具,去创造其它的价值。
# 🐴 1.基本命令
🚀 1、登陆SQL*Plus(以system用户登陆) conn system/jeames@orcl conn sys/jeames@orcl as sysdba 断开连接 -- disc 🚀2、显示用户名 show user> 🚀 3、设置显示行的宽度为100 set linesize 100 🚀 4、设置每页显示的行数目为18\ set pagesize 18 🚀 5、显示当前数据库的全称 select * from global_name; 🚀 6、Oracle中究竟有多少种角色 select * from dba_roles; 🚀 7、查询数据库的表空间,一般是DBA用户去查 SQL>select tablespace_name from dba_tablespaces; 🚀 8、查询Oracle中所有的系统权限 SQL>select * from system_privilege_map order by name; 🚀 9、查询Oracle中所有的对象权限 SQL>select distinct privilege from dba_tab_privs; 🚀 10、当前用户下的表 SQL>select table_name from user_tables; 🚀 11、 显示当前数据库可以访问的所有数据字典视图 SQL>select * from dict where comments like'%grant%'; 🚀 12、查看某个用户具有什么样的角色? SQL>select * from dba_role_privs where grantee='SCOTT'; 🚀 13、查看某个用户(角色)具有什么样的系统权限? SQL>select * from dba_sys_privs where grantee='SCOTT'; 🚀 14、查看某个用户(角色)具有什么样的对象权限? SQL>select * from dba_tab_privs where grantee='SCOTT'; 🚀 15、查询Oracle中所有用户信息 SQL> select * from all_users; 🚀 16、关闭数据库 SQL>shutdown 🚀 17、启动数据库 SQL>startup 🚀18、显示初始化参数 SQL>show parameter 🚀19、提交事务 SQL>COMMIT; 🚀🚀20、打开输出选项 SQL>set serveroutput on
# 🐴 2.用户管理
🚀 1、创建用户watchdog SQL> create user watchdog identified by watchdog;
🚀 2、给用户watchdog修改密码 SQL>password watchdog
🚀 3、删除用户watchdog --删除的用户已经创建了表,就需要在删除时带一个参数cascade SQL>drop user watchdog cascade
🚀 4、运行Sql脚本(f:\wdd.sql) SQL>@ d:\wdd.sql SQL>start d:\ wdd.sql
🚀 5、将内容输出到指定文件中去 SQL>spool d:\bb.sql SQL>select * from emp SQL>spool off
🚀 6、授权resource角色给watchdog --resource角色可以创建表 SQL>grant resource to watchdog;
🚀 7、授权create session权限给watchdog --create session权限色可以登陆数据库 SQL> grant create session to watchdog;
🚀 8、授权查询Scott用户的imp表给watchdog SQL>grant select on scott.emp to watchdog;
🚀 9、授权all权限(scott.emp)给watchdog SQL>grant all on scott.emp to watchdog;
🚀 10、system希望收回watchdog对scott.emp表的查询权限 --谁授权谁收回 SQL>revoke select on scott.emp from watchdog;
🚀 11、希望watchdog用户可以去查询Scott的imp表, 还希望watchdog能把这个权限给别人 SQL>grant select on scott.emp to watchdog with grant option; 如果是系统权限,就加入with admin option,其他同理
# 🐴 3.管理用户口令
🚀 1、账户锁定 指定cfmaster这个用户最多只能尝试3次登录,锁定时间为2天 SQL>create profile lock_account limit failed_login_attempts 3 >password_lock_time 2; SQL>alter user cfmaster profile lock_account;
🚀 2、账户解锁 SQL>alter user cfmaster account unlock;
🚀 3、终止口令 给用户xiaoming创建一个profile文件,要求该用户每隔10天修改自家的密码 SQL>create profile myprofile limit password_life_time 10 password_grace_time 2; SQL>alter user xiaoming profile myprofile;
🚀 4、删除profile文件(lock_account) SQL>drop profile lock_account;
# 🐴 4.表的管理
# 🌈 4.1 创建表
SQL>create table student( 2 xuehao number(4), 3 xingming varchar2(20), 4 sex char(2), 5 birthday date, 6 sal number(7,2) 7 ) 8 / SQL> create table mytable (id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from >scott.emp;
# 🌈 4.2 修改表
🚀 1、给表添加一个字段CLASSID SQL> alter table student add (classid number(2));
🚀 2、修改字段xingming的长度为30 --修改字段的类型要求不能有数据 SQL> alter table student modify (xingming varchar2(30));
🚀 3、删除字段SAL SQL>alter table student drop column sal;\
🚀 4、修改表的名字为STU SQL> rename student to stu;
🚀 5、删除表(stu) SQL>drop table stu
# 🌈 4.3 添加数据
🚀 1、所有字段都插入 SQL> insert into student values(1,'李芳','女','03-8月-99');
🚀 2、改日期的默认格式 SQL> alter session set nls_date_format='yyyy-mm-dd';
🚀 3、部分字段插入(xingming、sex) SQL>insert into student(xingming,sex) values('李芳','女');
🚀 4、改一个字段(修改sex为“女”的生日为”2001-05-22”) SQL>update student set birthday='2001-05-22'where sex='女';
🚀 5、修改多个字段 --修改sex为女的生日为”2014-05-21”,xingming为张三 SQL> update student set birthday='2014-05-21',xingming='张三'where sex='女';
🚀 6、删除所有数据 SQL> delete from student;
🚀 7、删除某行 SQL> delete from stu where fullname='王平平';
🚀 8、设置回滚点 SQL> savepoint a; SQL> rollback to a;
# 🐴 5.表的查询
# 🌈 5.1 简单查询命令
🚀SQL> clear --清屏 🚀SQL> desc dba_users --查询表结构 🚀 SQL> set timing on --打开显示操作的时间 🚀 SQL> select count()from student; --统计行数 🚀 SQL> select sal12 "总工资" from imp; --取别名及使用算数表达式 🚀 SQL> select sal*12+nvl(comm,0)12 "平均工资" from imp; --空值处理用nvl函数 🚀 SQL> select distinct deptno,job from imp; --取消重复行 🚀 SQL> select ename "姓名", sal12 as sum from imp; --使用列的别名 🚀SQL> select ename ||'is a'||job from imp; --如何连接字符串(||)
# 🌈 5.2 where子句
🚀 1、如何查找1982.1.1日后入职的员工 SQL> select * from imp where hiredate>'1-1月-1982';
🚀 2、如何显示工资在2000到2500的员工的情况 SQL> select * from imp where sal>=2000 and sal<=2500;
🚀 3、如何显示empno为7369,7499,7876的员工的情况(IN的使用). SQL>select * from imp where empno in(7369,7499,7876);
# 🌈 5.3 like操作符
🚀1、如何显示首字符为S的员工姓名和工资 SQL>select * from imp where ename like'S%';
🚀 2、如何显示第三个字符为大写O的员工姓名和工资 SQL>select * from imp where ename like'__O%';
# 🌈 5.4 逻辑操作符号
🚀🚀 查询工资高于500或者是岗位为MANAGER的雇员, 同时还要满足他们的姓名首字母为大写的J? SQL> select * from imp where (sal >500 or job = 'manager')\ and ename like 'J%';
# 🌈 5.5 order by字句
🚀1、如何按照工资的从低到高的顺序显示雇员的信息? SQL> select * from imp order by sal;
🚀2、按照部门号升序而雇员的工资降序排列 SQL> select * from imp order by deptno, sal desc;
# 🌈 6、表的复杂查询
🚀1、数据分组
显示所有员工中最高工资和最低工资?. SQL> select max(sal),min(sal) from imp; 最高工资那个人是谁? SQL> select ename from imp where sal=(select max(sal) from imp); 显示工资高于平均工资的员工信息 SQL> select * from imp where sal > (select avg(sal) from imp); 显示每个部门的平均工资和最高工资? SQL> select avg(sal), max(sal), deptno from imp group by deptno; --分组查询的话,分组的字段一定要出现在查询的列表里面,否则会报错 显示平均工资低于2000的部门号和它的平均工资? SQL> select avg(sal), deptno from imp group by deptno having avg(sal) < 2000;
🚀2、多表查询
显示雇员名,雇员工资及所在部门的名字 SQL> select e.ename, e.sal, d.dname from imp e, dept d where e.deptno = d.deptno; 显示各个员工的姓名,工资及工资的级别? SQL> select e.ename, e.sal, s.grade from imp e, salgrade s where e.sal between s.losal and s.hisal; 显示雇员名,雇员工资及所在部门的名字,并按部门排序? SQL> select e.ename, e.sal, d.dname from imp e, dept d where e.deptno = d.deptno order by e.deptno;
🚀3、合并查询
1)union该操作符用于取得两个结果集的并集。 当使用该操作符时,会自动去掉结果集中重复行。 SQL> select ename, sal, job from imp where sal >2500 union select ename, sal, job from imp where job = 'MANAGER'; 2)union all该操作符与union相似, 但是它不会取消重复行,而且不会排序。 SQL> select ename, sal, job from imp where sal >2500 UNION ALL select ename, sal, job from imp where job = 'MANAGER'; 3)intersect使用该操作符用于取得两个结果集的交集。 SQL> select ename, sal, job from imp where sal >2500 Intersect select ename, sal, job from imp where job = 'MANAGER'; 4)minus使用改操作符用于取得两个结果集的差集, 他只会显示存在第一个集合中,而不存在第二个集合中的数据。 SQL> select ename, sal, job from imp where sal >2500 Minus select ename, sal, job from imp where job = 'MANAGER';
相关推荐阅读: 90天精通Oracle-实战系列 (opens new window) Oracle高可用实战系列 (opens new window) MySQL从入门到实战 (opens new window) 如何成为SQL高手 (opens new window) PostgreSQL从入门到实战 (opens new window)
大家可以点赞、收藏、关注、评论我啦 、有数据库相关的问题随时联系我或交流哟~!
作者:IT邦德 链接:https://juejin.cn/post/7077053220735942664 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。