DMSQL学习
1、SQL分类
- DML(Data Mannipulation Language)数据操纵语言:
查询、操纵数据表资料行,包含: SELECT、 INSERT、 DELETE、 UPDATE、 MERGE - DDL(Data Definition Language)数据定义语言:
建立、修改、删除数据库中数据表对象,包含: CREATE、 ALTER、 DROP、 TRUNCATE、COMMENT; - DCL(Data Control Language)数据控制语言:
用于执行权限授予与收回操作,包含: GRANT、 REVOKE - TCL(Transactional Control Language)事物控制语言:
维护数据的一致性,包含: COMMIT、 ROLLBACK、 SAVEPOINT。
2、用户
- 用户(user):用来连接数据库访问数据库
- 模式(schema):模式对象是数据库数据的逻辑结构
关系:模式跟用户在oracle 是一对一的关系, 一个用户可以对应多个模式,dm也是一对多
- 模式规则:
- 在同一模式下不能存在同名对象,但在不同模式中的对象名称可以相同
- 新建表时候,可以指定表空间。如果不指定,则默认保存到MAIN
- 用户可以直接访问其他模式对象,但如果要要访问其他模式对象,则必须具有对象权限
- 当用户要访问其他模式对象时,必须附加模式名作后缀(schema.table)
3、数据操作
3.1 DELETE 和 TRUNCATE 的区别
(1) TRUNCATE 是 DDL 语句, 不会产生 redo 和 undo,所以删除效率很快, 不支持回滚;
DELETE 是 DML 语句, 会产生 redo 和 undo, delete 删除大表效率很低, 支持回滚。
(2) delete 可以加条件、 TRUNCATE 只能整表删除;
(3) TRUNCATE 可以立即释放空间, 清理表的水位线, delete 不立即释放空间。
(4) delete 支持闪回查询(UNDO_RETENTION 指定回滚段的保留时长), truncate 不支持。
3.2 DISTINCT、UNION、Order by
- DISTINCT
达梦的 distinct 只去重不排序, oracle 的 distinct 即去重也排序。 - UNION
达梦 union 只去重不排序, oracle 的 union 即去重也排序。 - Order by 子句排序
达梦 null 默认排在最前面, oracle 默认排在最后面
//练习
select b.DEPARTMENT_ID, b.DEPARTMENT_NAME, count(a.employee_id) empnum
from dmhr.employee a, dmhr.department b
where a.DEPARTMENT_ID = b.DEPARTMENT_ID
group by b.DEPARTMENT_ID, b.DEPARTMENT_NAME
having count(a.employee_id) > 20
order by empnum desc;
3、多表连接
3.1 内连接
- 内连接只返回满足连接条件的数据
- 内连接的语法:
SELECT table.column,table2.column
FROM table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING(column_name)] |
[JOIN table2 ON(table1.column_name=table2.column_name)];
//练习1
select a.EMPLOYEE_ID, a.EMPLOYEE_NAME, DEPARTMENT_ID,
b.DEPARTMENT_NAME
from dmhr.employee a
join dmhr.department b using(DEPARTMENT_ID);//练习2
select a.EMPLOYEE_ID, a.EMPLOYEE_NAME, a.DEPARTMENT_ID,
b.DEPARTMENT_NAME
from dmhr.employee a join dmhr.department b
on a.DEPARTMENT_ID = b.DEPARTMENT_ID;
3.2 外连接
- 左(右)外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表汇总不满足条件的行,这种连接称为左(或右)外连接。
- 全外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行,这种连接称为全外连接。
- 外连接的语法:
SELECT table1.column,table2.column
FROM table1
[LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name=table2.column_name)];
//练习1
select a.EMPLOYEE_ID, a.EMPLOYEE_NAME, a.DEPARTMENT_ID,
b.DEPARTMENT_NAME
from dmhr.employee a left join dmhr.department b
on a.DEPARTMENT_ID = b.DEPARTMENT_ID;//练习2
select b.DEPARTMENT_ID, b.DEPARTMENT_NAME, count(*) empnum
from dmhr.employee a left join dmhr.department b
on a.DEPARTMENT_ID = b.DEPARTMENT_ID
group by b.DEPARTMENT_ID, b.DEPARTMENT_NAME;//练习3
select b.DEPARTMENT_ID, b.DEPARTMENT_NAME, count(a.employee_id) empnum
from dmhr.employee a right join dmhr.department b
on a.DEPARTMENT_ID = b.DEPARTMENT_ID
group by b.DEPARTMENT_ID, b.DEPARTMENT_NAME;//练习4
select b.DEPARTMENT_ID, b.DEPARTMENT_NAME, count(a.employee_id) empnum
from dmhr.employee a full join dmhr.department b
on a.DEPARTMENT_ID = b.DEPARTMENT_ID
group by b.DEPARTMENT_ID, b.DEPARTMENT_NAME;
3.3 交叉连接
CROSS JOIN 子句可以生成两个表的交叉乘积,这与两个表之间的笛卡尔乘积是相同的。
例:
SELECT *
FROM DMHR.EMPLOYEE T1
CROSS JOIN DMHR.DEPARATMENT T2;
3.4 自然连接
NATURE JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接,在表中查询满足等值条件的数据,如果只是列名相同而数据类型不同,则会产生错误。
//练习
select a.EMPLOYEE_ID, a.EMPLOYEE_NAME, DEPARTMENT_ID,
b.DEPARTMENT_NAME
from dmhr.employee a
natural join dmhr.department b;
JOIN 类型之间的差异:
- JOIN:如果表中有至少一个匹配,则返回行
- LEFT JION:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,就返回行
4、DM8常用的查询语句
- 查询数据库版本
select in_code();
- 查询授权信息
select * from v$license;
- 查询服务器信息
select * from v$SYSTEMINFO;
- 查询会话连接信息
select * from v$sessions;
select count(*),state from v$sessions group by state;
select count(*),clnt_ip from v$sessions group by clnt_ip;
- 查看数据库服务器配置参数
select * from v$dm_ini;
- 查询最近的 sql执行记录
select * from v$sql_history;
- 查询某个用户下所有的表
select * from user_tables;
- dba用户查询某个模式下的所有表
select * from all_tables where owner=’TEST’;
- 查询某个用户下的所有表字段
select * from all_tab_cols where owner=’TEST’;
- 查看表注释
select * from ALL_TAB_COMMENTS where owner=’TEST’;
- 查看字段注释
select * from ALL_COL_COMMENTS where owner=’TEST’;
后面继续学习补充====