主頁 > 資料庫 > ☆常用的Sql陳述句匯總(DDL/DML)

☆常用的Sql陳述句匯總(DDL/DML)

2023-05-07 09:20:02 資料庫

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

標籤:其他

上一篇:Semi-Join Subquery優化策略

下一篇:返回列表

標籤雲
其他(158600) Python(38118) JavaScript(25404) Java(18023) C(15222) 區塊鏈(8262) C#(7972) AI(7469) 爪哇(7425) MySQL(7171) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5335) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1965) Web開發(1951) HtmlCss(1932) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • ☆常用的Sql陳述句匯總(DDL/DML)

    常用的sql陳述句匯總 1、獲取所有表名、表資訊 里面有表注釋 | 資料庫種類 | sql | 備注 | | | | | | mysql | -- 獲取所有表名、視圖名show tables-- 獲取 dev_test_data資料庫 所有表、視圖資訊select * from information ......

    uj5u.com 2023-05-07 09:20:02 more
  • Semi-Join Subquery優化策略

    Semi-Join Subquery優化策略 Semi-Join Subquery(半連接子查詢):對應IN或EXISTS子查詢,僅需要檢查"外表記錄"在"子查詢結果集"中是否存在匹配記錄,不需要計算"子查詢結果集"中記錄匹配次數,也不需要回傳"子查詢結果集"中匹配記錄內容 在MariaDB(MyS ......

    uj5u.com 2023-05-07 09:19:40 more
  • 實驗小記之Linux上的Oracle11gR2單實體靜默安裝和建庫

    說明:本文的所有步驟不適用于生產環境,僅用于個人測驗環境的快速部署和學習,下述操作程序在Oracle Linux 7.9上安裝Oracle 11.2.0.4單實體為例。 1 安裝環境檢查 安裝環境的檢查可以參考官方檔案Oracle Database Quick Installation Guide ......

    uj5u.com 2023-05-07 09:19:31 more
  • MySQL如何獲取binlog的開始時間和結束時間

    MySQL資料庫恢復到指定時間點時,我們必須通過MySQL全備+MySQL增量備份(可選)+MySQL的二進制日志(binlog)進行重放來恢復到指定時間點,實際的生產環境中,可能一段時間內生成了多個二進制日志檔案(binlog), MySQL本身不會存盤二進制日志檔案(binlog)的開始時間和結 ......

    uj5u.com 2023-05-07 09:19:25 more
  • GaussDB(DWS)字串處理函式回傳錯誤結果集排查

    摘要:在使用字串處理函式時,有時會出現非預期結果的場景。在排除使用問題后,應該從encoding和資料本身開始排查。 本文分享自華為云社區《GaussDB(DWS)字串處理函式回傳錯誤結果集排查》,作者: -CHEN111- 。 在使用字串處理函式時,有時會出現非預期結果的場景。在排除使用問題 ......

    uj5u.com 2023-05-07 09:19:19 more
  • MySQL備份命令幫助手冊

    借助于 mysqldump 命令可以進行資料庫的備份。 用法: mysqldump [OPTIONS] database [tables] 或:mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] 或:mysqldump [OPTION ......

    uj5u.com 2023-05-07 09:19:14 more
  • 如何計算真實的資料庫成本

    本文分享自天翼云開發者社區《如何計算真實的資料庫成本》 作者:王****乾 在云計算占主導地位之前,計算資料庫的成本是一個非常簡單的等式:軟體成本+硬體成本=資料庫成本。如果你選擇了一個開源產品,軟體成本可能會消失。雖然云計算已經從根本上改變了我們使用和部署軟體的方式,但仍有太多人在使用這種過時的計 ......

    uj5u.com 2023-05-07 09:19:10 more
  • 一文詳解如何在 ChengYing 中通過產品線部署一鍵提升效率

    在之前的內容當中,我們為大家介紹過 ChengYing 的安裝原理、產品包制作等內容,本篇就延續之前的內容,和大家展開聊聊 ChengYing 產品線部署相關的設計。幫助對「一站式全自動化全生命周期大資料平臺運維管家 ChengYing」感興趣的開發者更好地了解和使用 ChengYing。 產品線部 ......

    uj5u.com 2023-05-07 09:18:56 more
  • MySQL一次大量記憶體消耗的跟蹤

    GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯系小編并注明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 文章來源:GreatSQL社區原創 線上使用MySQL8.0.25的資料庫,通過監控發現資料庫在查詢一個視圖(80張表的union all)時記憶體和cp ......

    uj5u.com 2023-05-07 09:18:42 more
  • 由淺入深學MYSQL之--MySQL分組查詢詳解

    前言 從今天開始本系列文內容就帶各位小伙伴學習資料庫技術。資料庫技術是Java開發中必不可少的一部分知識內容。也是非常重要的技術。本系列教程由淺入深, 全面講解資料庫體系。 非常適合零基礎的小伙伴來學習。 全文大約 【1066】字,不說廢話,只講可以讓你學到技術、明白原理的純干貨!本文帶有豐富案例及 ......

    uj5u.com 2023-05-07 09:18:36 more