DESC —— SQL语句 —— 详解
书接上回《SQL语句where in查询括号中的字段加不加单引号''?》
提到了一种通过DESC来查询字段数据类型的方法,那么DESC运行出来结果示例究竟是怎样的,怎么能够做到呢?
首先,如何记忆?
很简单,DESC —— 即DESCRIBE的意思。顾名思义,描述一个表格。
DESC + 表名; 命令的作用是查看表结构,它会返回表中每个字段的详细信息,包括字段名、数据类型、是否可为空、键类型、默认值和额外信息。
1. DESC BC_INVOICE; 示例
在 Oracle 数据库中,执行以下命令:
DESC BC_INVOICE;
示例输出(Oracle 环境):
Name Null? Type ------------------- -------- ------------ BC_INVOICE_ID NOT NULL NUMBER(19) INVOICE_NO NOT NULL VARCHAR2(50) INVOICE_TYPE VARCHAR2(20) CREATED_DATE DATE AMOUNT NUMBER(10,2) REMARK CLOB
2. DESC命令输出解读
Name | 字段名(列名) |
Null? | 是否允许为NULL(NOT NULL表示不允许) |
Type | 字段的数据类型及长度(如NUMBER, VARCHAR2, DATE等) |
3. 如何根据Type判断是否要加引号?
在Oracle中,根据Type(数据类型)判断IN()中的值是否加引号,具体规则如下:
NUMBER | 数字类型(如NUMBER,NUMBER(10,2)) | 纯数字 | ❌ 不加引号 | WHERE BC_INVOICE_ID IN (7304794410654150656) |
VARCHAR2/CHAR | 字符串类型 | 字符串(即使是数字) | ✅ 加引号 | WHERE INVOICE_NO IN ('25327000000057799451') |
DATE/TIMESTAMP | 日期/时间类型 | 日期/时间格式 | ✅ 加引号 | WHERE CREATED_DATE IN ('2024-01-01') |
CLOB/BLOB | 大字段类型(存储文本或二进制数据) | 通常使用LIKE或CONTAINS等 | ✅ 加引号 | WHERE REMARK LIKE '%重要信息%' |
4. 示例代码
✅ 数值类型(不加引号)
字段类型为NUMBER时:
UPDATE BC_INVOICE SET INVOICE_TYPE = 'IS' WHERE BC_INVOICE_ID IN (7304794410654150656);
✅ 字符串类型(加引号)
字段类型为VARCHAR2时:
UPDATE BC_INVOICE SET IS_CWGX = 'Y' WHERE INVOICE_NO IN ('25327000000057799451', '25327000000057799450');
✅ 日期类型(加引号)
字段类型为DATE 时:
SELECT * FROM BC_INVOICE WHERE CREATED_DATE IN ('2024-01-01', '2024-02-01');
5. 推荐的 Oracle 数据字典查询方法
DESC在某些Oracle 工具(如SQL Developer、PL/SQL Developer)中可能受限。
推荐使用以下 SQL 查询来查看表的详细字段信息:
使用USER_TAB_COLUMNS查看字段信息
SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'BC_INVOICE';
示例输出:
COLUMN_NAME DATA_TYPE DATA_LENGTH NULLABLE --------------------------------------------------------- BC_INVOICE_ID NUMBER 19 N INVOICE_NO VARCHAR2 50 N INVOICE_TYPE VARCHAR2 20 Y CREATED_DATE DATE Y AMOUNT NUMBER 10 Y REMARK CLOB Y