㈠ sql如何將uniqueidentifier數據類型轉換成字元串類型。
select * from A where taskId in (SELECT CAST(ID AS NVARCHAR(50))FROM B where IsDel=0)
1、convert(varchar(36),id)
2、cast(id as varchar(36))
㈡ pgsql的主鍵存儲方式
PostgreSQL的穩定性極強,Innodb等索引在崩潰,斷電之類的災難場景下 抗擊打能力有了長足進步,然而很多 MqSQL用戶 都遇到過 Server級的資料庫丟失的場景 -- MySQL系統庫是 MyISAM,相比之下,PG資料庫這方面要更好一些。
任何系統都有它的性能極限,在高並發讀寫,負載逼近極限下,PG的性能指標仍可以位置雙曲線甚至對數曲線,到 頂峰之後不在下降,而MySQL明顯出現一個波峰後下滑(5.5版本 之後,在企業級版本中有個插件可以改善很多,不過需要付費)。
PG多年來在 GIS(地理信息)領域處於優勢地位,因為它有豐富的幾何類型,PG有大量字典,數組,bitmap等數據類型,相比之下 MySQL就差很多, Instagram就是因為 PG的空間資料庫 擴展 POSTGIS遠遠強於 MySQL的 my spatial 而採用 PgSQL的。
PG的「無鎖定」特性非常突出,甚至包括 vacuum這樣的整理數據空間的操作,這個和PGSQL的MVCC實現有關系。
PG可以使用函數 和 條件索引,這使得 PG資料庫的調優非常靈活, MySQL就沒有這個功能,條件索引在 web應用中 很重要。
PG有極其強悍的 SQL編程能力(9.x 圖靈完備,支持遞歸!),有非常豐富的統計函數和統計語法支持,比如分析函數(Oracle的叫法,PG里叫Window函數),還可以用多種語言來寫存儲過程,對於 R的支持也很好。這一點MySQL就差很多,很多分析功能都不支持,騰訊內部的存儲主要是 MySQL,但是數據分析主要是 Hadoop+ PgSQL。
PG的有多種集群架構可以選擇,plproxy可以之hi語句級的鏡像或分片,slony可以進行欄位級的同步配置,standby 可以構建 WAL文件級或流式的讀寫分離集群,同步頻率和集群策略調整方便。
一般關系型資料庫字元串有長度限制 8k 左右,無限長 TEXT類型的功能受限,只能作為外部大數據訪問。而 PG 的 TEXT 類型 可以直接訪問且無長度限制, SQL語法內置 正則表達式,可以索引,還可以全文檢索,或使用 xml xpath。用 PG的話,文檔資料庫都可以省了。
PgSQL對於 numa 架構的支持比 MySQL強一些,比 MySQL對於讀的性能更好一些, PgSQL提交可以完全非同步提交,而 MySQL的內存表不夠實用(因為表鎖的原因)。
pgsql除了存儲正常的數據類型外,還支持存儲
array,不管是一維數組還是多維數組均支持。
json和jsonb,相比使用 text存儲要高效很多。
json和 jsonb在更高的層面上看起來幾乎是一樣的,但是存儲實現上是不同的。
json存儲完的文本,json列會每次都解析存儲的值,它不支持索引,但 可以為創建表達式索引。
jsonb存儲的二進制格式,避免了重新解析數據結構。它支持索引,這意味著 可以不使用指定索引就能查詢任何路徑。
當我們比較寫入數據速度時,由於數據存儲 的方式的原因,jsonb會比 json 稍微的慢一點。json列會每次都 解析存儲的值,這意味著鍵的順序要和輸入的 時候一樣。但是 jsonb不同,以二進制格式存儲且不保證鍵的順序。因此如果有軟體需要依賴鍵的順序,jsonb可能不是最佳選擇。使用 jsonb的優勢還在於可以輕易的整合關系型數據和非關系型 數據 ,PostgreSQL對於 mongodb這類資料庫是一個不小的威脅,畢竟如果一個表中只有一列數據的類型是半結構化的,沒有必要為了遷就它而整個表的設計都採用 schemaless的結構。
1. CPU限制
PGSQL
沒有CPU核心數限制,有多少CPU核就用多少
MySQL
能用128核CPU,超過128核用不上
2. 配置文件參數
PGSQL
一共有255個參數,用到的大概是80個,參數比較穩定,用上個大版本配置文件也可以啟動當前大版本資料庫
MySQL
一共有707個參數,用到的大概是180個,參數不斷增加,就算小版本也會增加參數,大版本之間會有部分參數不兼容情況
3. 第三方工具依賴情況
PGSQL
只有高可用集群需要依靠第三方中間件,例如:patroni+etcd、repmgr
MySQL
大部分操作都要依靠percona公司的第三方工具(percona-toolkit,XtraBackup),工具命令太多,學習成本高,高可用集群也需要第三方中間件,官方MGR集群還沒成熟
4. 高可用主從復制底層原理
PGSQL
物理流復制,屬於物理復制,跟SQL Server鏡像/AlwaysOn一樣,嚴格一致,沒有任何可能導致不一致,性能和可靠性上,物理復制完勝邏輯復制,維護簡單
MySQL
主從復制,屬於邏輯復制,(sql_log_bin、binlog_format等參數設置不正確都會導致主從不一致)
大事務並行復制效率低,對於重要業務,需要依賴 percona-toolkit的pt-table-checksum和pt-table-sync工具定期比較和修復主從一致
主從復制出錯嚴重時候需要重搭主從
MySQL的邏輯復制並不阻止兩個不一致的資料庫建立復制關系
5. 從庫只讀狀態
PGSQL
系統自動設置從庫默認只讀,不需要人工介入,維護簡單
MySQL
從庫需要手動設置參數super_read_only=on,讓從庫設置為只讀,super_read_only參數有bug,鏈接:https://jiahao..com/s?id=1636644783594388753&wfr=spider&for=pc
6. 版本分支
PGSQL
只有社區版,沒有其他任何分支版本,PGSQL官方統一開發,統一維護,社區版有所有功能,不像SQL Server和MySQL有標准版、企業版、經典版、社區版、開發版、web版之分
國內外還有一些基於PGSQL做二次開發的資料庫廠商,例如:Enterprise DB、瀚高資料庫等等,當然這些只是二次開發並不算獨立分支
MySQL
由於歷史原因,分裂為三個分支版本,MariaDB分支、Percona分支 、Oracle官方分支,發展到目前為止各個分支基本互相不兼容
Oracle官方分支還有版本之分,分為標准版、企業版、經典版、社區版
7. SQL特性支持
PGSQL
SQL特性支持情況支持94種,SQL語法支持最完善,例如:支持公用表表達式(WITH查詢)
MySQL
SQL特性支持情況支持36種,SQL語法支持比較弱,例如:不支持公用表表達式(WITH查詢)
關於SQL特性支持情況的對比,可以參考:http://www.sql-workbench.net/dbms_comparison.html
8. 主從復制安全性
PGSQL
同步流復制、強同步(remote apply)、高安全,不會丟數據
PGSQL同步流復制:所有從庫宕機,主庫會罷工,主庫無法自動切換為非同步流復制(非同步模式),需要通過增加從庫數量來解決,一般生產環境至少有兩個從庫
手動解決:在PG主庫修改參數synchronous_standby_names ='',並執行命令: pgctl reload ,把主庫切換為非同步模式
主從數據完全一致是高可用切換的第一前提,所以PGSQL選擇主庫罷工也是可以理解
MySQL
增強半同步復制 ,mysql5.7版本增強半同步才能保證主從復制時候不丟數據
mysql5.7半同步復制相關參數:
參數rpl_semi_sync_master_wait_for_slave_count 等待至少多少個從庫接收到binlog,主庫才提交事務,一般設置為1,性能最高
參數rpl_semi_sync_master_timeout 等待多少毫秒,從庫無回應自動切換為非同步模式,一般設置為無限大,不讓主庫自動切換為非同步模式
所有從庫宕機,主庫會罷工,因為無法收到任何從庫的應答包
手動解決:在MySQL主庫修改參數rpl_semi_sync_master_wait_for_slave_count=0
9. 多欄位統計信息
PGSQL
支持多欄位統計信息
MySQL
不支持多欄位統計信息
10. 索引類型
PGSQL
多種索引類型(btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap,部分索引,表達式索引)
MySQL
btree 索引,全文索引(低效),表達式索引(需要建虛擬列),hash 索引只在內存表
11. 物理表連接演算法
PGSQL
支持 nested-loop join 、hash join 、merge join
MySQL
只支持 nested-loop join
12. 子查詢和視圖性能
PGSQL
子查詢,視圖優化,性能比較高
MySQL
視圖謂詞條件下推限制多,子查詢上拉限制多
13. 執行計劃即時編譯
PGSQL
支持 JIT 執行計劃即時編譯,使用LLVM編譯器
MySQL
不支持執行計劃即時編譯
14. 並行查詢
PGSQL
並行查詢(多種並行查詢優化方法),並行查詢一般多見於商業資料庫,是重量級功能
MySQL
有限,只支持主鍵並行查詢
15. 物化視圖
PGSQL
支持物化視圖
MySQL
不支持物化視圖
16. 插件功能
PGSQL
支持插件功能,可以豐富PGSQL的功能,GIS地理插件,時序資料庫插件, 向量化執行插件等等
MySQL
不支持插件功能
17. check約束
PGSQL
支持check約束
MySQL
不支持check約束,可以寫check約束,但存儲引擎會忽略它的作用,因此check約束並不起作用(mariadb 支持)
18. gpu 加速SQL
PGSQL
可以使用gpu 加速SQL的執行速度
MySQL
不支持gpu 加速SQL 的執行速度
19. 數據類型
PGSQL
數據類型豐富,如 ltree,hstore,數組類型,ip類型,text類型,有了text類型不再需要varchar,text類型欄位最大存儲1GB
MySQL
數據類型不夠豐富
20. 跨庫查詢
PGSQL
不支持跨庫查詢,這個跟Oracle 12C以前一樣
MySQL
可以跨庫查詢
21. 備份還原
PGSQL
備份還原非常簡單,時點還原操作比SQL Server還要簡單,完整備份+wal歸檔備份(增量)
假如有一個三節點的PGSQL主從集群,可以隨便在其中一個節點做完整備份和wal歸檔備份
MySQL
備份還原相對不太簡單,完整備份+binlog備份(增量)
完整備份需要percona的XtraBackup工具做物理備份,MySQL本身不支持物理備份
時點還原操作步驟繁瑣復雜
22. 性能視圖
PGSQL
需要安裝pg_stat_statements插件,pg_stat_statements插件提供了豐富的性能視圖:如:等待事件,系統統計信息等
不好的地方是,安裝插件需要重啟資料庫,並且需要收集性能信息的資料庫需要執行一個命令:create extension pg_stat_statements命令
否則不會收集任何性能信息,比較麻煩
MySQL
自帶PS庫,默認很多功能沒有打開,而且打開PS庫的性能視圖功能對性能有影響(如:內存佔用導致OOM bug)
23. 安裝方式
PGSQL
有各個平台的包rpm包,deb包等等,相比MySQL缺少了二進制包,一般用源碼編譯安裝,安裝時間會長一些,執行命令多一些
MySQL
有各個平台的包rpm包,deb包等等,源碼編譯安裝、二進制包安裝,一般用二進制包安裝,方便快捷
24. DDL操作
PGSQL
加欄位、可變長欄位類型長度改大不會鎖表,所有的DDL操作都不需要藉助第三方工具,並且跟商業資料庫一樣,DDL操作可以回滾,保證事務一致性
MySQL
由於大部分DDL操作都會鎖表,例如加欄位、可變長欄位類型長度改大,所以需要藉助percona-toolkit裡面的pt-online-schema-change工具去完成操作
將影響減少到最低,特別是對大表進行DDL操作
DDL操作不能回滾
25. 大版本發布速度
PGSQL
PGSQL每年一個大版本發布,大版本發布的第二年就可以上生產環境,版本迭代速度很快
PGSQL 9.6正式版推出時間:2016年
PGSQL 10 正式版推出時間:2017年
PGSQL 11 正式版推出時間:2018年
PGSQL 12 正式版推出時間:2019年
MySQL
MySQL的大版本發布一般是2年~3年,一般大版本發布後的第二年才可以上生產環境,避免有坑,版本發布速度比較慢
MySQL5.5正式版推出時間:2010年
MySQL5.6正式版推出時間:2013年
MySQL5.7正式版推出時間:2015年
MySQL8.0正式版推出時間:2018年
26. returning語法
PGSQL
支持returning語法,returning clause 支持 DML 返回 Resultset,減少一次 Client <-> DB Server 交互
MySQL
不支持returning語法
27. 內部架構
PGSQL
多進程架構,並發連接數不能太多,跟Oracle一樣,既然跟Oracle一樣,那麼很多優化方法也是相通的,例如:開啟大頁內存
MySQL
多線程架構,雖然多線程架構,但是官方有限制連接數,原因是系統的並發度是有限的,線程數太多,反而系統的處理能力下降,隨著連接數上升,反而性能下降
一般同時只能處理200 ~300個資料庫連接
28. 聚集索引
PGSQL
不支持聚集索引,PGSQL本身的MVCC的實現機制所導致
MySQL
支持聚集索引
29. 空閑事務終結功能
PGSQL
通過設置 idle_in_transaction_session_timeout 參數來終止空閑事務,比如:應用代碼中忘記關閉已開啟的事務,PGSQL會自動查殺這種類型的會話事務
MySQL
不支持終止空閑事務功能
30. 應付超大數據量
PGSQL
不能應付超大數據量,由於PGSQL本身的MVCC設計問題,需要垃圾回收,只能期待後面的大版本做優化
MySQL
不能應付超大數據量,MySQL自身架構的問題
31. 分布式演進
PGSQL
HTAP資料庫:cockroachDB、騰訊Tbase
分片集群: Postgres-XC、Postgres-XL
MySQL
HTAP資料庫:TiDB
分片集群: 各種各樣的中間件,不一一列舉
32. 資料庫的文件名和命名規律
PGSQL
PGSQL在這方面做的比較不好,DBA不能在操作系統層面(停庫狀態下)看清楚資料庫的文件名和命名規律,文件的數量,文件的大小
一旦操作系統發生文件丟失或硬碟損壞,非常不利於恢復,因為連名字都不知道
PGSQL表數據物理文件的命名/存放規律是: 在一個表空間下面,如果沒有建表空間默認在默認表空間也就是base文件夾下,例如:/data/base/16454/3599
base:默認表空間pg_default所在的物理文件夾
16454:表所在資料庫的oid
3599:就是表對象的oid,當然,一個表的大小超出1GB之後會再生成多個物理文件,還有表的fsm文件和vm文件,所以一個大表實際會有多個物理文件
由於PGSQL的數據文件布局內容太多,大家可以查閱相關資料
當然這也不能全怪PGSQL,作為一個DBA,時刻做好資料庫備份和容災才是正道,做介質恢復一般是萬不得已的情況下才會做
MySQL
資料庫名就是文件夾名,資料庫文件夾下就是表數據文件,但是要注意表名和資料庫名不能有特殊字元或使用中文名,每個表都有對應的frm文件和ibd文件,存儲元數據和表/索引數據,清晰明了,做介質恢復或者表空間傳輸都很方便
33. 許可權設計
PGSQL
PGSQL在許可權設計這塊是比較坑爹,拋開實例許可權和表空間許可權,PGSQL的許可權層次有點像SQL Server,db=》schema=》object
要說許可權,這里要說一下Oracle,用Oracle來類比
在ORACLE 12C之前,實例與資料庫是一對一,也就是說一個實例只能有一個資料庫,不像MySQL和SQL Server一個實例可以有多個資料庫,並且可以隨意跨庫查詢
而PGSQL不能跨庫查詢的原因也是這樣,PGSQL允許建多個資料庫,跟ORACLE類比就是有多個實例(之前說的實例與資料庫是一對一)
一個資料庫相當於一個實例,因為PGSQL允許有多個實例,所以PGSQL單實例不叫一個實例,叫集簇(cluster),集簇這個概念可以查閱PGSQL的相關資料
PGSQL裡面一個實例/資料庫下面的schema相當於資料庫,所以這個schema的概念對應MySQL的database
注意點:正因為是一個資料庫相當於一個實例,PGSQL允許有多個實例/資料庫,所以資料庫之間是互相邏輯隔離的,導致的問題是,不能一次對一個PGSQL集簇下面的所有資料庫做操作
必須要逐個逐個資料庫去操作,例如上面說到的安裝pg_stat_statements插件,如果您需要在PGSQL集簇下面的所有資料庫都做性能收集的話,需要逐個資料庫去執行載入命令
又例如跨庫查詢需要dblink插件或fdw插件,兩個資料庫之間做查詢相當於兩個實例之間做查詢,已經跨越了實例了,所以需要dblink插件或fdw插件,所以道理非常簡單
許可權操作也是一樣逐個資料庫去操作,還有一個就是PGSQL雖然像SQL Server的許可權層次結構db=》schema=》object,但是實際會比SQL Server要復雜一些,還有就是新建的表還要另外授權
在PGSQL裡面,角色和用戶是一樣的,對新手用戶來說有時候會傻傻分不清,也不知道怎麼去用角色,所以PGSQL在許可權設計這一塊確實比較坑爹
MySQL
使用mysql庫下面的5個許可權表去做許可權映射,簡單清晰,唯一問題是缺少許可權角色
user表
db表
host表
tables_priv表
columns_priv表
1. 架構對比
Mysql:多線程
PostgreSql:多進程
多線程架構和多進程架構之間沒有絕對的好壞,例如oracle在unix上是多進程架構,在windows上是多線程架構。
2. 對存儲過程及事務的支持能力
MySql對於無事務的MyISAM表,採用表鎖定,一個長時間運行的查詢很可能會長時間的阻礙,而PostgreSQL不會尊在這種問題。
PostgreSQL支持存儲過程,要比MySql好,具備本地緩存執行計劃的能力。
3. 穩定性及性能
高並發讀寫,負載逼近極限下,PG的性能指標仍可以維持雙曲線甚至對數曲線,到頂峰之後不再下降,而 MySql 明顯出現一個波峰後下滑(5.5版本後Mysql企業版有優化,需要付費)
MySql的InnoDB引擎,可以充分優化利用系統的所有內存,超大內存下PG對內存使用的不那麼充分(需要根據內存情況合理分配)。
4. 高可用
InnoDB的基於回滾實現的 MVCC 機制,對於 PG 新老數據一起放的基於 XID 的 MVCC機制,是占優的。新老數據一起存放,需要定時觸發 VACUUM,會帶來多餘的 IO 和資料庫對象加鎖開銷,引起資料庫整理的並發能力下降。而且 VACUUM 清理不及時,還可能會引發數據膨脹
5. 數據同步方式:
Mysql到現在也是非同步復制,pgsql可以做到同步、非同步、半同步復制。
Mysql同步是基於binlog復制,屬於邏輯復制,類似於oracle golden gate,是基於stream的復制,做到同步很困難,這種方式更加適合非同步復制;
Pgsql的同是基於wal,屬於物理復制,可以做到同步復制。同時,pgsql還提供stream復制。
Mysql的復制可以用多級從庫,但是在9.2之前,PgSql不能用從庫帶從庫。
Pgsql的主從復制屬於物理復制,相對於Mysql基於binlog的邏輯復制,數據的一致性更加可靠,復制性能更高,對主機性能的影響也更小。
6. 許可權控制對比
MySql允許自定義一套不同的數據級、表級和列的許可權,運行指定基於主機的許可權
Mysql的merge表提供了 一個獨特管理多個表的方法。myisampack可以對只讀表進行壓縮,以後仍然可以直接訪問該表中的行。
7. SQL語句支持能力
PG有極其強悍的 SQL 編程能力(9.x 圖靈完備,支持遞歸!),有非常豐富的統計函數和統計語法支持,例如分析函數(Oracle的叫法,PG里叫window函數)
支持用多種語言來寫存儲過程,對於R的支持也很好。這一點上Mysql就差的很遠,很多分析功能都不支持。
PgSql對表名大小寫的處理,只有在Sql語句中,表明加雙引號,才區分大小寫。
在Sql的標准實現上要比Mysql完善,而且功能實現比較嚴謹。
對表連接支持比較完整,優化器的功能比較完整,支持的索引類型很多,復雜查詢能力較強。
Mysql採用索引組織表,這種存儲方式非常適合基於主鍵匹配的查詢、刪改操作,但是對表結果設計存在約束;
Mysql的Join操作的性能非常的差,只支持Nest Join,所以一旦數據量大,性能就非常的差。PostgresSQL除了支持 Nest Join 和 Sort Merge Join,PostgreSQL還支持正則表達式查詢,MySql不支持。
8. 數據類型支持能力
PostgreSQL可以更方便的使用UDF(用戶定義函數)進行擴展。
有豐富的幾何類型,實際上不止集合類型,PG有大量的字典、數組、bitmap等數據類型,因此PG多年來在 GIS 領域處於優勢地位。相比之下Mysql就差很多,instagram就是因為PG的空間數據擴展 PostGIS遠遠強於 MySql的 my spatial 而採用 PgSql的。Mysql中的空間數據類型有4種,分別是 CEOMETRY、POINT、LINESTRING、POLYGON,其空間索引只能在存儲引擎為 MyiSam的表中創建,用SPATIAL關鍵字進行擴展,使得能夠用於創建正規索引類型的語法創建空間索引。創建空間索引的列,必須將其聲明為NOT NULL。不同的存儲親情有差別。MyISAM和InnoDB 都支持 spatial extensions,但差別在於:如果使用MyISAM,可以建立 spatial index,而 InnoDB是不支持的。
pgsql對json支持比較好,還有很逆天的fdw功能,就是把別的資料庫中的表當自己的用。
pgsql的欄位類型支持的多,有很多mysql沒有的類型,但是實際中有時候用到。
一半關系型資料庫的字元串長度8k左右,無限長的 TEXT 類型的功能受限,只能作為外部帶數據訪問。而 PG 的 TEXT 類型可以直接訪問,SQL 語法內置正則表達式,可以索引,還可以全文檢索,或使用 xml xpath。用 PG 的話,文檔資料庫都可以省了。
postgresql 有函數,用於報表、統計很方便
PG支持 R-Trees這樣可擴展的索引類型,可以方便的處理一些特殊數據。
PG可以使用函數和條件所以,使得資料庫的調優非常靈活,mysql就沒有這個功能,條件索引在web應用中很重要。
9. 如可過程容錯能力
大批量數據入庫,PostgreSql要求所有的數據必須完全滿足要求,有一條錯誤,整個數據入庫過程失敗。MySql無此問題。
10. 表組織方式
pgsql用繼承的方式實現分區表,讓分區表的使用不方便且性能差,這點比不上mysql。
pg主表採用堆表存放,MySQL採用索引組織表,能夠支持比MySql更大的數據量。
MySql分區表的實現要優於PG的基於繼承表的分區實現,主要體現在分區個數達到成千上萬後的處理性能差異很大。
11. 開發結構
對於web應用來所,mysql 5.6 的內置 MC API 功能很好用,PgSQL差一些。
PG的「無鎖定」特性非常突出,甚至包括 vacuum 這樣的整理數據空間的操作,這個和 PGSQL的 MVCC 實現有關系。
好文要頂 關注我 收藏該文
茄子777
粉絲 - 0 關注 - 0
+加關注
00
« 上一篇: 多線程中的wait與join
» 下一篇: 負載均衡相關
posted @ 2022-11-02 16:20 茄子777 閱讀(55) 評論(0) 編輯 收藏 舉報
刷新評論刷新頁面返回頂部
登錄後才能查看或發表評論,立即 登錄 或者 逛逛 博客園首頁
【推薦】阿里雲新人特惠,爆款雲伺服器2核4G低至0.46元/天
【推薦】雙十一同價!騰訊雲雲伺服器搶先購,低至4.2元/月
編輯推薦:
· 一個有趣的 nginx HTTP 400 響應問題分析
· 誰說.NET沒有GC調優?只改一行代碼就讓程序不再佔用內存
· 為什麼標准庫的模板變數都是 inline 的
· .net 如何優雅的使用 EFCore
· 在 C# 中使用 Halcon 開發視覺檢測程序
閱讀排行:
· Entity Framework Core 7中高效地進行批量數據插入
· 除了 filter 還有什麼置灰網站的方式?
· 快速繪制流程圖「GitHub 熱點速覽 v.22.47」
· 使用.NET7和C#11打造最快的序列化程序-以MemoryPack為例
· 私藏!資深數據專家SQL效率優化技巧 ⛵
㈢ oracle_plsql函數大全
1.ascii('A') 返回與指定的字元對應的十進制數
2.chr(65) 給出整數,返回對應的字元;
3. concat('010-','88888888') 連接字元串
4.initcap('smith') 返回字元串並將字元串的第一個字母變為大寫;
5.instr(C1,C2,I,J) 在字元串C1中搜索字元串C2,返回發現指定的字元的位置;
I搜索的開始位置,默認為1。 J出現的位置,默認為1。
6.length(name) 返回字元串的長度;
7. lower('AaBbCcDd') 返回字元串,並將所有的字元小寫
8. upper('AaBbCcDd') upper from al;返回字元串,並將所有的字元大寫
9.rpad和lpad(粘貼字元) lpad(rpad('gao',10,'*'),17,'*') 得*******gao*******
10.ltrim和rtrim和trim 刪除字元兩邊出現的空格。
11. substr (string,start,count)取子字元串,從start開始,取count個
12. replace ('string','s1','s2') string希望被替換的字元或變數,s1被替換的字元串
s2要替換的字元串
13. soundex 返回一個與給定的字元串讀音相同的字元串
14.TRIM('s' from 'string') 剪掉前面和後面的字元
15. abs(100) 返回指定值的絕對值
16. acos(-1) 給出反餘弦的值
17. asin(0.5) 給出反正弦的值
18. atan(1) 返回一個數字的反正切值
19. ceil(3.1415927) 返回大於或等於給出數字的最小整數
20. cos(-3.1415927) 返回一個給定數字的餘弦
21. cosh(20) 返回一個數字反餘弦值
22. exp(2) 返回一個數字e的n次方根
23. floor(2345.67) 對給定的數字取整數
24. ln(1) 返回一個數字的對數值
25.log(n1,n2) 返回一個以n1為底n2的對數
26.mod(n1,n2) 返回一個n1除以n2的余數
27.power(n1,n2) 返回n1的n2次方根
28. round和trunc 按照指定的精度進行舍入
29.sign(n) 取數字n的符號,大於0返回1,小於0返回-1,等於0返回0
30. sin(1.57079) 返回一個數字的正弦值
31. sin(20) 返回雙曲正弦的值
32.sqrt(n) 返回數字n的根
33. tan(n) 返回數字n的正切值
34. tanh(n) 返回數字n的雙曲正切值
35. trunc (124.16666,2) 按照指定的精度截取一個數
36. add_months 增加或減去月份
37. last_day(sysdate) 返回日期的最後一天
38. months_between (date2,date1) 給出date2-date1的月份
39. new_time (date,'this','that') 給出在this時區=other時區的日期和時間
40. next_day (date,'day') 給出日期date和星期x之後計算下一個星期的日期
41. sysdate 用來得到系統的當前日期
42. chartorowid 將字元數據類型轉換為ROWID類型
43. convert (c,dset,sset)
44. hextoraw 將一個十六進制構成的字元串轉換為二進制
45. rawtohext 將一個二進制構成的字元串轉換為十六進
46. rowidtochar 將ROWID數據類型轉換為字元類型
47. to_char (date,'format')
48. to_date(string,'format') 將字元串轉化為ORACLE中的一個日期
49. to_multi_byte('高') 將字元串中的單位元組字元轉化為多位元組字元
50. to_number('1999') 將給出的字元轉換為數字
51. bfilename (dir,file)
52. convert('x','desc','source') 將x欄位或變數的源source轉換為desc
53. mp(s,fmt,start,length)
54. empty_blob()和empty_clob() 這兩個函數都是用來對大數據類型欄位進行初始化操
作的函數
55. greatest('AA','AB','AC') 返回一組表達式中的最大值,即比較字元的編碼大小.
56. least('啊','安','天') 返回一組表達式中的最小值
57. uid 返回標識當前用戶的唯一整數(user_id=uid)
58. user 返回當前用戶的名字
59. userevn 返回當前用戶環境的信息,opt可以是:
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE
ISDBA 查看當前用戶是否是DBA如果是則返回true
60.avg(DISTINCT|ALL) all表示對所有的值求平均值,distinct只對不同的值求平均值
61.max(DISTINCT|ALL) 求最大值,DISTINCT表示對不同的值求最大值,相同的只取一次
62.min(DISTINCT|ALL) 求最小值,DISTINCT表示對不同的值求最小值,相同的只取一次
63. stddev (distinct|all) 求標准差,DISTINCT表示只對不同的值求標准差
64. variance (DISTINCT|ALL) 求協方差
65. group by主要用來對一組數進行統計
66. having 對分組統計再加限制條件
67.ORDER BY 用於對查詢到的結果進行排序輸出
㈣ 以下那種類別對應數據的字元類屬性
整數類型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
浮點數類型:FLOAT、DOUBLE、DECIMAL
字元串類型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
日期類型:Date、DateTime、TimeStamp、Time、Year
其他數據類型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等
1、整型
數據類型 位元組及范圍
tinyint(m) 1個位元組 (-128~127)
smallint(m) 2個位元組 (-32768~32767)
mediumint(m) 3個位元組 (-8388608~8388607)
int或integer(m) 4個位元組 (-2147483648~2147483647)
bigint(m) 8個位元組 (±9.22*10的18次方)
整型括弧中里的m是表示SELECT查詢結果集中的顯示寬度,並不攔基影響實際的取值范圍,沒有影響到顯示的寬度。(可以略過這個東西)
2、浮簡吵謹點型
數據類型 定義
float(m,d) 單精度浮點型 8位精度(4位元組)
double(m,d) 雙精度浮點型 16位精度(8位元組)
m總個數,d小數位。設一個欄位定義為float(6,3),如果插入一個數123.45678,實際資料庫里存的是123.457,但總個數還以實際為准,即6位。整數部分最大是3位。如果插入數12.123456,存儲的是12.1234,如果插入12.12,存儲的是12.1200.
3、定點數
①浮點型在資料庫中存放的是近似值,而定點類型在資料庫中存放的是精確值。
decimal(m,d)
②DECIMAL 類型不同於FLOAT和DECIMAL,其中DECIMAL 實際是以串存放的。DECIMAL 可能的最大取值范圍與DOUBLE 一樣,但是其有效的取值范圍由M 和D 的值決定。
給定的DECIMAL 類型的取值范圍取決於MySQL數據類型的版本。
③ 對貨幣等對精度敏感的數據,應該用定點數表示或存儲;
在這里插入圖片描述
4、字元串
數據類型 大小
char(n) 固定長度,最多255個字元
varchar(n) 固定長度,最多65535個字元
tinytext 可變長度,最多255個字元
text 可變長度,最多65535個字元
mediumtext 可變長度,最多2的24次方-1個字元
longtext 可變長度,最多2的32次方-1個字元
區別char和varchar:
①char(n) 若存入字元數小於n,則以空格補於其後,查詢之時再將空格去掉。所以char類型存儲的字元串末尾不能有空格,varchar不限於此。
②char(n) 固定長度,char(4)不管是存入幾個字元,都將佔用4個位元組;varchar是存入的實際字元數+1個位元組(n<=255)或2個位元組(n>255),所以varchar(4),存入3個字元將佔用4個位元組。
③char類型的字元串檢索速度要比varchar類型的快。
5、二進制數據(_Blob)
1._BLOB和_text存儲方式不同,_TEXT以文本方式存儲,英文存儲區分大小寫,而_Blob是以二進制方式存儲,不分大小寫。
2._BLOB存儲的數據只能整體讀出。
3._TEXT可以指定字元集,_BLO不用指定字元集。
6、日期碰告和時間類型
作用:存儲用戶注冊時間,文章發布時間,員工入職時間,出生時間,過期時間等
數據類型 定義
DATE 日期 『2008-12-2』
TIME 時間 『12:25:36』
YEAR 年份 『2008』
DATETIME 日期時間 『2008-12-2 22:06:44』
TIMESTAMP 自動存儲記錄修改時間
註:①TIMESTAMP列用於INSERT或UPDATE操作時記錄日期和時間。如果不分配一個值,表中的第一個TIMESTAMP列自動設置為最近操作的日期和時間。
②也可以通過分配一個NULL值,將TIMESTAMP列設置為當前的日期和時間。TIMESTAMP值返回後顯示為』YYYY-MM-DD HH:MM:SS』格式的字元串。
③有專有的自動更新特性。
二、數據類型屬性
關鍵字 含義
NULL 數據列可包含NULL值
NOT NULL 數據列不允許包含NULL值
DEFAULT 默認值
PRIMARY KEY 主鍵
AUTO_INCREMENT 自動遞增,適用於整數類型
UNSIGNED 無符號
CHARACTER SET name 指定一個字元集
三、簡單介紹幾個存儲引擎
1、MyISAM 數據存儲引擎和數據列
MyISAM數據表,最好使用固定長度(CHAR)的數據列代替可變長度(VARCHAR)的數據列。
2、MEMORY存儲引擎和數據列
MEMORY數據表目前都使用固定長度的數據行存儲,因此無論使用CHAR或VARCHAR列都沒有關系。兩者都是作為CHAR類型處理的。
3、InnoDB 存儲引擎和數據列(重要)
建議使用 VARCHAR類型。
也可以用show engines;語句查看所有引擎
在這里插入圖片描述
以下幾個例子
1、時間和日期
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
2、set
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
3、datatime
在這里插入圖片描述
4、TIMESTAMP
CREATE TABLE timestamp_db(
a TIMESTAMP
);
INSERT timestamp_db() VALUES(20020121);
INSERT timestamp_db() VALUES(20020121142554);
INSERT timestamp_db() VALUES("2015-12-16 21:14:15");
INSERT timestamp_db() VALUES("2015-12-17");
INSERT timestamp_db() VALUES(NULL);
INSERT timestamp_db() VALUES(CURRENT_TIMESTAMP);
INSERT timestamp_db() VALUES();
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
在這里插入圖片描述
5、YEAR
在這里插入圖片描述
文章知識點與官方知識檔案匹配
MySQL入門技能樹資料庫組成表
22468 人正在系統學習中
點擊閱讀全文
打開CSDN,閱讀體驗更佳
評論(2) 請先 登錄 後發表或查看評論
...知識之數據類型_小玉玉玉玉呀的博客_資料庫數據類型
四、日期時間類型 1、數據類型 date裡面 Y是年,M是月,D是天,即年月日;time裡面 H是時,M是分,S是秒 ,即時分秒。 eg:表中的money是充值金額,接著記錄一下充值時間,先添加一個時間欄位,類型是datetime, 然後刷新表格,再打開,...
MySQL資料庫中幾種常見的數據類型分享_ysds20211402的博客...
一、數據類型是什麼? 數據類型是指列、存儲過程參數、表達式和局部變數的數據特徵,它決定了數據的存儲格式,代表了不同的信息類型。 有一些數據是要存儲為數字的,數字當中有些是要存儲為整數、小數、日期型等... ...
Oracle 數據類型
Oracle的數據類型: 1、CHAR數據類型,該類型是固定長度的字元串,如果沒指定大小,則默認佔用一位元組,如果輸入的值小於指定的長度,則資料庫用空格填充至固定長度,如果用戶輸入的值大於指定的長度,則資料庫返回錯誤信息 2、varchar2,用於存儲可變長度的字元串,使用該數據類型可節省磁碟空間,但存儲效率沒有CHAR高 3、NCHAR和nvarchar2,NCHAR和CHAR區別在於NCHAR用來存儲Unicode字元集類型,即雙位元組字元數據,CHAR是一個位元組,而NCAHR是一個字元(兩個位元組),前者是CHAR(1)無法插入『的』,後者是NCHAR(1)可以插入『的』 4、NUMBER表示數值數據類型,NUMBER(P,S),P為精度,表示數據的總位數,S為范圍,表示小數點右邊數字的位數 5、DATE數據類型,使用7個位元組固定長度,每個位元組分別存儲世紀,年,月,日 ,時,分,秒,ORACLE中SYSDATE函數的功能是返回當前的日期和時間 6、TIMESTAMP數據類型,和DATE相似,但是這個類型的秒精確到小數點後6位,而DATE沒有秒的小數部分 7、LOB數據類型用於存儲大型的,沒有被結構化的數據,例如二進制文件,圖片文件,LOB主要分為BLOB和CLOB,BLOB數據類型用於存儲二進制對象:圖像,音頻,視頻...CLOB數據類型用於存儲字元格式的大型對象 8、ORACLE其實也支持INTEGER,FLOAT,DOUBLE,VARCHAR,最好用ORACLE自身的NUMBER 和 VARCHAR2
資料庫:常見的數據類型
文章目錄一、常見的數據類型1.數值型 一、常見的數據類型 1、數值型: 整型 小數: 定點數 浮點型 2、字元型: 較短的文本:char、varchar 較長的文本:text、blob(較長的二進制數據) 3、日期型 1.數值型 (1)整型 整數類型 位元組 范圍 Tinyint 1 有符號:-128~127 , 無符號:0~225
繼續訪問
資料庫的類型_彬仔二號的博客_資料庫類型
ps:資料庫的類型主要分為四大類:一:關系型資料庫。二:非關系型資料庫。三:網狀資料庫。四:層次資料庫。目前最常見的資料庫模型主要是:關系型資料庫和非關系型資料庫。 ps:這里我們主要說關系型資料庫和非關系型資料庫。
資料庫的數據類型
之前介紹了 資料庫基本常識的簡介及mysql安裝 結構化查詢語言sql 資料庫表介紹 接下來說一下資料庫的數據類型 資料庫的數據類型主要包括以下幾種 整數類型:一般常用的就是int=integer。可以在int後面加顯示寬度,例如int(4),但是超過這個長度也不會報錯,會進行自動擴充。 浮點類型:一般常用的是double。指定小數位和總長度double(4,1),表示小數點後保留1位,總長度為4位,並且不會自動擴充。如果出現插入的小數位數較多,則會進行四捨五入。 字元串類型:char和varch
繼續訪問
MySQL資料庫中幾種常見的數據類型分享
轉自:微點閱讀https://www.weidianyue.com 一、數據類型是什麼? 數據類型是指列、存儲過程參數、表達式和局部變數的數據特徵,它決定了數據的存儲格式,代表了不同的信息類型。 有一些數據是要存儲為數字的,數字當中有些是要存儲為整數、小數、日期型等... 二、MYSQL常見數據類型 MySQL支持多種類型,大致可以分為四類:數值型、浮點型、日期/時間和字元串(字元)類型。 1、數值類型 MySQL支持所有標准SQL數值數據類型。 這些數值類型包括嚴格數值數據類型..
繼續訪問
資料庫的類型
ps:資料庫的類型主要分為四大類:一:關系型資料庫。二:非關系型資料庫。三:網狀資料庫。四:層次資料庫。目前最常見的資料庫模型主要是:關系型資料庫和非關系型資料庫。ps:這里我們主要說關系型資料庫和費關系型資料庫。1. 關系型資料庫關系型資料庫模型是將復雜的數據結構用較為簡單的二元關系(二維表)來表示,如圖1-4所示。在該類型資料庫中,對數據的操作基本上都建立在一個或多個表格上,我們可以採用結構化查詢語言(SQL)對資料庫進行操作。關系型資料庫是目前主流的資料庫技術,其中具有代表性的資料庫管理系統有:Ora
繼續訪問
資料庫基礎知識之數據類型
mysql常用數據類型 一、數值類型(整型、浮點型) 1、整型 eg:添加一個表格:點擊表——添加欄位——名稱——類型,年齡age是tinyint類型,要在下方勾選無符號,因為年齡都是正數,不存在負數一說,所以不需要符號。 點擊保存,然後輸入表名,比如t1,就出現了t1 然後雙擊表裡面的null就可以修改值了 如果在年齡里寫了一個負數,再按ctrl+s保存,就會報錯: 由於范圍是0-255,所以當寫了256時,也會報錯: 2、浮點型 eg:想添加...
繼續訪問
資料庫修改數據類型
資料庫修改數據類型 在日常使用資料庫中,或多或少都會遇到要修改資料庫表中欄位的數據類型,有一種方法是直接點「設計」,就可以修改了,但往往都不行,會提示為「不允許保存修改」 那就用另一種方法。可以看到,表中的「B02_2」的數據類型是『nchar』,就把它數據類型修改為『int』 首先新建一個查詢 接著在查詢窗口裡輸入SQL 查詢語句,查詢表結構,找到需要修改的欄位 然後執行下面語句,命令已成功完成。 最後表中的「B02_2」的數據類型就修改為『int』了
繼續訪問
資料庫中修改數據類型
UNIT_PRICE :資料庫原先類型為: NUMBER(18,4) AMOUNT : 資料庫原先類型為: NUMBER(18,4) 如果直接進行修改會報錯,因為原先欄位中已經有數據了。 ALTER TABLE CLOUD_RELEASE.CONTRACT_PRODUCT_ITEM MODIFY(UNIT_PRICE NUMBER(18,6)); ALTER TABLE CLOUD_RELEASE.CONTRACT_PRODUCT_ITEM MODIFY(AMOUNT NUMBER(18,6));
繼續訪問
資料庫常見數據類型
常見的數據類型: 數值型: 整型:tinyint(1位元組)、smallint(2位元組)、mediumint(3位元組)、int/integer(4位元組)、bigint(8位元組) 特點:默認是有符號的,要設置無符號,需添加unsigned關鍵字;不設置長度,會有默認的長度,長度代表了顯示的最大寬度,如果不夠會用0在左邊填充。 小數: 浮點型:float(M,D)、double(M,D) 定點型:dec(M,D)、decimal(M,D) M:整數部位+小數部位 D:小數部位 M和D都可以省略
繼續訪問
【mysql】 數據表修改欄位的數據類型
【mysql】 數據表修改欄位的數據類型1、背景2、修改欄位的數據類型 1、背景 當數據表創建之後,發現數據表欄位的數據類型不合適,我們可以立即刪除後重新創建; 但是一旦存上大量數據之後,我們更希望直接修改數據表; 即修改數據表: 修改表指的是修改資料庫中已經存在的數據表的結構。 MySQL 中使用 ALTER TABLE 語句修改表。 2、修改欄位的數據類型 本博客涉及數據表中修改欄位的數據類型,即把欄位的數據類型轉換成另一種數據類型。 在 MySQL 中修改欄位數據類型的語法規則如下: ALTER TA
繼續訪問
資料庫中有哪幾種數據類型?
資料庫中有哪幾種數據類型? 整型: tiny int,small int,medium int,int,big int,大小分別為 8,16,24,32,64位。 浮點型: float、double 字元串類型: 定長的 char,變長的 varchar。在進行存儲時,char 會刪除末尾的空格,varchar 會保留末尾的空格。 日期時間類型: 與時區無關的 data time,與時區有關的 ...
繼續訪問
熱門推薦 八大基本數據類型(超詳細)
學習目標: Java八大數據類型: (1)整數類型:byte、short、int、long (2)小數類型:float、double (3)字元類型:char (4)布爾類型:boolean 學習內容: 1、 整數數據類型 byte:1個位元組,8位,256種狀態,取值范圍為【-128,127】 short:2個位元組,16位,65536種狀態,取值范圍為【-32768,32767】 int:4個位元組,32位,整數類型默認是int類型,取值范圍約21億 long:8個位元組,64位,long類型表示long類
繼續訪問
數據類型有哪些?如何判斷數據類型?
數據類型有哪些?如何判斷數據類型? 一、數據類型有兩種, 一種基本數據類型, 一種引用數據類型, 基本數據都有,string、number、Boolean、null、undefined; 引用數據類型有object, es6新增一個symbol 1、symbol類型 Symbol()返回的symbol值都是唯一的,使用Symbol()創建新的symbol值,並用一個可選的字元串作為其描述 —— 描述相同的兩個Symbol值依然是不同的 2、undefined類型 只有一個值。在使用var聲明變數但未對其加初
繼續訪問
資料庫常用的數據類型
數據類型1.整型:bit(布爾型):只能輸入true或false,輸入1是自動轉化為TRUE,0是自動轉化為FALSEtinyint:只能輸入0到225之間的整數smallint(兩個位元組組成的整數):-32768~32767int(四個位元組組成的整數):2的31次方bigint(八個位元組組成的整數):2的63次方2.貨幣型:money,可以四位小數3.日期型:data:2001.1.1~9999...
繼續訪問
21 常見的數據類型
常見的數據類型 1、數值型:整型、浮點型(定點數、浮點數) 2、字元型:較短的文本:CHAR、VARCHAR 較長的文本:TEXT、BLOB(較長的二進制數據) 3、日期型 一、整型 整數類型 位元組 范圍 Tinyint 1 有符號:-128-127 無符號:0~255 Smallint 2 有符號:-32768~32767 無符號:0~65536 Mediumint 3 有符號:-8388608~8388607 無符號:0~1677215 Int、Integer 4 有符
繼續訪問
最新發布 資料庫基本增刪改查語法和多表聯查方式
我們想要操作資料庫,主要需要使用的基本指令就是增刪改查,主要包括四個關鍵字,增:insert,刪:delete,改:update,查:select。接下來詳細的講一下這四種關鍵字的使用。
繼續訪問
SQL中改變列的數據類型
一、該列非主鍵、無default約束 直接更新: alter table 表名 alter column 列名 數據類型 二、該列為主鍵列、無default約束 (1)刪除主鍵 alter table 表名 drop constraint 主鍵名稱 (2)更新數據類型 alter table 表名 alter column 列名 數據類型 not null (3)添加主鍵 alter table ...
繼續訪問
MySQL修改列名稱或列的數據類型
一、只修改列的數據類型的方法: 語法: alter table 表名 modify column 列名 新的列的類型 例如:student表中列stu_name的類型是char(20),現在要修改為varchar(20),SQL語句如下 alter table student modify column stu_name varchar(20); 二、同時修改列名和列的數據
繼續訪問
python六種數據類型的增刪改查
六種數據類型的增刪改查1、字元串str2、列表list3、元組tuple4、字典dict5、集合set可變類型:list、set、dict不可變類型:string、tuple、數字型 1、字元串str 增:拼接+,* 刪:無 改:不可修改 查:index查字元串的索引值 2、列表list 增:append、insert、extend、update 刪:pop、del、remove、clear 改:...
繼續訪問
資料庫數據類型
㈤ SQL有哪些函數
1.絕對值
SQL:select abs(-1) value
O:select abs(-1) value from al
2.取整(大)
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from al
3.取整(小)
S:select floor(-1.001) value
O:select floor(-1.001) value from al
4.取整(截取)
S:select cast(-1.002 as int) value
O:select trunc(-1.002) value from al
5.四捨五入
S:select round(1.23456,4) value 1.23460
O:select round(1.23456,4) value from al 1.2346
6.e為底的冪
S:select Exp(1) value 2.7182818284590451
O:select Exp(1) value from al 2.71828182
7.取e為底的對數
S:select log(2.7182818284590451) value 1
O:select ln(2.7182818284590451) value from al; 1
8.取10為底對數
S:select log10(10) value 1
O:select log(10,10) value from al; 1
9.取平方
S:select SQUARE(4) value 16
O:select power(4,2) value from al 16
10.取平方根
S:select SQRT(4) value 2
O:select SQRT(4) value from al 2
11.求任意數為底的冪
S:select power(3,4) value 81
O:select power(3,4) value from al 81
12.取隨機數
S:select rand() value
O:select sys.dbms_random.value(0,1) value from al;
13.取符號
S:select sign(-8) value -1
O:select sign(-8) value from al -1
----------數學函數
14.圓周率
S:SELECT PI() value 3.1415926535897931
O:不知道
15.sin,cos,tan 參數都以弧度為單位
例如:select sin(PI()/2) value 得到1(SQLServer)
16.Asin,Acos,Atan,Atan2 返回弧度
17.弧度角度互換(SQLServer,Oracle不知道)
DEGREES:弧度-〉角度
RADIANS:角度-〉弧度
---------數值間比較
18. 求集合最大值
S:select max(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select greatest(1,-2,4,3) value from al
19. 求集合最小值
S:select min(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select least(1,-2,4,3) value from al
20.如何處理null值(F2中的null以10代替)
S:select F1,IsNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl
--------數值間比較
21.求字元序號
S:select ascii('a') value
O:select ascii('a') value from al
22.從序號求字元
S:select char(97) value
O:select chr(97) value from al
23.連接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22')||33 value from al
23.子串位置 --返回3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from al
23.模糊子串的位置 --返回2,參數去掉中間%則返回7
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle沒發現,但是instr可以通過第四霾問 刂瞥魷執問?BR> select INSTR('sdsfasdqe','sd',1,2) value from al 返回6
24.求子串
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from al
25.子串代替 返回aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from al
26.子串全部替換
S:沒發現
O:select Translate('fasdbfasegas','fa','我' ) value from al
27.長度
S:len,datalength
O:length
28.大小寫轉換 lower,upper
29.單詞首字母大寫
S:沒發現
O:select INITCAP('abcd dsaf df') value from al
30.左補空格(LPAD的第一個參數為空格則同space函數)
S:select space(10)+'abcd' value
O:select LPAD('abcd',14) value from al
31.右補空格(RPAD的第一個參數為空格則同space函數)
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from al
32.刪除空格
S:ltrim,rtrim
O:ltrim,rtrim,trim
33. 重復字元串
S:select REPLICATE('abcd',2) value
O:沒發現
34.發音相似性比較(這兩個單詞返回值一樣,發音相同)
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from al
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差
返回0-4,4為同音,1最高
--------------日期函數
35.系統時間
S:select getdate() value
O:select sysdate value from al
36.前後幾日
直接與整數相加減
37.求日期
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from al
select to_char(sysdate,'yyyy-mm-dd') value from al
38.求時間
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from al
39.取日期時間的其他部分
S:DATEPART 和 DATENAME 函數 (第一個參數決定)
O:to_char函數 第二個參數決定
參數---------------------------------下表需要補充
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O無效)
dayofyear dy, y (O表星期)
day dd, d (d O無效)
week wk, ww (wk O無效)
weekday dw (O不清楚)
Hour hh,hh12,hh24 (hh12,hh24 S無效)
minute mi, n (n O無效)
second ss, s (s O無效)
millisecond ms (O無效)
----------------------------------------------
40.當月最後一天
S:不知道
O:select LAST_DAY(sysdate) value from al
41.本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
42.字元串轉時間
S:可以直接轉或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
43.求兩日期某一部分的差(比如秒)
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用兩個日期相減(比如d1-d2=12.3)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
44.根據差值求新的日期(比如分鍾)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;
45.求不同時區時間
S:不知道
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;
-----時區參數,北京在東8區應該是Ydt-------
AST ADT 大西洋標准時間
BST BDT 白令海標准時間
CST CDT 中部標准時間
EST EDT 東部標准時間
GMT 格林尼治標准時間
HST HDT 阿拉斯加—夏威夷標准時間
MST MDT 山區標准時間
NST 紐芬蘭標准時間
PST PDT 太平洋標准時間
YST YDT YUKON標准時間
Oracle支持的字元函數和它們的Microsoft SQL Server等價函數:
函數 Oracle Microsoft SQL Server
把字元轉換為ASCII ASCII ASCII
字串連接 CONCAT (expression + expression)
把ASCII轉換為字元 CHR CHAR
返回字元串中的開始字元(左起) INSTR CHARINDEX
把字元轉換為小寫 LOWER LOWER
把字元轉換為大寫 UPPER UPPER
填充字元串的左邊 LPAD N/A
清除開始的空白 LTRIM LTRIM
清除尾部的空白 RTRIM RTRIM
字元串中的起始模式(pattern) INSTR PATINDEX
多次重復字元串 RPAD REPLICATE
字元串的語音表示 SOUNDEX SOUNDEX
重復空格的字串 RPAD SPACE
從數字數據轉換為字元數據 TO_CHAR STR
子串 SUBSTR SUBSTRING
替換字元 REPLACE STUFF
將字串中的每個詞首字母大寫 INITCAP N/A
翻譯字元串 TRANSLATE N/A
字元串長度 LENGTH DATELENGTH or LEN
列表中最大的字元串 GREATEST N/A
列表中最小的字元串 LEAST N/A
如果為NULL則轉換字串 NVL ISNULL
日期函數
函數 Oracle Microsoft SQL Server
日期相加 (date column +/- value) or
ADD_MONTHS DATEADD
兩個日期的差 (date column +/- value) or
MONTHS_BETWEEN DATEDIFF
當前日期和時間 SYSDATE GETDATE()
一個月的最後一天 LAST_DAY N/A
時區轉換 NEW_TIME N/A
日期後的第一個周日 NEXT_DAY N/A
代表日期的字元串 TO_CHAR DATENAME
代表日期的整數 TO_NUMBER
(TO_CHAR)) DATEPART
日期舍入 ROUND CONVERT
日期截斷 TRUNC CONVERT
字元串轉換為日期 TO_DATE CONVERT
如果為NULL則轉換日期 NVL ISNULL
轉換函數
函數 Oracle Microsoft SQL Server
數字轉換為字元 TO_CHAR CONVERT
字元轉換為數字 TO_NUMBER CONVERT
日期轉換為字元 TO_CHAR CONVERT
字元轉換為日期 TO_DATE CONVERT
16進制轉換為2進制 HEX_TO_RAW CONVERT
2進制轉換為16進制 RAW_TO_HEX CONVERT
其它行級別的函數
函數 Oracle Microsoft SQL Server
返回第一個非空表達式 DECODE COALESCE
當前序列值 CURRVAL N/A
下一個序列值 NEXTVAL N/A
如果exp1 = exp2, 返回null DECODE NULLIF
用戶登錄賬號ID數字 UID SUSER_ID
用戶登錄名 USER SUSER_NAME
用戶資料庫ID數字 UID USER_ID
用戶資料庫名 USER USER_NAME
當前用戶 CURRENT_USER CURRENT_USER
用戶環境(audit trail) USERENV N/A
在CONNECT BY子句中的級別 LEVEL N/A
合計函數
函數 Oracle Microsoft SQL Server
Average AVG AVG
Count COUNT COUNT
Maximum MAX MAX
Minimum MIN MIN
Standard deviation STDDEV STDEV or STDEVP
Summation SUM SUM
Variance VARIANCE VAR or VARP
Oracle還有一個有用的函數EXTRACT,提取並且返回日期時間或時間間隔表達式中特定的時間域:
EXTRACT(YEAR FROM 日期)
㈥ Labelmx條形碼生成器的軟體功能
Labelmx條形碼生成器是鄭州恆佑科技推出的一款簡單易用的專業條碼標簽設計系統。集畫圖設計、條碼生成、標簽製作、批量列印於一體。界面友好、即時上手、無需任何專業知識即可輕松完成對各種資料庫連接。系統內置大量設計模板,用戶稍作改動即可滿足實際應用。
◆.支持40多種條碼類型:一維條碼((EAN-138及附加碼、EAN-14條形碼、UPC-AE及附加碼、CODE 128 ABCAuto條形碼、CODE 39Extended條形碼、Codabar(庫德巴碼/NW 7)、ITF-14條形碼、interleaved 2of5(i 2of5)條形碼、 instrial 2of5、 Matrix 25(矩陣25碼)、Code MSI、EAN/UCC 128ABCAuto組合碼、SSCC-18/14、SSCC-18SCC-14、電子監管碼、葯監碼...),二維條碼(PDF417, MicroPDF 417, Data Matrix, MaxiCode, QR Code...);所有條碼類型按照國際編碼規則設計,用戶只需簡單修改條碼屬性就可以快速設計出專業、高質量的條碼標簽;
◆.支持所有列印機:普通列印機(彩色噴墨、針式列印機或激光列印機)、條碼/標簽列印機、證卡/吊牌列印機,數碼印刷機以及工業列印機等;
--------------------------------------------
1.操作簡單,所見即所得的可視化設計模式,支持畫的圖形:文字、圖片、一維條碼、二維條碼、數據源、直線(表格)、曲線、矩形、填充矩形、菱形、多邊形、圓形;用戶可以設置圖形的前景色及背景色,其中文字和條碼可以流水或者連接數據源批量列印,圖片可以連接數據源列印可變圖片;支持自定義標簽設計環境;
2.支持可變數據批量列印:支持流水號,流水條碼(Code001、Code002...);支持文字、條碼和圖片連接資料庫(1.文本文件 2.EXCEL表格 3.Access資料庫 4.Dbf資料庫 5.Edb資料庫 6.MySQL資料庫 7.SQLServer資料庫 8.Oracle資料庫 9.Sqlite資料庫 10.IBM DB2資料庫 11.自定義資料庫),且支持多個資料庫同時連接;
3.支持條碼導出為jpg、bmp、tiff點陣圖格式和wmf、emf矢量格式姿手圖片,方便導入到CorelDraw、Illustrator等軟體中交互使用,用於出菲林和印刷;
4.支持單個或批量導出可變數據的條碼標簽為高解析度圖片,用於直接出菲林和印刷,適用於印刷設計企業;
5.支持設置每張標簽的列印份數或者根據資料庫指定數量欄位打凱冊銀印,用戶只用在資料庫中設置好每條記錄的數量,軟體便可以按照數量欄位列印,更加人性化設計;
6.軟體自帶有條碼批量編制工具,可以生成10進制、16進制、26進制,32或36進制流水數據,或者按條碼類型生成帶校驗碼的流水數據,並可以打亂排序或分段顯示生成防偽碼;
7.提供多媒體教程、軟體幫助和在線客服加專業技術一條龍的優質服務,隨時為您解決各種軟體疑問和條碼問題,終身免費技術咨詢;
8.支持用戶列印許可權設置,普通用戶無法修改標簽的任何設置,只能列印,避免誤盯宴操作導致的錯誤情況;
9.支持列印頁眉和頁碼,支持文字、圖形(圖片,條形碼,矩形,直線等)和文件頁眉(包含多個圖形元素,並且可以為可變數據);支持上、下、左、右和自定義位置列印頁碼,並可設置生產線標記,如:XX訂單XX產品XX生產線,從XXX到XXX頁當前第X頁,用於流水線大批量列印;
10.斷電或誤關機後,設置自定義列印起始位置或列印指定頁,實現標簽連續列印;
11.支持列印當前日期,當前時間,支持文字和條碼根據列印時輸入內容列印,支持字母大小寫轉換、數字大小寫轉換、數字四捨五入、數字轉換為簡繁金額及限制小數點長度,支持多種文字分段效果(如HY-001,HY-002,HY-003...);
12.支持其它程序調用列印介面:將文字、圖片和條碼設置為變數,用於其它軟體調用。
㈦ SQL和Oracle的功能上有什麼區別
許多軟體公司都理解開發不依賴於特定資料庫類型(例如Oracle、SQL Server、DB2)的應用程序的重要性,它可以讓客戶們選擇自己習慣的平台。一般來說,軟體開發人員都能夠識別出他們的負責資料庫維護的客戶,和必須使用現有平台和個性化的客戶。
關於Oracle和SQL Server之間的區別,已經有很多篇文章從企業的角度和資料庫管理員的角度出發描寫了兩者之間的一般差別。在這篇文章裡面,我將會從應用程序的角度向你描述SQL erver 和oracle平台之間的區別,並且將會討論開發不依賴於資料庫環境的應用程序的幾種可能的方法。與此同時,我不會再論討對於應用程序來說,兩個平台之間顯而易見的區別,例如表的分割和索引。
定義通用介面和語言有很少的幾種通用語言和介面可以讓應用程序不依賴於資料庫,想來也可以以同樣的方式應用在關系型資料庫上面: ANSI是美國國家標准局定義的,這是一家志願者成員的組織(用私人基金運轉),他們在有關設備和程序等廣泛領域內開發了國家承認的標准。在資料庫領域, ANSI定義了編寫SQL命令的標准,假設命令可以運行在任何的資料庫上,而不需要更改命令的語法。ODBC是開放資料庫連接(ODBC)介面,微軟定義的,它可以讓應用程序訪問資料庫管理系統(DBMS)中的數據,使用SQL作為訪問數據的標准。ODBC允許最大的互聯性,這意味著一個單個的應用程序可以訪問不同的資料庫管理系統。然後,應用程序終端用戶可以添加開放資料庫連接(ODBC)資料庫驅動來將應用程序與他們所選擇的資料庫管理系統鏈接上。 OLE DB是ODBC的繼承者,是一組允許例如基於VB、C++、Access等任何可以連接到類似SQL Server、Oracle、DB2、MySQL等後台的「前台」的軟體組件。在許多種情況下,OLE DB組件都比原有的ODBC提供了好得多的性能。 JDBC(Java資料庫連接)應用程序介面是Java編程語言和廣泛范圍的資料庫,SQL資料庫和其他表列數據源(例如電子表格或者普通文本文件)之間,進行不依賴於資料庫的連接的行業標准。JDBD應用程序介面為基於SQL的資料庫訪問提供了調用級別的應用程序介面。真實世界中的通用介面不幸的是,並不是所有資料庫級別的命令都是ANSI,每個資料庫平台都有自己的擴展功能。對於ANSI或者通用介面,一般來說都代表著幾本功能,因此也可能意味著喪失了性能方面的競爭力。對於小型資料庫和小型應用程序來說,要維護對資料庫的通用訪問是簡單的,但是當資料庫和/或應用程序變得越來越大,越來越復雜,你就不得不向代碼中添加功能。
SQL Server和Oracle的常用函數對比
---------數學函數
1.絕對值
S:select abs(-1) value
O:select abs(-1) value from al
2.取整(大)
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from al
3.取整(小)
S:select floor(-1.001) value
O:select floor(-1.001) value from al
4.取整(截取)
S:select cast(-1.002 as int) value
O:select trunc(-1.002) value from al
5.四捨五入
S:select round(1.23456,4) value 1.23460
O:select round(1.23456,4) value from al 1.2346
6.e為底的冪
S:select Exp(1) value 2.7182818284590451
O:select Exp(1) value from al 2.71828182
7.取e為底的對數
S:select log(2.7182818284590451) value 1
O:select ln(2.7182818284590451) value from al; 1
8.取10為底對數
S:select log10(10) value 1
O:select log(10,10) value from al; 1
9.取平方
S:select SQUARE(4) value 16
O:select power(4,2) value from al 16
10.取平方根
S:select SQRT(4) value 2
O:select SQRT(4) value from al 2
11.求任意數為底的冪
S:select power(3,4) value 81
O:select power(3,4) value from al 81
12.取隨機數
S:select rand() value
O:select sys.dbms_random.value(0,1) value from al;
13.取符號
S:select sign(-8) value -1
O:select sign(-8) value from al -1
----------三角函數相關
14.圓周率
S:SELECT PI() value 3.1415926535897931
O:不知道
15.sin,cos,tan 參數都以弧度為單位
例如:select sin(PI()/2) value 得到1(SQLServer)
16.Asin,Acos,Atan,Atan2 返回弧度
17.弧度角度互換(SQLServer,Oracle不知道)
DEGREES:弧度-〉角度
RADIANS:角度-〉弧度
---------數值間比較
18. 求集合最大值
S:select max(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select greatest(1,-2,4,3) value from al
19. 求集合最小值
S:select min(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select least(1,-2,4,3) value from al
20.如何處理null值(F2中的null以10代替)
S:select F1,IsNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl
--------字元串函數
21.求字元序號
S:select ascii('a') value
O:select ascii('a') value from al
22.從序號求字元
S:select char(97) value
O:select chr(97) value from al
23.連接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22')||33 value from al
23.子串位置 --返回3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from al
23.模糊子串的位置 --返回2,參數去掉中間%則返回7
// 本文轉自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=996&d=dwn1rn
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle沒發現,但是instr可以通過第四個參數控制出現次數
select INSTR('sdsfasdqe','sd',1,2) value from al 返回6
24.求子串
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from al
25.子串代替 返回aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from al
26.子串全部替換
S:Replace
O:select Translate('fasdbfasegas','fa','我' ) value from al
27.長度
S:len,datalength
O:length
28.大小寫轉換 lower,upper
29.單詞首字母大寫
S:沒發現
O:select INITCAP('abcd dsaf df') value from al
30.左補空格(LPAD的第一個參數為空格則同space函數)
S:select space(10)+'abcd' value
O:select LPAD('abcd',14) value from al
31.右補空格(RPAD的第一個參數為空格則同space函數)
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from al
32.刪除空格
S:ltrim,rtrim
O:ltrim,rtrim,trim
33. 重復字元串
S:select REPLICATE('abcd',2) value
O:沒發現
34.發音相似性比較(這兩個單詞返回值一樣,發音相同)
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from al
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差
返回0-4,4為同音,1最高
--------------日期函數
35.系統時間
S:select getdate() value
O:select sysdate value from al
36.前後幾日
直接與整數相加減
37.求日期
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from al
select to_char(sysdate,'yyyy-mm-dd') value from al
38.求時間
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from al
39.取日期時間的其他部分
S:DATEPART 和 DATENAME 函數 (第一個參數決定)
O:to_char函數 第二個參數決定
參數---------------------------------下表需要補充
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O無效)
dayofyear dy, y (O表星期)
day dd, d (d O無效)
week wk, ww (wk O無效)
weekday dw (O不清楚)
Hour hh,hh12,hh24 (hh12,hh24 S無效)
minute mi, n (n O無效)
second ss, s (s O無效)
millisecond ms (O無效)
----------------------------------------------
40.當月最後一天
S:不知道
O:select LAST_DAY(sysdate) value from al
41.本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
42.字元串轉時間
S:可以直接轉或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
43.求兩日期某一部分的差(比如秒)
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用兩個日期相減(比如d1-d2=12.3)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
44.根據差值求新的日期(比如分鍾)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;
45.求不同時區時間
S:不知道
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;
-----時區參數,北京在東8區應該是Ydt-------
AST ADT 大西洋標准時間
BST BDT 白令海標准時間
CST CDT 中部標准時間
EST EDT 東部標准時間
GMT 格林尼治標准時間
HST HDT 阿拉斯加—夏威夷標准時間
MST MDT 山區標准時間
NST 紐芬蘭標准時間
PST PDT 太平洋標准時間
YST YDT YUKON標准時間
Oracle支持的字元函數和它們的Microsoft SQL Server等價函數:
函數 Oracle Microsoft SQL Server
把字元轉換為ASCII ASCII ASCII
字串連接 CONCAT (expression + expression)
把ASCII轉換為字元 CHR CHAR
返回字元串中的開始字元(左起) INSTR CHARINDEX
把字元轉換為小寫 LOWER LOWER
把字元轉換為大寫 UPPER UPPER
填充字元串的左邊 LPAD N/A
清除開始的空白 LTRIM LTRIM
清除尾部的空白 RTRIM RTRIM
字元串中的起始模式(pattern) INSTR PATINDEX
多次重復字元串 RPAD REPLICATE
字元串的語音表示 SOUNDEX SOUNDEX
重復空格的字串 RPAD SPACE
從數字數據轉換為字元數據 TO_CHAR STR
子串 SUBSTR SUBSTRING
替換字元 REPLACE STUFF
將字串中的每個詞首字母大寫 INITCAP N/A
翻譯字元串 TRANSLATE N/A
字元串長度 LENGTH DATELENGTH or LEN
列表中最大的字元串 GREATEST N/A
列表中最小的字元串 LEAST N/A
如果為NULL則轉換字串 NVL ISNULL
日期函數
函數 Oracle Microsoft SQL Server
日期相加 (date column +/- value) or
ADD_MONTHS DATEADD
兩個日期的差 (date column +/- value) or
MONTHS_BETWEEN DATEDIFF
當前日期和時間 SYSDATE GETDATE()
一個月的最後一天 LAST_DAY N/A
時區轉換 NEW_TIME N/A
日期後的第一個周日 NEXT_DAY N/A
代表日期的字元串 TO_CHAR DATENAME
代表日期的整數 TO_NUMBER
(TO_CHAR)) DATEPART
日期舍入 ROUND CONVERT
日期截斷 TRUNC CONVERT
字元串轉換為日期 TO_DATE CONVERT
如果為NULL則轉換日期 NVL ISNULL
轉換函數
函數 Oracle Microsoft SQL Server
數字轉換為字元 TO_CHAR CONVERT
字元轉換為數字 TO_NUMBER CONVERT
日期轉換為字元 TO_CHAR CONVERT
字元轉換為日期 TO_DATE CONVERT
16進制轉換為2進制 HEX_TO_RAW CONVERT
2進制轉換為16進制 RAW_TO_HEX CONVERT
其它行級別的函數
函數 Oracle Microsoft SQL Server
返回第一個非空表達式 DECODE COALESCE
當前序列值 CURRVAL N/A
下一個序列值 NEXTVAL N/A
如果exp1 = exp2, 返回null DECODE NULLIF
用戶登錄賬號ID數字 UID SUSER_ID
用戶登錄名 USER SUSER_NAME
用戶資料庫ID數字 UID USER_ID
用戶資料庫名 USER USER_NAME
當前用戶 CURRENT_USER CURRENT_USER
用戶環境(audit trail) USERENV N/A
在CONNECT BY子句中的級別 LEVEL N/A
合計函數
函數 Oracle Microsoft SQL Server
Average AVG AVG
Count COUNT COUNT
Maximum MAX MAX
Minimum MIN MIN
Standard deviation STDDEV STDEV or STDEVP
Summation SUM SUM
Variance VARIANCE VAR or VARP
Oracle還有一個有用的函數EXTRACT,提取並且返回日期時間或時間間隔表達式中特定的時間域:
EXTRACT(YEAR FROM 日期)
㈧ 36進制的sql語言如何寫
不知所雲
你寫的SQL 首先能讓SQL編譯器 編譯透過
㈨ sql 處理字元串的函數有哪些
1.絕對值
SQL:select abs(-1) value
O:select abs(-1) value from al
2.取整(大)
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from al
3.取整(小)
S:select floor(-1.001) value
O:select floor(-1.001) value from al
4.取整(截取)
S:select cast(-1.002 as int) value
O:select trunc(-1.002) value from al
5.四捨五入
S:select round(1.23456,4) value 1.23460
O:select round(1.23456,4) value from al 1.2346
6.e為底的冪
S:select Exp(1) value 2.7182818284590451
O:select Exp(1) value from al 2.71828182
7.取e為底的對數
S:select log(2.7182818284590451) value 1
O:select ln(2.7182818284590451) value from al; 1
8.取10為底對數
S:select log10(10) value 1
O:select log(10,10) value from al; 1
9.取平方
S:select SQUARE(4) value 16
O:select power(4,2) value from al 16
10.取平方根
S:select SQRT(4) value 2
O:select SQRT(4) value from al 2
11.求任意數為底的冪
S:select power(3,4) value 81
O:select power(3,4) value from al 81
12.取隨機數
S:select rand() value
O:select sys.dbms_random.value(0,1) value from al;
13.取符號
S:select sign(-8) value -1
O:select sign(-8) value from al -1
----------數學函數
14.圓周率
S:SELECT PI() value 3.1415926535897931
O:不知道
15.sin,cos,tan 參數都以弧度為單位
例如:select sin(PI()/2) value 得到1(SQLServer)
16.Asin,Acos,Atan,Atan2 返回弧度
17.弧度角度互換(SQLServer,Oracle不知道)
DEGREES:弧度-〉角度
RADIANS:角度-〉弧度
---------數值間比較
18. 求集合最大值
S:select max(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select greatest(1,-2,4,3) value from al
19. 求集合最小值
S:select min(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select least(1,-2,4,3) value from al
20.如何處理null值(F2中的null以10代替)
S:select F1,IsNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl
--------數值間比較
21.求字元序號
S:select ascii('a') value
O:select ascii('a') value from al
22.從序號求字元
S:select char(97) value
O:select chr(97) value from al
23.連接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22')||33 value from al
23.子串位置 --返回3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from al
23.模糊子串的位置 --返回2,參數去掉中間%則返回7
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle沒發現,但是instr可以通過第四霾問 刂瞥魷執問?BR> select INSTR('sdsfasdqe','sd',1,2) value from al 返回6
24.求子串
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from al
25.子串代替 返回aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from al
26.子串全部替換
S:沒發現
O:select Translate('fasdbfasegas','fa','我' ) value from al
27.長度
S:len,datalength
O:length
28.大小寫轉換 lower,upper
29.單詞首字母大寫
S:沒發現
O:select INITCAP('abcd dsaf df') value from al
30.左補空格(LPAD的第一個參數為空格則同space函數)
S:select space(10)+'abcd' value
O:select LPAD('abcd',14) value from al
31.右補空格(RPAD的第一個參數為空格則同space函數)
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from al
32.刪除空格
S:ltrim,rtrim
O:ltrim,rtrim,trim
33. 重復字元串
S:select REPLICATE('abcd',2) value
O:沒發現
34.發音相似性比較(這兩個單詞返回值一樣,發音相同)
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from al
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差
返回0-4,4為同音,1最高
--------------日期函數
35.系統時間
S:select getdate() value
O:select sysdate value from al
36.前後幾日
直接與整數相加減
37.求日期
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from al
select to_char(sysdate,'yyyy-mm-dd') value from al
38.求時間
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from al
39.取日期時間的其他部分
S:DATEPART 和 DATENAME 函數 (第一個參數決定)
O:to_char函數 第二個參數決定
參數---------------------------------下表需要補充
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O無效)
dayofyear dy, y (O表星期)
day dd, d (d O無效)
week wk, ww (wk O無效)
weekday dw (O不清楚)
Hour hh,hh12,hh24 (hh12,hh24 S無效)
minute mi, n (n O無效)
second ss, s (s O無效)
millisecond ms (O無效)
----------------------------------------------
40.當月最後一天
S:不知道
O:select LAST_DAY(sysdate) value from al
41.本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
42.字元串轉時間
S:可以直接轉或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
43.求兩日期某一部分的差(比如秒)
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用兩個日期相減(比如d1-d2=12.3)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
44.根據差值求新的日期(比如分鍾)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;
45.求不同時區時間
S:不知道
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;
-----時區參數,北京在東8區應該是Ydt-------
AST ADT 大西洋標准時間
BST BDT 白令海標准時間
CST CDT 中部標准時間
EST EDT 東部標准時間
GMT 格林尼治標准時間
HST HDT 阿拉斯加—夏威夷標准時間
MST MDT 山區標准時間
NST 紐芬蘭標准時間
PST PDT 太平洋標准時間
YST YDT YUKON標准時間
Oracle支持的字元函數和它們的Microsoft SQL Server等價函數:
函數 Oracle Microsoft SQL Server
把字元轉換為ASCII ASCII ASCII
字串連接 CONCAT (expression + expression)
把ASCII轉換為字元 CHR CHAR
返回字元串中的開始字元(左起) INSTR CHARINDEX
把字元轉換為小寫 LOWER LOWER
把字元轉換為大寫 UPPER UPPER
填充字元串的左邊 LPAD N/A
清除開始的空白 LTRIM LTRIM
清除尾部的空白 RTRIM RTRIM
字元串中的起始模式(pattern) INSTR PATINDEX
多次重復字元串 RPAD REPLICATE
字元串的語音表示 SOUNDEX SOUNDEX
重復空格的字串 RPAD SPACE
從數字數據轉換為字元數據 TO_CHAR STR
子串 SUBSTR SUBSTRING
替換字元 REPLACE STUFF
將字串中的每個詞首字母大寫 INITCAP N/A
翻譯字元串 TRANSLATE N/A
字元串長度 LENGTH DATELENGTH or LEN
列表中最大的字元串 GREATEST N/A
列表中最小的字元串 LEAST N/A
如果為NULL則轉換字串 NVL ISNULL
日期函數
函數 Oracle Microsoft SQL Server
日期相加 (date column +/- value) or
ADD_MONTHS DATEADD
兩個日期的差 (date column +/- value) or
MONTHS_BETWEEN DATEDIFF
當前日期和時間 SYSDATE GETDATE()
一個月的最後一天 LAST_DAY N/A
時區轉換 NEW_TIME N/A
日期後的第一個周日 NEXT_DAY N/A
代表日期的字元串 TO_CHAR DATENAME
代表日期的整數 TO_NUMBER
(TO_CHAR)) DATEPART
日期舍入 ROUND CONVERT
日期截斷 TRUNC CONVERT
字元串轉換為日期 TO_DATE CONVERT
如果為NULL則轉換日期 NVL ISNULL
轉換函數
函數 Oracle Microsoft SQL Server
數字轉換為字元 TO_CHAR CONVERT
字元轉換為數字 TO_NUMBER CONVERT
日期轉換為字元 TO_CHAR CONVERT
字元轉換為日期 TO_DATE CONVERT
16進制轉換為2進制 HEX_TO_RAW CONVERT
2進制轉換為16進制 RAW_TO_HEX CONVERT
其它行級別的函數
函數 Oracle Microsoft SQL Server
返回第一個非空表達式 DECODE COALESCE
當前序列值 CURRVAL N/A
下一個序列值 NEXTVAL N/A
如果exp1 = exp2, 返回null DECODE NULLIF
用戶登錄賬號ID數字 UID SUSER_ID
用戶登錄名 USER SUSER_NAME
用戶資料庫ID數字 UID USER_ID
用戶資料庫名 USER USER_NAME
當前用戶 CURRENT_USER CURRENT_USER
用戶環境(audit trail) USERENV N/A
在CONNECT BY子句中的級別 LEVEL N/A
合計函數
函數 Oracle Microsoft SQL Server
Average AVG AVG
Count COUNT COUNT
Maximum MAX MAX
Minimum MIN MIN
Standard deviation STDDEV STDEV or STDEVP
Summation SUM SUM
Variance VARIANCE VAR or VARP
Oracle還有一個有用的函數EXTRACT,提取並且返回日期時間或時間間隔表達式中特定的時間域:
EXTRACT(YEAR FROM 日期)
㈩ 在jdbcapi,statement哪個方法可以用來限制查詢返回的記錄數
jdbc驅動
java jdbc連接_2019最新JDBC面試題(附JDBC教程)
weixin_39665379
關注
0點贊·410人閱讀
1.什麼是JDBC API,何時使用它?
Java DataBase Connectivity API允許我們使用關系資料庫。JDBC API介面和類是part java.sql和javax.sqlpackage的一部分。我們可以使用JDBC API來獲取資料庫連接,在資料庫伺服器中運行SQL查詢和存儲過程並處理結果。
JDBC API的編寫方式允許我們的Java程序和實際的JDBC驅動程序之間的鬆散耦合,這使我們可以輕松地從一個資料庫切換到另一個資料庫伺服器。
2.JDBC驅動程序有哪幾種類型?
有四種類型的JDBC驅動程序。任何與資料庫一起工作的java程序都有兩個部分,第一部分是JDBC API,第二部分是執行實際工作的驅動程序。
JDBC-ODBC Bridge加ODBC驅動程序(類型1):它使用ODBC驅動程序連接到資料庫。我們應該安裝ODBC驅動程序來連接資料庫,這就是為什麼這個驅動程序幾乎已經過時的原因。
Native API部分支持Java技術的驅動程序(類型2):此驅動程序將JDBC類轉換為資料庫伺服器的客戶端API。我們應該安裝資料庫客戶端API。由於對資料庫客戶端局改API驅動程序的額外依賴性,這也不是首選驅動程序。
用於資料庫中間件的純Java驅動程序(類型3):此驅動程序將JDBC調用發送到可以連接到不同類型資料庫的中間件伺服器。我們應該安裝一個中間件伺服器來使用這個驅動程序。這增加了額外的網路調用和性能降低,這就是為什麼不廣泛使用JDBC驅動程序。
直接到資料庫的純Java驅動程序(類型4):此驅動程序將JDBC調用轉換為資料庫伺服器可以理解的網路協議。該解決方案簡單,適用於網路上的資料庫連接。但是對於此解決方案,我們應該使用特定於資料庫的驅動程序,例如Oracle for Oracle DB的OJDBC jar和MySQL Connector的MySQL Connector / J.
3.JDBC API如何幫助我們實現Java程序和JDBC驅動程序API之間的鬆散耦合?
JDBC API使用Java Reflection API實現java程序和JDBC驅動程序之間的鬆散耦合。如果你看一個簡單的JDBC例子,你會發現所有的編程都是用JDBC API完成的,而驅動程序只有在通過反射使用Class.forName()方法載入時才會出現。
我認為這是在核心java類中使用Reflection的最佳示例之一,以確保我們的應用程序不能直接使用Drivers API,這使得從一個資料庫移動到另一個資料庫變得非常容易。
4.什麼是JDBC連接?解釋在簡單的java程序中獲取資料庫連接的步驟。
JDBC Connection就像使用資料庫伺服器創建的Session。您還可以將Connection 視為來自資料庫伺服器的Socket連接。
創建JDBC連接非常簡單,需要兩個步驟:
注冊並載入驅動程序:使用Class.forName(),驅動程序類注冊到DriverManager並載入到內存中。
使用DriverManager獲取Connection對象:我們DriverManager.getConnection()通過傳遞資料庫URL字元串,用戶賣賣名和密碼作為參數來獲取連接對象。
Connection
5.JDBC DriverManager類有什麼用?
JDBC DriverManager是我們通過它獲取資料庫連接對象的工廠類。當我們載入JDBC Driver類時,它將自己注冊到中臘逗DriverManager,您可以查找JDBC Driver類源代碼來檢查它。
當我們通過傳遞資料庫配置細節來調用方法DriverManager.getConnection()時,DriverManager使用已注冊的驅動程序來獲取Connection並將其返回給調用者程序。
6.如何在java程序中獲取資料庫伺服器的詳細信息?
我們可以使用DatabaseMetaDataobject來獲取資料庫伺服器的詳細信息。成功創建資料庫連接後,我們可以通過調用getMetaData()方法獲取元數據對象。我們可以使用DatabaseMetaData中的方法來獲取資料庫產品名稱,版本和詳細的配置信息。
DatabaseMetaData
7.什麼是JDBC Statement?
JDBC API Statement用於在資料庫中執行SQL查詢。我們可以通過調用Connection createStatement()方法來創建Statement對象。我們可以使用Statement通過不同的執行方法傳遞查詢來執行靜態SQL查詢,例如execute(),executeQuery(),executeUpdate()等。
由於查詢是在java程序中生成的,如果未正確驗證用戶輸入,則可能導致SQL注入問題,可以在SQL注入示例中找到更多詳細信息。
默認情況下,每個Statement對象只能同時打開一個ResultSet對象。因此,如果我們想要使用多個ResultSet對象,則每個對象必須由不同的Statement對象生成。Statement介面中的所有execute()方法都隱式關閉一個statment的當前ResultSet對象(如果存在open對象)。
8.execute,executeQuery,executeUpdate有什麼區別?
Statement execute(String query)用於執行任何SQL查詢,如果結果是ResultSet(如運行Select查詢),則返回TRUE。當沒有ResultSet對象(如運行Insert或Update查詢)時,輸出為FALSE。我們可以使用getResultSet()獲取ResultSet和getUpdateCount()方法來檢索更新計數。
Statement executeQuery(String query)用於執行Select查詢並返回ResultSet。即使沒有與查詢匹配的記錄,返回的ResultSet也永遠不會為null。執行select查詢時,我們應該使用executeQuery方法,這樣如果有人試圖執行insert / update語句,它將拋出java.sql.SQLException,並顯示消息「executeQuery方法不能用於更新」。
語句executeUpdate(String query)用於執行不返回任何內容的Insert / Update / Delete(DML)語句或DDL語句。輸出為int,等於SQL數據操作語言(DML)語句的行數。對於DDL語句,輸出為0。
只有在不確定語句類型時才應使用execute()方法,否則使用executeQuery或executeUpdate方法。
9.什麼是JDBC PreparedStatement?
JDBC PreparedStatement對象表示預編譯的SQL語句。我們可以使用它的setter方法來設置查詢的變數。
由於PreparedStatement是預編譯的,因此可以使用它多次有效地執行此語句。PreparedStatement是Statement的更好選擇,因為它會自動轉義特殊字元並避免SQL注入攻擊。
10.如何在JDBC PreparedStatement中設置NULL值?
我們可以使用PreparedStatement setNull()方法將null變數綁定到參數。例如,setNull方法將index和SQL Types作為參數 ps.setNull(10, java.sql.Types.INTEGER);。
11.Statement中的getGeneratedKeys()方法有什麼用?
有時,表可以使用自動生成的鍵來插入主鍵的唯一列值。我們可以使用Statement getGeneratedKeys()方法獲取此自動生成密鑰的值。
12.PreparedStatement對Statement有什麼好處?
PreparedStatement對Statement的一些好處是:
PreparedStatement幫助我們防止SQL注入攻擊,因為它會自動轉義特殊字元。
PreparedStatement允許我們使用參數輸入執行動態查詢。
PreparedStatement比Statement快。當我們重用PreparedStatement或使用它的批處理方法執行多個查詢時,它變得更加明顯。
PreparedStatement幫助我們使用setter方法編寫面向對象的代碼,而使用Statement我們必須使用String Concatenation來創建查詢。如果要設置多個參數,則使用字元串連接編寫查詢看起來非常難看並且容易出錯。
13.PreparedStatement的限制是什麼以及如何克服它?
PreparedStatement的一個限制是我們不能直接在IN子句中使用它。將PreparedStatement與IN子句一起使用的一些替代方法是:
執行單一查詢 性能非常慢,不推薦使用
使用存儲過程 特定於資料庫,因此不適用於多個資料庫應用程序。
動態創建PreparedStatement查詢 良好的方法但失去了緩存的PreparedStatement的好處。
在PreparedStatement查詢中使用NULL 當您知道變數輸入的最大數量時,這是一種很好的方法,可以通過部分執行來擴展以允許無限制的參數。可以在JDBC PreparedStatement IN子句替代中找到更詳細的分析。
14.什麼是JDBC ResultSet?
JDBC ResultSet就像一個表示資料庫結果集的數據表,通常通過執行查詢資料庫的語句來生成。
ResultSet對象維護指向其當前數據行的游標。最初,游標位於第一行之前。next()方法將游標移動到下一行。如果沒有更多行,則next()方法返回false,並且可以在while循環中使用它來迭代結果集。
默認的ResultSet對象不可更新,並且只有一個向前移動的游標。因此,您只能迭代一次,並且只能從第一行到最後一行。可以使用以下語法生成可滾動和/或可更新的ResultSet對象。
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
當生成它的Statement對象關閉,重新執行或用於從多個結果序列中檢索下一個結果時,ResultSet對象將自動關閉。
我們可以使用ResultSet getter方法,列名或索引號從1開始檢索列數據。
15.ResultSet有哪些不同的類型?
在創建Statement時,我們可以根據用戶輸入獲得不同類型的ResultSet對象。如果您將查看Connection方法,您將看到createStatement()和prepareStatement()方法被重載以提供ResultSet類型和並發作為輸入參數。
ResultSet對象有三種類型。
ResultSet.TYPEFORWARDONLY:這是默認類型,游標只能在結果集中向前移動。
ResultSet.TYPESCROLLINSENSITIVE:游標可以前後移動,結果集對創建結果集後其他人對資料庫所做的更改不敏感。
ResultSet.TYPESCROLLSENSITIVE:游標可以向前和向後移動,結果集對創建結果集後其他人對資料庫所做的更改很敏感。基於並發性,有兩種類型的ResultSet對象。
ResultSet.CONCURREADONLY:結果集是只讀的,這是默認的並發類型。
ResultSet.CONCUR_UPDATABLE:我們可以使用ResultSet更新方法來更新行數據。
16.Statement中的setFetchSize()和setMaxRows()方法有什麼用?
我們可以使用setMaxRows(int i)方法來限制資料庫從查詢返回的行數。您可以使用SQL查詢本身實現相同的功能。例如,在MySQL中,我們可以使用LIMIT子句來設置查詢返回的最大行數。
理解fetchSize可能很棘手,因為你應該知道Statement和ResultSet是如何工作的。當我們在資料庫中執行查詢時,將在資料庫緩存中獲取並維護結果,並返回ResultSet。ResultSet是具有對資料庫中結果的引用的游標。
假設我們有一個返回100行的查詢,並且我們將fetchSize設置為10,因此在每次資料庫訪問時,JDBC驅動程序將只獲取10行,因此將有10次訪問以獲取所有行。如果每行需要大量處理時間並且結果中的行數很大,那麼設置最佳fetchSize會很有幫助。
我們可以通過Statement對象設置fetchSize,但可以通過ResultSet對象setFetchSize()方法覆蓋它。
17.如何使用JDBC API調用存儲過程?
存儲過程是一組SQL查詢,它們在資料庫中編譯,可以從JDBC API執行。JDBC CallableStatement可用於在資料庫中執行存儲過程。初始化CallableStatement的語法是;
CallableStatement
//我們需要在調用存儲過程之前注冊外部參數
stmt
我們需要在執行CallableStatement之前注冊OUT參數。
18.什麼是JDBC批處理,它有什麼好處?
有時我們需要為資料庫運行類似的批量查詢,例如將數據從CSV文件載入到關系資料庫表。我們知道我們可以選擇使用Statement或PreparedStatement來執行查詢。除此之外,JDBC API還提供了批處理功能,通過該功能,我們可以一次性為資料庫執行大量查詢。
JDBC API支持通過Statement和PreparedStatement addBatch()以及executeBatch()方法進行批處理。
批處理比一次執行一個語句更快,因為資料庫調用的數量較少。
19.什麼是JDBC事務管理?我們為什麼需要它?
默認情況下,當我們創建資料庫連接時,它以自動提交模式運行。這意味著無論何時執行查詢並完成查詢,都會自動觸發提交。因此,我們觸發的每個SQL查詢都是一個事務,如果我們運行一些DML或DDL查詢,則每個SQL語句完成後,更改都會保存到資料庫中。
有時我們希望一組SQL查詢成為事務的一部分,以便我們可以在所有查詢運行正常時提交它們,如果我們得到任何異常,我們可以選擇回滾作為事務的一部分執行的所有查詢。
JDBC API提供了一種方法,setAutoCommit(boolean flag)通過該方法我們可以禁用連接的自動提交功能。我們應該僅在需要時禁用自動提交,因為除非我們在連接上調用commit()方法,否則不會提交事務。資料庫伺服器使用表鎖來實現事務管理,這是資源密集型過程。所以我們應該在完成交易後立即提交交易。
20.如何回滾JDBC事務?
我們可以使用Connection對象rollback()方法來回滾事務。它將回滾事務所做的所有更改,並釋放此Connection對象當前持有的所有資料庫鎖。
21.什麼是JDBC Savepoint?如何使用它?
有時,事務可以是多個語句的組,我們希望回滾到事務中的特定點。JDBC Savepoint幫助我們在事務中創建檢查點,並且我們可以回滾到該特定檢查點。
為事務創建的任何保存點都會自動釋放,並在提交事務時或在回滾整個事務時變為無效。將事務滾動回保存點會自動釋放並使在相關保存點之後創建的任何其他保存點無效。
22.什麼是JDBC DataSource?它的好處是什麼?
JDBC DataSource是javax.sql包中定義的介面,它比DriverManager更強大,可用於資料庫連接。我們可以使用DataSource來創建資料庫連接,而Driver實現類可以用來獲取連接的實際工作。除了獲取資料庫連接外,DataSource還提供了一些其他功能,例如:
緩存PreparedStatement以加快處理速度 連接超時設置 記錄功能 ResultSet最大大小閾值 使用JNDI支持在servlet容器中連接池 在JDBC DataSource上閱讀有關DataSource的更多信息。
23.如何在Apache Tomcat Server中使用JDBC DataSource和JNDI實現JDBC連接池?
對於部署在servlet容器中的Web應用程序,創建JDBC連接池非常簡單,只需要幾個步驟。
在容器配置文件中創建JDBC JNDI資源,通常是server.xml或context.xml。例如
server
在Web應用程序中,使用InitialContext查找在第一步中配置的JNDI資源,然後獲取連接。
Context
24.什麼是Apache DBCP API?
如果您使用DataSource獲取資料庫連接,通常用於獲取連接的代碼與特定於驅動程序的DataSource實現緊密耦合。除了選擇DataSource實現類之外,大多數代碼都是樣板代碼。
Apache DBCP通過提供DataSource實現來幫助我們擺脫這些問題,DataSource實現充當我們的程序和不同JDBC驅動程序之間的抽象層。Apache DBCP庫依賴於Commons Pool庫,因此請確保它們都在構建路徑中。
25.什麼是JDBC連接隔離級別?
當我們使用JDBC事務來實現數據完整性時,DBMS使用鎖來阻止其他人訪問事務所訪問的數據。DBMS使用鎖來防止臟讀,不可重復讀和幻像讀問題。
DBMS使用JDBC事務隔離級別來使用鎖定機制,我們可以通過Connection getTransactionIsolation()方法獲取隔離級別信息,並使用setTransactionIsolation()方法設置它。
26.什麼是JDBC RowSet?RowSet有哪些類型?
JDBC RowSet以更靈活的方式保存表格數據,即ResultSet。所有RowSet對象都是從ResultSet派生的,因此它們具有ResultSet的所有功能以及一些其他功能。RowSet介面在javax.sql包中定義。
RowSet提供的一些附加功能包括:
具有屬性的Java Bean及其getter-setter方法。RowSet使用JavaBeans事件模型,它們可以向任何已注冊的組件發送通知,用於事件,例如游標移動,更新/插入/刪除行以及更改為RowSet內容。
默認情況下,RowSet對象是可滾動和可更新的,因此如果DBMS不支持可滾動或可更新的ResultSet,我們可以使用RowSet來獲取這些功能。
RowSet大致分為兩種類型:
已連接的RowSet對象 - 這些對象連接到資料庫,與ResultSet對象最相似。JDBC API僅提供一個連接的RowSet對象javax.sql.rowset.JdbcRowSet,它的標准實現類是com.sun.rowset.JdbcRowSetImpl 斷開連接的RowSet對象 - 這些RowSet對象不需要連接到資料庫,因此它們更輕量級且可序列化。它們適合通過網路發送數據。有四種類型的斷開連接的RowSet實現。
CachedRowSet - 它們可以獲取連接並執行查詢並讀取ResultSet數據以填充RowSet數據。我們可以在數據斷開連接時操作和更新數據,並重新連接到資料庫並寫入更改。WebRowSet派生自CachedRowSet - 它們可以讀寫XML文檔。JoinRowSet派生自WebRowSet - 它們可以形成SQL JOIN而無需連接到數據源。從WebRowSet派生的FilteredRowSet - 我們可以應用過濾條件,以便只有選定的數據可見。
27.ResultSet和RowSet有什麼不同?
RowSet對象派生自ResultSet,因此它們具有ResultSet的所有功能以及一些附加功能。RowSet的一大好處是它們可以斷開連接,使其輕量級,並且易於通過網路傳輸。
是否使用ResultSet或RowSet取決於您的要求,但如果您計劃使用ResultSet更長的持續時間,則斷開連接的RowSet是釋放資料庫資源的更好選擇。
28.常見的JDBC異常有哪些?
一些常見的JDBC異常是:
java.sql.SQLException - 這是JDBC異常的基本異常類。java.sql.BatchUpdateException - 當Batch操作失敗時拋出此異常,但它依賴於JDBC驅動程序是否拋出此異常或基本SQLException。java.sql.SQLWarning - 用於SQL操作中的警告消息。java.sql.DataTruncation - 當數據值因超出MaxFieldSize而被意外截斷時。
29.JDBC中的CLOB和BLOB數據類型是什麼?
字元大對象(CLOB)是由具有關聯代碼頁的單位元組字元組成的字元串。此數據類型適用於存儲面向文本的信息,其中信息量可能超出常規VARCHAR數據類型的限制(上限為32K位元組)。
二進制大對象(BLOB)是由位元組組成的二進制字元串,沒有關聯的代碼頁。此數據類型可以存儲大於VARBINARY(32K限制)的二進制數據。此數據類型適用於存儲圖像,語音,圖形和其他類型的業務或特定於應用程序的數據。
30.什麼是JDBC中的「臟讀」?哪個隔離級別可防止臟讀?
當我們處理事務時,有可能更新行,同時其他查詢可以讀取更新的值。這會導致臟讀,因為更新後的值不是永久性的,已更新行的事務可以回滾到先前的值,從而導致無效數據。
隔離級別TRANSACTIONREADCOMMITTED,TRANSACTION_REPEATABLEREAD和TRANSACTIONSERIALIZABLE阻止了臟讀。
31.什麼是2階段提交?
當我們在涉及多個資料庫的分布式系統中工作時,我們需要使用2階段提交協議。2階段提交協議是分布式系統的原子承諾協議。在第一階段,事務管理器向所有事務資源發送commit-request。如果所有事務資源都正常,則事務管理器將為所有資源提交事務更改。如果任何事務資源響應為Abort,則事務管理器可以回滾所有事務更改。
32.JDBC中有哪些不同類型的鎖定?
從廣義上講,有兩種類型的鎖定機制可以防止數據損壞,因為多個用戶使用相同的數據。
樂觀鎖定 - 使用代碼實現此鎖定。表中引入了一個額外的列以保持更新計數。當您選擇該行時,您也會閱讀此列,比如「version」。現在,當您嘗試更新/刪除行時,將在where子句中傳遞此「version」。因此,如果在其間執行其他線程的更新,則更新將失敗。這是避免數據損壞的好方法,但如果有人錯過更新其更新語句中的「version」,則可能容易出錯。通過這種鎖定方式,更新查詢看起來如下所示。
mysql> update emp SET name = 『David』, version = 5 WHERE id = 10 and version = 4;
悲觀鎖定 - 將記錄從選擇鎖定到讀取,更新和提交階段。這通常由資料庫供應商軟體完成,並通過使用SELECT FOR UPDATE查詢觸發。如果線程處理鎖定較長時間,則這種鎖定行的方式可能導致性能降低和死鎖。
除此之外,一些DBMS系統提供鎖定機制來鎖定單行,表或資料庫。
33.你對DDL和DML語句有什麼了解?
數據定義語言(DDL)語句用於定義資料庫模式。創建,更改,刪除,截斷,重命名語句屬於DDL語句,通常它們不返回任何結果。
數據操作語言(DML)語句用於操縱資料庫模式中的數據。選擇,插入,更新,刪除,調用等是DML語句的示例。
34.java.util.Date和java.sql.Date有什麼區別?
java.util.Date包含有關日期和時間的信息,而java.sql.Date包含僅有關日期的信息,它沒有時間信息。因此,如果您必須在資料庫中保留時間信息,建議使用Timestamp或DateTime欄位。
35.如何將圖像或原始數據插入資料庫?
我們可以使用BLOB將圖像或原始二進制數據插入資料庫。
36.什麼是幻像讀取以及哪種隔離級別阻止了它?
虛擬讀取是指事務多次執行查詢並獲取不同數據的情況。假設事務正在執行查詢以根據條件獲取數據,然後另一個事務插入與條件匹配的行。現在,當同一事務再次執行查詢時,新行將成為結果集的一部分。這個新行被稱為Phantom Row,這種情況稱為Phantom Read。
只有使用TRANSACTION_SERIALIZABLE隔離級別才能阻止幻像讀取。
37.什麼是SQL警告?如何在JDBC程序中檢索SQL警告?
SQLWarning是SQLException的子類,我們可以通過在Connection,Statement和ResultSet對象上調用getWarnings()方法來檢索它。SQL警告不會停止腳本的執行,但會警告用戶警告。
38.如何使用資料庫對象作為IN / OUT調用Oracle存儲過程?
如果Oracle存儲過程具有作為資料庫對象的IN / OUT參數,那麼我們需要在程序中創建相同大小的Object數組,然後使用它來創建Oracle STRUCT對象。然後我們可以通過調用setSTRUCT()方法為資料庫對象設置此STRUCT對象並使用它。
39.我們什麼時候得到java.sql.SQLException:找不到合適的驅動程序?
當SQL URL字元串格式不正確時,您將得到沒有合適的驅動程序發現異常。您可以在使用DriverManager的簡單Java應用程序或使用DataSource的JNDI資源中獲取此異常。異常堆棧跟蹤如下所示。
org
在調試此異常時,只需檢查日誌中列印的URL,如上面的日誌中URL URL是』jdbc:mysql:// localhost:3306 / UserDB,而它應該是jdbc:mysql:// localhost:3306 / UserDB 。
40.JDBC有哪些最佳實踐?
一些JDBC最佳實踐是:
資料庫資源很重,因此請確保在完成後立即關閉它。Connection,Statement,ResultSet和所有其他JDBC對象都定義了close()方法來關閉它們。
始終在代碼中顯式關閉結果集,語句和連接,因為如果您在連接池環境中工作,則可能會將連接返回到池,從而導致打開的結果集和語句對象導致資源泄漏。
關閉finally塊中的資源,以確保即使在異常情況下它們也會關閉。
使用批處理進行類似的批量操作。
始終對Statement使用PreparedStatement以避免SQL注入並獲得PreparedStatement的預編譯和緩存優勢。
如果要將批量數據檢索到結果集中,則為fetchSize設置最佳值有助於獲得良好的性能。
資料庫伺服器可能不支持所有隔離級別,因此請在假設之前進行檢查。
更嚴格的隔離級別會導致性能降低,因此請確保為資料庫連接設置了最佳隔離級別。
如果要在Web應用程序中創建資料庫連接,請嘗試使用JNDI上下文使用JDBC DataSource資源來重用連接。
當您需要長時間使用ResultSet時,請嘗試使用斷開連接的RowSet。