【開發篇sql】 條件和表示式(二) 資料型別的比較規則
2,資料型別的比較規則
主要看幾個常見且比較重要的例子。
Char字元的比較,是比較ascii值的大小:
SQL> select 1 from dual where 'ab' >'ac';
1
----------
SQL> select 1 from dual where 'ab'
1
----------
1
SQL> select 1 from dual where 'a'
1
----------
1
字元與數值的比較,有一個隱身轉換的過程:
SQL> select 1 from dual where '32' = 32;
1
----------
1
但是下面這樣的情況並不會將32隱身轉換為’32’:
SQL> select 1 from dual where 'a' = 32;
select 1 from dual where 'a' = 32
ORA-01722: invalid number
之所以這裡特意提到隱式轉換,是因為,往往在sql條件中,由於隱式轉換可能會禁用相關的索引,這個也是sql效能的一大隱患,可以簡單看一個例子,注意不能使用上面建立的表,drop後新建,插入下列資料:
Insert into t_test_chr values ('1111', '1111', '1111');
SQL> create index t_test_chr_id2 on t_test_chr(type_varchar2);
Index created
SQL> select * from t_test_chr a where a.type_varchar2='aaaa';
Execution Plan
----------------------------------------------------------
Plan hash value: 3150866331
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 40 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T_TEST_CHR | 1 | 40 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | T_TEST_CHR_ID2 | 1 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
SQL> select * from t_test_chr a where a.type_varchar2=1;
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 217284118
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 40 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T_TEST_CHR | 1 | 40 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------
可以看到由於隱式轉換使得查詢走了不同的執行路徑,在很多時候這種變化不是開發者所期待的,所以需要留意資料型別。具體可以參加《sql reference》的Datatype Comparison Rules一節。來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-662797/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料型別和表示式題目資料型別
- Oracle date 型別比較和String比較Oracle型別
- 字符集和比較規則
- PHP基礎-資料型別-string和int比較PHP資料型別
- SQL稽核 | SQLE 如何開發一條自定義的規則SQL
- 【SQL】18 SQL NULL 函式、SQL 通用資料型別、SQL 用於各種資料庫的資料型別SQLNull函式資料型別資料庫
- JS資料型別轉換規則JS資料型別
- MySQL 的 timestamp 和 datetime 型別比較MySql型別
- 開發60條規則
- Oracle vs PostgreSQL,研發注意事項(8)- Oracle資料比較規則OracleSQL
- Oracle OCP(06):通用函式和條件表示式Oracle函式
- SSIS 資料型別 第二篇:變數的資料型別資料型別變數
- mysql資料庫中decimal資料型別比較大小MySql資料庫Decimal資料型別
- [JAVA] Java 變數、表示式和資料型別詳解Java變數資料型別
- 實驗一 C語言開發環境使用和資料型別,運算子,表示式C語言開發環境資料型別
- 實驗1 C語言開發環境使用和資料型別、運算子、表示式C語言開發環境資料型別
- 實驗一 c語言開發環境使用和資料型別、運算子、表示式C語言開發環境資料型別
- 實驗1 C語言開發環境使用和資料型別,運算子,表示式C語言開發環境資料型別
- 32. 基本資料型別、約束條件資料型別
- Java 條件表示式的優化Java優化
- CMake 生成器表示式---條件表示式和邏輯運算子
- 正規表示式基本規則
- SQL正規表示式SQL
- “正規表示式”應當稱為“規則表示式”
- sql裡的正規表示式SQL
- SQL SERVER 日期和時間資料型別及函式 (Transact-SQL)SQLServer資料型別函式
- JAVA_資料型別介紹與基本資料型別之間的運算規則Java資料型別
- 批量插入 1 萬條資料,DB 查詢構造器和原生 SQL 效能比較SQL
- 正規表示式的一些規則
- SQL 資料型別SQL資料型別
- sql server 資料型別轉換函式SQLServer資料型別函式
- 規則引擎與ML模型的比較 - xLaszlo模型
- javascript ==與!=的比較規則(加踩坑)JavaScript
- 從根上理解 MySQL 的字符集和比較規則MySql
- php型別比較表PHP型別
- 從規範看ECMAScript(二):資料型別資料型別
- python資料型別和四則運算Python資料型別
- java double、float型別的比較Java型別
- C與C++在函式和資料的比較C++函式