☆常用的Sql語句彙總(DDL/DML)

来源:https://www.cnblogs.com/kakarotto-chen/archive/2023/05/06/17378261.html
-Advertisement-
Play Games

常用的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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 利用PowerPoint可以很方便的呈現多媒體信息,且信息形式多媒體化,表現力強。但難免在某些情況下我們會需要將PowerPoint轉換為HTML格式。因為HTML文檔能獨立於各種操作系統平臺(如Unix,Windows等)。並且它可以加入圖片、聲音、動畫、影視等內容,還能從一個文件跳轉到另一個文件 ...
  • 目錄 01項目環境準備 02代碼示例 03輸出示例 04總結 05源碼地址 01項目環境準備 A.開發使用的軟體:AutoCAD2016、VisualStudio2022 B.建立依賴的本地庫(提前從AutoCAD軟體安裝目錄拷貝開發時需要使用的庫,如:accoremgd.dll) C.創建新的類庫 ...
  • 支持.Net Core(2.0及以上)/.Net Framework(4.5及以上),可以部署在Docker, Windows, Linux, Mac。 http請求調用是開發中經常會用到的功能,因為,很多第三方功能介面往往是通過http地址的形式提供的,比如:ChatGpt、OpenAI、簡訊服務 ...
  • 就從頭開始吧 第一題 (ASCII) 一道簡單的ASCII碼轉換,直接用題目的提示代碼解就行了 ascii=[99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, ...
  • 最近小編思維發散“Visual Studio可以集成chatgpt嗎?”,這樣不就可以讓chatgpt幫你寫代碼了嗎?尋覓了一圈,還真有這個東西,那就是一個Visual Studio的擴展插件:Visual chatGPT Studio,雖然不是官方的,部分功能也可以值得一用。本文將介紹Visual ...
  • 1、七種文件類型 普通文件類型 Linux中最多的一種文件類型, 包括 純文本文件(ASCII);二進位文件(binary);數據格式的文件(data);各種壓縮文件.第一個屬性為 [-] 目錄文件 就是目錄, 能用 # cd 命令進入的。第一個屬性為 [d],例如 [drwxrwxrwx] 塊設備 ...
  • 0、由於M系列晶元是arm架構,在使用brew安裝node時都是arm的node,但是[email protected]版本中不支持arm架構的出現如下報錯: Error: Node Sass does not yet support your current environment: OS X Un ...
  • 上一章我們認識了etcd,簡單的介紹了 etcd 的基礎概念,但是理解起來還是比較抽象的。這一章我們就一起來部署下 etcd 。這樣可以讓我們對 etcd 有更加確切的認識。 1、etcd單實例部署 對於平常的學習,其實搭建一個單機節點是夠了的。接下來就講講怎麼搭建單機節點。 本次部署是在 cent ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...