句Oracle 100款经典SQL语句收藏大全(oracle100常用语)
Oracle数据库是当今最流行的关系型数据库之一。SQL是Oracle数据库的重要组成部分,用于查询和管理数据库中的数据。在开发和管理Oracle数据库时,SQL语句是必不可少的工具。本文将为您介绍100个Oracle SQL语句,帮助您提高对Oracle数据库的管理。
1. 查看当前数据库名称
“`sql
select * from v$database;
2. 查看表空间的使用情况
```sqlSELECT A.TABLESPACE_NAME "表空间名称",
A.BYTES "表空间大小", B.BYTES "已使用空间",
A.BYTES - B.BYTES "剩余空间", ROUND((B.BYTES / A.BYTES) * 100, 2) || '%' "已使用比例"
FROM (SELECT TABLESPACE_NAME, SUM(BYTES) BYTES
FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) A,
(SELECT TABLESPACE_NAME, SUM(BYTES) BYTES
FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) B
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME (+);
3. 查看当前用户
“`sql
select user from dual;
4. 查看用户下的表
```sqlselect * from tab;
5. 查看表中的数据
“`sql
select * from 表名;
6. 查看表的结构
```sqldesc 表名;
7. 创建表
“`sql
create table 表名 (列名 数据类型 [约束条件], …);
8. 删除表
```sqldrop table 表名;
9. 修改表结构
“`sql
alter table 表名 [add|drop|modify] 列名 数据类型 [约束条件];
10. 统计表中记录数
```sqlselect count(*) from 表名;
11. 从表中删除数据
“`sql
delete from 表名 where 条件;
12. 向表中插入数据
```sqlinsert into 表名 (列1, 列2, 列3, ...) values (值1, 值2, 值3, ...);
13. 更新表中数据
“`sql
update 表名 set 列1 = 值1, 列2 = 值2, … where 条件;
14. 查找满足条件的数据(单表查询)
```sqlselect 列1, 列2, ... from 表名 where 条件;
15. 查找满足条件的数据(多表查询)
“`sql
select 列1, 列2, … from 表1, 表2 where 表1.列 = 表2.列 and 条件;
16. 排序
```sqlselect 列1, 列2, ... from 表名 order by 列1 [asc|desc], 列2 [asc|desc], ...;
17. 分组统计
“`sql
select 列1, count(列2), sum(列3), avg(列4), max(列5), min(列6) from 表名 group by 列1;
18. 子查询
```sqlselect 列1, 列2, ... from 表名 where 列 in (select 列 from 子查询表名 where 条件);
19. 连接查询
“`sql
select 列1, 列2, … from 表1 [left|right|inner] join 表2 on 表1.列 = 表2.列 where 条件;
20. 联合查询
```sqlselect 列1, 列2, ... from 表1 where 条件1 union [all] select 列1, 列2, ... from 表2 where 条件2;
21. 获取当前日期
“`sql
select sysdate from dual;
22. 字符串拼接
```sqlselect 列1 || 列2 as 别名 from 表名;
23. 获取最大值
“`sql
select max(列名) from 表名;
24. 获取最小值
```sqlselect min(列名) from 表名;
25. 获取总计
“`sql
select sum(列名) from 表名;
26. 获取平均数
```sqlselect avg(列名) from 表名;
27. 获取指定范围内的随机数
“`sql
select dbms_random.value(最小值, 最大值) from dual;
28. 查找字段包含特定字符串的记录
```sqlselect 列1, 列2, ... from 表名 where 列 like '%字符串%';
29. 查找字段以特定字符串开头的记录
“`sql
select 列1, 列2, … from 表名 where 列 like ‘字符串%’;
30. 查找字段以特定字符串结尾的记录
```sqlselect 列1, 列2, ... from 表名 where 列 like '%字符串';
31. 查找字段为空的记录
“`sql
select 列1, 列2, … from 表名 where 列 is null;
32. 查找字段不为空的记录
```sqlselect 列1, 列2, ... from 表名 where 列 is not null;
33. 查找字段等于某个值的记录
“`sql
select 列1, 列2, … from 表名 where 列 = 值;
34. 查找字段不等于某个值的记录
```sqlselect 列1, 列2, ... from 表名 where 列 != 值;
35. 查找字段大于某个值的记录
“`sql
select 列1, 列2, … from 表名 where 列 > 值;
36. 查找字段小于某个值的记录
```sqlselect 列1, 列2, ... from 表名 where 列
37. 查找字段大于等于某个值的记录
“`sql
select 列1, 列2, … from 表名 where 列 >= 值;
38. 查找字段小于等于某个值的记录
```sqlselect 列1, 列2, ... from 表名 where 列
39. 查找两个日期之间的记录
“`sql
select 列1, 列2, … from 表名 where 列 between 开始日期 and 结束日期;
40. 查找指定行数的记录(取前n行)
```sqlselect 列1, 列2, ... from 表名 where rownum
41. 查找分页数据
“`sql
select * from (select rownum rn, t.* from 表名 t where rownum = 开始行数;
42. 查找日期范围内的记录
```sqlselect 列1, 列2, ... from 表名 where to_char(列, 'yyyy-MM-dd') between '开始日期' and '结束日期';
43. 查找指定月份的记录
“`sql
select 列1, 列2, … from 表名 where to_char(列, ‘yyyy-MM’) = ‘日期’;
44. 查找某一列中重复的记录
```sqlselect 列, count(*) from 表名 group by 列 having count(*) > 1;
45. 统计今天、昨天、本周、上周、本月、上月的数据
“`sql
— 今天
select * from 表名 where trunc(列) = trunc(sysdate);
— 昨天
select * from 表名 where trunc(列) = trunc(sysdate – 1);
— 本周
select * from 表名 where trunc(列, ‘D’) >= trunc(sysdate, ‘D’) – 7 and trunc(列, ‘D’)
— 上周
select * from 表名 where trunc(列, ‘D’) >= trunc(sysdate, ‘D’) – 14 and trunc(列, ‘D’)
— 本月
select * from 表名 where to_char(列, ‘yyyy-MM’) = to_char(sysdate, ‘yyyy-MM’);
— 上月
select * from 表名 where to_char(列, ‘yyyy-MM’) = to_char(add_months(sysdate, -1), ‘yyyy-MM’);
46. 计算两个日期之间的天数
```sqlselect to_date('日期1', '日期格式') - to_date('日期2', '日期格式') from dual;
47. 计算两个日期之间的月数
“`sql
select months_between(to_date(‘日期1’, ‘日期格式’), to_date(‘日期2’, ‘日期格式’)) from dual;
48. 格式化日期
```sqlselect to_char(列, 'yyyy-MM-dd') as 别名 from 表名;
49. 把数字转换成中文
“`sql
with t as (select level lev from dual connect by level
select decode(lev, 1, ‘零’, 2, ‘壹’, 3, ‘贰’, 4, ‘叁’, 5, ‘肆’, 6, ‘伍’, 7, ‘陆’, 8, ‘柒’, 9, ‘捌’, 10, ‘玖’, 11, ‘拾’, 12, ‘佰’) from t;
50. 查找最大值对应的记录
```sqlselect 列名 from 表名 where 列名 = (select max(列名) from 表名);
51. 查找最小值对应的记录
“`sql
select 列名 from 表名 where 列名 = (select min(列名) from 表名);
52. 查找第n大/小的记录
```sql-- 查找第n大的记录
select 列名 from (select 列名, row_number() over (order by 列名 desc) rn from 表名) where rn = n;
-- 查找第n小的记录select 列名 from (select 列名, row_number() over (order by 列名 asc) rn from 表名) where rn = n;
53. 查找前n大/小的记录
“`sql
— 查找前n大的记录
select * from (select 列名, row_number() over (order by 列名 desc) rn from 表名) where rn
— 查找前n小的记录
select * from (select 列名, row_number() over (order by 列名 asc) rn from 表名) where rn
54. 判断是否存在满足条件的记录
```sqlselect count(*) from 表名 where 列 = 值;
55. 判断两个日期是否相等
“`sql
select case when to_char(日期1, ‘yyyy-MM-dd’) = to_char(日期2, ‘yyyy-MM-dd’) then ‘相等’ else ‘不相等’ end from dual;
56. 判断一个字符串是否是数字
```sqlselect case when regexp_like(字符串, '^[0-9]+$') then '是数字' else '不是数字' end from dual;
57. 获取日期的星期几
“`sql
select to_char(日期, ‘D’) from dual;
58. 判断是否为闰年
```sqlselect case when to_number(to_char(add_months(sysdate, 12), 'YYYY')) - to_number(to_char(sysdate, 'YYYY')) = 1 then '闰年' else '非闰年' end from dual;
59. 获取当前时间
“`sql
select sysdate from dual;
60. 获取当前时间的小时
```sqlselect to_char(sysdate, 'HH24') from dual;
61. 获取当前时间的分钟
“`sql
select to_char(sysdate, ‘mi’) from dual;
62. 判断某个数是否为偶数
```sqlselect case when mod(数, 2) = 0 then '偶数' else '奇数' end from dual;
63. 把秒数转换成时间格式
“`sql
select to_char(to_date(秒数, ‘sssss’), ‘hh24:mi:ss’) from dual;
64. 把时间格式转换成秒数
```sqlselect (to_date(时间格式, 'hh24:mi:ss') - to_date('00:00:00', 'hh24:mi:ss')) * 86400 from dual;
65. 根据年份和月份生成日历
“`sql
with t as (select to_date(‘2022-09’, ‘yyyy-mm’) + level – 1 d from dual connect by level
select to_char(d, ‘dd’) as 日, decode(to_char(d, ‘D’), 1, ‘日’, 2, ‘一’, 3, ‘二’, 4, ‘三’, 5, ‘四’, 6, ‘五’, 7, ‘六’) as 星期 from t;
66. 计算两个经纬度之间的距离(单位:千米)
```sqlSELECT ROUND(6378.138 * 2 * ASIN(SQRT(POW(SIN((LATITUDE1 * PI() / 180 - LATITUDE2 * PI() / 180) / 2), 2) + COS(LATITUDE1 * PI() / 180) * COS(LATITUDE2 * PI() / 180) * POW(SIN((LONGITUDE1 * PI() / 180 - LONGITUDE2 * PI() / 180) / 2), 2))), 2) AS 距离 FROM 表名;
67. 将字符串转换成日期
“`sql
select to_date(字符串, ‘日期格式’) from dual;
68. 将日期转换成字符串
```sqlselect to_char(日期, '日期格式') from dual;
69. 把数字转换成罗马数字
“`sql
with t as (select level – 1 lev from dual connect by level
select column_value, replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lev, 1, ‘I’), 2, ‘II’), 3, ‘III’), 4, ‘IV’), 5, ‘V’), 6, ‘VI’), 7, ‘VII’), 8, ‘VIII’), 9, ‘IX’), 10, ‘X’), 20, ‘XX’), 30, ‘XXX’), 40, ‘XL’), 50, ‘L’), 60, ‘LX’), 70, ‘LXX’), 80, ‘LXXX’), 90, ‘XC’), 100, ‘C’) from t;
70. 获取本年度的第几周
```sqlselect to_char(sysdate, 'ww') from dual;
71. 获取本年度的第几天
“`sql
select to_char(sysdate, ‘DDD’) from dual;
72. 判断两个集合是否有交集
```sqlselect case when exists(select * from 集合A where 列 in (select 列 from 集合B)) then '有交集' else '无交集' end from dual;
73. 把字符串按指定长度分割成数组
“`sql
with t as (select ‘abcdefg’ str from dual)
select substr(str, 1, 3) “1”, substr(str, 4, 3) “2”, substr(str, 7, 1) “3” from t;
74. 把字符串中的数字取出来并求和
```sqlselect sum(regexp_replace('字符串', '[^0-9]+')) from dual;
75. 判断当前用户是否有指定权限
“`sql
select decode(count(*), 1, ‘有权限’, ‘无权限’) from user_tab_privs where grantee = user and table_name = ‘表名’ and privilege = ‘权限’;
76. 获取当前用户拥有的所有权限
```sqlselect * from session_privs;
77. 创建索引
“`sql
create index 索引名称 on 表名 (列名);
78. 删除索引
```sqldrop index 索引名称;
79. 查看表的索引
“`sql
select * from user_indexes where table_name = ‘表名’;
80. 查看索引的使用情况
```sqlselect * from v$segstat where obj# = (select index_id from user_indexes where index_name = '索引名称');
81. 查看当前会话的信息
“`sql
select * from v$session where sid = &sid;
82. 查看当前系统会话的信息
```sqlselect * from v$session where username = 'SYSTEM';
83. 查看数据库的版本
“`sql