1. 複製表結構及其數據:
create
table
table_name_new
as
select
*
from
table_name_old
2. 只複製表結構:
create
table
table_name_new
as
select
*
from
table_name_old
where
1=2;
或者:
create
table
table_name_new
like
table_name_old
3. 只複製表數據:
若是兩個表結構同樣:
insert
into
table_name_new
select
*
from
table_name_old
若是兩個表結構不同:
insert
into
table_name_new(column1,column2...)
select
column1,column2...
from
table_name_old
用truncate、delete均可以清空表中數據。
SQL以下:
truncate table [表名];
delete from [表名];html
delete與truncate的區別:
delete:會產生rollback,若是刪除大數據量的錶速度會很慢,同時會佔用不少的rollback segments。
truncate: 是DDL操做,不產生rollback,速度快。sql
3、PL/SQL的文本導入工具數據庫
工具---文本導入工具,可導入txt,csv等。windows
文本內第一行寫標題,最好和表相對應,工具會自動識別。詳細內容服務器
4、pl/sql執行一些耗時的操做時,可能會卡住,鼠標會一直轉圈,沒法得知進度,此時能夠另開了個pl/sql,用sql去查看錶的狀態來判斷執行進度。session
好比一次性導入幾十萬數據的操做,可能須要幾十分鐘分鐘執行,期間你不知道是卡住了仍是正常執行,另起一個pl/sql去count一下數據量,作個簡單的判斷。併發
5、根據rowid刪除重複記錄oracle
delete from table_name t1 where rowid not in( select min(rowid) from table_name t2 where t2.id is not null having count(id) >1 group by t2.id)
6、decode使用 鏈接符號「||」字段拼接工具
select t.*, h.area_code, a.area_name, DECODE(h.verify_code,1,'部分繳費',2,'所有繳費',3,'欠費多繳',4,'不欠費預存') from ZFBPOS_HN_SERIAL t,SERIAL_HISTORY_2018 h,AREA_REF a where 'ALI'||t.ali_serial_no=h.old_serial_no and h.area_code=a.area_id and to_char(h.tran_date,'yyyymm')<'201806';
7、windows下sqlplus管理員無密碼登陸數據庫post
首先,開始菜單,cmd,弄出來黑色窗口
sqlplus /nolog connect /as sysdba //賦給用戶鏈接權限 grant create session to username;
8、oracle鏈接數
在查看數據的鏈接狀況頗有用,寫完程序一邊測試代碼一邊查看數據庫鏈接的釋放狀況有助於分析優化出一個健壯的系統程序來。
一、查看當前的數據庫鏈接數
select count(*) from v$process ; --當前的數據庫鏈接數
二、數據庫容許的最大鏈接數
select value from v$parameter where name ='processes'; --數據庫容許的最大鏈接數
三、修改數據庫最大鏈接數
alter system set processes = 300 scope = spfile; --修改最大鏈接數:
四、關閉/重啓數據庫
shutdown immediate; --關閉數據庫
startup; --重啓數據庫
五、查看當前有哪些用戶正在使用數據
select osuser, a.username, cpu_time/executions/1000000||'s', b.sql_text, machine
from v$session a, v$sqlarea b
where a.sql_address =b.address
order by cpu_time/executions desc; --查看當前有哪些用戶正在使用數據
六、 --當前的session鏈接數
select count(*) from v$session --當前的session鏈接數
七、當前併發鏈接數
select count(*) from v$session where status='ACTIVE'; --併發鏈接數
v$process:
這個視圖提供的信息,都是oracle服務進程的信息,沒有客戶端程序相關的信息
服務進程分兩類,一是後臺的,一是dedicate/shared server
pid, serial# 這是oracle分配的PID
spid 這纔是操做系統的pid
program 這是服務進程對應的操做系統進程名
v$session:
這個視圖主要提供的是一個數據庫connect的信息,
主要是client端的信息,好比如下字段:
machine 在哪臺機器上
terminal 使用什麼終端
osuser 操做系統用戶是誰
program 經過什麼客戶端程序,好比TOAD
process 操做系統分配給TOAD的進程號
logon_time 在什麼時間
username 以什麼oracle的賬號登陸
command 執行了什麼類型的SQL命令
sql_hash_value SQL語句信息
有一些是server端的信息:
paddr 即v$process中的server進程的addr
server 服務器是dedicate/shared
9、Oracle session鏈接數和inactive的問題記錄
11、篩選統計記錄大於2條的數據
select a.c,a.b from (select t.DEVICE_IMEI c,count(*) as b from device_info t GROUP BY t.DEVICE_IMEI ) a where a.b > 1;
12、查詢字段不是純數字
SELECT * FROM device_info t WHERE LENGTH(0+t.DEVICE_IMEI) != LENGTH(t.DEVICE_IMEI);//這個原理是0+字段後長度等不等於原長度,可是若是首數字是0的話,就無論用了,例如003,原長度3加零以後,長度變爲1
SELECT * FROM device_info t WHERE (t.DEVICE_IMEI REGEXP '[^0-9.]')!=0;
十3、統計全部表的數據量
select t.table_name,t.num_rows from user_tables t ORDER BY NUM_ROWS DESC;
十4、有則更新無則插入
MERGE INTO ali_elec_notice_bill_result a USING ( SELECT '3536185368' as calcid FROM dual ) b ON (a.calcid = b.calcid) WHEN MATCHED THEN UPDATE SET a.remark = '已結清清' WHEN NOT MATCHED THEN INSERT (a.CALCID,a.CUST_NO,a.T_PQ,a.RCVBL_AMT,a.RCVBL_YM,a.REMARK) VALUES ('3536185368','5024002955','236','13216','201903','已結清');
MERGE INTO ali_elec_notice_query_result a USING ( SELECT '3140080836' as cust_no,to_date('20190314','yyyyMMdd') as query_date FROM dual ) b ON (a.cust_no = b.cust_no and a.query_date = b.query_date) WHEN MATCHED THEN UPDATE SET a.custname = '111' WHEN NOT MATCHED THEN INSERT (a.CUST_NO,a.QUERY_DATE,a.CUSTNAME,a.ADDRESS,a.PREPAY_BAL,a.EXCHG_AMT,a.BATCH_NO,a.ORG_NO,a.ORG_NAME) VALUES ('3140080836',to_date('20190314','yyyyMMdd'),'11','111',116.12,0.00,'34689105721','41412','111');
十5、查詢n到m條數據
SELECT * FROM ( SELECT 表名.*, ROWNUM AS CON FROM 表名 WHERE ROWNUM <= M AND 其它查詢條件 ORDER BY 排序條件 ) WHERE CON >=N;
十6、----