程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> oracle使用二(sql查詢)

oracle使用二(sql查詢)

編輯:Oracle數據庫基礎

Oracle 中的偽列 

rowid,rownum,id,name,address,email from mytable 

更改 Oracle 中表的信息:

以下代碼演示了修改mytable表中的address列的長度:

    Alter table mytable modify (address varchar2(50))

以下代碼演示了向mytable 表中新增加一列:

Alter table mytable add (phone varchar2(20))

以下代碼演示了刪除 mytable 表中的 phone 列

    Alter table mytable drop column phone

以下代碼演示了truncate table 命令刪除表中所有的行

Truncate table mytable;

以下代碼演示了列出了mytable表的各列及其數據類型

   Desc mytable;

Oracle 中利用現有的表創建新表:

create table newmytable as select * from mytable ;

以下代利用現有的表創建新表,沒有任何記錄.

create table newmytable  as select * from mytable where 1=2;

日期和時間的處理 :

  以下代碼演示了默認的時間格式:

insert into MYTABLE (ID, NAME, ADDRESS, EMAIL,REGDATE)

values (5, ''rose'', ''tianjin'', ''[email protected]'',''12-5月-05'')

使用DATE 關鍵字向數據庫提供一個日期文本字符串,此日期必須使用yyyy-mm-dd格式,以下代碼演示了 date關鍵字;

insert into MYTABLE (ID, NAME, ADDRESS, EMAIL,REGDATE)

values (6, ''rose'', ''tianjin'', ''[email protected]'', date ''2007-10-12'')

下列代碼演示了通過 to_date() 函數返回的值添加到數據庫中

insert into MYTABLE 

(ID, NAME, ADDRESS, EMAIL,REGDATE) values (6, ''rose'', ''tianjin'', ''[email protected]'', to_date(''2007-10-23 12:36:58'',''yyyy-mm-dd hh24:mi:ss''))

To_char() 將時間轉換為字符串

下列語句使用 to_char() 函數將 customers 中的 dob 列轉換為字符串格式,格式為(yyyy-mm-dd hh:mm:ss)

selectid,name,address,email, to_char(regdate,''yyyy-mm-dd hh24:mi:ss'') from mytable

Last_day() 返回包含月的最後一天

以下代碼返回了customers 表中的 dob 中的所在月的最後一天時間:

select last_day(regdate) as lastday from mytable

ADD_MONTHS 返回指定的日期加上指定的月數後的日期值得

select add_months(sysdate,3) from dual

ROUND 返回日期值,四捨五入為格式模型指定的單位。日期默認為最近的那一天。

  select round(to_date(''2007-6-30'',''yyyy-mm-dd''),''year'') from dual

 如果指定年份那麼以 7月1號後作為下一年的最近日期。

  指定月:

  Select round(date’2007-10-14’,’month’),

           Round(date’2007-10-16’,’month’)

   From dual;

NEXT_DAY 此函數返回指定的下個星期幾的日期

 Select next_day(sysdate,’星期二’) from  dual;

TRUNC  指定日期截斷為由格式模型指定的單位的日期(只捨不入

Select trunc(sysdate,’year’) from dual

EXTRACT 獲取日期時間類型中的特定部分

 Select extract(year from sysdate) from dual

 Oracle 插入來自其他表中的數據:

    insert into newEmployees3 select * from employees

Oracle中 savepoint , rollback , commit 使用

   insert into mytable values(7,''dick'',''tianjin'',''[email protected]'',date''2007-10-10'');

savepoint p1;

    update mytable set name=''abck'' where id=1;

savepoint p2;

    insert into mytable values(8,''qing'',''tianjin'',''[email protected]'',date''2008-10-10'');

savepoint p3;    

update mytable set name=''ddddd'' where id=3;

savepoint p4;

Oracle 中的 union all 操作符,查詢返回所檢索出的所有行,包括重復的行:下面的例子使用了 union all。注意products 和 more_products 中的所有的行都被檢索出來,包括重復的行

   select product_id,product_type_id,name from products union all select prd_id,prd_type_id,name from more_products

Oracle 中的 union操作符號返回查詢檢索出的非重復的列:

select product_id,product_type_id,name from products union  select prd_id,prd_type_id,name from more_products

Oracle 中的 intersect 操作符返回兩個查詢所檢索出的共有的行:

select product_id,product_type_id,name from products intersect   select prd_id,prd_type_id,name from more_products

Oracle 中的 minuse 操作符返回將第二個查詢檢索出的行從第一個查詢檢索出的行中減去之後剩余的行

select product_id,product_type_id,name from products minus  select prd_id,prd_type_id,name from more_products

Oracle 中的連接操作符號

select (''商品名稱為:''||name) info from products

Oracle 中的字符串轉換函數:

select name,translate(name,''spring'',''SPRING'') from products

LPAD 函數由三個參數 ,第一個參數是字符串,該字符串左邊需要填充,第二個是數字,它表示返回值的總長度,第三個是字符串,需要時用它進行左填充。

     Select lpad(‘function’,10,’=’) from dual;

Oracle 中的 decode()函數返回了兩個值是否相等,如果相等的話返回指定的值,否則返回默認的值:

以下代碼演示了 decode 使用: Select decode(1,1,2,3) from dual;

下面代碼對 more_products 中的 available 列進行比較。如果等於Y返回字符串’產品可以用’, 如果等於N 返回字符串’ 產品不可以用’

select prd_id,available,decode(available,''Y'',''產品可以用'',''N'',''產品不可以用'') from more_products

下列代碼演示了向 decode() 傳遞多個搜索和結果參數:

   Select product_id,product_type_id,decode(product_type_id,1,

’書本’,2,’ 視頻’,3,’DVD’,4,’CD’,’ 雜志’) from products;

Oracle 中轉換空值的函數

NVL 使用

select id,name ,NVL(to_char(regdate,''yyyy-mm-dd''),sysdate) from mytable

NVL2  使用 (如果第一個參數不為空返回第二個參數,否則返回第三個參數)

SELECT id,name,email,NVL2(id,name,email) 

 from mytable 

NULLIF 使用(判斷兩個參數是否相等,如果相等返回 null ,否則返回第一個參數)

select id,nullif(name,email) from mytable

使用 rollup 子句為每個分組返回一條小計,並為全部分組返回總計:

Select  division_id,sum(salary) from employees2 Group by division_id

向 rollup 傳一列 

   Select  division_id,sum(salary) from employees2 Group by rollup(division_id)

向 rollup 傳多列

Select  division_id,job_id,sum(salary) from employees2 Group by rollup(division_id,job_id)

使用 cube 子句對 group by 進行擴展,返回 cube中所有列組合的小計,

同時在最後顯示總計信息

Select division_id,job_id,sum(salary) from employees2

 Group by cube(division_id,job_id)

使用分析函數:

以下代碼演示了如何對所有員工的工資進行排名,即使工資相同其排名也不相同,

select employee_id,division_id,job_id,salary,row_number()  over( order by salary desc)  from employees2 

以下代碼演示了如何對所有員工的工資按職務進行排名,即使工資相同其排名也不相同

select employee_id,division_id,job_id,salary,row_number()  over(partition by job_id order by salary desc)  from employees2 

以下代碼演示如何根據員工的公司ID進行排位。

select employee_id,division_id,job_id,salary,rank()  over(partition by division_id order by salary desc)  from employees2

以下代碼演示了選擇所在公司ID 和職務ID進行排位,相等的工資排位相同。

select d.dname,e.ename,e.sal,dense_rank() over(partition by e.deptno order by e.sal desc) as denserank from emp e,dept d where e.deptno = d.deptno

Oracle 中的層次化查詢:

1. 使用 connect by 和 start with 子句

select employee_id, manager_id, empname, title, salary from more_employees start with employee_id=1  connect by prior employee_id=manager_id

說明:

start with employee_id=1   表示查詢從員工 1 開始

connect by prior 當編寫層次化查詢的時必須定義 connect by prior 

employee_id=manager_id  表示父節點的employee_id和子節點manager_id 之間存在關系,也就是說子節點的manger_id 指向父節點的employee_id

2. 在 Oracle 中使用 level 偽列

下面的查詢說明了如何使用偽列 level 顯示節點在樹中的層次

Select level, employee_id, manager_id, empname, title, salary from more_employees start with employee_id=1  connect by prior employee_id=manager_id  order by level

說明:level 是一個偽列,代表位於樹的第幾層,對根節點來說,level 返回1,根節點的子節點返回2,依次類推。

3. 格式化層次化查詢的結果

Select level,lpad(''  '',2*level-1) || empname as employeename from more_employees start with employee_id =1 connect by prior employee_id = manager_id

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved