常用的sql語句彙總 1、獲取所有表名、表信息 裡面有表註釋 | 資料庫種類 | sql | 備註 | | | | | | mysql | -- 獲取所有表名、視圖名show tables-- 獲取 dev_test_data資料庫 所有表、視圖信息select * from information ...
常用的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 = 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