一、SQL 语句的高级用法
1.SQL语句字符串处理以及时间处理
1)TO_CHAR(TIMECOLUMN,'YYYYMMDDHH24MISS')
TO_DATE('20090812162512','YYYYMMDDHH24MISS')
非常的方便
select lineid,vehicleid,TO_CHAR(GETONSTATIONTIME,'yyyymmdd'),count(*) from icdata group by lineid,vehicleid,TO_CHAR(getonstationtime,'yyyymmdd');
2)sql 语句中的字符串连接
UPDATE GPSDATA SET VEHICLEID='000'||VEHICLEID WHERE SUBSTR(VEHICLEID,1,2)='X3';
3)数据查询中不重复数据的查询
SELECT DISTINCT A1 FROM TABLE1;
2.分组查询与Having子句
WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
GROUP BY 子句用来分组 WHERE 子句的输出。
HAVING 子句用来从分组的结果中筛选行。
如:SELECT ID, V_ID,COUNT(*),TO_CHAR(RECORDTIME,'YYYYMMDD') FROM TABLE GROUP BY V_ID ,ID ,TO_CHAR(RECORDTIME,'YYYYMMDD');
注意 ID,V_ID 必须出现在GROUP BY 后边
3.子查询的重要应用,最接近值查询,即查找线路中最接近某一特定值的记录
SELECT STATIONID FROM STATIONGPSDATA WHERE ABS(LONGTITUDE-PLONGTITUDE)+ABS(LATITUDE-PLATITUDE)=(SELECT MIN(AB(LONGTITUDE-PLONGTITUDE)+ABS(LATITUDE-PLATITUDE))FROM STATIONGPSDATA);
其中PLONGTITUDE、PLATITUDE 是给定的经度和纬度。选出与此经度和纬度最接近的值的站点的编号
首先最里面的SELECT是选出所有记录中与给定经纬度分别的绝对值的差的最小值,然后选出最小值其对应的ID。直接选择ID 是不允许的。
PL/SQL 编程基础
DECLARE -- 变量部分
CURSOR mycur IS -- 游标相当于数组 SELECT * FROM GPSDATA WHERE LINEID='00417' AND VEHICLEID='73620' FOR UPDATE;-- FOR UPDATE 是锁定其不能被别的用户查询
MyRec GPSDATA%ROWTYPE; -- 声明记录集,记录集相当于结构体 x number; -- 声明变量 id number; BEGIN -- 执行部分 OPEN mycur; -- 打开游标 FETCH mycur INTO MyRec; -- 将游标的值付给记录集 x:=0; -- 将x 赋值 千万不要忘了: WHILE mycur%FOUND LOOP -- 循环 x:=x+1; FINDID(MyRec.LONGTITUDE,MyRec.LAITUDE,ID); -- 存储过程 见下面的说明 UPDATE GPSDATA SET NEARBYSTATIONID = ID WHERE CURRENT OF mycur;-- 更新数据,注意CURRENT OF mycur 的用法 非常的方便
FETCH mycur INTO MyRec;
END LOOP; CLOSE mycur; DBMS_OUTPUT.PUT_LINE('共计更改了'||x||'条数据'); END; /以上是匿名块,缺点是不能够存储在数据库中,而且每次运行都需要编译效率非常的低,
下面介绍的是存储过程,可以存储在数据库中,编译好了直接调用效率高。存储过程相当于函数
CREATE OR REPLACE PROCEDURE FINDID(PLONGTITUDE NUMBER,PLATITUDE NUMBER,PSTATIONID OUT NUMBER)
-- 创建过程 名称 参数(包括输入参数,输出参数)
IS BEGIN SELECT STATIONID FROM STATIONGPSDATA WHERE ABS(LONGTITUDE-PLONGTITUDE)+ABS(LATITUDE-PLATITUDE)=(SELECT MIN(ABS(LONGTITUDE-PLONGTITUDE)+ABS(LATITUDE-PLATITUDE)) FROM STATIONGPSDATA) AND ROWNUM<2; END; /-- 注意SQL语句中的INTO用法 INTO PSTATIONID
删除归档日志文件
DELETE ARCHIVELOG FROM TIME 'SYSDATE-7';