[zt] oracle基础知识和基本sql语句

本文介绍Oracle数据库中的基本SQL操作,包括插入、更新数据的方法,如何使用日期函数,以及事务管理和查询技巧等。
2007-03-28 18:18:24 发表, 已被浏览了( 8 )次  

insert into aa(id,name,birthday)
values (01,'lily',SYSDATE);
SYSDATE 当前系统时间日期函数,oracle中函数中如果没有参数,后面的括号可省略
-----------------
insert into aa(id,name,birthday)
values (01,'lily',TO_DATE('2006-5-6','yyyy-MON-DD'));
TO_DATE('日期的字符串','日期时间的格式') 添加指定日期字段,必须用这个日期转换函数
-----------------

set linesize 500 设置行宽度为500
set pagesize 100 设置每页显示100行
run 执行刚才最后执行的sql语句 (可简写为r或/)

alter session set NLS_date_format='YYYY-MM-DD';
         修改会话,使表中存储日期的格式是 YYYY-MM-DD
 
desc 表名 :查看表结构 
ed: 如果用户输入sql语句有错误,可以输入ed打开一个afiedt.buf文件,里面存放着上一回输入的sql语句
    修改后,输入/可重复执行刚才改过的sql语句
------------------
使用绑定变量,给数据库中插入多个记录
insert into aa(id,name,sal)
values (&employeeno,'&employeename',&employeesal);
  回车后会提示给这三个变量输入值
然后用run或r或/可重复执行给表中插入记录的操作
-----------------------------------
从其它表中复制数据
 insert into aa(id,name,address)
      select id,name,address
      from bb where address='jl';
----------------------------------
更新
update aa set name='zhangsan' where address='jl';
----------------------------------
clear screen 清屏
----------------------------------
commit; 提交事务
rollback; 回滚事务

当第一条sql(DML)语句被执行时,事务便开始了
当出现下面的事件时,事务便结束:
-commit or rollback被执行时,把前面的事务提交,事务结束
-DDL or DCL被执行时(自动提交)
-用户退出
-系统中止

事务保存点:可以有选择的返回到事返的某个保存点
比如,执行一条sql语句, update......
   savapoint 事务保存点名1
    执行其它sql语句
   rollback to 事务保存点名1   (回滚到“事务保存点名1”)
----------------------------------
null值在算术表达式中的使用
 如果在查询中,进行运算时,在运算中的字段有空值,它的结果为空
  select id,name, sal*10+comm form s
       这里假如某人的comm字段的值为空,它运算的结果就为空
  解决办法是这种运算用函数去做
------------------
select id||''||name as employees form emp
  这里的||和sqlserver中的+一样,字符串连接符,功能是两个字段连接在一起
------------------------------------
select * from s where name='AA';
  这里的where中的查询条件的内容必须为大写,不然找不到任何结果

select name address sal from aa where sal between 1000 and 1500;

select name address sal from aa where sal in(1000,1200,1500);

select name address sal from aa where name like 'Z%';   (%代表多个字符)

select name address sal from aa where name like 'Z_';   (_代表一个任意字符)

select name address sal from aa where address is null;  (显示所有address为空的记录)

限制重复行
select distinct name from aa;

<think> 我们有两个表:zt_mandatory_tender_project_dept t_ztbjg_zt_mandatory_tender_project_dept。 目标:查看这两个表的字段有多少相同,有多少不同。 思路: 1. 我们可以从系统表中查询这两个表的字段信息。 2. 然后分别收集两个表的字段集合。 3. 计算相同的字段数量:即两个集合的交集。 4. 计算不同的字段数量:这里有两种不同:表A有而表B没有的,以及表B有而表A没有的。我们可以分别计算,也可以计算总的不同字段数(即并集减去交集)。 但是用户要求的是“相同不同数量”,所以我们可以分别给出: - 相同字段的数量 - 表1有而表2没有的字段数量 - 表2有而表1没有的字段数量 注意:不同的数量可以有两种理解,这里我们分别给出两个方向的不同,以及总的不同字段数(即两个方向不同字段数的)。 具体步骤(以MySQL为例): 假设我们使用的是MySQL,我们可以通过information_schema.columns表来获取字段信息。 首先,我们获取两个表的字段列表: 表1(zt_mandatory_tender_project_dept)的字段: SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = 'zt_mandatory_tender_project_dept'; 表2(t_ztbjg_zt_mandatory_tender_project_dept)的字段: SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = 't_ztbjg_zt_mandatory_tender_project_dept'; 然后,我们可以使用集合操作来计算: 相同的字段:两个表的字段交集。 不同的字段:两个表的对称差集。 但是直接在SQL中计算两个集合的交集差集可能需要使用多个子查询。 我们可以这样写: 步骤: 1. 分别统计两个表的字段集合(使用子查询)。 2. 计算交集:即同时出现在两个表中的字段。 3. 计算表1有而表2没有的字段。 4. 计算表2有而表1没有的字段。 最终,我们可以输出: - 相同字段数量 - 表1独有字段数量 - 表2独有字段数量 这里我们假设数据库名是已知的,但用户没有给出,我们可以用变量代替,或者让用户替换。 下面编写一个SQL语句,同时输出这些信息。 注意:由于不同的数据库系统(如MySQLSQL Server、Oracle)的系统表不同,这里我们以MySQL为例。如果用户使用的是其他数据库,需要相应调整。 在MySQL中,我们可以这样写: 使用条件聚合集合操作: 但是,为了清晰,我们可以分别计算三个部分: 方法1:使用多个子查询 计算相同字段的数量: SELECT COUNT(*) as same_count FROM ( SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'your_db_name' AND table_name = 'zt_mandatory_tender_project_dept' INTERSECT SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'your_db_name' AND table_name = 't_ztbjg_zt_mandatory_tender_project_dept' ) AS common_columns; 但是,MySQL不支持INTERSECT操作符(在MySQL 8.0之前不支持,8.0开始支持),为了兼容性,我们可以使用INNER JOIN来实现交集。 同样,我们也可以使用LEFT JOIN来找出表1中有而表2中没有的字段。 下面我们使用JOIN的方式: 我们将两个表的字段列表进行左连接右连接。 完整SQL: 注意:将'your_db_name'替换为实际的数据库名。 步骤: 1. 先获取表1的所有字段,然后与表2的字段进行左连接,表2字段为NULL的即为表1独有。 2. 同理,表2与表1左连接,表1字段为NULL的即为表2独有。 3. 两个表内连接即为共有字段。 但是我们可以在一个查询中同时计算三个部分: 我们可以这样: WITH t1_columns AS ( SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'your_db_name' AND table_name = 'zt_mandatory_tender_project_dept' ), t2_columns AS ( SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'your_db_name' AND table_name = 't_ztbjg_zt_mandatory_tender_project_dept' ), common_columns AS ( SELECT t1.COLUMN_NAME FROM t1_columns t1 INNER JOIN t2_columns t2 ON t1.COLUMN_NAME = t2.COLUMN_NAME ), t1_only AS ( SELECT t1.COLUMN_NAME FROM t1_columns t1 LEFT JOIN t2_columns t2 ON t1.COLUMN_NAME = t2.COLUMN_NAME WHERE t2.COLUMN_NAME IS NULL ), t2_only AS ( SELECT t2.COLUMN_NAME FROM t2_columns t2 LEFT JOIN t1_columns t1 ON t2.COLUMN_NAME = t1.COLUMN_NAME WHERE t1.COLUMN_NAME IS NULL ) SELECT (SELECT COUNT(*) FROM common_columns) AS same_count, (SELECT COUNT(*) FROM t1_only) AS t1_only_count, (SELECT COUNT(*) FROM t2_only) AS t2_only_count; 这个查询会返回三个数字:相同字段的数量,表1独有的字段数量,表2独有的字段数量。 但是注意:在MySQL中,字段名是大小写不敏感的,但为了准确,我们通常认为大小写相同的字段名才是相同的。不过,在information_schema中,COLUMN_NAME的存储取决于数据库表的具体情况,通常是小写的,但为了确保一致,我们可以使用BINARY关键字进行精确匹配(如果表定义中有大小写区分,但一般情况下,MySQL在Linux下是大小写敏感的,而在Windows下不敏感,所以最好按实际情况)。 不过,通常表字段定义不会同时存在大小写不同的相同名字段,所以我们可以不考虑大小写问题。 另外,如果两个表在不同的数据库中(schema),那么需要分别指定table_schema。 这里我们假设两个表在同一个数据库中。 如果不在同一个数据库,那么需要分别指定不同的table_schema,比如: t1_columns: table_schema = 'db1' t2_columns: table_schema = 'db2' 根据用户表名,我们假设它们在同一个数据库。 现在,我们给出完整的SQL查询语句,并提醒用户替换数据库名。 此外,我们也可以分别列出具体相同的字段不同的字段,但用户只要求数量。 如果用户需要列出具体的字段,我们可以稍作调整,但问题只要求数量。 因此,我们提供上述查询。 但是,如果用户使用的是不支持WITH语句的MySQL版本(MySQL 8.0之前),我们可以使用子查询的方式重写: SELECT (SELECT COUNT(*) FROM (SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'your_db_name' AND table_name = 'zt_mandatory_tender_project_dept' ) AS t1 INNER JOIN (SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'your_db_name' AND table_name = 't_ztbjg_zt_mandatory_tender_project_dept' ) AS t2 ON t1.COLUMN_NAME = t2.COLUMN_NAME ) AS same_count, (SELECT COUNT(*) FROM (SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'your_db_name' AND table_name = 'zt_mandatory_tender_project_dept' ) AS t1 LEFT JOIN (SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'your_db_name' AND table_name = 't_ztbjg_zt_mandatory_tender_project_dept' ) AS t2 ON t1.COLUMN_NAME = t2.COLUMN_NAME WHERE t2.COLUMN_NAME IS NULL ) AS t1_only_count, (SELECT COUNT(*) FROM (SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'your_db_name' AND table_name = 't_ztbjg_zt_mandatory_tender_project_dept' ) AS t2 LEFT JOIN (SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'your_db_name' AND table_name = 'zt_mandatory_tender_project_dept' ) AS t1 ON t2.COLUMN_NAME = t1.COLUMN_NAME WHERE t1.COLUMN_NAME IS NULL ) AS t2_only_count; 这个查询可以运行在较老版本的MySQL上。 注意:需要将'your_db_name'替换为实际的数据库名。 最后,如果用户使用的是其他数据库,比如PostgreSQL,同样可以使用类似的查询,因为information_schema是标准的。但如果是Oracle,则需要使用all_tab_columns或user_tab_columns。 考虑到用户没有指定数据库类型,我们以MySQL为例。 因此,我们提供以上SQL语句。 使用步骤: 1. 用实际数据库名替换'your_db_name' 2. 执行查询 结果将包含三列: same_count: 两个表相同的字段数量 t1_only_count: 只有表zt_mandatory_tender_project_dept中存在的字段数量 t2_only_count: 只有表t_ztbjg_zt_mandatory_tender_project_dept中存在的字段数量 这样,用户就可以知道两个表字段的相同不同情况了。 如果用户还需要知道有哪些具体的字段,我们也可以提供,但当前问题只要求数量。 现在,我们按照要求生成相关问题。 </think> 以下是编写SQL查询表`zt_mandatory_tender_project_dept``t_ztbjg_zt_mandatory_tender_project_dept`字段差异的完整解决方案: ### 步骤说明 1. **获取字段信息**:通过数据库元数据表查询字段列表 2. **计算差异**: - `common_count`: 两表共有的字段数量 - `table1_only_count`: 仅存在于第一个表的字段数量 - `table2_only_count`: 仅存在于第二个表的字段数量 ### SQL查询(MySQL示例) ```sql WITH t1_columns AS ( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'zt_mandatory_tender_project_dept' ), t2_columns AS ( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't_ztbjg_zt_mandatory_tender_project_dept' ) SELECT (SELECT COUNT(*) FROM t1_columns INNER JOIN t2_columns USING (COLUMN_NAME)) AS common_count, (SELECT COUNT(*) FROM t1_columns LEFT JOIN t2_columns USING (COLUMN_NAME) WHERE t2_columns.COLUMN_NAME IS NULL) AS table1_only_count, (SELECT COUNT(*) FROM t2_columns LEFT JOIN t1_columns USING (COLUMN_NAME) WHERE t1_columns.COLUMN_NAME IS NULL) AS table2_only_count; ``` ### 其他数据库适配 1. **Oracle**: ```sql WITH t1_columns AS (SELECT COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME = 'ZT_MANDATORY_TENDER_PROJECT_DEPT'), t2_columns AS (SELECT COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME = 'T_ZTBJG_ZT_MANDATORY_TENDER_PROJECT_DEPT') -- 后续计算逻辑与MySQL相同 ``` 2. **SQL Server**: ```sql WITH t1_columns AS ( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'zt_mandatory_tender_project_dept' ), -- 后续计算逻辑与MySQL相同 ``` ### 查询结果说明 | 列名 | 说明 | |------|------| | `common_count` | 两表完全相同的字段数量 | | `table1_only_count` | 仅`zt_mandatory_tender_project_dept`独有的字段数 | | `table2_only_count` | 仅`t_ztbjg_...`独有的字段数 | ### 注意事项 1. **权限要求**:执行账号需有`INFORMATION_SCHEMA`或系统表的查询权限 2. **大小写敏感**: - MySQL/PostgreSQL:字段名默认大小写不敏感 - Oracle:字段名默认大写存储 3. **扩展应用**:如需列出具体差异字段,可使用: ```sql -- 列出独有字段 (SELECT 'Table1 Only', COLUMN_NAME FROM t1_columns EXCEPT SELECT 'Table1 Only', COLUMN_NAME FROM t2_columns) UNION ALL (SELECT 'Table2 Only', COLUMN_NAME FROM t2_columns EXCEPT SELECT 'Table2 Only', COLUMN_NAME FROM t1_columns) ``` > 提示:在包含大量字段的场景中,建议添加`TABLE_SCHEMA`条件(如`WHERE TABLE_SCHEMA='your_db_name'`)确保准确性[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值