SQL 常用命令

SQL查询所有字段的备注

select * from user_col_comments

查看所有字段配置

select * from user_tab_columns

#所有表所在的表空间

select owner,table_name,tablespace_name from all_tables;

#索引所在的表空间

select index_name,index_type,table_owner,table_name,tablespace_name from all_indexes

#查询所有对象的占用大小

select owner,segment_name,tablespace_name,bytes/1024/1024 MB from dba_segments

查看索引字段

select * from all_ind_columns

oracle 链表查询

select a2.id from 主表 a1, 纬度表 a2 where a1.源表字段 = a2.纬度内容(+)

# 在纬度表字段后面加加号可以保证原始数据不丢失,匹配上纬度表id

数据去重

select distinct 字段 as sh from 表名

日期类型取值

select to_char(字段, 'YYYYMMDD') from 表名

根据数据去重

select * from 主表 a, (select distinct(去重字段) from 主表) b, where a.去重字段(+)=b.去重字段

字符串替换

select REPLACE(字段, '需要替换的内容','') as 字段名 from 表名

使用已有数据进行表处理

UPDATE 表名

SET 判断后字段 = '判断成功后填写的内容'

WHERE 依据判断的字段 = '判断条件';

COMMIT;

去除空格

SELECT TRIM(字段) FROM 表

数据分批处理

SELECT * FROM ( SELECT 需要查看的数据字段,ROWNUM AS rowno FROM infoshar_296287231 where ROWNUM = 小数

值替换

select decode(需要匹配的字段,'替换前','替换后','替换前','替换后','替换前','替换后') as JYYT ROWNUM AS rowno from FOODS_DWD.DWD_JYXK

连接字符串

select 字段1||'&&'||字段2||'&&'||字段3 AS 连接后的字段名 from 表名

字段中字符串替换

select REPLACE(字段名,'需要替换的字符串','替换后的字符串') as 替换后的字段名 from 表名

截取字符串

SUBSTR(截取的字段,截取开始下标,截取结束下标)

if 判断

DECODE(字段名,'abc','值1' ,'值2') as name

如果值为abc 返回值1 如果不为abc 返回值2

自增列

select rownum as id from 表名

小于当前时间

select * from 表名 where 字段名 > SYSDATE

合并

union # 对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序

union all # 对两个结果集进行并集操作,包括重复行,不进行排序

case when

sql的逻辑判断语句

select * from 表名 where

case when 条件 then 返回内容

when 条件 then 返回内容

....

else 返回内容

end

窗口函数

具有功能:

1. 同时具有分组和排序的功能

2. 不减少原表的行数

3. 语法如下:

over (partition by

order by )

排序函数

rank,dense_rank,row_number 的功能一样,不同的是

1. rank 在排名时如果出现并列的情况,会占用下一名的空间,会造成:1、1、1、4的情况

2. dense_rank 在排名时如果出现并列的情况,不会占用下一名的空间,会造成:1、1、1、2的情况

3. row_number 在排名时如果出现并列情况,会正常排序,推荐使用,会造成:1、2、3、4的情况‘

4. 函数后面的括号中不需要参数

select *,

rank() over (partition by 分组列

order by 成绩 desc) as 排序列

from 表

聚合函数

sum(求和)、avg(平均)、count(行数)、max(最大值)、min(最小值)

函数后面的括号需要参数

select *,

sum(求和列) over (order by 排序列) as current_sum

from 表

聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响

SQL语句的优先顺序

1. 执行 from 语句

2. 执行 on 过滤

3. 添加外部行

4. 执行 where 过滤

5. 执行 group by 分组

6. 执行 having 过滤

7. select 列表

8. 执行 distinct 语句

9. 执行 order by 语句

达梦数据闪回

SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP > '2012-01-01 12:00:00';

达梦创建表索引

CREATE INDEX "DWD_CHARGE_REPORT_10" ON "FOODS_DWD_V2"."DWD_CHARGE_REPORT"("ID" ASC);

CREATE INDEX "DWD_CHARGE_REPORT_10" ON "FOODS_DWD_V2"."DWD_CHARGE_REPORT"("ID" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;

进行注释

COMMENT ON COLUMN "模式名"."表名"."字段名" IS '注释内容'

正则匹配函数 regexp_like

select * from 表名 where regexp_like(字段, '正则表达式')

若要匹配数字请先将数字转换为字符串

类型转换函数

convert 和 case

convert(data_type[(length)], expression [, style])

例:select convert(varchar(10), stuno) as stuno from 表名

cast(expression as data_type)

select cast(stuno as carchar(10)) as stuno from student

获取字段长度

BIT_LENGTH(str)

拼接字符串

CONCAT(S1, S2, S3 ......) 将多个字段拼接乘字符串

CONCAT_WS(sep, S1, S2, S3 ......) 将多个字段使用sep的间隔符拼接成字符串

字符串下标替换

INSERT(str, x, y, instr) 将字符串从x开始,到y结束替换为instr

LCASE(str)或LOWER(str) 返回将字符串str中所有字符改变为小写后的结果

LEFT(str,x) 返回字符串str中最左边的x个字符

LENGTH(s) 返回字符串str中的字符数

POSITION(substr,str) 返回子串substr在字符串str中第一次出现的位置

LTRIM(str) 从字符串str中切掉开头的空格

QUOTE(str) 用反斜杠转义str中的单引号

REPEAT(str,srchstr,rplcstr) 返回字符串str重复x次的结果

REVERSE(str) 返回颠倒字符串str的结果

RIGHT(str,x) 返回字符串str中最右边的x个字符

RTRIM(str) 返回字符串str尾部的空格

STRCMP(s1,s2) 比较字符串s1和s2

TRIM(str) 去除字符串首部和尾部的所有空格

UCASE(str)或UPPER(str) 返回将字符串str中所有字符转变为大写后的结果

索引相关内容

select * from all_indexes

表相关内容

select * from all_tables;

给用户查的权限

Grant select on table_name to user_name;

修改字段长度和类型

alter table 表名 modify 字段名 字段类型(字段长度);

修改表名

alter table "模式名"."旧表名" RENAME TO "新表名";

扩字段:如果对没有内容的表进行扩字段,不会影响性能

但是对已经分配block的内容进行扩字段,就会造成行迁移

行迁移:是指一行记录,涉及到两个数据块:在第一个块里保留了这行记录的一个指针,指向这行记录真正的保存位置。当影子进程

读取该记录时,需要先读取第一个块,在块里读取到该记录的指针,按照该指针指定的位置,才找到记录/数据真正的保存位置。

所以会影响查询SQL,如果原来的数据库负载就过高,不建议直接扩字段

清除行迁移方法:

先将数据备份,再清空数据内容,再灌入数据

方法 1:

create table table_name_tmp as select * from table_name where rowed in (select head_rowid from chained_rows);

Delete from table_name where rowed in (select head_rowid from chained_rows);

Insert into table_name select * from table_name_tmp;

方法 2:

create table table_name_tmp select * from table_name ;

truncate table table_name

insert into table_name select * from table_name_tmp

Oracl由于Oracle的优化器是CBO,所以对象的统计数据对执行计划的生成至关重要

优化器是根据统计信息自动调整,因此,每次修改表结构之后,重新更新表统计信息,优化器可自动适应修改表结构之后的结果

DBMS_STATS.GATHER_TABLE_STATS统计表,列,索引的统计信息(默认参数下是对表进行直方图信息收集,包含该表的自身-表的行数、数据块数、行长等信息;列的分析--列值的重复数、列上的空值、数据在列上的分布情况;索引的分析-索引页块的数量、索引的深度、索引聚合因子)

DBMS_STATS.GATHER_TABLE_STATS的语法如下:DBMS_STATS.GATHER_TABLE_STATS ( 

  ownname                  VARCHAR2,       tabname                  VARCHAR2,       partname                VARCHAR2,    estimate_percentNUMBER,       block_sample        BOOLEAN,    method_opt            VARCHAR2,    degree                    NUMBER,    granularity          VARCHAR2,       cascade                  BOOLEAN,    stattab                  VARCHAR2,       statid                    VARCHAR2,    statown                  VARCHAR2,    no_invalidate      BOOLEAN,    force                      BOOLEAN);

ownname:要分析表的拥有者

tabname:要分析的表名.

partname:分区的名字,只对分区表或分区索引有用.

estimate_percent:采样行的百分比,取值范围[0.000001,100],null为全部分析,不采样.常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默认值,由oracle决定最佳取采样值.

block_sapmple:是否用块采样代替行采样.

method_opt:决定histograms信息是怎样被统计的.method_opt的取值如下(默认值为FOR ALLCOLUMNS SIZE AUTO):

for all columns:统计所有列的histograms.

for all indexedcolumns:统计所有indexed列的histograms.

for all hiddencolumns:统计你看不到列的histograms

for columns SIZE | REPEAT | AUTO |SKEWONLY:统计指定列的histograms.N的取值范围[1,254];REPEAT上次统计过的histograms;AUTO由oracle决定N的大小;SKEWONLY multipleend-points with the same value which is what we define by "there isskew in thedata

degree:决定并行度.默认值为null.

granularity:Granularity of statisticsto collect ,only pertinent if the table is partitioned.

cascade:是收集索引的信息.默认为FALSE.

stattab:指定要存储统计信息的表,statid如果多个表的统计信息存储在同一个stattab中用于进行区分.statown存储统计信息表的拥有者.以上三个参数若不指定,统计信息会直接更新到数据字典.

no_invalidate: Does not invalidate thedependent cursors if set to TRUE. The procedure invalidates thedependent cursors immediately if set to FALSE.

force:即使表锁住了也收集统计信息.

例子:

DBMS_STATS.GATHER_TABLE_STATS('FOOD_SAMPLING_TEST','TASK_ASSIST_SMS_NOTICE_LOG',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');

触发器:

分为出发前和触发后

可以监控对数据的操作,增删改都可以进行监控,相当于一个事件,只有进行更新就会进行下一步

老数据可以用old作为别名,新数据可以用new作为别名

示例

create trigger TR_GIRL_2 -- TR_GIRL_2是触发器名称 before update or delete or insert -- 可以监控增删改,如果监控那个填那个 on T_GIRL for each row -- T_GIRL 被监控的表名 -- for each row 是代表行级触发器的意思,也就是处理多少行就执行多少次触发体,如果没有,那么就是只执行一次触发体 begin if inserting then insert into T_SQL_LOG(tname,srcrowid,sqltype,trname) values('T_GIRL',:new.rowid,1,'TR_GIRL_2'); end if; if updating then insert into T_SQL_LOG(tname,srcrowid,sqltype,trname) values('T_GIRL',:new.rowid,2,'TR_GIRL_2'); end if; if deleting then insert into T_SQL_LOG(tname,srcrowid,sqltype,trname) values('T_GIRL',:old.rowid,3,'TR_GIRL_2'); end if; end;

MERGE INTO

判断源表 S 和目标表 T 是否满足 ON 中的条件,如果满足则用 S 表去更新 T 表,如果不满足,则将 S 表数据插入 T 表中

  1. MERGE INTO [target-table] T USING [source-table sql] S ON([conditional expression] and [...]...)
  2. WHEN MATCHED
  3. THEN [UPDATE sql]
  4. WHEN NOT MATCHED
  5. THEN [INSERT sql]

示例:

  1. merge into target t using source s on (t.id = s.aid)
  2. when matched then
  3. update set t.year = s.year
  4. when not matched then
  5. insert values(s.aid, s.name, s.year);

你可能感兴趣的:(sql,数据库,mysql)