1.聚合函數與非分組字段查詢問題
案例:
用oracle創建表:
create table t1(
id Number(10),
name varchar2(20),
gender varchar2(20),
age Number(10),
primary key(id)
);
//插入
Insert into t1 values(
seq_t1.nextval,'cmz','1','1'
);
Insert into t1 values(
seq_t1.nextval,'zmc','1','3'
);
Insert into t1 values(
seq_t1.nextval,'czm','2','5'
);
Insert into t1 values(
seq_t1.nextval,'zcm','2','7'
);
Insert into t1 values(
seq_t1.nextval,'mcz','2','9'
);
select * from t1;
//查找
select count(*),gender from t1 group by gender;—–1
select count(*),name from t1 group by gender;——2
1.按性別分組並查找count(*),沒什麼問題,oracle與mysql都可以
2.這裡區別就出現瞭,oracle會報錯,而mysql不會,oracle報錯是因為按照gender分組後,count(*)和gender都是兩行,而name是5行。所以不同行不能同時顯示就會報錯;
但是mysql不會,mysql會輸出按照gender分組過後的第一個name。具體原因是因為什麼現在不知道,以後補充
補充:
1.百度獲得
*.做單獨的查詢時, Orcale使用一個叫DUAL的偽表, 而MySQL不需要.
比如:select 3.1415926 from dual—-oracle;
select 3.14.5926———mysql
*. MySQL別名不區分大小寫, MySQL字符比較也不區別大小寫.
*. 包含null的任何運算(is null 除外), 包括null = null, MySQL返回NULL, Oracle(……..待定..).
*. Oracle中, 如果列名長於列限定字符數, 那麼輸出的列名會被截斷.
*. MySQL 4.0以後的版本支持UNION和UNION ALL, 但仍不支持INTERSECT和MINUS.
日期:
*. MySQL隻支持類似於2002-3-12或者96-12-1的日期格式.
*. 日期運算MySQL是用DATE_ADD(date, interval 2 month)這樣的函數運算, 而Oracle用類似於ADD_MONTHS(date, 2)這樣樣的函數來運算.
*. Oracle可以使用MONTHS_BETWEEN, NEW_TIME, NEXT_DAY這樣的函數計算日期.
*. Oracle使用SYSDATE獲得當前時間, MySQL使用NOW();
字符
*. 字符串引用, Oracle隻能用單引號, MySQL還可以用雙引號.
*. 用字符型數據使用算術運算符, Oracle報錯, MySQL會先將此數據轉換為數值.
*. MySQL中"||"符號默認是"或"運算符, 連接字符串用函數CONCAT.
*. MySQL中取得字符ASCII碼用函數ASCII(), Oracle用CHR();
*. Oracle可以使用INITCAP函數讓字符串首字母大字.
*. MySQL中使用REPLACE函數時必須要寫全三個參數.
*. REPLACE函數中, 第二個和第三個任一參數為NULL, MySQL返回NULL; 而Oracle在第二個參數為NULL時會返回字符串, 第三個參數缺少或為NULL時會刪除與第二個參數匹配的字符.
*. Oracle中可以使用translate來進行字符串替換.
*. Oracle中不可以對數值使用length函數. MySQL自動將數值轉換為字符.
GROUP BY 和 HAVING
*. Oracle中, 有GROUP BY子句的查詢, SELECT後隻能出現聚合函數或者GROUP BY子句中作為分組條件的列. MySQL可以使用其它列, 該列的值將等於指分組條件在查詢時第一個出現的行的該列的值.
*. MySQL中, 同時包含GROUP BY和HAVING的子句, 隻可以在HAVING中使用聚合函數或者SELECT中作為列表的列; Oracle中可以使用其它列, 這個列是指該分組的所有行的列. 比如 HAVING col < 5, 指該分組所有行的col列均小於5