常用的sql陳述句匯總
1、獲取所有表名、表資訊
- 里面有表注釋
資料庫種類 | sql | 備注 |
---|---|---|
mysql | -- 獲取所有表名、視圖名 show tables -- 獲取 dev_test_data資料庫 所有表、視圖資訊 select * from information_schema.tables where table_schema='dev_test_data' -- 獲取表名、視圖名 select table_name from information_schema.tables where table_schema='dev_test_data' -- 只獲取表資訊 select * from information_schema.tables where table_schema='dev_test_data' and table_type = 'BASE TABLE' |
|
達夢8 (底層是oracle) |
-- 獲取表、視圖名稱 select table_name from user_tab_comments -- 只獲取表名稱 select table_name from user_tab_comments where TABLE_TYPE = 'TABLE' -- 獲取表資訊、視圖 select * from user_tab_comments |
基本和oracle一樣的 |
oracle | -- 獲取表名 select table_name from user_tab_comments where TABLE_TYPE = 'TABLE' -- 獲取表資訊 select * from user_tab_comments where TABLE_TYPE = 'TABLE' -- 獲取表、視圖資訊 select * from user_tab_comments |
2、獲取當前表的 主表(外鍵關聯的表)
資料庫種類 | sql | 備注 |
---|---|---|
mysql | SELECT REFERENCED_TABLE_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA ='dev_test_data' AND TABLE_NAME = 't_c_my_dept' and REFERENCED_TABLE_NAME != 'null' |
獲取欄位:table_name |
oracle、達夢8 | -- 根據表名獲取 其主表 第一種 方法 select t1.table_name, t2.table_name as "TABLE_NAME(R)", t1.constraint_name, t1.r_constraint_name as "CONSTRAINT_NAME(R)", a1.column_name, a2.column_name as "COLUMN_NAME(R)" from user_constraints t1, user_constraints t2, user_cons_columns a1, user_cons_columns a2 where t1.owner = upper('CJY') and t1.r_constraint_name = t2.constraint_name and t1.constraint_name = a1.constraint_name and t1.r_constraint_name = a2.constraint_name and t1.table_name = 't_c_emp' -- 根據表名獲取 其主表 第二種 方法 select cl.table_name from user_cons_columns cl left join user_constraints c on cl.constraint_name = c.r_constraint_name where c.constraint_type = 'R' and c.table_name = 't_c_dept' and c.owner = 'CJY' |
|
--(獲取其主表) ———— 外鍵關聯的表
- 就是這個表中的外鍵關聯的表
2.1、獲取從表
--mysql
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_SCHEMA = "dev_test_data" and REFERENCED_TABLE_NAME in ('t_c_my_dept') AND REFERENCED_TABLE_NAME != ""
--oracle、達夢
獲取其從表
-- 根據表名獲取 其從屬表的名字
select c.table_name from user_cons_columns cl
left join user_constraints c on cl.constraint_name = c.r_constraint_name
where c.constraint_type = 'R'
and cl.table_name = 't_c_dept' and c.owner = 'CJY'
3、獲取表的約束
- 根據表名、資料庫名
資料庫種類 | SQL | 備注 |
---|---|---|
mysql | SELECT constraint_name, column_name, table_catalog, table_schema, referenced_table_schema, referenced_table_name, referenced_column_name, table_name FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE table_schema = 'fd' -- 篩選表名,一起查詢快些 -- AND table_name = 't_autotb561' AND ( referenced_table_name IS NOT NULL OR constraint_name = 'PRIMARY' ) |
23.2.3更新 |
oracle/達夢8 | SELECT aa.CONSTRAINT_NAME, aa.COLUMN_NAME, aa.CONSTRAINT_TYPE, aa.SEARCH_CONDITION, aa.R_CONSTRAINT_NAME, bb.TABLE_NAME, bb.COLUMN_NAME, aa.TABLE_NAME FROM ( SELECT A.CONSTRAINT_NAME, A.TABLE_NAME, A.COLUMN_NAME, B.CONSTRAINT_TYPE, B.SEARCH_CONDITION, B.R_CONSTRAINT_NAME FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME -- 模式名 AND A.owner = 'THEME_BY1' -- 表名(查所有比一個個查詢快) -- AND A.TABLE_NAME = 'E_Z_CS_EMP' ) aa LEFT JOIN USER_CONS_COLUMNS bb ON bb.CONSTRAINT_NAME = aa.R_CONSTRAINT_NAME |
23.2.3更新 |
mysql
oracle
4、獲取表的索引
- 根據表名、資料庫名
資料庫種類 | SQL | 備注 |
---|---|---|
mysql | SELECT index_name, column_name, COLLATION, non_unique, nullable, index_type, index_comment, table_name FROM information_schema.statistics WHERE table_schema = 'fd' -- 篩選表名,一起查詢快些 -- AND table_name = 't_c_my_dept'; |
23.2.3更新 |
oracle/達夢8 | SELECT t.index_name, t.column_name, t.descend, i.uniqueness, i.compression, i.INDEX_TYPE, i.table_type, t.TABLE_NAME FROM user_ind_columns t, user_indexes i WHERE t.index_name = i.index_name AND t.table_name = i.table_name -- 篩選表,全部查詢快些 -- AND t.TABLE_NAME = 'abcdTYB_T_AUTOTB557' |
23.2.3更新 |
mysql
oracle
5、case when then else end
5.1、情況一
測驗表:
CREATE TABLE test.cc (
id int PRIMARY key IDENTITY(1,1),
name varchar(255) NULL,
age int NULL,
country varchar(255) NULL
)
需求
需求:
用一句sql查詢出一張表中年齡<10和年齡≥10的
【提示:用行內;group by后面括號里面可以寫邏輯】
【提示:用case when】
下面是實作sql(兩種方式)
-- 1 查詢年齡小于10、大于10的人數
select
case
when age > 0 and age < 10 then 'age小于10'
when age >= 10 and age < 20 then 'age大于10'
else '其他'
end as '條件',
count(*) as '人數'
from test.t_user
group by
case
when age > 0 and age < 10 then 'age小于10'
when age >= 10 and age < 20 then 'age大于10'
else '其他'
end;
-- 2 查詢中國人、美國人、其他國家人的年齡和(第一種寫法)
select sum(age) as '年齡和',
case name
when 'cc' then '中國人'
when 'dd' then '中國人'
when 'ee' then '中國人'
when 'ff' then '美國人'
when 'gg' then '美國人'
when 'hh' then '美國人'
else '其他國家'
end as '國家'
from test.t_user
group by
case name
when 'cc' then '中國人'
when 'dd' then '中國人'
when 'ee' then '中國人'
when 'ff' then '美國人'
when 'gg' then '美國人'
when 'hh' then '美國人'
else '其他國家'
end;
-- 3 查詢中國人、美國人、其他國家人的年齡和(第二種寫法)
select sum(age) as '年齡和',
case country
when '中國' then '中國人'
when '美國' then '美國人'
else '其他國家'
end as '國家'
from test.t_user
group by
case country
when '中國' then '中國人'
when '美國' then '美國人'
else '其他國家'
end;
5.2、情況二
TD_DI_WORK_TABLE 表中有表名欄位 TARGET_TABLE_NAME
TD_DI_WORK_TABLE 中有NODE_ID 與 TD_DI_NODE 關聯
- TD_DI_NODE 中有WORK_TYPE型別,表名該表的構建型別
要求:查詢出表名+型別,型別需要根據1-7轉換為中文:如:a_tree_pid(采集)
- oracle連接字串:|| 、concat
方式一:
SELECT
wt.TARGET_TABLE_NAME ||
(CASE
dn.WORK_TYPE
WHEN 1 THEN '(采集)'
WHEN 2 THEN '(歸一)'
WHEN 7 THEN '(訂閱)'
ELSE '(主題)'
END
) AS tableName
FROM
TD_DI_WORK_TABLE AS wt
LEFT JOIN TD_DI_NODE AS dn ON
dn.ID = wt.NODE_ID
方式二:
SELECT
CONCAT(
wt.TARGET_TABLE_NAME,
(CASE
dn.WORK_TYPE
WHEN 1 THEN '(采集)'
WHEN 2 THEN '(歸一)'
WHEN 7 THEN '(訂閱)'
ELSE '(主題)'
END
)
) AS tableName1
FROM
TD_DI_WORK_TABLE AS wt
LEFT JOIN TD_DI_NODE AS dn ON
dn.ID = wt.NODE_ID
結果:
5.3、例子
SELECT
(
CASE
FILE_TYPE
WHEN 1 THEN 'PDF'
WHEN 2 THEN 'picture'
WHEN 3 THEN 'DOC'
WHEN 4 THEN 'EXCEL'
WHEN 5 THEN 'PPT'
WHEN 6 THEN 'audio'
WHEN 7 THEN 'video'
WHEN 8 THEN 'text'
WHEN 9 THEN 'other'
ELSE '其他'
END
) AS AA
FROM
TD_DR_DATA_RESOURCE_STATIC AS drs
6、建表、建注釋、建索引
6.1、達夢
1、常用資料型別
名稱 | 長度(精度) | 精度(標度) | 可做主鍵 | 可索引 | 默認值 | 備注 |
---|---|---|---|---|---|---|
CHAR | 1-8188 | - | true | true | 默認值長度 <= 長度 | |
VARCHAR2 | 1-8188 | - | true | true | 默認值長度 <= 長度 | |
NUMBER | 0-38 | 0<=精度<=長度 | true | true | 精度 + 默認值小數點前的長度(喊“-”符號位) <= 長度、必須是數字 | |
NUMERIC | 0-38 | 0<=精度<=長度 | true | true | 精度 + 默認值小數點前的長度(喊“-”符號位) <= 長度、必須是數字 | |
DECIMAL | 0-38 | 0<=精度<=長度 | true | true | 精度 + 默認值小數點前的長度(喊“-”符號位) <= 長度、必須是數字 | |
SMALLINT | 5 | - | true | true | 必須是數字,-32768<=默認值<=32767(Short) | 長度、精度固定 |
INTEGER | 10 | - | true | true | 必須是數字,-2147483648<=默認值<=2147483647(Integer) | 長度、精度固定 |
BIGINT | 19 | - | true | true | 必須是數字, -9223372036854775808<=默認值<=9223372036854775807(Long) |
長度、精度固定 |
DATE | 13 | - | true | true | 可以為:SYSDATE 或 yyyy-MM-dd 格式的時間 | 長度、精度固定 |
TIME | 22 | 0<=精度<=6 | true | true | 可以為:SYSDATE 或 HH:mm:ss 格式的時間 | 長度固定 |
TIMESTAMP | 36 | 0<=精度<=6 | true | true | 可以為:SYSDATE 或 yyyy-MM-dd HH:mm:ss 格式的時間 | 長度固定 |
TEXT | 2147483647 | - | false | false | 文本 | 文本(可用java中的:String接收) |
BLOB | 2147483647 | - | false | false | 不能設定默認值 | 二進制檔案 |
CLOB | 2147483647 | - | false | false | 不能設定默認值 | 文本(可用java中的:String接收) |
2、規則:表名、欄位、注釋長度
①、表名、欄位名的最大長度 128 位元組,
②、注釋(表注釋、欄位注釋)字串最大長度為4000(中文2000)
3、建表sql—創建聯合索引
- 聯合主鍵名字:PK_UNION_e25f0721c3fe4a4aa47781606200475f 不能重復,且是隨機生成的
CREATE TABLE SUBJECT2."t_name"(
"id" CHAR (10) NOT NULL,
"idd" CHAR (2) NOT NULL,
"VARCHAR21" VARCHAR2 (10) DEFAULT ('-33') ,
"NUMBER1" NUMBER (10,7) DEFAULT ('-45.56565665') ,
"DECIMAL1" DECIMAL (10,7) DEFAULT ('545.56565665') NOT NULL,
"DATE1" DATE DEFAULT (SYSDATE) ,
"time1" TIME (6) DEFAULT (SYSDATE) ,
"Timestamp1" TIMESTAMP (6) DEFAULT (SYSDATE) NOT NULL,
"SMALLINT1" SMALLINT DEFAULT ('11111') NOT NULL,
"NUMERIC1" NUMERIC (11,6) DEFAULT ('11111') NOT NULL,
"INTEGER2" INTEGER DEFAULT ('1111111111') NOT NULL,
"BIGINT2" BIGINT DEFAULT ('1111111111') ,
"TEXT2" TEXT DEFAULT ('的撿垃圾拉法基拉法基垃圾啊獨立開發經理就') NOT NULL,
"BLOB2" BLOB,
"CLOB2" CLOB,
CONSTRAINT PK_UNION_e25f0721c3fe4a4aa47781606200475f PRIMARY KEY ( "id",
"idd"))
4、建表sql—創建單個主鍵
- NOT CLUSTER的使用
CREATE TABLE SUBJECT2."T_DDD"(
"id" CHAR (10) NOT NULL,
not cluster PRIMARY KEY("id"),
"idd" CHAR (2) NOT NULL,
"VARCHAR21" VARCHAR2 (10) DEFAULT ('-33') ,
"NUMBER1" NUMBER (10,7) DEFAULT ('-45.56565665') ,
"DECIMAL1" DECIMAL (10,7) DEFAULT ('545.56565665') NOT NULL,
"DATE1" DATE DEFAULT (SYSDATE) ,
"time1" TIME (6) DEFAULT (SYSDATE) ,
"Timestamp1" TIMESTAMP (6) DEFAULT (SYSDATE) NOT NULL,
"SMALLINT1" SMALLINT DEFAULT ('11111') NOT NULL,
"NUMERIC1" NUMERIC (11,6) DEFAULT ('11111') NOT NULL,
"INTEGER2" INTEGER DEFAULT ('1111111111') NOT NULL,
"BIGINT2" BIGINT DEFAULT ('1111111111') ,
"TEXT2" TEXT DEFAULT ('的撿垃圾拉法基拉法基垃圾啊獨立開發經理就') NOT NULL,
"BLOB2" BLOB,
"CLOB2" CLOB
)
-
指明 CLUSTER(默認是聚集索引),表明是主關鍵字上聚集索引;
- 聚集索引,是不能修改欄位資訊的
-
指明 NOT CLUSTER,表明是主關鍵字上非聚集索引;
- 一般用這個
5、建注釋sql
- 注釋字串最大長度為4000
-表注釋
comment on table "SUBJECT2"."T_DDD" is '備注注111';
-欄位注釋
comment on column "SUBJECT2"."T_DDD"."VARCHAR21" is '注釋';
6、判斷表是否存在
select * from user_tables where table_name = '表名'
7、創建索引——聯合索引
create index "SUBJECT2"."索引名字" on "SUBJECT2"."T_DDD2"("idd","VARCHAR21","DECIMAL1","time1","INTEGER2")
8、創建索引——單個索引
create index "SUBJECT2"."索引名字" on "SUBJECT2"."T_DDD"("idd")
- 簡約
create index "索引名字" on "T_DDD"("idd")
9、只查詢表結構
SELECT * FROM TD_DI_NODE WHERE 1=0
10、Java構建SQL
1、判斷引數工具類
public class Verify {
/** 欄位型別判斷:判斷欄位是否符合達夢建表要求
* @Description
* char、varchar2 ①不能設定精度 ②最大長度 1-8188 ③設定了默認值:默認值長度 <= 長度 (一個中文占兩個長度)
* number、numeric、decimal:①精度(>=0) <= ②長度(0-38) ③設定了默認值:精度+默認值小數點前的長度 <= 長度
* smallint、integer、bigint:①不能設定長度、精度 ②默認值可以為小數,下面的范圍是指小數點前面的數
* 默認值范圍:-32768<=smallint<=32767 -2147483648<=integer<=2147483647
* 默認值范圍:-9223372036854775808<=bigint<=9223372036854775807
* smallint、int、integer、bigint、number、numeric、decimal :①必須是數字(整數、小數)
* text:①不能設定長度、精度 ②不能設定主鍵、不能設定索引
* blob、clob:①不能設定長度、精度 ②不能設定默認值 ③不能設主鍵、不能建索引
* date:①不能設定長度、精度 ②時間格式:yyyy-MM-dd ④默認值還可以為:SYSDATE
* time:①不能設定長度 ②時間格式:HH:mm:ss ③可以設定精度(>=0 且 <=6) ④默認值還可以為:SYSDATE
* timestamp:①不能設定長度 ②時間格式:yyyy-MM-dd HH:mm:ss ③可以設定精度(>=0 且 <=6) ④默認值還可以為:SYSDATE
* @Author CC
* @Date 2021/11/9
* @Param [fieldName欄位名字, fieldType欄位型別, length欄位長度,
* precision欄位精度, defaultValue默認值]
* @return void
**/
public static void verDmFieldType(String fieldName, String fieldType,
Integer length, Integer precision,
String defaultValue,Integer isIndex,
Integer isPk
) {
Assert.isTrue(Constants.DM_FIELD_ALL.contains(fieldType), String.format("欄位%s:型別不對!",fieldName));
//默認值長度
int defLen = StringUtils.isNotBlank(defaultValue) ? defaultValue.length() : 0;
int chineseNum = RegularVer.chineseNum(defaultValue);
defLen = chineseNum == 0 ? defLen : (defLen-chineseNum) + chineseNum * 2;
//判斷1
if (Constants.DM_FIELD_CHAR.contains(fieldType)){
Assert.isTrue(length>=1 && length<=8188,
String.format("欄位(%s):長度只能是1-8188",fieldName));
Assert.isTrue(defLen <= length,
String.format("欄位(%s):默認值長度必須小于設定長度(一個中文占兩個長度)",fieldName));
}
if (Constants.DM_FIELD_NUM_ALL.contains(fieldType) && StringUtils.isNotBlank(defaultValue)){
Assert.isTrue(RegularVer.isNumber(defaultValue),
String.format("欄位(%s):默認值必須是純數字",fieldName));
String front = defaultValue.split("\\.")[0];
if (DmFieldEnums.SMALLINT.getName().equals(fieldType)){
String min = String.valueOf(Short.MIN_VALUE);
String max = String.valueOf(Short.MAX_VALUE);
Assert.isTrue(Verify.verNumInMinMax(front, min, max),
String.format("欄位(%s):默認值小數點前數字必須大于等于%s,且小于等于%s",fieldName,min,max));
}
if (DmFieldEnums.INTEGER.getName().equals(fieldType)){
String min = String.valueOf(Integer.MIN_VALUE);
String max = String.valueOf(Integer.MAX_VALUE);
Assert.isTrue(Verify.verNumInMinMax(front, min, max),
String.format("欄位(%s):默認值小數點前數字必須大于等于%s,且小于等于%s",fieldName,min,max));
}
if (DmFieldEnums.BIGINT.getName().equals(fieldType)){
String min = String.valueOf(Long.MIN_VALUE);
String max = String.valueOf(Long.MAX_VALUE);
Assert.isTrue(Verify.verNumInMinMax(front, min, max),
String.format("欄位(%s):默認值小數點前數字必須大于等于%s,且小于等于%s",fieldName,min,max));
}
}
if (Constants.DM_FIELD_NUM.contains(fieldType)){
Assert.isTrue(precision <= length,
String.format("欄位(%s):精度必須小于設定長度",fieldName));
if (StringUtils.isNotBlank(defaultValue)){
String[] split = defaultValue.split("\\.");
Assert.isTrue(precision + split[0].length() <= length,
String.format("欄位(%s):精度+默認值小數點前的長度 必須不大于 設定長度",fieldName));
}
}
if(StringUtils.isNotBlank(defaultValue)){
if (DmFieldEnums.DATE.getName().equals(fieldType) && !Constants.SYSDATE.equals(defaultValue)) {
Assert.isTrue(RegularVer.isValidDate(defaultValue),
String.format("欄位(%s):默認值不是指定時間格式(yyyy-MM-dd)",fieldName));
}
if (DmFieldEnums.TIME.getName().equals(fieldType) && !Constants.SYSDATE.equals(defaultValue)) {
Assert.isTrue(RegularVer.isValidTime(defaultValue),
String.format("欄位(%s):默認值不是指定時間格式(HH:mm:ss)",fieldName));
}
if (DmFieldEnums.TIMESTAMP.getName().equals(fieldType) && !Constants.SYSDATE.equals(defaultValue)) {
Assert.isTrue(RegularVer.isValidTimestamp(defaultValue),
String.format("欄位(%s):默認值不是指定時間格式(yyyy-MM-dd HH:mm:ss)",fieldName));
}
}
if (fieldType.contains(DmFieldEnums.TIME.getName())){
Assert.isTrue(precision <= 6,
String.format("欄位(%s):精度只能是0-6之間",fieldName));
}
if (fieldType.contains(Constants.LOB) || fieldType.contains(DmFieldEnums.TEXT.getName())){
Assert.isTrue(isIndex == 0,
String.format("欄位(%s):不能設定索引",fieldName));
Assert.isTrue(isPk == 0,
String.format("欄位(%s):不能設定為主鍵",fieldName));
}
if (fieldType.contains(Constants.LOB)) {
Assert.isNull(length,String.format("欄位%s:長度必須為空",fieldName));
Assert.isNull(precision,String.format("欄位%s:精度必須為空",fieldName));
Assert.isNull(defaultValue,String.format("欄位%s:默認值必須為空",fieldName));
} else if (fieldType.contains(DmFieldEnums.TEXT.getName()) ) {
Assert.isNull(length,String.format("欄位%s:長度必須為空",fieldName));
Assert.isNull(precision,String.format("欄位%s:精度必須為空",fieldName));
} else if (fieldType.contains(Constants.INT)) {
Assert.isNull(length,String.format("欄位%s:長度必須為空",fieldName));
Assert.isNull(precision,String.format("欄位%s:精度必須為空",fieldName));
} else if (fieldType.contains(DmFieldEnums.TIME.getName())) {
Assert.isNull(length,String.format("欄位%s:長度必須為空",fieldName));
}else if (fieldType.contains(DmFieldEnums.CHAR.getName())) {
Assert.isNull(precision,String.format("欄位%s:精度必須為空",fieldName));
}else if (fieldType.contains(DmFieldEnums.DATE.getName())) {
Assert.isNull(length,String.format("欄位%s:長度必須為空",fieldName));
Assert.isNull(precision,String.format("欄位%s:精度必須為空",fieldName));
}
}
/** 判斷數字num在min和max之間:min <= num <= max
* @Description
* num在min和max之間回傳true,反之false
* @Author CC
* @Date 2021/11/11
* @Param [defDec, min, max]
* @return boolean
**/
public static boolean verNumInMinMax(String num, String min, String max) {
Assert.isTrue(RegularVer.isNumber(num),String.format("%s,不是純數字!",num));
Assert.isTrue(RegularVer.isNumber(min),String.format("%s,不是純數字!",min));
Assert.isTrue(RegularVer.isNumber(max),String.format("%s,不是純數字!",max));
BigDecimal defDec = new BigDecimal(num);
return defDec.compareTo(new BigDecimal(min)) > -1 && defDec.compareTo(new BigDecimal(max)) < 1;
}
}
常量類
@Data
public class Constants {
public static final List<String> DM_FIELD_ALL =
Lists.newArrayList(
DmFieldEnums.CHAR.getName(),
DmFieldEnums.VARCHAR2.getName(),
DmFieldEnums.NUMERIC.getName(),
DmFieldEnums.DECIMAL.getName(),
DmFieldEnums.NUMBER.getName(),
DmFieldEnums.INTEGER.getName(),
DmFieldEnums.BIGINT.getName(),
DmFieldEnums.SMALLINT.getName(),
DmFieldEnums.DATE.getName(),
DmFieldEnums.TIME.getName(),
DmFieldEnums.TIMESTAMP.getName(),
DmFieldEnums.TEXT.getName(),
DmFieldEnums.BLOB.getName(),
DmFieldEnums.CLOB.getName()
);
public static final List<String> DM_FIELD_NUM_ALL =
Lists.newArrayList(
DmFieldEnums.SMALLINT.getName(),
DmFieldEnums.INTEGER.getName(),
DmFieldEnums.BIGINT.getName(),
DmFieldEnums.NUMBER.getName(),
DmFieldEnums.NUMERIC.getName(),
DmFieldEnums.DECIMAL.getName()
);
public static final List<String> DM_FIELD_NUM =
Lists.newArrayList(
DmFieldEnums.NUMBER.getName(),
DmFieldEnums.NUMERIC.getName(),
DmFieldEnums.DECIMAL.getName()
);
public static final List<String> DM_FIELD_INT =
Lists.newArrayList(
DmFieldEnums.SMALLINT.getName(),
DmFieldEnums.INTEGER.getName(),
DmFieldEnums.BIGINT.getName()
);
public static final List<String> DM_FIELD_CHAR =
Lists.newArrayList(
DmFieldEnums.CHAR.getName(),
DmFieldEnums.VARCHAR2.getName()
);
public static final String LOB = "LOB";
public static final String TEXT = "TEXT";
public static final String INT = "INT";
public static final String SYSDATE = "SYSDATE";
}
列舉類
/** 達夢欄位型別,資料字典型別A11
* @Description
* @Author CC
* @Date 2021/11/9
* @Version 1.0
*/
public enum DmFieldEnums {
//達夢欄位型別
CHAR("CHAR","A1101"),
VARCHAR2("VARCHAR2","A1102"),
NUMERIC("NUMERIC","A1103"),
DECIMAL("DECIMAL","A1104"),
NUMBER("NUMBER","A1105"),
INTEGER("INTEGER","A1106"),
BIGINT("BIGINT","A1107"),
SMALLINT("SMALLINT","A1108"),
DATE("DATE","A1109"),
TIME("TIME","A1110"),
TIMESTAMP("TIMESTAMP","A1111"),
TEXT("TEXT","A1112"),
BLOB("BLOB","A1113"),
CLOB("CLOB","A1114")
;
DmFieldEnums(String name, String code) {
this.name = name;
this.code = code;
}
DmFieldEnums() {
}
private String name;
private String code;
//getter/setter……
}
2、表資訊物體類
@Data
public class TableEntity implements Serializable {
private static final long serialVersionUID = -3523824212672386937L;
private String name;//表名
private String alias;//表別名
private String schmeName;// 庫名
private List<ColumnEntity> columnEntities;//欄位資訊
}
@Data
public class ColumnEntity {
private String tableName;
private String name;//欄位名
private String alias;//欄位別名
private String type;//欄位型別
private Integer length;//欄位長度
private Integer precision;//欄位精度
private String defaultValue;//默認值
private Integer isNull;//是否可以為空 0:不能為空,1:可為空,
private Integer isKey = 0;//是否主鍵 0:否1:是
private String describe; //欄位描述
}
3、判斷表是否存在、洗掉表、創建表—SQL
public class CreateTableSql {
public static final String ORACLE = "oracle";
public static final String MYSQL = "mysql";
public static final String KINGBASE = "kingbase";
public static final String DM = "dm";
/**封裝查詢表是否存在的sql
* @param type 資料庫型別 mysql oracle dm kingbase
* @param tableName 表名
* @return 查詢sql
*/
public static String getIsExistTableSql(String type, String tableName) {
String sql = "";
switch (type) {
case ORACLE:
StringBuffer oracleQueryTable = new StringBuffer().append("select table_name from tabs where table_name ='").append(tableName).append("'");
sql = oracleQueryTable.toString();
break;
case MYSQL:
StringBuffer mysqlQueryTable = new StringBuffer().append("show tables like '").append(tableName).append("'");
sql = mysqlQueryTable.toString();
break;
case KINGBASE:
StringBuffer kingbaseQueryTable = new StringBuffer().append("select * from SYS_TABLES where tablename = '").append(tableName.toUpperCase()).append("'");
sql = kingbaseQueryTable.toString();
break;
case DM:
StringBuffer dmQueryTable = new StringBuffer().append("select * from user_tables where table_name ='").append(tableName).append("'");
sql = dmQueryTable.toString();
break;
default:throw new QzBizException("型別只能是:oracle、mysql、dm、kingbase");
}
return sql;
}
/** 洗掉表
* @param type 型別:oracle、dm
* @param tableName 表名
* @return 洗掉sql
**/
public static String dropTable(String type, String tableName) {
String sql = "";
switch (type) {
case ORACLE:
StringBuffer oracleQueryTable = new StringBuffer().append("drop table \"").append(tableName).append("\"");
sql = oracleQueryTable.toString();
break;
case DM:
StringBuffer dmQueryTable = new StringBuffer().append("DROP TABLE \"").append(tableName).append("\"");
sql = dmQueryTable.toString();
break;
default:break;
}
return sql;
}
/**
* 達夢 建表陳述句
* char、varchar2 ①不能設定精度 ②最大長度 1-8188 ③設定了默認值:默認值長度 <= 長度 (一個中文占兩個長度)
* number、numeric、decimal:①精度(>=0) <= ②長度(0-38) ③設定了默認值:精度+默認值小數點前的長度 <= 長度
* smallint、int、integer、bigint:①不能設定長度、精度 ②默認值長度 <= 5、10、10、19
* smallint、int、integer、bigint、number、numeric、decimal :①必須是數字(整數、小數)
* text:①不能設定長度、精度 ②不能設定主鍵、不能設定索引
* blob、clob:①不能設定長度、精度 ②不能設定默認值 ③不能設主鍵、不能建索引
* date:①不能設定長度、精度 ②時間格式:yyyy-MM-dd ④默認值還可以為:SYSDATE
* time:①不能設定長度 ②時間格式:HH:mm:ss ③可以設定精度(>=0 且 <=6) ④默認值還可以為:SYSDATE
* timestamp:①不能設定長度 ②時間格式:yyyy-MM-dd HH:mm:ss ③可以設定精度(>=0 且 <=6) ④默認值還可以為:SYSDATE
*/
public static String sqlCreateTableDM(TableEntity tableEntity) {
StringBuffer creatTable = new StringBuffer().append("create table ");
if (StringUtils.isNotEmpty(tableEntity.getSchmeName())) {
creatTable.append(tableEntity.getSchmeName()).append(".");
}
creatTable.append("\"").append(tableEntity.getName()).append("\"(");
//主鍵欄位
List<ColumnEntity> keyColumnList = tableEntity.getColumnEntities().stream().filter(e -> e.getIsKey() != null &&
e.getIsKey().equals(1)).collect(Collectors.toList());
//是否設定聯合主鍵
boolean isUnionKey = false;
//主鍵欄位個數大于1,則設定聯合主鍵
if (!CollectionUtils.isEmpty(keyColumnList) && keyColumnList.size() > 1) {
isUnionKey = true;
}
for (int i = 0; i < tableEntity.getColumnEntities().size(); i++) {
ColumnEntity columnEntity = tableEntity.getColumnEntities().get(i);
String type = columnEntity.getType().toUpperCase();
String columnName = "\"" + columnEntity.getName() + "\"";
creatTable.append(columnName).append(" ");
if (type.contains("CLOB") || type.contains("BLOB")) {
columnEntity.setLength(null);
columnEntity.setPrecision(null);
columnEntity.setDefaultValue(null);
} else if (type.contains("TEXT") ) {
columnEntity.setLength(null);
columnEntity.setPrecision(null);
} else if (type.contains("INT")) {
columnEntity.setLength(null);
columnEntity.setPrecision(null);
} else if (type.contains("TIME")) {
columnEntity.setLength(null);
}else if (type.contains("CHAR")) {
columnEntity.setPrecision(null);
}else if (type.contains("DATE")) {
columnEntity.setLength(null);
columnEntity.setPrecision(null);
}
creatTable.append(type);
String defaultValue = https://www.cnblogs.com/kakarotto-chen/archive/2023/05/06/columnEntity.getDefaultValue();
Integer precision = columnEntity.getPrecision();
//有長度、不是date、也不是time型別
if (columnEntity.getLength() != null && columnEntity.getLength() != 0 &&
!type.contains("DATE") && !type.contains("TIME") && !type.contains("INT")
) {
creatTable.append(" (").append(columnEntity.getLength());
if ((type.contains("DECIMAL") || type.contains("NUM")
) && Objects.nonNull(precision) && 0 != precision) {
creatTable.append(",").append(precision);
}
creatTable.append(")");
}
if (type.contains("TIME") && Objects.nonNull(precision) && 0 != precision){
creatTable.append(" (").append(precision).append(") ");
}
if (StringUtils.isNotBlank(defaultValue)) {
if (type.contains("TIME") || type.contains("DATE")){
creatTable.append(" DEFAULT (").append(defaultValue).append(") ");
}else {
creatTable.append(" DEFAULT ('").append(defaultValue).append("') ");
}
}
//不能為空
if (columnEntity.getIsNull() != null && 0 == columnEntity.getIsNull()) {
creatTable.append(" not null");
}
if (columnEntity.getIsKey() != null && 1 == columnEntity.getIsKey() && !isUnionKey) {
creatTable.append(", primary key(").append(columnName).append(")");
}
if (i == (tableEntity.getColumnEntities().size() - 1)) {
//需要設定聯合主鍵
if (isUnionKey) {
// creatTable.append(",CONSTRAINT PK_UNION PRIMARY KEY (");
creatTable.append(",CONSTRAINT ");
creatTable.append(" PK_UNION").append("_").append(UUIDGeneratorUtil.generate());
creatTable.append(" PRIMARY KEY ( ");
for (ColumnEntity c : keyColumnList) {
creatTable.append("\"").append(c.getName()).append("\",");
}
//去掉最后一個逗號
creatTable.deleteCharAt(creatTable.length() - 1);
creatTable.append(")");
}
creatTable.append(")");
} else {
creatTable.append(",");
}
}
return creatTable.toString();
}
4、創建表注釋、欄位注釋—SQL
java實作sql
/**設定表注釋sql
* @param serviceName 資料庫名(dm:模式名)
* @param tableName 表名
* @param remark 注釋
* @return 構造sql
* @author CC
*/
public static String setTableRemarkSql(String serviceName,String tableName, String remark) {
remark = remark == null ? "''" : "'" + remark + "'";
StringBuilder sb = new StringBuilder();
sb.append("comment on table ");
if (StringUtils.isNotBlank(serviceName)){
sb.append("\"").append(serviceName).append("\".");
}
sb.append("\"").append(tableName).append("\"");
sb.append(" is ").append(remark);
return sb.toString();
}
/**設定欄位注釋sql
* @param serviceName 資料庫名(dm:模式名)
* @param tableName 表名
* @param fieldName 欄位名稱
* @param remarks 注釋
* @return 構造sql
* @author gw
*/
public static String setFieldRemarksSql(String serviceName,String tableName, String fieldName, String remarks) {
remarks = remarks == null ? "''" : "'" + remarks + "'";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("comment on column ");
if (StringUtils.isNotBlank(serviceName)){
stringBuilder.append("\"").append(serviceName).append("\".");
}
stringBuilder.append("\"").append(tableName).append("\".");
stringBuilder.append("\"").append(fieldName).append("\"");
stringBuilder.append(" is ").append(remarks);
return stringBuilder.toString();
}
5、創建聯合索引—SQL
java實作sql
/**
* 表欄位創建索引
*
* @param tableName 表名
* @param indexFieldIdList 設定了索引的欄位集合
* @return 構造sql
* @author gw
*/
public static String createTableIndexSql(String tableName, List<String> indexFieldIdList) {
String indexName = tableName.toUpperCase() + "_INDEX";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("create index ").append(indexName);
stringBuilder.append(" on ").append("\"").append(tableName).append("\"(");
for (String field : indexFieldIdList) {
stringBuilder.append("\"").append(field).append("\",");
}
//去掉最后一個逗號
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
stringBuilder.append(")");
return stringBuilder.toString();
}
7、分頁
7.1、Oracle
方式一(推薦)
- (效率高、可寫where、order by)
-- page :第幾頁
-- pageSize :每頁條數
-- end = page*pageSize
-- start = end-pageSize+1
-- 例如:
-- page pageSize end-pageSize+1 page*pageSize
-- 1 2 start=1 end=2
-- 2 2 start=3 end=4
-- 3 2 start=5 end=6
-- 1 3 start=1 end=3
-- 2 3 start=4 end=6
-- 2 4 start=5 end=8
SELECT
*
FROM
(
SELECT
a.*,
ROWNUM rn
FROM
(
SELECT
*
FROM
SUBJECT2.EEE_EEE AS e
) a
WHERE
ROWNUM <= end
) AS rn
WHERE
rn >= start
- 寫where、order
SELECT
*
FROM
(
SELECT
a.*,
ROWNUM rn
FROM
(
SELECT
*
FROM
SUBJECT2.EEE_EEE AS e
WHERE e."AREA_ORIGIN_ID" IN (22,33,44,55,66,77)
ORDER BY e."AREA_ORIGIN_ID" DESC
) a
WHERE
ROWNUM <= end
) AS rn
WHERE
rn >= start
方式二
- 不能寫where、order
-- endNum = page*pageSize
-- startNum = endNum-pageSize
-- 分頁查詢 page:第1頁,pageSize:每頁2條資料 endNum=2 startNum=0
-- 分頁查詢 page:第2頁,pageSize:每頁2條資料 endNum=4 startNum=2
-- 分頁查詢 page:第3頁,pageSize:每頁1條資料 endNum=3 startNum=2
-- 分頁查詢 page:第3頁,pageSize:每頁2條資料 endNum=6 startNum=4
-- 分頁查詢 page:第1頁,pageSize:每頁4條資料 endNum=4 startNum=0
SELECT
*
FROM
(
SELECT
ROWNUM AS rnum,
e.*
FROM
SUBJECT2."EEE_EEE" AS e
WHERE
ROWNUM <= endNum
) AS re
WHERE
re.rnum > startNum;
有欄位:
SELECT
*
FROM
(
SELECT
ROWNUM AS rowno,
"AREA_ORIGIN_ID",
"Province",
"City",
"AREA_ORIGIN_NAME",
"MEMONIC",
"Remark",
"rrrr"
FROM
SUBJECT2."EEE_EEE" AS e
WHERE
ROWNUM <= endNum
) as rn
WHERE
rn.rowno > startNum
錯誤寫法:
SELECT
*
FROM
(
SELECT
ROWNUM AS rnum,
e.*
FROM
SUBJECT2.EEE_EEE AS e
WHERE
ROWNUM <= 4
AND e."AREA_ORIGIN_ID" IN (22,33,44,55,66,77)
ORDER BY e."AREA_ORIGIN_ID" DESC
) AS re
WHERE
re.rnum > 0;
7.2、Mysql
-- page pageSize start end
-- - - (page-1)*pageSize pageSize
-- 1 2 0 2
-- 2 2 2 2
-- 3 3 6 3
SELECT
*
FROM
trg
limit start,end
SELECT
*
FROM
trg
limit (page-1)*pageSize,pageSize
- 寫where、order by
SELECT
*
FROM
trg
WHERE
id IN ( 10, 11, 12, 13, 14 )
ORDER BY id DESC
LIMIT start,end
7.3、達夢
- Oracle、Mysql的方式都可以用(推薦用Mysql的limit方式)
8、連接字串(concat)
8.1、oracle、達夢
① ||
- 不推薦,其他資料庫不支持
SELECT 'q'||'w'||'e'||'r' AS str
結果:qwer
SELECT 'q'||'w'||null||'r' AS str
結果:qwr
② concat
- 推薦
SELECT CONCAT('q','w','e','r') AS str
結果:qwer
SELECT CONCAT('q','w',null,'r') AS str
結果:qwr
③ CONCAT_WS :連接字串
SELECT CONCAT_WS('-','w','e','r') AS str
結果:w-e-r
SELECT CONCAT_WS('-','w',NULL,'r') AS str
結果:w--r
- 在oracle中,null也被當做一個字串
8.2、mysql
①concat
CONCAT(str1,str2,…)
回傳結果為連接引數產生的字串,如有任何一個引數為NULL ,則回傳值為 NULL,
select concat('c','d','f');
結果:cdf
②拼接字串并連接
CONCAT_WS(separator,str1,str2,...)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式,第一個引數是其它引數的分隔符,分隔符的位置放在要連接的兩個字串之間,分隔符可以是一個字串,也可以是其它引數,
select concat_ws('-','11','22','33');
結果:11-22-33
③字串中有null值
- concat
select concat('c','d',null);
結果:null
- concat_ws
select concat_ws('-',null,'22','33');
結果:22-33
9、Oracle的函式
9.1、TO_CHAR(格式化時間)
-
TO_CHAR 把日期或數字轉換為字串
-
獲取系統日期: SYSDATE
格式化日期:
? TO_CHAR(SYSDATE, 'YY/MM/DD HH24:MI:SS)
? 或 TO_DATE(SYSDATE, 'YY/MM/DD HH24:MI:SS)
格式化數字: TO_NUMBER -
TO_CHAR(number, '格式')
TO_CHAR(salary, '$99,999.99')
TO_CHAR(date, '格式')
日期:
12小時制:
SELECT TO_CHAR(SYSDATE() ,'yyyy-MM-dd HH:MI:SS')
結果:2021-12-14 05:22:42
24小時制:
SELECT TO_CHAR(SYSDATE() ,'yyyy-MM-dd HH24:MI:SS')
結果:2021-12-14 17:16:43
轉換的格式:
表示 year 的: y 表示年的最后一位 、
yy 表示年的最后2位 、
yyy 表示年的最后3位 、
yyyy 用4位數表示年
表示month的: mm 用2位數字表示月 、
mon 用簡寫形式, 比如11月或者nov 、
month 用全稱, 比如11月或者november
表示day的: dd 表示當月第幾天 、
ddd 表示當年第幾天 、
dy 當周第幾天,簡寫, 比如星期五或者fri 、
day 當周第幾天,全稱, 比如星期五或者friday
表示hour的: hh 2位數表示小時 12進制 、
hh24 2位數表示小時 24小時
表示minute的:mi 2位數表示分鐘
表示second的:ss 2位數表示秒 60進制
表示季度的:q 一位數 表示季度 (1-4)
另外還有ww 用來表示當年第幾周 w用來表示當月第幾周,
24小時制下的時間范圍:00:00:00-23:59:59
12小時制下的時間范圍:1:00:00-12:59:59
9.2、TO_NUMBER
格式
數字格式: 9 代表一個數字
0 強制顯示0
$ 放置一個$符
L 放置一個浮動本地貨幣符
. 顯示小數點
, 顯示千位指示符
截取兩位小數(trunc)
select trunc(to_number('1.1271113'),2);
9.3、NVL(回傳非null的值)
- 從兩個運算式回傳一個非 null 值,
- 語法:NVL(A, B)
如果A為null,則回傳B,否則回傳A,
例如NVL(A,0),如果A為null,回傳0,
SELECT NVL(1,null)
結果:1
SELECT NVL(null,2)
結果:2
9.4、連接字串|| 和 concat 見8.1
10、drop-洗掉表
10.1、oracle、dm
- 級聯洗掉
drop table "SYSDBA"."TABLE_NAME" cascade;
- 普通洗掉
drop table "SUBJECT_CS"."A_by" restrict;
11、UNION ALL 連表
- 問題:A一張表有欄位Z,B表沒有欄位Z,是否可以連表?
- 答案:可以的,B表連表,對應欄位Z時,用 null 或者 '' 表示
如下:是 "TYPE" 欄位第二張表沒有,用 '3' 來表示
SELECT
drs.ID,drs.RESOURCE_ID,drs."TYPE"
,drs.CREATOR_ID,drs.CREATOR_NAME ,drs.ORG_ID ,drs.CREATE_TIME
FROM TD_DR_DATA_RESOURCE_STATISTICS AS drs
WHERE RESOURCE_ID = 'fc937912543b49bca9f54ae18eb568e9'
UNION ALL
SELECT
urc.ID,urc.RESOURCE_ID,'3' AS "TYPE"
,urc.CREATOR_ID,urc.CREATOR_NAME ,urc.ORG_ID ,urc.CREATE_TIME
FROM TD_PORTAL_USER_RESOURCE_COLLECT AS urc
WHERE RESOURCE_ID = 'fc937912543b49bca9f54ae18eb568e9'
UNION ALL:合并重復的行
UNION:不合并重復的行
12、遞回查詢資料(樹結構)-達夢、oracle
學習網址:https://blog.csdn.net/wang_yunj/article/details/51040029/
12.1、語法:
select * from table [start with condition1] connect by [prior] id=parentid
12.2、示例:
12.2.1、指定根節點查找葉子節點(↓)
示例:
select t.*, level, CONNECT_BY_ROOT(id)
from tab_test t
start with t.id = 0
connect by prior t.id = t.fid;
12.2.2、從葉子節點查找上層節點(↑)
示例:
--第一種,修改prior關鍵字位置
select t.*, level, CONNECT_BY_ROOT(id)
from tab_test t
start with t.id = 4
connect by t.id = prior t.fid;
--第二種,prior關鍵字不動 調換后面的id=fid邏輯關系的順序
select t.*, level, CONNECT_BY_ROOT(id)
from tab_test t
start with t.id = 4
connect by prior t.fid = t.id;
12.3、我的示例sql
SELECT
t.*,
LEVEL,
CONNECT_BY_ROOT(ID)
FROM
TD_SYS_POINT AS t
START WITH
t.ID = #{id}
CONNECT BY PRIOR t.ID = t.P_ID;
13、開啟、關閉資料庫主外鍵
13.1、達夢
-- 1開啟、0關閉
call "dmcompare"."FOREIGN_KEY_CHECKS"(1,'T_DATA_PROCESS','T_DATA_PROCESS');
13.2、mysql
13.3、oracle
- 達夢應該和oracle一樣
14、清空表中的資料(TRUNCATE)
TRUNCATE TABLE "TD_SYS_USER_ORG";
15、生成32位字串
15.1、達夢、oracle
函式:sys_guid()、newid()
select rawtohex(sys_guid());
-- 推薦使用newid()
select REPLACE(newid(),'-','');
16、邊查詢邊插入
insert into TD_SYS_USER_ORG
(ID,USER_ID,ORG_ID,ORG_TYPE)
(
select
rawtohex(sys_guid()),
ID,
ORG_ID,
2
from TD_SYS_USER
);
- select 查詢出來的是串列
17、替換字串
17.1、oracle、達夢
一、replce方法
用法1:REPLACE(sourceStr, searchStr, replacedStr)
sourceStr標識要被替換的欄位名或字串,searchStr表示要被替換掉的字串,replacedStr表示要替換成的字串,
用法2:REPLACE(sourceStr, searchStr)
sourceStr標識要被替換的欄位名或字串,searchStr表示要被剔除掉的字串,
如:
select REPLACE(newid(),'-','');
18、查詢資料庫所有物件
18.1、oracle、dm
- ALL_OBJECTS 表
- 資料庫所有物件表:包括表、視圖、物化視圖、函式……等
-- 查詢所有物件
SELECT * from ALL_OBJECTS
-- 篩選條件 - OWENR:哪個資料庫,- OBJECT_TYPE 型別:
SELECT OBJECT_NAME,OBJECT_TYPE from ALL_OBJECTS
WHERE OWNER = 'MIDDLE' AND OBJECT_TYPE = 'MATERIALIZED VIEW'
查詢(當前用戶的)物化視圖(USER_MVIEWS):
SELECT MVIEW_NAME,REFRESH_METHOD FROM USER_MVIEWS
-- oracle的
-- 整個資料庫的物化視圖
select * from DBA_MVIEWS where OWNER = 'MIDDLE'
-- 當前用戶的物化視圖
SELECT * FROM USER_MVIEWS WHERE MVIEW_NAME = 'V2'
-- 創建物化日志
create materialized view log on "Z_ZZX" with rowid, sequence (ID_CPM_JH, CODE) including new values;
-- 查詢物化視圖的日志
select * from MLOG$_Z_ZZX
-- 查詢物化視圖日志表
SELECT * from ALL_OBJECTS WHERE OWNER = 'MIDDLE' and OBJECT_NAME LIKE '%MLOG$%'
-- 查詢物化視圖
SELECT * from ALL_OBJECTS
WHERE OWNER = 'MIDDLE' AND OBJECT_TYPE = 'MATERIALIZED VIEW'
-- 查詢物化視圖需要的表
select REFERENCED_NAME from ALL_DEPENDENCIES WHERE OWNER = 'MIDDLE' AND TYPE = 'MATERIALIZED VIEW' AND NAME = 'WH_LOG' AND REFERENCED_NAME <> 'WH_LOG'
-- 連表查詢
SELECT * FROM user_mviews um left join SYS.ALL_DEPENDENCIES ad on ad.NAME = um.MVIEW_NAME WHERE ad.OWNER = 'MIDDLE' AND ad.TYPE = 'MATERIALIZED VIEW' AND ad.NAME = 'WH_LOG' AND ad.REFERENCED_NAME <> 'WH_LOG'
-- 獲取DDL陳述句(根據不同型別)
SELECT dbms_metadata.get_ddl('MATERIALIZED_VIEW','WH_LOG') FROM DUAL
-- 獲取DDL-物化視圖日志
SELECT dbms_metadata.get_ddl('TABLE','MLOG$_Z_ZZX') FROM DUAL
-- 獲取DDL-物化視圖
SELECT dbms_metadata.get_ddl('MATERIALIZED_VIEW','CS_COMMIT_COMPLETE') FROM DUAL
SELECT dbms_metadata.get_ddl('MATERIALIZED_VIEW_LOG','MLOG$_Z_ZZX') FROM DUAL
-- 獲取DDL-視圖
SELECT dbms_metadata.get_ddl('VIEW','V1') FROM DUAL
19、獲取兩個表中差異資料:minus(減法)
-
mysql沒有,需要用別的方式替換
-
表結構必須一致,資料也必須一致才能減去
-
真實意思:T_1中的資料減去T_2中的資料,回傳還多余的資料
-
相當于 3-2=1、3-0=3,這個例子中的0、1、2、3表示的是一行一行的資料
SELECT * from T_1
minus
SELECT * from T_2
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/551863.html
標籤:其他
下一篇:返回列表