mysql數據庫的SQL語句和oracle的有什么區別
7) mysql的group by 語句可以select 沒有被分組的字段,如
select id,name,age from A group by age 這樣
但是在orcale和sqlserver中是會報錯的。這個取出的id,name所在的行是每個分組中的第一行數據。
8)orcale用decode()來轉換數據,mysql,sqlserver用case when:
case *_RESULT when '2402' then *ID end (必須有end)
9)mysql: 兩個select 出的數據相減:
(COUNT(distinct(*ID))-
CONVERT((COUNT(distinct(case *_RESULT when '2402' then *ID end))), SIGNED)) AS NEGATIVE
FROM `view_sims_for_report` t
10)convert,cast用法
mysql將varchar轉為int
convert(字段名, SIGNED)
字符集轉換 : CONVERT(xxx USING gb2312)
類型轉換和SQL Server一樣,就是類型參數有點不同 : CAST(xxx AS 類型) , CONVERT(xxx,類型)
可用的類型
二進制,同帶binary前綴的效果 : BINARY
字符型,可帶參數 : CHAR()
日期 : DATE
時間: TIME
日期時間型 : DATETIME
浮點數 : DECIMAL
整數 : SIGNED
無符號整數 : UNSIGNED
參考資料:http://**article/*
sql server的sql語句和oracle的sql語句有什么不同嗎
Oracle與Sql server都遵循SQL-92標準:
區別如下:
*中表名,字段名,存儲過程名,變量名不能超過30個字符串長度。
*中不支持Top 語法。使用whererownum
*中光標的使用與SqlServer中有挺大差別,主要是在循環控制方面不一致。
在Oracle中如果某列是Date類型,那么它默認的格式是yyyy-MM-dd,如果使用where colDate = '2005-06-08 17:14:57'就會出錯,'2005-06-08'可以。如果此時需要精確比較時間(小時,分,秒),可以采用下列方法:TO_DATE('2005-6-8 17:14:57','yyyy-mm-dd hh24:mi:ss')。由于Oracle和SQLServer在DateTime上對SQL標準的拓展實現方式不同,因此不能用同一個SQL實現。
*中的TimeStamp(時間戳)與SqlServer中的差別很大。SqlServer中的TimeStamp是二進制格式存儲在數據庫中,可以將DataSet中的這個字段類型設定為base64Binary類型。Oracle中的TimeStamp是時間格式存儲的。因此,無法用同一個DataSet既裝載SqlServer的TimeStamp,有裝載Oracle的TimeStamp.由于在應用程序中很少用到這個值,因此可以不檢索這個字段。
*中的TimeStamp不能像SqlServer在傳入數據的時候自動填充,可以設定默認值systimestamp來實現類似功能。
*中沒有Boolean的字段類型,可以用intger或者char代替SqlServer中的bit類型。
*中會將””空字符串當多NULL處理,也就是說,當應用程序往數據庫中插入一個空字符串時,實際數據庫會嘗試插入一個NULL。如果這個字段是NOTNULL類型,那么就會出錯,這種情況下可以用別的默認值代替空字符串。當從SqlServer導入數據到Oracle的時候,在NOTNULL列上的空字符串會導致導出操作失敗。此時可以在導出向導中手工修改SQL腳本,將空字符串設定成一個特殊值。
*中不支持,SELECT . . INTO創建新表,要用CREATE TABLE 表名AS SELECT 語句 ,創建新表。
9.在Oracle中連接字符串用 ‘||’ 或CONCAT(COL1,COL2)函數,不能使用‘+’。
統配符 [],[^] ,Oracle好像也不支持。
Oracle維護常用SQL語句是什么
1、查看表空間的名稱及大小 select t。
tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t。 tablespace_name = d。
tablespace_name group by t。tablespace_name; 2、查看表空間物理文件的名稱及大小 select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name; 3、查看回滾段名稱及大小 select segment_name, tablespace_name, r。
status, (initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent, max_extents, v。curext CurExtent From dba_rollback_segs r, v$rollstat v Where r。
segment_id = v。usn(+) order by segment_name ; 4、查看控制文件 select name from v$controlfile; 5、查看日志文件 select member from v$logfile; 6、查看表空間的使用情況 select sum(bytes)/(1024*1024) as free_space,tablespace_name from dba_free_space group by tablespace_name; SELECT A。
TABLESPACE_NAME,A。BYTES TOTAL,B。
BYTES USED, C。BYTES FREE, (B。
BYTES*100)/A。BYTES "% USED",(C。
BYTES*100)/A。BYTES "% FREE" FROM SYS。
SM$TS_AVAIL A,SYS。SM$TS_USED B,SYS。
SM$TS_FREE C WHERE A。TABLESPACE_NAME=B。
TABLESPACE_NAME AND A。TABLESPACE_NAME=C。
TABLESPACE_NAME; 7、查看數據庫庫對象 select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status; 8、查看數據庫的版本 Select version FROM Product_component_version Where SUBSTR(PRODUCT,1,6)='Oracle'; 9、查看數據庫的創建日期和歸檔方式 Select Created, Log_Mode, Log_Mode From V$Database; 10、如何遠程判斷Oracle數據庫的安裝平臺 select * from v$version; 1 1、查看數據表的參數信息 SELECT partition_name, high_value, high_value_length, tablespace_name, pct_free, pct_used, ini_trans, max_trans, initial_extent, next_extent, min_extent, max_extent, pct_increase, FREELISTS, freelist_groups, LOGGING, BUFFER_POOL, num_rows, blocks, empty_blocks, avg_space, chain_cnt, avg_row_len, sample_size, last_analyzed FROM dba_tab_partitions --WHERE table_name = :tname AND table_owner = :towner ORDER BY partition_position 1 2、查看還沒提交的事務 select * from v$locked_object; select * from v$transaction; 1 4、回滾段查看 select rownum, sys。 dba_rollback_segs。
segment_name Name, v$rollstat。extents Extents, v$rollstat。
rssize Size_in_Bytes, v$rollstat。xacts XActs, v$rollstat。
gets Gets, v$rollstat。waits Waits, v$rollstat。
writes Writes, sys。dba_rollback_segs。
status status from v$rollstat, sys。dba_rollback_segs, v$rollname where v$rollname。
name(+) = sys。dba_rollback_segs。
segment_name and v$rollstat。usn (+) = v$rollname。
usn order by rownum 1 5、捕捉運行很久的SQL column username format a12 column opname format a16 column progress format a8 select username,sid,opname, round(sofar*100 / totalwork,0) || '%' as progress, time_remaining,sql_text from v$session_longops , v$sql where time_remaining 0 and sql_address = address and sql_hash_value = hash_value / 16。 查看數據表的參數信息 SELECT partition_name, high_value, high_value_length, tablespace_name, pct_free, pct_used, ini_trans, max_trans, initial_extent, next_extent, min_extent, max_extent, pct_increase, FREELISTS, freelist_groups, LOGGING, BUFFER_POOL, num_rows, blocks, empty_blocks, avg_space, chain_cnt, avg_row_len, sample_size, last_analyzed FROM dba_tab_partitions --WHERE table_name = :tname AND table_owner = :towner ORDER BY partition_position 17。
查找object為哪些進程所用 select p。spid, s。
sid, s。serial# serial_num, s。
username user_name, a。type object_type, s。
osuser os_user_name, a。 owner, a。
object object_name, decode(sign(48 - command), 1, to_char(command), 'Action Code #' || to_char(command) ) action, p。 program oracle_process, s。
terminal terminal, s。program program, s。
status session_status from v$session s, v$access a, v$process p where s。 paddr = p。
addr and s。type = 'USER' and a。
sid = s。sid and a。
object='SUBSCRIBER_ATTR' order by s。username, s。
osuser 18。 耗資源的進程(top session) select s。
schemaname schema_name, decode(sign(48 - command), 1, to_char(command), 'Action Code #' || to_char(command) ) action, status session_status, s。 osuser os_user_name, s。
sid, p。spid , s。
serial# serial_num, nvl(s。username, '[Oracle process]') user_name, s。
terminal terminal, s。 program program, st。
value criteria_value from v$sesstat st, v$session s , v$process p where st。sid = 。
Oracle的Sql語句必做哪些事
使用scott/tiger用戶下的emp表和dept表完成下列練習,表的結構說明如下 emp員工表(empno員工號/ename員工姓名/job工作/mgr上級編號/hiredate受雇日期/sal薪金/comm傭金/deptno部門編號) dept部門表(deptno部門編號/dname部門名稱/loc地點) 工資 = 薪金 + 傭金 1.列出至少有一個員工的所有部門 2.列出薪金比“SMITH”多的所有員工。
3.列出所有員工的姓名及其直接上級的姓名。 4.列出受雇日期晚于其直接上級的所有員工。
5.列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。 6.列出所有“CLERK”(辦事員)的姓名及其部門名稱。
7.列出最低薪金大于1500的各種工作。 8.列出在部門“SALES”(銷售部)工作的員工的姓名,假定不知道銷售部的部門編號。
9.列出薪金高于公司平均薪金的所有員工。 10.列出與“SCOTT”從事相同工作的所有員工。
11.列出薪金等于部門30中員工的薪金的所有員工的姓名和薪金。 12.列出薪金高于在部門30工作的所有員工的薪金的員工姓名和薪金。
13.列出在每個部門工作的員工數量、平均工資和平均服務期限。 14.列出所有員工的姓名、部門名稱和工資。
16.列出所有部門的詳細信息和部門人數。 17.列出各種工作的最低工資。
18.列出MANAGER(經理)的最低薪金。 19.列出所有員工的年工資,按年薪從低到高排序。
Oracle數據庫SQL語句性能調整的基本原則是什么
一、問題的提出 在應用系統開發初期,由于開發數據庫數據比較少,對于查詢SQL語句,復雜視圖的的編寫等體會不出SQL語句各種寫法的性能優劣,但是如果將應用系統提交實際應用后,隨著數據庫中數據的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。
系統優化中一個很重要的方面就是SQL語句的優化。對于海量數據,劣質SQL語句和優質SQL語句之間的速度差別可以達到上百倍,可見對于一個系統不是簡單地能實現其功能就可,而是要寫出高質量的SQL語句,提高系統的可用性。
在多數情況下,Oracle使用索引來更快地遍歷表,優化器主要根據定義的索引來提高性能。 但是,如果在SQL語句的where子句中寫的SQL代碼不合理,就會造成優化器刪去索引而使用全表掃描,一般就這種SQL語句就是所謂的劣質SQL語句。
在編寫SQL語句時我們應清楚優化器根據何種原則來刪除索引,這有助于寫出高性能的SQL語句。 二、SQL語句編寫注意問題 下面就某些SQL語句的where子句編寫中需要注意的問題作詳細介紹。
在這些where子句中,即使某些列存在索引,但是由于編寫了劣質的SQL,系統在運行該SQL語句時也不能使用該索引,而同樣使用全表掃描,這就造成了響應速度的極大降低。 1。
IS NULL 與 IS NOT NULL 不能用null作索引,任何包含null值的列都將不會被包含在索引中。 即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會從索引中排除。
也就是說如果某列存在空值,即使對該列建索引也不會提高性能。任何在where子句中使用is null或is not null的語句優化器是不允許使用索引的。
2。 聯接列 對于有聯接的列,即使最后的聯接值為一個靜態值,優化器是不會使用索引的。
我們一起來看一個例子,假定有一個職工表(employee),對于一個職工的姓和名分成兩列存放(FIRST_NAME和LAST_NAME),現在要查詢一個叫比爾。 克林頓(Bill Cliton)的職工。
下面是一個采用聯接查詢的SQL語句: select * from employss where first_name||''||last_name ='Beill Cliton'; 上面這條語句完全可以查詢出是否有Bill Cliton這個員工,但是這里需要注意,系統優化器對基于last_name創建的索引沒有使用。 當采用下面這種SQL語句的編寫,Oracle系統就可以采用基于last_name創建的索引。
Select * from employee where first_name ='Beill' and last_name ='Cliton'; 遇到下面這種情況又如何處理呢?如果一個變量(name)中存放著Bill Cliton這個員工的姓名,對于這種情況我們又如何避免全程遍歷,使用索引呢?可以使用一個函數,將變量name中的姓和名分開就可以了,但是有一點需要注意,這個函數是不能作用在索引列上。 下面是SQL查詢腳本: select * from employee where first_name = SUBSTR('&&name',1,INSTR('&&name',' ')-1) and last_name = SUBSTR('&&name',INSTR('&&name',' ')+1) 3。
帶通配符(%)的like語句 同樣以上面的例子來看這種情況。目前的需求是這樣的,要求在職工表中查詢名字中包含cliton的人。
可以采用如下的查詢SQL語句: select * from employee where last_name like '%cliton%'; 這里由于通配符(%)在搜尋詞首出現,所以Oracle系統不使用last_name的索引。 在很多情況下可能無法避免這種情況,但是一定要心中有底,通配符如此使用會降低查詢速度。
然而當通配符出現在字符串其他位置時,優化器就能利用索引。在下面的查詢中索引得到了使用: select * from employee where last_name like 'c%'; 4。
Order by語句 ORDER BY語句決定了Oracle如何將返回的查詢結果排序。Order by語句對要排序的列沒有什么特別的限制,也可以將函數加入列中(象聯接或者附加等)。
任何在Order by語句的非索引項或者有計算表達式都將降低查詢速度。 仔細檢查order by語句以找出非索引項或者表達式,它們會降低性能。
解決這個問題的辦法就是重寫order by語句以使用索引,也可以為所使用的列建立另外一個索引,同時應絕對避免在order by子句中使用表達式。 5。
NOT 我們在查詢時經常在where子句使用一些邏輯表達式,如大于、小于、等于以及不等于等等,也可以使用and(與)、or(或)以及not(非)。 NOT可用來對任何邏輯運算符號取反。
下面是一個NOT子句的例子: 。
。 where not (status ='VALID')。
sql server的sql語句和oracle的sql語句有什么不同嗎
基本上都是相似的,但值得注意的幾個地方(是我們經常碰到的):
1.數據類型是varchar2而不是varchar,
2.有數據類型number,沒有數據類型numeric,
3.還有就是字符的連接,用的是“||”而不是"+",
4.取得系統時間是sysdate ,而不是函數getdate()
還有一些在具體的使用中需要注意的,
可以查看sql server與oracle的對比列表。
呵呵,希望能有幫助,^_^
ORACLE優化SQL語句有什么作用
索引是表的一個概念部分,用來提高檢索數據的效率,Oracle使用了一個復雜的自平衡B-tree結構。
通常,通過索引查詢數據比全表掃描要快。當 Oracle找出執行查詢和Update語句的最好路徑時, Oracle優化器將使用索引。
同樣在聯結多個表時使用索引也能夠提高效率。 另一個使用索引的好處是,他提供了主鍵(primary key)的唯一性驗證。
那些LONG或LONG RAW數據類型, 您能夠索引幾乎任何的列。通常, 在大型表中使用索引特別有效。
當然,您也會發現, 在掃描小表時,使用索引同樣能提高效率。雖然使用索引能得到查詢效率的提高,但是我們也必須注意到他的代價。
索引需要空間來存儲,也需要定期維護, 每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改。這意味著每條記錄的INSERT,DELETE , UPDATE將為此多付出 4、 5次的磁盤I/O 。
因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢。 定期的重構索引是有必要的: ALTER INDEX REBUILD (18)用EXISTS替換DISTINCT: 當提交一個包含一對多表信息(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT。
一般能夠考慮用EXIST替換, EXISTS 使查詢更為迅速,因為RDBMS核心模塊將在子查詢的條件一旦滿足后,立即返回結果。 例子: (低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D。
DEPT_NO = E。DEPT_NO (高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT 'X' FROM EMP E WHERE E。
DEPT_NO = D。DEPT_NO); (19)SQL語句用大寫的;因為Oracle總是先解析SQL語句,把小寫的字母轉換成大寫的再執行。
(20)在Java代碼中盡量少用連接符“+”連接字符串。 (21)避免在索引列上使用NOT通常,我們要避免在索引列上使用NOT, NOT會產生在和在索引列上使用函數相同的影響。
當Oracle“碰到”NOT,他就會停止使用索引轉而執行全表掃描。 (22)避免在索引列上使用計算。
WHERE子句中,假如索引列是函數的一部分。優化器將不使用索引而使用全表掃描。
舉例: 低效: SELECT … FROM DEPT WHERE SAL * 12 > 25000; 高效: SELECT … FROM DEPT WHERE SAL > 25000/12; (23)用>=替代>: 高效:SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3 兩者的區別在于,前者DBMS將直接跳到第一個DEPT等于4的記錄而后者將首先定位到DEPTNO=3的記錄并且向前掃描到第一個DEPT大于3的記錄。 (24)用UNION替換OR (適用于索引列): 通常情況下,用UNION替換WHERE子句中的OR將會起到較好的效果。
對索引列使用OR將造成全表掃描。注意,以上規則只針對多個索引列有效。
假如有column沒有被索引,查詢效率可能會因為您沒有選擇OR而降低。 在下面的例子中,LOC_ID 和REGION上都建有索引。
高效:SELECT LOC_ID 。 LOC_DESC ,REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID ,LOC_DESC ,REGION FROM LOCATION WHERE REGION = “MELBOURNE” 低效: SELECT LOC_ID ,LOC_DESC ,REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE”。
轉載請注明出處華閱文章網 » sql語句oracle