DMSQL语法学习记录

DMSQL

SQL:结构化查询语言

DMSQL 基于 sql92 和 sql99 的标准

1DMSQL分类

DML数据操纵(数据库查询和操纵数据表资料行):select insert update delete

DDL 数据定义(建立、修改、删除数据库中数据表对象):create drop alter truncate

DCL数据控制(权限控制、用于执行行权限授予与收回操作):grant revoke

TCL事务控制(事务控制、维护数据的一致性):commit rollback

2SQL书写规范

A.关键字不能被拆分、缩写 ,也不能分行;

B.不区分大小写,除了’ ’、” ”以外 (大小写不敏感);

C.可以写在一行或者多行,可以换行;

D.采用缩进可提高语句的可读性。

3.单表查询

3.1 简单查询 (全表扫描,耗能)

1.SELECT 标识选择哪些列      FROM标识从哪个表中选择

2.省略模式名:set schema 模式名

3.查询结果出现乱码:客户端字符集和数据库冲突(查看是否做过conn操作,以disql标准执行操作)

语法 select () from ();

--单列查询

eg:查询员工表的姓名

select employee_name from dmhr.employee;

--多列查询

eg:查询员工表的姓名,部门编号,工资

 select employee_name,department_id,salary from dmhr.employee;

--查询所有列

Select * from dmhr.employee;

--对列起别名

eg:查询员工姓名和工资

select employee_name,salary as gz from dmhr.employee;

select employee_name,salary gz from dmhr.employee;

对每一列起别名:

select employee_name ename,salary gz from dmhr.employee;

连接 ||

eg:查询“***的工资是:”

select employee_name|| '的工资是:'||salary from dmhr.employee;

去重复 distinct (隐藏排序-升序)

eg:在员工表查询部门编号

select distinct department_id from dmhr.employee;

--表达式

eg:为所有人工资加 2000

select employee_name,salary,salary+2000 from dmhr.employee;

3.2 过滤查询(带条件查询)

语法

Select () from () where ();

比较运算符、逻辑运算、in、is null/is not null、between***and ***,like

--比较运算符:= > >= < <= <> !=

eg:查询名为“马学铭”的工资

select employee_name,salary from dmhr.employee where employee_name='马学铭';

select employee_name,salary,department_id from dmhr.employee where salary>=30000;

--逻辑运算符:and or not

and:如果两个分量条件都为真,则返回true

or:如果其中一个分量条件为真,则返回true

not:如果下面的条件为假,则返回true

eg:查询部门编号为101且工资大于10000的员工

select employee_name,salary,department_id from dmhr.employee where department_id=101 and salary >=10000;

eg:查询部门编号为103或者工资大于30000的员工

select employee_name,salary,department_id from dmhr.employee where department_id=103 or salary >=30000;

--模糊查询:like % _

%匹配 0 个或多个字符

eg:查询姓陈的员工姓名和部门编号

select employee_name,department_id from dmhr.employee where employee_name like '陈%';

eg:查询名字里带有“强”的员工姓名和部门编号

select employee_name,department_id from dmhr.employee where employee_name like '%强';

_匹配 1 个字符

eg:查询姓陈且姓名为两个字的员工姓名和部门编号

select employee_name,department_id from dmhr.employee where employee_name like '陈_';

--in 用来查询某列值属于指定集合的元组

eg:查询部门编号为101和102的员工

select employee_name,department_id from dmhr.employee where department_id in (101,102)

--is null/is not null null 为空,不等于 0

eg:查询部门编号为空/不为空的员工

select employee_name,job_id,department_id from dmhr.employee where department_id is null;

select employee_name,job_id,department_id from dmhr.employee where department_id is not null;

between*** and *** 表示范围

eg:工资在10000~20000之间的员工

select employee_name,department_id,salary from dmhr.employee where salary BETWEEN 10000 and 20000;

等价于:

select employee_name,salary from dmhr.employee where salary>= 10000 and salary <=20000;

3.3 分组函数

COUNT:总个数函数

MAX:最大值函数

MIN:最小值函数

AVG:平均值集数

SUM:总和函数

语法:

Select () from () where () group by () having ();

使用说明:

AVG、SUM 的参数必须为数值类型;

MAX、MIN 的结果数据类型与参数类型保持一致;

group by(先分组,再聚合):给查询的结果进行分组

除了聚合函数不用跟在 group by 后面,其他 select 列,必须要跟在 group by 后面,having

是对 group by 的进一步过滤,having 不能单独使用。

eg:统计工资大于30000的员工数

select count(*)from dmhr.employee where salary>=30000;

eg:求部门工资和大于 10 万的部门

select department_id,sum (salary) from dmhr.employee group by DEPARTMENT_ID having sum (salary) >100000;

eg:求部门编号为101的员工工资最大值

select department_id,max(salary)from dmhr.employee group by department_id having department_id=101;

eg:求部门编号为103的员工工资最小值

select department_id,min(salary)from dmhr.employee group by department_id having department_id=103;

eg:求部门编号为104的员工工资平均值

select department_id,avg(salary)from dmhr.employee group by department_id having department_id=104;

3.4 排序

--升序 asc

eg:对员工工资进行升序排序

select employee_name,department_id,salary from dmhr.employee order by salary asc;

eg:查看最早入职的员工

select employee_name,department_id,hire_date from dmhr.employee order by hire_date asc;

--降序 desc

eg:对员工工资进行降序排序

select employee_name,department_id,salary from dmhr.employee order by salary desc;

4 连接查询

4.1 内连接(inner)

结果集只显示满足条件的记录

--自然连接 natural join

查询不需要指定连接列,列名自己过滤,两个表的连接列的列名和数据类型要一致。

eg:连接列department_id

select employee_name,department_id,department_name from dmhr.employee natural join dmhr.department;

--交叉连接cross join(笛卡集)---尽量避免,容易拖死数据库

select count(*) from dmhr.employee; (emoployee表的行集)

select count(*) from dmhr.department; (departmen表的行集)

select count(*) from dmhr.employee cross join dmhr.department; (两表行集乘积)

--join ... using 子句

在满足多个连接列时,可以指定一个列做连接,连接列的前面不能加表名或者是前缀;join 关键字指定连接的两张表,using 指明连接列;要求 using 中的列存在于两张连接表中。

eg:指定连接列 department_id

select employee_name,department_name,department_id

from dmhr.employee

join dmhr.department

using (department_id);

--join ... on子句

join 关键字指定连接的两张表,on 子句指定连接条件表达式,其中不允许出现 rownum,可为表设置简单代称。

eg:查询员工入职时间

select e1.employee_name,j1.start_date

from dmhr.employee e1

join dmhr.job_history j1

on e1.employee_id=j1.employee_id;

--hash join

可以通过 hint 强制走 hash join

优化器 CBO 根据小表的连接列生成 hash 值,连接大表,扫描大表

eg:查询员工编号和所属部门

select e.EMPLOYEE_ID,e.EMPLOYEE_NAME,d.DEPARTMENT_NAME from dmhr.employee e inner

hash join dmhr.department d

on e.department_id = d.department_id;

4.2 外连接(outer)

结果集除了显示满足条件的记录,不满足的也显示,用 null 代替

左外连接

把 left join 左边的全部显示出来,右边只显示满足条件的记录,不满足条件的用 null 代替

eg:查询员工电话号码和所属部门

select e.employee_name,e.phone_num,d.department_name

from dmhr.employee e

left join dmhr.department d

on d.department_id=e.department_id;

右外连接

把 right join 右边的全部显示出来,右边只显示满足条件的记录,不满足条件的用 null 代替

select e.employee_name,e.phone_num,d.department_name

from dmhr.employee e

right join dmhr.department d

on d.department_id=e.department_id;

全外连接

左外连接+右外连接

select e.employee_name,e.phone_num,d.department_name

from dmhr.employee e

full join dmhr.department d

on d.department_id=e.department_id;

5 子查询

当一个查询的结果是另一个查询的条件时,就叫子查询。子查询先运行,子查询的结果是主查询的条件。子查询可以嵌套子查询,子查询可以做临时表,字段。

单行子查询:一次只返回一条记录

eg:查询马学铭的工资和部门编号

select employee_name,salary,department_id

from dmhr.employee

where employee_id = (select employee_id from dmhr.employee where employee_name='马学铭');

多行子查询:一次返回多条记录

eg:查询比102部门所有人工资都高的员工

select employee_name,salary,department_id

from dmhr.employee

where salary > all (select salary from dmhr.employee where department_id=102);

达梦数据库 - 新一代大型通用关系型数据库 | 达梦云适配中心

上一篇:05. 多表查询


下一篇:GDB调试精粹及使用实例