DB问题 ORACLE SQL语句整理(建表语句,简单语句,函数,复杂函数)

1:建表相关:
以创建一个两个字段的表为例 表名:TEST ,字段:ID,NAME

操作SQL语句
删除表DROP TABLE TEST;
创建表CREATE TABLE TEST (“ID” VARCHAR2(100 BYTE) NULL, “NAME” VARCHAR2 (200 BYTE)NULL);
增加主键ALTER TABLE TEST ADD PRIMARY KEY (“ID”);
添加字段注释COMMENT ON COLUMN TEST.“ID” IS “这是字段ID”;
添加索引CREATE INDEX TEST_INDEX ON TEST(NAME);

2:字段类型说明:
只写我用过的

字段类型描述
CHAR固定长度字符串(MAX:2000)
VARCHAR2可变长度字符串(MAX:4000)
NVARCHAR2根据字符集可变长度 (MAX:4000)
TIPS同样是存入“你好123abc”,char占2000个字节,varchar2占11个字节,NVARCHAR2占16个字节,char字段如果存入的数据小于设定的字段长度,会用空格填满该字段,varchar2会将汉字按照2个字节存入,字母按照一个字节存入,NVARCHAR2会将字符全部按照1个字节或者两个字节存入,看你数据库设定的字符集
DATE在数据库中存入固定7个字节,分别对应:世纪+100,年,月,天,小时+1,分+1,秒+1
TIMESTAMP长度为3,3代表毫秒的3位数:2000-01-01 00:00:00.000
CLOB长文本(MAX:4G)
NUMBER数字类型(LEN:(1-38),LEN:(-84-127))
TIPSNUMBER类型字段长度(P,S)P为有效位,123.456有效位是6,S大于0时,精确到S位,并且四舍五入,如果S设定为2,123.456则录入为123.46;S小于0时,精确到整数的S位,如果S为-2,则123.456录入为100

3:简单SQL整理:
假设有TEST表,字段有 ID,NAME
假设有TEST1表,字段有 IDD,NAMEE

描述SQL
插入一条(全字段)INSERT INTO TEST VALUES(“001”,“张三”);
插入一条(部分字段)INSERT INTO TEST(ID) VALUES(“001”);
插入多条INSERT ALL INTO TEST (ID) VALUES(“002”) INTO TEST1(IDD) VALUES(“001”) SELECT 1 FROM DUAL;
更新一条同MYSQL
删除一条同MYSQL
查询(无分页)SELECT ID,NAME FROM TEST WHERE 1=1;
查询(分页)SELECT * FROM (SELECT T.*,RN FROM (这个括号内放你的SQL语句) T) WHERE RN BETWEEN (这里放你的开始行) AND (这里放你的结束行);
TIPSORACLE用的伪列,没用过研究这个需要半小时或者几个小时时间

4:简单函数整理:
假设你有如下表TEST

ID(VARCHAR2(50))NAME(VARCHAR2(100))AGE(NUMBER(3,0))GENDER(NUMBER(1,0))DEPARMENT(VARCHAR2(200))
001张三1811
002李四19NULL1
003王五2001
004赵六1902
005NULL2012
函数名描述语句结果
NVL(A,B)if判断,A为空返回 B,否则返回ASELECT NVL(NAME,ID) FROM TEST WHERE ID =‘005’;005
NVL(A,B,C)A===NULL?C:B
INSTR(A,B)类似于JS的indexOfSELECT (ID,‘3’) FROM TEST WHERE ID = ‘003’;3
SUBSTR(STR,START,LEN)类似于JS的substr
LPAD(STR,LEN,PSTR)从左向右填充字符串SELECT LPAD(‘hello’,‘10’,‘s’) FROM DUAL;ssssshello
RPAD(STR,LEN,PSTR)从右向左填充字符串SELECT RPAD(‘hello’,‘10’,‘s’) FROM DUAL;hellossssss
DECODE(T,V1,R1,V2,R2…D)类似于JS的SWTICHSELECT DECODE(GENDER,‘1’,‘男’,‘0’,‘女’,‘未知’) FROM DUAL;GENDER字段:1男,0:女,null:未知
CONCAT(或者两个竖线,打不出来 o(╥﹏╥)o)字符串拼接,类似于JS的 ‘+’SELECT CONCAT(‘HELLO’,‘WORLD’) FROM DUAL;HELLOWORLD
REPLACE字符串替换SELECT REPLACE(‘ABC’,‘A’,‘Z’) FROM DUAL;ZBC
ABS绝对值
CEIL(NUM)返回大于等于NUM的最小整数
FLOOR(NUM)返回小于等于NUM的最大整数
ROUND(NUM,LEN)对小数据后面LEN四舍五入SELECT ROUND(1,2345,3) FROM DUAL;1.235
SYSDATEmysql的NOW()SELECT SYSDATE-1 FROM DUAL;昨天此时
ADD_MONTHS(D,N)对日期运算SELECT ADD_MONTHS(SYSDATE,-1) FROM DUAL;上个月此时
LAST_DAY(D)返回该月最后一天的日期
TO_CHAR把时间转化为字符串
TO_DATE把字符串转化为时间SELECT TO_DATE(‘DATE’,‘FORMAT’) FROM DUAL;
TIPS年月日时分秒:‘yyyy-mm-dd hh24:mi:ss’

扩展:TRUNC截取数字和日期:
1:截取数字(不四舍五入)
TRUNC(NUM,LEN)
LEN>0 保留多少位小数点,
SELECT TRUNC(123.4567,2) FROM DUAL; // 返回123.45
LEN<0 保留多少位整数
SELECT TRUNC(123.4567,-2) FROM DUAL; // 返回100

2:截取时间:
1:本年第一天:
SELECT TRUNC(SYSDATE,‘YEAR’) FROM DUAL;
SELECT TRUNC(SYSDATE,‘yy’) FROM DUAL;
SELECT TRUNC(SYSDATE,‘yyyy’) FROM DUAL;
2: 本季度第一天
SELECT TRUNC(SYSDATE,‘q’) FROM DUAL;
3:本月第一天
SELECT TRUNC(SYSDATE,‘month’) FROM DUAL;
SELECT TRUNC(SYSDATE,‘mm’) FROM DUAL;
4:本周第一天(周日)
SELECT TRUNC(SYSDATE,‘day’) FROM DUAL;
5:当前小时开始时间
SELECT TRUNC(SYSDATE,‘HH’) FROM DUAL;
6:当前分钟开始时间
SELECT TRUNC(SYSDATE,‘MI’) FROM DUAL;

复合函数

函数描述
AVG平均值
COUNT数据条数
MAX最大值
MIN最小值
SUM总和

SELECT AVG(AGE) FROM TEST GROUP BY DEPARTMENT; // 查询以部门分组的平均年龄
SELECT COUNT(1) FROM TEST GROUP BY DEPARTMENT; // 查询每个部门有多少人
SELECT MAX(AGE) FROM TEST GROUP BY DEPARTMENT; // 查询以部门分组的最大年龄
SELECT MIN(AGE) FROM TEST GROUP BY DEPARTMENT; // 查询以部门分组的最小年龄
SELECT SUM(AGE) FROM TEST GROUP BY DEPARTMENT; // 查询以部门分组的年龄总和

拓展常用函数:
1:CASE WHEN THEN ELSE END
SELECT CASE
WHEN AGE < 20
THEN ‘少年’
WHEN AGE < 40
THEN ‘壮年’
WHEN AGE <60
THEN ‘中年’
ELSE ‘老年’
END AS STATUS
FROM TEST;

STATUS:字段名

2:LISTAGG
分组后拼接(根据ID排序)
SELECT LISTAGG(NAME,’,’) WITHIN GROUP(ORDER BY ID DESC) NAMES FROM TEST GROUP BY DEPARTMENT;
// 王五,李四,张三
// ,赵六

3:START WITH …GROUP BY
假设有以下树形结构表 TREE

IDNAMEPID
1顶级节点#
2父节点11
3父节点21
4子节点1-12
5子节点1-1-14

树形结构:
顶级节点(1)
-------父节点1(2)
-----------子节点1-1(4)
-------------------子节点1-1-1(5)
-------父节点2(3)
查询父节点1以下所有子节点(包括父节点1)
SELECT ID,NAME,PID FROM TREE START WITH ID = ‘2’ CONNECT BY PRIOR ID = PID;
// 查询结果: 父节点1,子节点1-1,子节点1-1-1

子节点1-1 以上所有父节点(包含子节点1-1)
SELECT ID,NAME,PID FROM TREE START WITH ID = ‘4’ CONNECT BY ID = PRIOR PID;
// 查询结果:子节点1-1,父节点1,顶级节点

查询所有父节点1下面所有子节点(不包括父节点1)
SELECT ID,NAME,PID FROM TREE START WITHN PID = ‘2’ CONNECT BY PRIOR ID = PID;
//查询结果:子节点1-1,子节点1-1-1

5:ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2) 分组聚合
一般用来查询根据。。分组,根据时间倒序的最新一条数据
SELECT IDCARD,UPDATE_TIME,RN FROM
(SELECT IDCARD,UPDATE_TIME,ROW_NUMBER() OVER(PARTITION BY IDCARD ORDER BY UPDATE_TIME) FROM TEST) WHERE RN = 1;

TIPS:
1:查询时严禁使用 SELECT * ,ORACLE在解析过程中会将 * 号依次转换为所有字段,转换时是通过查询数据字典完成的,会加大数据库的工作量
2:WHERE 条件的顺序(有待考察)
SQL是从右向左执行,把ISDEL这种索引想放到WHERE条件的最后面会增加查询速度(我没感觉出来),SELECT ID,NAME FROM TEST WHERE NAME LIKE ‘%张%’ AND ISDEL = ‘0’;
3: 使用EXISTSNOT EXISTS来替换 INNOT IN
①:EXISTS对外表用LOOP逐条查询
②:IN就是多个OR叠加,最大条数1000条
③:IN会使索引失效
④:如果IN内的条件已经确定是少量的,比如50条以下,20条一下,用IN

4:多表查询时使用表别名
SELECT A.ID,A.NAME,B.ID BID,B.NAME BNAME
FROM TEST A LEFT JOIN MY_TEST B ON A.ID = B.AID
WHERE A.NAME LIKE ‘%张%’

5:表名和字段名用大写,mysql用小写(规范…)

6:事务执行: START 【SQL代码】 END;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值