一、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';