IT评测·应用市场-qidao123.com

标题: 工作中,我们经常用到哪些SQL语句呢? [打印本页]

作者: 千千梦丶琪    时间: 2023-5-8 08:23
标题: 工作中,我们经常用到哪些SQL语句呢?
目录

一、DDL部分(create、drop、alter)

1.1 create 语句上

①语法:
  1. create table table_name (                        
  2.     column_name datatype [null|not null],         
  3.     column_name datatype [null|not null],
  4.     ...
  5.     [constraint]
  6. )
  7. -- table_name: 数据库表名称,在一个数据库中数据表名称不能重复
  8. -- column_name :表中的列名,列名在一个表中也不能重复
  9. -- datatype:该列存放数据的数据类型
  10. -- [null|not null] :该列是否允许为空
  11. -- [constraint]:为表中的列设置约束(主键约束、外检约束、检查约束等)
复制代码
②举例:创建一张商品信息表(productinfo),表包含商品编号、商品名称、商品价格、商品数量、商品类型、商品描述、产地7个字段,并设置主键约束、非空、检查约束等
  1. create table productinfo(
  2.     productid varchar2(10) PRIMARY KEY,
  3.     productname varchar2(50) not null,
  4.     productprice number(8,2) not null,
  5.     qty          number(10),
  6.     category     varchar2(10),
  7.     desperation  varchar2(400),
  8.     orign        varchar2(50)
  9.     CONSTRAINT productname_uk UNIQUE(productname)
  10. )
复制代码
1.2 drop 语句

① 语法:
  1. drop table table_name;
复制代码
②举例:删除上面所创建的商品信息表
  1. drop table productinfo;
复制代码
1.3 alter 语句

① 语法
  1. alter table table_name
  2. add column_name | modify column_name | drop column column_name;
  3. --add column_name : 用于向表中添加列
  4. --modify column_name : 用来修改表中已存在的列信息
  5. --drop column : 删除表中列
复制代码
② 举例 : 向商品信息表中添加备注字段、修改备注字段类型、删除备注字段
  1. alter table productinfo add remark varchar2(200);
  2. alter table productinfo modify remark number(2,2);
  3. alter table productinfo drop column remark;
复制代码
二、DML(数据操纵语言)和DQL(数据查询语言)

2.1 insert 语句

① 语法:
  1. insert into table_name(colunm_name1,colunm_name2,colunm_name3,...)values(data1,data2,data3...)
  2. -- colunm_name1: 指定表中要添加数据的列名,可以是一个或多个
  3. -- data1:要填入指定列的数据值,值的数目要与列数量一致
复制代码
② 举例:向商品信息表中添加一条商品信息
  1. insert into productinfo
  2.   (productid, productname, productprice, qty, category, desperation, orign)
  3. values
  4.   ('10001', '电视机', 3250, 2, '01', '65寸智能电视', '小米集团');
复制代码
2.2 update 语句

① 语法:
  1. update table_name set colunm_name1=data1,colunm_name2=data2,...{where condition};
复制代码
② 举例:将商品信息表中的电视机名称修改成“小米电视机”,价格修改成4500
  1. update productinfo
  2.    set productname = '小米电视机',
  3.        productprice = 4500
  4. where productid = '10001';
复制代码
2.3 delete 语句

① 语法:
  1. delete from table_name {where condition};
复制代码
② 举例:删除商品信息表中编号为10001 的数据
  1. delete productinfo
  2. where productid = '10001';
复制代码
2.4 select 语句

① 语法:
  1. select colunm_name1,colunm_name2,colunm_name3,... from table_name {where condition};
复制代码
② 举例:查询出商品编码为10001的商品信息
  1. select productid, productname, productprice, qty, category, desperation, orign from productinfo where productid = '10001'
复制代码
2.5 其他操纵语言

2.5.1 truncate 语句

truncate语句和delete语句一样都是用来删除表中数据,但是两者是有区别的,使用truncate语句是没有条件的删除,可以把表中数据全部删除,truncate删除表中数据的速度比delete快
① 语法
  1. truncate table table_name;
复制代码
② 举例:删除商品信息表中全部数据
  1. truncate table productinfo;
复制代码
2.5.2 merge 语句

merge语句与update语句功能类似,都是修改表中数据。但是两者是有区别的,merge可以对数据表同时进行增加和修改操作
① 语法
  1. merge [into] table_name1
  2.     using table_name2
  3.     on (condition)
  4.     when matched then merge_update_clause
  5.     when not matched then merge_insert_clause;
  6. -- table_name1 : 要修改或添加的表
  7. -- table_name2:参照的更新的表
  8. -- condition : table_name1 和 table_name2 表之间的关系,或其他条件
  9. -- merge_update_clause:条件匹配执行语句
  10. -- merge_insert_clause:条件不匹配执行语句 可以去掉
复制代码
② 举例:当满足条件时,根据fin_item_compare表中的itemcode 更新ipb_itemlist表的sicode字段
  1. merge into ipb_itemlist t1 using fin_item_compare t2
  2. on (t1.orgcode = t2.orgcode and t1.itemid = t2.itemid  and t1.isdrug= '1' and t1.inid = '30675328')
  3. when matched then
  4. update set t1.sicode = t2.itemcode
复制代码
三、用户角色权限

3.1 用户相关

3.1.1 创建用户

① 语法:
  1. create user username
  2. identified by password
  3. or externally as certificate_dn
  4. or globally as directory_dn
  5. [default tablespace tablespacename]
  6. [temporary tablespace tablespaceName]
  7. [profile profile]
  8. [quota integer|unlimited on tablespaceName]
  9. [password expire]
  10. [account lock|unlock]
  11. --username : 用户名称
  12. --identified by password:用户口令
  13. --[default tablespace tablespacename] :默认表空间;
  14. --[temporary tablespace tablespaceName] :临时表空间;
  15. --[profile profile]:设置当前用户使用的概要文件的名称
  16. --[quota integer|unlimited on tablespaceName]:设置当前用户使用表空间的最大值,如果设置成unlimited 表示对表空间的使用没有限制
  17. --[password expire]: 设置当前用户密码立即处于过期状态,用户如果想再登陆数据库必须要更改密码
  18. --[account lock|unlock]: 设置当前用户锁的状态,lock表示不能访问数据库unlock表示可以访问数据库
复制代码
②举例:创建一个user2的用户,并且设置密码为立即过期方式
  1. create user user2   
  2. identified by abcd   --口令是abcd
  3. default tablespace test    --默认表空间是test
  4. quota 10M on test          -- 在表空间test中使用的磁盘限额是10MB
  5. temporary tablespace temp  --临时表空间为temp
  6. profile pro_test           --使用概要文件是pro_test
  7. password expire            --密码为立即过期状态
复制代码
3.1.2 修改用户

①语法:
  1. alter  user username identified
  2. {by password [replace old_pwssword]
  3. |externally as certificate_dn
  4. | globally as directory_dn
  5. [default tablespace tablespacename]
  6. [temporary tablespace tablespaceName]
  7. [profile profile]
  8. [quota integer|unlimited on tablespaceName]
  9. [password expire]
  10. [account lock|unlock]
  11. }
复制代码
②举例:修改用户user2的密码为123456
  1. alter user user2 identified by 123456   --修改user2密码为123456
复制代码
③举例:修改用户缺省表空间
  1. Alter user user2 default tablespace users;   --修改user2缺省表空间为users
复制代码
④举例:修改用户临时表空间
  1. Alter user user2 temporary tablespace temp_data;  --修改user2临时表空间为temp_data
复制代码
⑤举例:强制用户修改口令字
  1. Alter user user2 password expire;   --强制用户修改口令
复制代码
⑥用户加锁、解锁
  1. Alter user user2 account lock;  -- 加锁
  2. Alter user user2 account unlock;  -- 解锁
复制代码
3.1.3 删除用户

①语法:
  1. drop user username
复制代码
② 举例:删除user2用户
  1. drop user user2;
复制代码
3.1.4 监视用户

①查询用户会话信息
  1. select username, sid, serial#, machine from v$session;
复制代码
② 删除用户会话信息
  1. Alter system kill session 'sid, serial#';
复制代码
③查询用户SQL语句
  1. SQL> select user_name, sql_text from v$open_cursor;
复制代码
3.2 权限管理相关

3.2.1  权限分类

系统权限:系统规定用户使用数据库的权限。(系统权限是对用户而言)。
实体权限:某种权限用户对其它用户的表或视图的存取权限。(是针对表或视图而言的)。
3.2.2  系统权限

①系统权限分类
DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。
RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。
CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。
对于普通用户:授予connect, resource权限。
对于DBA管理用户:授予connect,resource, dba权限。
②系统权限授权命令
系统权限只能由DBA用户授出:sys, system最开始只能是这两个用户。普通用户通过授权可以具有与system相同的用户权限,但永远不能达到与sys用户相同的权限,system用户的权限也可以被回收。
授权语法:
  1. grant connect, resource, dba to 用户名1 [,用户名2]...;
复制代码
举例:给user2授权
  1. grant connect, resource to user2;
复制代码
查询用户权限:
  1. select * from dba_role_privs;
  2. select * from dba_sys_privs;
  3. select * from role_sys_privs;
复制代码
  1. drop user 用户名 cascade; --加上cascade则将用户连同其创建的东西全部删除
复制代码
③ 系统权限传递
增加WITH ADMIN OPTION选项,则得到的权限可以传递。
  1. grant connect, resorce to user2 with admin option;  --可以传递所获权限。
复制代码
④ 系统权限收回
  1. Revoke connect, resource from user2;
复制代码
说明:
(1)如果使用WITH ADMIN OPTION为某个用户授予系统权限,那么对于被这个用户授予相同权限的所有用户来说,取消该用户的系统权限并不会级联取消这些用户的相同权限。
(2)系统权限无级联,即A授予B权限,B授予C权限,如果A收回B的权限,C的权限不受影响;系统权限可以跨用户回收,即A可以直接收回C用户的权限。
3.2.3 实体权限

①实体权限分类:
select、 update、 insert、alter、index、 delete、all  (all包括所有权限)、execute(执行存储过程权限)
举例:proudct 属于user01表,将proudct 权限授权给usert02
user01:
  1. grant select, update, insert on product to user02;
  2. grant all on product to user02;
复制代码
user02:
  1. select * from user01.product; --此时user02可以查询到user01.product
复制代码
②将表的操作权限授予全体用户
  1. grant all on product to public;  -- public表示是所有的用户,这里的all权限不包括drop。
  2. [实体权限数据字典]:
  3. select owner, table_name from all_tables; -- 用户可以查询的表
  4. select table_name from user_tables;  -- 用户创建的表
  5. select grantor, table_schema, table_name, privilege from all_tab_privs; -- 获取可以存取的表(被授权的)
  6. select grantee, owner, table_name, privilege from user_tab_privs;   -- 授出权限的表(授出的权限)
复制代码
③DBA用户可以操作全体用户的任意基表(无需授权,包括删除)
DBA用户具有以下权限:
  1. /*
  2. 创建其他用户的表
  3. */
  4. Create table stud02.product(
  5. id number(10),
  6. name varchar2(20)
  7. );
  8. /*
  9. 删除其他用户的表
  10. */
  11. drop table stud02.emp;
  12. /*
  13. 根据用户1的数据为用户2创建表
  14. */
  15. create table stud02.employee
  16. as
  17. select * from scott.emp;
复制代码
3.2.3  实体权限传递(with grant option)

user01:
  1. grant select, update on product to user02 with grant option; -- user02得到权限,并可以传递。
复制代码
3.2.4 实体权限回收

user01:
  1. Revoke select, update on product from user02;  --传递的权限将全部丢失。
复制代码
说明
(1)如果取消某个用户的对象权限,那么对于这个用户使用WITH GRANT OPTION授予权限的用户来说,同样还会取消这些用户的相同权限,也就是说取消授权时级联的。
3.3 角色相关

角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限
3.3.1 系统预定义角色

oracle数据库安装之后会自动创建一些角色
① CONNECT, RESOURCE, DBA
这些预定义角色主要是为了向后兼容。其主要是用于数据库管理
② DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE, SELECT_CATALOG_ROLE
这些角色主要用于访问数据字典视图和包。
③ EXP_FULL_DATABASE, IMP_FULL_DATABASE
这两个角色用于数据导入导出工具的使用。
④ AQ_USER_ROLE, AQ_ADMINISTRATOR_ROLE
AQ:Advanced Query。这两个角色用于oracle高级查询功能。
⑤ SNMPAGENT
用于oracle enterprise manager和Intelligent Agent
⑥ RECOVERY_CATALOG_OWNER
用于创建拥有恢复库的用户
⑦ HS_ADMIN_ROLE
3.3.2 管理角色

① 建一个角色
  1. create role role1;
复制代码
② 将权限授权给角色
  1. grant create any table,create procedure to role1;
复制代码
③ 将角色授予角色给用户
  1. grant role1 to user1;
复制代码
④ 查看角色所包含的权限
  1. select * from role_sys_privs;
复制代码
⑤ 创建带有口令的角色(在生效带有口令的角色时必须提供口令)
  1. create role role1 identified by password1;
复制代码
⑥ 修改角色:是否需要口令
  1. alter role role1 not identified;
  2. alter role role1 identified by password1;
复制代码
⑦ 设置当前用户要生效的角色
(注:角色的生效是一个什么概念呢?假设用户a有b1,b2,b3三个角色,那么如果b1未生效,则b1所包含的权限对于a来讲是不拥有的,只有角色生效了,角色内的权限才作用于用户,最大可生效角色数由参数MAX_ENABLED_ROLES设定;在用户登录后,oracle将所有直接赋给用户的权限和用户默认角色中的权限赋给用户。)
  1. set role role1;--使role1生效
  2. set role role,role2;--使role1,role2生效
  3. set role role1 identified by password1;--使用带有口令的role1生效
  4. set role all;--使用该用户的所有角色生效
  5. set role none;--设置所有角色失效
  6. set role all except role1; --除role1外的该用户的所有其它角色生效。
  7. select * from SESSION_ROLES;--查看当前用户的生效的角色。
复制代码
⑧ 修改指定用户,设置其默认角色
  1. alter user user1 default role role1;
  2. alter user user1 default role all except role1;
复制代码
⑨ 删除角色
角色删除后,原来拥用该角色的用户就不再拥有该角色了,相应的权限也就没有了。
  1. drop role role1;
复制代码
四、工作常用sql总结

4.1 cmd连接Oracle
  1. sqlplus scott/tiger@192.168.205.100:1521/orcl
复制代码
4.2 查看数据库版本
  1. select * from v$version;
复制代码
4.3 查看所有dblink
  1. select * from ALL_DB_LINKS;
复制代码
4.4 查看所有定时job
  1. select * from all_jobs;
复制代码
4.5 查看当前用户所有序列
  1. select * from user_sequences; --last_number就是此刻执行nextval的值,last_number - increment_by 就是当前值
复制代码
4.6 查看数据库允许的最大连接数
  1. select value from v$parameter where name ='processes';
复制代码
4.7 查看当前的session连接数
  1. select count(*) from v$session;
复制代码
4.8 查看并发连接数
  1. select count(*) from v$session where status='ACTIVE';
复制代码
4.9 查询用户拥有的所有表
  1. select * from all_tables where owner='TEST';
复制代码
4.10 查询数据库进程数
  1. select value from v$parameter where name = 'processes'; --取得进程数的上限。
  2. select count(*) from v$process; --取得数据库目前的进程数。
复制代码
4.11 数据误删除恢复
  1. select * from tablename as of timestamp sysdate -1/24; --一小时前表数据
  2. select * from tablename as or timestamp sysdate-5/1440; --5分钟前的表数据
复制代码
4.12 获取某张表的所有字段
  1. select * from user_tab_columns where table_name ='表名大写'
复制代码
4.13 生成连续时间区间内时间
  1. --2019-03-13 日00 点到23 点内时间
  2. SELECT to_char(to_date('2019-03-13 00', 'yyyy-mm-dd hh24') +
  3.                (ROWNUM - 1) / 24,
  4.                'yyyy-mm-dd hh24') sdate
  5.   FROM dual
  6. CONNECT BY ROWNUM <= (to_date('2019-03-13 23', 'yyyy-mm-dd hh24') -
  7.            to_date('2019-03-13 00', 'yyyy-mm-dd hh24')) * 24 + 1
复制代码
② 保留小数点后面的0
  1. select df.tablespace_name 表空间,
  2.        totalspace 总_M,
  3.        freespace 剩_M,
  4.        round((1 - freespace / totalspace) * 100, 2) || '%' 使用率
  5.   from (select tablespace_name, round(sum(bytes) / 1024 / 1024) totalspace
  6.           from dba_data_files
  7.          group by tablespace_name) df,
  8.        (select tablespace_name, round(sum(bytes) / 1024 / 1024) freespace
  9.           from dba_free_space
  10.          group by tablespace_name) fs
  11. where df.tablespace_name = fs.tablespace_name
  12.    and df.tablespace_name like '%%'
  13. order by df.tablespace_name
复制代码
③ 即保留小数点前面的0也保留小数点后面的0
  1. select t1.name, t2.name
  2.    from v$tablespace t1, v$datafile t2
  3.   where t1.ts# = t2.ts#
复制代码
4.18 Oracle分页查询
  1. --1.手工改变已存在数据文件的大小
  2. ALTER TABLESPACE app_data ADD DATAFILE
  3. 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP01.DBF' SIZE 20480M;
  4. --2.允许已存在的数据文件自动增长
  5. ALTER DATABASE DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP01.DBF'
  6. AUTOEXTEND ON NEXT 100M MAXSIZE 20480M;
  7. --3.增加数据文件(设置的每个文件初始分配空间为7g, autoextend on为自动增长大小,oracle单个文件大小最大不超过32g)
  8. --这里增加两个数据文件,需要扩容的表空间是APP_DATA
  9. ALTER TABLESPACE APP_DATA  ADD DATAFILE
  10. 'C:\APP\ORACLE\ORADATA\DFYYCDB\DATAFILE\APP02.DBF'
  11. size 7167M autoextend on ;
  12. ALTER TABLESPACE APP_DATA  ADD DATAFILE
  13. 'C:\APP\ORACLE\ORADATA\DFYYCDB\DATAFILE\APP04.DBF'
  14. size 7167M autoextend on ;
复制代码
4.19 Oracle根据生日计算年龄,精确到天
  1. select l.session_id sid,
  2.        s.serial#,
  3.        l.locked_mode,
  4.        l.oracle_username,
  5.        l.os_user_name,
  6.        s.machine,
  7.        s.terminal,
  8.        o.object_name,
  9.        s.logon_time
  10.   FROM v$locked_object l, all_objects o, v$session s
  11. WHERE l.object_id = o.object_id
  12.    AND l.session_id = s.sid
  13. --and o.object_name='table_name'       --object_name 表示表名
  14. ORDER BY sid, s.serial#;
复制代码
4.20 子查询
  1. alter system kill session 'sid,serial#';  --其中sid和serial#由1中查出
复制代码
4.21 显示文章、提交人和最后回复时间
  1. SELECT 'ALTER system kill session ''' || s.sid || ', ' || s.serial# ||
  2.        '''; ',
  3.        object_name,
  4.        machine,
  5.        s.sid,
  6.        s.serial#
  7.   FROM v$locked_object l, dba_objects o, v$session s
  8. WHERE l.object_id  = o.object_id
  9.    AND l.session_id = s.sid
  10.    and o.object_name = upper('R_REGISTER');
复制代码
4.22 外连接查询
  1. sqlplus /nolog
复制代码
4.23 between语句使用
  1. conn /as sysdba
复制代码
4.24 in 用法
  1. alter user  sys identified by 123456; -- 将sys用户密码修改为123456
复制代码
4.25 两张关联表,删除主表中已经在副表中没有的信息
  1. SQL> select to_char(0.1) from dual
  2.   2  /
  3. TO_CHAR(0.1)
  4. ------------
  5. .1
  6. --解决办法
  7. SQL> select to_char(0.1,'fm9999990.9999') from dual
  8.   2  /
  9. TO_CHAR(0.1,'FM9999990.9999')
  10. -----------------------------
  11. 0.1
复制代码
4.26 四表联查
  1. SQL> select to_char(2.30) from dual
  2.   2  /
  3. TO_CHAR(2.30)
  4. -------------
  5. 2.3
  6. --解决办法
  7. SQL>  select to_char(2.30,'fm9999999.0000') from dual
  8.   2  /
  9. TO_CHAR(2.30,'FM9999999.0000')
  10. ------------------------------
  11. 2.3000
复制代码
4.27 日程安排提前五分钟提醒
  1. SQL> select to_char(0.10) from dual
  2.   2  /
  3. TO_CHAR(0.10)
  4. -------------
  5. .1
  6. --解决办法
  7. SQL> select to_char(0.10,'fm9999990.00') from dual
  8.   2  /
  9. TO_CHAR(0.10,'FM9999990.00')
  10. ----------------------------
  11. 0.10
复制代码
4.28 查询前10条记录
  1. -- 查询5到10行数据
  2.    select *
  3.      from (select *
  4.              from (select t.*, rownum rn from emp t)
  5.             where rownum <= 10)
  6.     where rn >= 6
复制代码
4.29 选择在每一组b值相同的数据中对应的a最大的记录的所有信息
  1. select trunc(months / 12) || '岁',
  2.        trunc(mod(months, 12)) || '月',
  3.        trunc(sysdate - add_months(birth, trunc(months))) || '天' age
  4.   from (select months_between(sysdate, birth) months, birth
  5.           from (select date '1992-09-13' birth from dual));
复制代码
4.30 包括所有在 TableA中但不在 TableB和TableC中的行并消除所有重复行
  1. select a,b,c from a where a IN (select d from b ) ;--
复制代码
4.31 随机取出10条数据
  1. select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b;
复制代码
4.32 删除重复记录
  1. select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c;
复制代码
4.33 union 和union all 语句
  1. select * from table1 where time between time1 and time2; --限制查询数据范围时包括了边界值
  2. select a,b,c, from table1 where a not between 数值1 and 数值2;--限制查询数据范围时不包括边界
复制代码
4.34 intersect 语句
  1. select * from table1 where a [not] in ('值1','值2','值4','值6');
复制代码
4.35 minus 语句
  1. delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 );
复制代码
4.36 Oracle 导入导出
  1. select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
复制代码
目前能想到的就这么多了,后面会据需更新。大佬们觉得有漏的也可以多多指点

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4