SQLServer和Oracle语法的差异
浅析oracle与sqlserver的区别

Select语句的不同oracle Select * from tablename where rownum < 2sqlserver Select top 1 * from tablenameoracle Select A.*, B.* from A, B where A.bh=B.bh(+)sqlserver Select A.*, B.* from A left Join B on A.bh=B.bhoracle Select A.*, B.* from A, B where A.bh(+)=B.bhsqlserver Select A.*, B.* from A right join B where A.bh=B.bh //oracle 9i 以后也支持了oracle Select * from tablename where lrsj>= to_date(‘2002-11-11’,’yyyy-mm-dd’)sqlserver Select * from tablename where lrsj >= ‘2002-11-11’oracle Select sysdate from dualsqlserver Select getdate()oracle Select Field1 || Field2 from A (指字符串的)sqlserver Select Field1+Field2 from AInsert语句的不同Oracle如何实现自增列(1)建立测试数据表。
CREATE TABLE TEST(ID NUMBER,NAME V ARCHAR2(20),PRIMARY KEY(ID));(2) 创建序列。
CREATE SEQUENCE SEQ_TEST;Parameter的区别存储过程的不同(3)创建触发器。
CREATE OR REPLACE TRIGGER AUTOINCREMENT BEFORE INSERT ON TESTFOR EACH ROWWHEN (NEW.ID IS NULL)BEGINSELECT SEQ_TEST.NEXTV AL INTO :NEW.ID FROM DUAL; END;(4)插入数据。
Oracle与SQL-Server的SQL语法差别

Delete with Second From Clause
SQL Server
delete from products from products, product_deletes where products.a =
product_deletes.a and products.b = product_deletes.b and product_deletes.c = 'd';
Oracle select d.deptname,e.ename from dept d, emp e where d.empno = e.enum (+);
SubQueries in Place of Columns
• SQL Server
select distinct year, q1 = (select Amount amt FROM sales where Quarter=1 AND year = s.year), q2 = (SELECT Amount amt FROM sales where Quarter=2 AND year = s.year), q3 = (SELECT Amount amt FROM sales where Quarter=3 AND year = s.year), q4 = (SELECT Amount amt FROM sales where Quarter=4 AND year = s.year)
Time
SQL Server Datetime: 1/300th second
Oracle Date: 1 second Timestamp: 1/100 millionth second
Column Aliases
Oracle与SQL-Server的SQL语法差别

• sqlplus
II. A Little More Detail
• Outer Join • Sub-Queries in Place of Columns • Deletes With a Second From Clause
Outer Join
SQL Server select d.deptname, e.ename from dept d, emp e where d.empno *= e.enum;
Beginning SQL: Differences Between SQL Server and Oracle
A Quick Intro for SQL Server Users
Les Kopari Independent Consultant
Introduction
If you're new to SQL or just new to Oracle SQL, perhaps coming from a Microsoft SQL Server environment, it may seem like the two versions should be very similar, and they are, to a certain degree, but they are also very different in some important and basic ways.
SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234-
1234', ' [[:digit:]]{5}(-[[:digit:]]{4})?$')
oracle和sqlserver查询语句

oracle和sqlserver查询语句Oracle和SQL Server是两种常见的关系型数据库管理系统(DBMS),它们在查询语句方面有一些不同之处。
在本文中,我们将一步一步回答关于Oracle和SQL Server查询语句的问题,以帮助您更好地理解它们的区别。
首先,让我们从基本的查询语句开始。
无论是Oracle还是SQL Server,都使用SELECT语句来检索数据。
下面是一个简单的示例查询,从一个名为"employees"的表中选择所有员工的姓名:SELECT name FROM employees;在这个查询中,"name"是要检索的列名,而"employees"是表的名称。
这个查询语句将返回一个包含所有员工姓名的结果集。
在Oracle中,还可以使用表别名来简化查询。
表别名是一个用于替代表名称的临时名称。
例如,我们可以使用表别名"e"来编写上面的查询:SELECT FROM employees e;在SQL Server中,也可以使用表别名。
与Oracle类似,我们可以使用“AS”关键字或直接省略关键字来定义表别名。
下面是一个相同的查询示例:SELECT FROM employees AS e;或SELECT FROM employees e;接下来,让我们来看看在Oracle和SQL Server中如何使用WHERE子句来添加条件筛选。
在Oracle中,WHERE子句用于过滤满足指定条件的行。
以下是一个示例查询,从"employees"表中选择所有薪水大于5000的员工的姓名:SELECT name FROM employees WHERE salary > 5000;在这个查询中,"salary > 5000"是条件表达式,用于指定返回薪水大于5000的员工。
Oracle和SQLServer的主要区别

序号 Oracle 1.Oracle的参数文件init.ora是可调的,既我们可以根据数据库的规 模调整Oracle对系统资源的使用情况,以达到最合理的资源分配,让 Oracle达到最佳的性能。因此Oracle的性能优势体现在它的多用户 上,比较适用于访问量和并发用户数大的大型应用系统上。 2.游标是以提高速度全部统一的单项游标,可以允许多用户异步读 取,而且声明比较简单,就一句declare cursor游标名 is select 语句就可以了。 数据库性能 3.Oracle以块为最小存储单位,以区为单位分配空间,用户可以根据 需要自己定义块的大小,且区可以按等额或递增进行分配,这可以大 大减少系统的I/O操作提高数据库的性能。 4.ORACLE中用户可以根据数据需要在创建块时定义填充因子(空闲空 间的百分比)和复用因子(当块的存储数据所占的空间下降到这个百分 比之下时,块才重新标记为可用)。用户可以根据记录变化频率和数 据量的大小设置合适的填充因子和空闲因子。 Oracle的安全可靠性更高: 1.Oracle的数据字典和真实数据是分开存放的,不同的数据分别放在 不同的表空间,而且基表(存储系统参数信息)是加密存储,任何人都 无法访问,只能通过用户可视视图查看。安全性高。 2.在ORACLE里默认只有三个系统用户,ORACLE只能通过注册用户登入 安全性 。 3.Oracle的控制文件记录了数据库文件的物理位置和有效性,在每次 打开Oracle系统都将自动对数据进行验证,查看其有效性,防止数据 的丢失,这体现了Oracle对数据管理的严密性。 4.ORACLE在创建表时用户可以精确定义数据存放的表空间,甚至可以 把一张表分开存放在多个表空间中,这样可以将数据量庞大的表按某 Oralce可以很好地支持Windows、Linux等多种操作系统,跨平台性比 跨平台 较好 Oracle的存储结构是由块、区、段组成,可扩展性好,空间利用率 高,但是操作比较复杂: 1.ORACLE里有两个块参数PCTFREE(填充因子)和PCTUSED(复用因子), 块的大小可设置,这样可降低数据行连接与行迁移的可能性。 2.连续的块组成区,区的分配可以是等额的也可以是自增长的,这样 存储结构的不同 可以减少空间分配次数。 3.Oracle的表可以分为多个段,段由多个区组成,每个段可指定分配 在哪个表空间里,这样大大降低了磁盘争用的可能性。 4.Oracle的数据字典和真实数据是分开存放的,不同的数据分别放在 不同的表空间,而且基表(存储系统参数信息)是加密存储,任何人都 无法访问。只能通过用户可视视图查看。 1.ORACLE中容错类型有三种,分别是预定义错误、非预定义错误、用 户自定义,其中在自定义错误中SQLCODE 错误号、SQLERRM错误描述 是SQL Server没有的。 容错机制 2.Oracle提供了健全的错误机制,用户可以轻松的获得错误位置和错 误原因而加以修改。用户还可以自己定义所须的错误类型,用以检查 逻辑错误。 备份机制 ORACLE提供了7种备份机制,具有联机备份功能 Oracle的日志默认有3个,先写入1号日志,满了后再写入2号日志,2 号满了再写入3号日志,3号满了后Oracle将自动备分1号日志的内 容,然后清空后写入新的日志信息,且Oracle的日志有多路复用功 能,我们可以为日志创建多个镜像,把相同的日志信息同时写入多个 日志文件中,这样可以防止磁盘损坏造成的数据丢失。
Oracle与SQLServer的SQL语法差异总结

项目
Oracle 10g
SQLServer 2008
备注
存储过程格式
CREATEORREPLACEPROCEDURE存储过程名(参数列表) IS
Begin
---存储过程内容
End存储过程名;
CREATEPROCEDURE存储过程名(参数列表) AS
--存储过程内容
From person
2、流控制语句
流控制与表达式结构很相似,只是结果表达式换成语句块
Case表达式when匹配表达式then {语句块1} else {语句块2} end case;
Eg:
case v_name
when‘张三’then
v_number := 1;
when‘李四’then
v_number:=2;
Eg:
Set @result =‘abcd’
2、通过SQL语句赋值
Select变量=表达式from表
Eg:
Select @code=code,@name=name from sysc01 where id = 1000
语句结束符
SQL语句使用分号;作为语句的结束
SQL语句不需要加分号;作为结束符(加也可)
3、动态存储过程(带入、出参)
Eg:
DECLARE@resultVARCHAR(50);
DECLARE@sqlNVARCHAR(1000);
DECLARE@paraNVARCHAR(200);
SET@sql='p_test @code,@name,@result output'
SET@para='@code varchar(10),@name varchar(10),@result varchar(50) output'
oracle与SQL_SEVER的语法区别

浮点数类型 FLOAT FLOAT
实数类型 REAL REAL
ORACLE内部函数大全以及与SQLSERVER的区别:
下面是Oracle支持的字符函数和它们的Microsoft SQL Server等价函数。
ORACLE和SQL语法区别归纳
数据类型比较
类型名称
Oracle
SQLServer比较
字符数据类型 CHAR CHAR 都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb
变长字符数据类型 VARCHAR2 VARCHAR Oracle里面最大长度为4kb,SQLServer里面最大长度为8kb
WHEN 'B+' THEN 3.3
WHEN 'B-' THEN 2.7
WHEN 'C' THEN 2
WHEN 'C+' THEN 2.3
WHEN 'C-' THEN 1.7
WHEN 'D' THEN 1
WHEN 'D+' THEN 1.3
WHEN 'D-' THEN 0.7
ELSE 0
列表中最小的字符串 LEAST --------------------N/A
如果为NULL则转换字串 NVL-------------------- ISNULL
日期函数
下面是Oracle支持的日期函数和它们的Microsoft SQL Server等价函数。
函数 Oracle --------------------Microsoft SQL Server
SQLServerMySqlOracle语法对比及区别

SQLServerMySqlOracle语法对⽐及区别操作SQLServer Oracle Mysql查看表结构exec sp_help 表名desc 表名在command window看desc 表名或 describe 表名或show columns from 表名;修改数据库名称exec sp_renamedb ‘旧数据库名’,’新数据库名’不详修改表名exec sp_rename ‘旧表明’,’新表明’rename 旧表名 to 新表名alter table 表名 rename to 新表名修改列名exec sp_rename ‘表.旧列名’,’新列名’alter table 表名 rename column 旧列名 to 新列名alter table test change column address address1 varchar(30)--修改表列名删除数据库drop database 数据库名不详Drop database添加表中⼀列alter table 表名 Add 列名数据库类型alter table 表明 add(列名数据类型) 或alter table 表名 Add 列名数据库类型alter table test add column name varchar(10); --添加表列删除表中⼀列alter table 表名 drop column 列名alter table 表名 drop column 列名alter table test drop column name;修改表现有列alter table 表名 alter column 列名新数据库类型⼤⼩alter table 表明 modify(列名数据类型)alter table test modify address char(10) --修改表列类型||alter table test change address address char(40)删除约束alter table 表名 drop constraint约束名完全⼀样添加主键约束alter table 表名add constraint 主键约束名primary key (列名)完全⼀样alter table 表明add primary key (列名)删除主键约束alter table 表名 drop primary key添加唯⼀约束alter table 表名add constraint 唯⼀约束名unique (列名)完全⼀样alter table 表名 add unique (列名)添加默认约束alter table 表名add constraint default (值) for 列名完全⼀样添加检查约束alter table 表名add constraint check (列名 > 10)完全⼀样添加外键约束alter table ⼦表add constraint 外键约束名foreign key(⼦表的列名) references 主表 (列名)on update cascade / on updateaction注意:默认和加 on update action 表⽰更新受限加on update cascade 表⽰更新不受限,多项操作时⽤逗号隔开完全⼀样添加索引约束alter table 表名 add index 索引名 (列名)添加普通索引:create index 索引名 ON 表名 (列名)添加唯⼀索引:create unique索引名 ON 表名 (列名)删除索引drop index 索引名 on 表名alter table 表名 drop index 索引名⾝份: exec sp_grantlog域名\密码’⾝份: exec sp_addlogin ‘登陆’,’密码’SET PASSWORD FOR'username'@'host'= PASSWORD('newpassword');数据库名⾝份: Exec域名密码’,’数据库⽤户名’⾝份: Exec sp_grantdbaccess登陆帐户’,’数据库⽤户名’create user HDEAM_TYMBidentified by ""default tablespace HDEAM_TYMBtemporary tablespace TEMPprofile DEFAULT;mysql>insert intoer(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) values("localhost","pppadmin",password("passwd"),'','','');CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY'123456';CREATE USER 'pig'@'%' IDENTIFIED BY '123456';CREATE USER 'pig'@'%' IDENTIFIED BY '';CREATE USER 'pig'@'%';权限 [on 表明] to 数据库grant dba to HDEAM_TYMB with admin option;-- Grant/Revoke system privilegesgrant unlimited tablespace to HDEAM_TYMBwith admin option;“abc”;grant all privileges on phplampDB.* to phplamp@localhostidentified by '1234';mysql>flush privileges;权限 [on 表名] from 数据REVOKE SELECT ON*.* FROM'pig'@'%';数据库’drop user HDEAM_SBFF cascade;mysql>Delete FROM user Where User="phplamp" andHost="localhost";mysql>flush privileges;⾝份: exec sp_droplogin⾝份: exec sp_revokelogin 登分离数据库:数据库名附加数据库:数据库名,主数据⽂件路径’,⽇志⽂件路径’exp hdeam_product/d3B68Apk29v34Dj@orclfile=E:/tymb.dmp log=E:/tymb.logimp HDEAM_LHSH/HDEAM_LHSH@orcldevfile=E:\TYMBHDEAM_BAK_2013-03-25.dmpfull=Y;mysqldump -h localhost -u root -pmysql oa >d:\oa.sqlmysql -h localhost -u root -p jira<d:\jira.sql:Select *select * from表)Exec Sp_helpExecExec数据库名exec表名exec sp_helpindex注意: 下⾯都是通过( select * from 对象 ) 来查看信息触发器 user_triggers过程 user_procedures查看源代码 user_source查看数据库对象 user_objects查看错误信息 show errors查看索引信息 user_indexes查看分区索引 user_ind_partitions查看有关基于列创建的索引 user_ind_columns查看表空间 -- user_tablespaces查看所有数据库 show databases;查看库所有表 show tables;查看表结构和属性use information_schema;select * from columns where table_name=’表名’查看表源代码show create table 表名;查看存储过程源代show create procedure 过程名查看视图源代码show create procedure 过程名查看视图资代码show create VIEW 视图名查看表的索引show index from 表名查看表的索引show keys from 表明表储蓄过/空过程,函数,视图,表的源代码:对象名::查看序列 -- user_sequences查看同义词 -- user_ind_columns查看⽤户表信息 -- user_tables查看⽤户所有的表信息 user_all_tables查看表的索引show keys from 表明sysdate NOW()varchar2(20)不⼀定要指定具体列名必须指定具体列名标识的开始值, 标识种右)create sequence 序列名1.序列名.nextval 获取下⼀个序列的值2.序列名.currval 获取当前的序列的值: *.mdf =1 :*.ndf >=0 : *.log >=1数据⽂件: *.dbf >=1⽇志⽂件: *.log >=11位置开始查找t字符串(默认从1开始)从pos位置len获取字符串的长度把字符串全部转换成把字符串全部转换成清除左边的空格清楚右边的空格从左边返回指定长度的从右边返回指定长度将s t替换成字符串我的⾳乐我’)A我的⾳乐我的世界EFG2位置开3的字符串,并在该位置索引从1开始substr(char, pos, len) 截取字符串length(char) 返回字符串的长度lower(char) 转换为⼩写upper(char) 转换为⼤写trim() 截取左右空格initcap(char) ⾸字母⼤写ltrim(char,set) 左剪裁rtrim(char,set) 右剪裁replace(char oldchar, newchar) 字符串替换concat(char1, char2) 连接字符串cha(67) 根据ASCII码返回对应的字符lpad()和rpad() 在字符串的左边或右边添加东西需要3个参数第⼀个是字符串第⼆个是返回值的总长度, 第三个是⽤来填充的字符值 as varchar) 不需指定长度to_char(d|n, fmt)将数字或⽇期转换为指定格式的值 as varchar) 不需指定长度值) 必须指to_char(d|n, fmt)将数字或⽇期转换为指定格式的字符串to_date(char,frm)将char 或varchar 转换为⽇期数据类型to_number() 将包含数字的字符转换为number数据类型取绝对值取上界最⼩整取下界最⼤整数取幂四舍五⼊,正数返回1 ,负数返-1求平⽅根获取计算机名称nvl(ex1,ex2)如果ex1为null则返回ex2;如果ex1不为null则返回ex1;nvl2(ex1,ex2,ex3)如果ex1不为null则返回ex2如果ex1为null则返回ex3nullif(ex1,ex2)如果ex1=ex2则返回null 否则返回ex1;聚合)列名) 求这列的平均值列名) 求这列的最⼩值列名) 求这列的最⼤值统计所有的⾏包括重复列名) 统计指定列中⾮空值列名) 统计不是重复右句⽤于将信息表划分,按组进⾏聚合运算avg(列名) 求这列的平均值min(列名) 求这列的最⼩值max(列名) 求这列的最⼤值count(*) 统计所有的⾏包括重复值和空值count(列名) 统计指定列中⾮空值的个数count(distinct 列名) 统计不是重复值的个数group by右句⽤于将信息表划分为组,按组进⾏聚合运算返回当前系统时间返回指+指定部分后的⽇期返回返回指a. add_months(d,n) 返回给指定的⽇期加上指定的⽉数后的⽇期值 selectadd_months(sysdate,2) from dual;b. months_between(d,d) 返回2个⽇期之间的⽉数select months_between (date '2005-05-06',date '2005-9-01') from dual;c. last_day(d) 返回指定⽇期当⽉的最后⼀天的⽇期select last_day(sysdate) from dual;d. round(d, [fmt]) 返回⽇期值⽇期四舍五⼊为格式模型指定的单位 select round(date'2005-09-08','year') from dual; 返回 2005-01-01 selectround(date'2005-09-08','month') from dual; 返回2005-09-01 select round(date'2005-09-08','day')from dual; 返回最靠近的⼀个星期⽇e. next_day(d, day) 返回指定的下⼀个星期⼏的⽇期 select next_day(sysdate,'星期⼆') fromdualf.trunc 语法与round 相同区别:trunc 是只舍不⼊g.extract 提取⽇期时间类型中的特定部分|| 连接字符串⽤于将2个或多个字符串合并成⼀个字符串两个)重复的⾏select orderno from order_master union select orderno from order_detail;b.union all 合并2个查询选定的所有⾏包括重复的⾏c.intersect 返回2个查询都有的⾏d.minus 第1个查询在第2个查询中不存在的数据)个,⾄n-个条)::对1 :)左别名.列名,右别名.列from 左表 as 左别名 inner右表 as 右别名on 左别名.列= 右别名.列名左表名.列名,右表名.列from 左表 ,右表 where 左表.列名 = 右表名.列名左外连接:(返回左表的所有⾏,如null代替,存在则显⽰具体数,显⽰出来的总⾏数由左表决定)左别名.列名,右别名.列名左表 as 左别名 left join 右as 右别名on 左别名.列名 = 右.列名右外连接:(返回右表的所有⾏,如null代替,存在则显⽰具体数,显⽰出来的总⾏数由右表决定)左别名.列名,右别名.列名左表 as 左别名 right join右表 as 右别名on 左别名.列名 =完全⼀样连接分类:1内连接:条件2外连接1)左外连接: left join 或 left outer join2)右外连接:right join 或 right outer join3)完整外连接: Full join 或 Full outer join3交叉连接: from …4. 交叉连接:(返回左右表的所有⾏,如果左表没有与右表匹配的⾏则全部⽤null代替,如果右表没有与左表匹配的⾏则全部⽤null代替,存在则显⽰具体数据,显⽰出来的总⾏数=左表和右表⾏数和决定)Select 左别名.列名,右别名.列名 from 左表 as左别名 right join 右表 as 右别名on 左别名.列名= 右别名.列名完全拷贝: insert into ⽬标表源表部分拷贝: insert into ⽬标表 (列) select 列名 from 源表表不存完全拷贝: select * into 新表源表部分拷贝: select 列名 into 新from 源表拷贝表结构: select * into 新表源表 Where 1=2emp;b.拷贝⼀部分create table temp as select 列1,列2 from 表c.只拷贝⼀个空表(根据⼀个假条件)create table temp as select * from 表 where 1=2d.使⽤列别名: select stu_id, stu_name as "学⽣姓名" from student;A表,B1:⽬标表 set 列 = a.列 froma where a.关联列 = ⽬标表.2:列 = a.列 from 源a , ⽬标表b where a.关联列 =关联列3:⽬标表 set 列 = a.列 froma , ⽬标表b where a.关联列关联列4:⽬标表 set ⽬标表.列 = a.from 源表 a , ⽬标表 b where关联列 = b.关联列5:⽬标表 set⽬标表.列 = a.from 源表 a where a.关联列 =update ⽬标表a, 源表b set a.列 =b.列 where a.关联列 = b.关联列update ⽬标表a, 源表b set a.列 =b.列 where a.关联列 = b.关联列from 源表 a where a.关联列 = .关联列6:update语创建⼀个新表修改表中的列表名 alter column 列新数据库类型⼤⼩添加表中的列表名 Add 列名数据库删除表中的列表名 drop column 列删除表中的记录⽽不删除表的truncate table student只是查看表的结构删除表中的数据及表的结构a.创建⼀个新表create table student(stu_id int, stu_name varchar2(20)) tablespace lijiaob.修改表中的列alter table student modify(stu_name varchar2(40))c.添加表中的列alter table student add(stu_age int)d.删除表中的列alter table student drop column stu_agee.删除表中的记录⽽不删除表的结构truncate table studentf.只是查看表的结构desc studentg.删除表中的数据及表的结构drop table student;:.必须)a. commit 命令(⽤于提交并结束事务处理)commitb.savepoint 保存点类似于标记它将很长的事务处理划分为较⼩的部分他们⽤来标记事务中可以应⽤回滚的点save point savepoint_idc.rollbace work ,rollbackd.回滚到某个保存点rollback to savepoint伪列,但a.rowid(可以唯⼀的标识数据库中的⼀⾏)b.rownum (代表⾏的序号)rownum 不跟> , = , >= 操作使⽤储在,)变量名 = 值变量名 = 列名 from 表明列名 =⽤户)最后⼀个T-SQL错误号最后⼀次插⼊的标识本地服务器的名值’ 只出现在查询分析器中值’,16,1) 能在前台⽤条件) begin … end条件) begin …end else begin表名 where= 值)表名列名 = 值) begin …. enda) if condition then exp_bodyend if;b) if condition then exp_bodyelse exp_body end if;c) if condition then exp_bodyelsif condition then exp_bodyelse exp_body end if;1) loop condition end loop2) while condition Loop exp_body end loop3)for varable in [REVERSE] value1...value2 (varable 变量不需声明 , ... 是范围连接符 )loop exp_body end loop别名=case条件 then 值条件 then 值值表列名值 then 值值 then 值值表a) select case 列名when 值 then 值when 值 then 值else 值end case from 表明b) select casewhen 列名=值 then 值when 列名=值 then 值else 值end case from 表:1.列类型: %TYPEvarable tableName.columnName%TYPE;varable tableName.columnName%TYPE;2.⾏类型: %ROWTYPEvarable tableName%ROWTYPE;3.使⽤⾏类型:varable.列名;异常信息’,16,1) 能在 1)⾃定义异常:a)定义异常:(位 declare和 begin之间)DECLARE varable EXCEPTION;b)显⽰引发异常(为 begin 和 end 之间):RAISE varable;2)处理预定义异常:(位 begin 和 end 之间)EXCEPTIONwhen Too_Many_ROWS thenDBMS_OUTPUT.PUT_LINE('返回多⾏');when others thenDBMS_OUTPUT.PUT_LINE('全部处理');3) 引发应⽤程序错误:RAISE_APPLICATION_ERROR(error_number,error_message);原理: ):(重复⼦查询,不能单)(只执⾏⼀次,能单独执, 查询原理: 从外(外sql⼀次查出sql)到⾥把外不查出来的值传):查询到结果可以作为表来使⼀样切套⼦查询:Select * from AuthorBook a where CopyRight =(select Max(CopyRight) from AuthorBookwhere BookName = a.BopokName)(效率低)>连接查询(效), ⽽连. 右查询有连接查完全⼀样返回多⾏⼀列完全⼀样完全⼀样:只能出现在Group by分组,不能单独使⽤group by 就没有Having完全⼀样完全⼀样相对于mssql oracle显著的书写特点:1.代码⽚段必须放到begin end .. 中2.虚拟表 dual 的使⽤3.每⾏代码强制分号";"结束,包括end4.赋值符号 :=;(select xx into xx from daul;也可以⽤于赋值)5.省略了 as...补充:⼏种关系数据库中字符编码和存储长度需要注意的⼏个问题1.mysql中char(n) varchar(n) 中再utf8编码存储⽅式下数字表⽰的是字符数,但是在其他⽅式下就根据情况定,需要再相应环境下探索⼀下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQLServer和Oracle是大家经常用到的数据库,在此总结出这些常用函数以供大家参考。
数学函数1.绝对值S:select abs(-1) valueO:select abs(-1) value from dual2.取整(大)S:select ceiling(-1.001) valueO:select ceil(-1.001) value from dual3.取整(小)S:select floor(-1.001) valueO:select floor(-1.001) value from dual4.取整(截取)S:select cast(-1.002 as int) valueO:select trunc(-1.002) value from dual5.四舍五入S:select round(1.23456,4) value 1.23460O:select round(1.23456,4) value from dual 1.23466.e为底的幂S:select Exp(1) value 2.7182818284590451O:select Exp(1) value from dual 2.718281827.取e为底的对数S:select log(2.7182818284590451) value 1O:select ln(2.7182818284590451) value from dual; 18.取10为底对数S:select log10(10) value 1O:select log(10,10) value from dual; 19.取平方S:select SQUARE(4) value 16O:select power(4,2) value from dual 1610.取平方根S:select SQRT(4) value 2O:select SQRT(4) value from dual 211.求任意数为底的幂S:select power(3,4) value 81O:select power(3,4) value from dual 8112.取随机数S:select rand() valueO:select sys.dbms_random.value(0,1) value from dual;13.取符号S:select sign(-8) value -1O:select sign(-8) value from dual -114.圆周率S:SELECT PI() value 3.1415926535897931O:不知道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 valueunionselect -2 valueunionselect 4 valueunionselect 3 value)aO:select greatest(1,-2,4,3) value from dual19. 求集合最小值S:select min(value) value from(select 1 valueunionselect -2 valueunionunionselect 3 value)aO:select least(1,-2,4,3) value from dual20.如何处理null值(F2中的null以10代替)S:select F1,IsNull(F2,10) value from TblO:select F1,nvl(F2,10) value from Tbl21.求字符序号S:select ascii('a') valueO:select ascii('a') value from dual22.从序号求字符S:select char(97) valueO:select chr(97) value from dual23.连接S:select '11'+'22'+'33' valueO:select CONCAT('11','22') 33 value from dual23.子串位置 --返回3S:select CHARINDEX('s','sdsq',2) valueO:select INSTR('sdsq','s',2) value from dual23.模糊子串的位置 --返回2,参数去掉中间%则返回7S:select patindex('%d%q%','sdsfasdqe') valueO:oracle没发现,但是instr可以通过第四个参数控制出现次数select INSTR('sdsfasdqe','sd',1,2) value from dual 返回624.求子串S:select substring('abcd',2,2) valueO:select substr('abcd',2,2) value from dual25.子串代替返回aijklmnefS:SELECT STUFF('abcdef', 2, 3, 'ijklmn') valueO:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual26.子串全部替换S:没发现O:select Translate('fasdbfasegas','fa','我' ) value from dual27.长度O:length28.大小写转换 lower,upper29.单词首字母大写S:没发现O:select INITCAP('abcd dsaf df') value from dual30.左补空格(LPAD的第一个参数为空格则同space函数)S:select space(10)+'abcd' valueO:select LPAD('abcd',14) value from dual31.右补空格(RPAD的第一个参数为空格则同space函数)S:select 'abcd'+space(10) valueO:select RPAD('abcd',14) value from dual32.删除空格S:ltrim,rtrimO:ltrim,rtrim,trim33. 重复字符串S:select REPLICATE('abcd',2) valueO:没发现34.发音相似性比较(这两个单词返回值一样,发音相同)S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dualSQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差返回0-4,4为同音,1最高日期函数35.系统时间S:select getdate() valueO:select sysdate value from dual36.前后几日直接与整数相加减37.求日期S:select convert(char(10),getdate(),20) valueO:select trunc(sysdate) value from dualselect to_char(sysdate,'yyyy-mm-dd') value from dual38.求时间S:select convert(char(8),getdate(),108) valueO:select to_char(sysdate,'hh24:mm:ss') value from dual39.取日期时间的其他部分S:DATEPART 和 DATENAME 函数(第一个参数决定)O:to_char函数第二个参数决定参数---------------------------------下表需要补充year yy, yyyyquarter 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 dual41.本星期的某一天(比如星期日)S:不知道O:SELECT Next_day(sysdate,7) vaule FROM DUAL;42.字符串转时间S:可以直接转或者select cast('2004-09-08'as datetime) valueO: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) valueO:直接用两个日期相减(比如d1-d2=12.3)SELECT (d1-d2)*24*60*60 vaule FROM DUAL;44.根据差值求新的日期(比如分钟)S:select dateadd(mi,8,getdate()) valueO: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标准时间。